⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metrowerks_xml.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program is free software; you can redistribute it and/or modify it** under the terms of the GNU General Public License as published by the** Free Software Foundation; either version 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "metrowerks_xml.h"#include "option.h"#include <qdir.h>#include <qdict.h>#include <qregexp.h>#include <stdlib.h>#include <time.h>#if !defined(QWS) && defined(Q_OS_MAC)#include <Carbon/Carbon.h>#include <sys/types.h>#include <sys/stat.h>#endifMetrowerksMakefileGenerator::MetrowerksMakefileGenerator(QMakeProject *p) : MakefileGenerator(p), init_flag(FALSE){}boolMetrowerksMakefileGenerator::writeMakefile(QTextStream &t){    if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {	/* for now just dump, I need to generated an empty xml or something.. */	fprintf(stderr, "Project file not generated because all requirements not met:\n\t%s\n",		var("QMAKE_FAILED_REQUIREMENTS").latin1());	return TRUE;    }    if(project->first("TEMPLATE") == "app" ||       project->first("TEMPLATE") == "lib") {	return writeMakeParts(t);    }    else if(project->first("TEMPLATE") == "subdirs") {	writeHeader(t);	qDebug("Not supported!");	return TRUE;    }    return FALSE;}boolMetrowerksMakefileGenerator::writeMakeParts(QTextStream &t){    //..grrr.. libs!    QStringList extra_objs;    bool do_libs = TRUE;    if(project->first("TEMPLATE") == "app") 	extra_objs += project->variables()["QMAKE_CRT_OBJECTS"];    else if(project->first("TEMPLATE") == "lib" && project->isActiveConfig("staticlib"))	do_libs = FALSE;    if(do_libs)	extra_objs += project->variables()["QMAKE_LIBS"];    for(QStringList::Iterator val_it = extra_objs.begin(); 	val_it != extra_objs.end(); ++val_it) {	if((*val_it).startsWith("-L")) {	    QString dir((*val_it).right((*val_it).length() - 2));	    fixEnvVariables(dir);	    if(project->variables()["DEPENDPATH"].findIndex(dir) == -1 &&	       project->variables()["INCLUDEPATH"].findIndex(dir) == -1)		project->variables()["INCLUDEPATH"].append(dir);	} else if((*val_it).startsWith("-l")) {	    QString lib("lib" + (*val_it).right((*val_it).length() - 2)  + "." + 			project->first("QMAKE_EXTENSION_SHLIB"));	    if(project->variables()["LIBRARIES"].findIndex(lib) == -1)		project->variables()["LIBRARIES"].append(lib);	} else 	    if((*val_it) == "-framework") {	    ++val_it;	    if(val_it == extra_objs.end())		break;	    QString frmwrk = (*val_it) + ".framework";	    if(project->variables()["FRAMEWORKS"].findIndex(frmwrk) == -1)		project->variables()["FRAMEWORKS"].append(frmwrk);	} else if((*val_it).left(1) != "-") {	    QString lib=(*val_it);	    int s = lib.findRev('/');	    if(s != -1) {		QString dir = lib.left(s);		lib = lib.right(lib.length() - s - 1);		fixEnvVariables(dir);		if(project->variables()["DEPENDPATH"].findIndex(dir) == -1 &&		   project->variables()["INCLUDEPATH"].findIndex(dir) == -1)		    project->variables()["INCLUDEPATH"].append(dir);	    }	    project->variables()["LIBRARIES"].append(lib);	}    }    //let metrowerks find the files & set the files to the type I expect    QDict<void> seen(293);    QString paths[] = { QString("SRCMOC"), QString("FORMS"), QString("UICDECLS"),			QString("UICIMPLS"), QString("SOURCES"),QString("HEADERS"),			QString::null };    for(int y = 0; paths[y] != QString::null; y++) {	QStringList &l = project->variables()[paths[y]];	for(QStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) {	    //establish file types	    seen.insert((*val_it), (void *)1);	    createFork((*val_it)); //the file itself	    QStringList &d = findDependencies((*val_it)); //depends	    for(QStringList::Iterator dep_it = d.begin(); dep_it != d.end(); ++dep_it) {		if(!seen.find((*dep_it))) {		    seen.insert((*dep_it), (void *)1);		    createFork((*dep_it));		}	    }	    //now chop it	    int s = (*val_it).findRev('/');	    if(s != -1) {		QString dir = (*val_it).left(s);		(*val_it) = (*val_it).right((*val_it).length() - s - 1);		QString tmpd=dir, tmpv;		if(fixifyToMacPath(tmpd, tmpv)) {		    bool add_in = TRUE;		    QString deps[] = { QString("DEPENDPATH"), 				     QString("INCLUDEPATH"), QString::null }, 				     dd, dv;		    for(int yy = 0; deps[yy] != QString::null; yy++) {			QStringList &l2 = project->variables()[deps[yy]];			for(QStringList::Iterator val_it2 = l2.begin(); 			    val_it2 != l2.end(); ++val_it2) {			    QString dd= (*val_it2), dv;			    if(!fixifyToMacPath(dd, dv)) 				continue;			    if(dd == tmpd && tmpv == dv) {				add_in = FALSE;				break;			    }			}		    }		    if(add_in) 			project->variables()["INCLUDEPATH"].append(dir);		}	    }	}    }    //need a defines file    if(!project->isEmpty("DEFINES")) {	QString pre_pref = project->first("TARGET_STEM");	if(project->first("TEMPLATE") == "lib")	    pre_pref += project->isActiveConfig("staticlib") ? "_static" : "_shared";	project->variables()["CODEWARRIOR_PREFIX_HEADER"].append(pre_pref + "_prefix.h");    }    QString xmlfile = findTemplate(project->first("QMAKE_XML_TEMPLATE"));    QFile file(xmlfile);    if(!file.open(IO_ReadOnly )) {	fprintf(stderr, "Cannot open XML file: %s\n", 		project->first("QMAKE_XML_TEMPLATE").latin1());	return FALSE;    }    QTextStream xml(&file);    createFork(Option::output.name());    int rep;    QString line;    while ( !xml.eof() ) {	line = xml.readLine();	while((rep = line.find(QRegExp("\\$\\$[!a-zA-Z0-9_-]*"))) != -1) {	    QString torep = line.mid(rep, line.find(QRegExp("[^\\$!a-zA-Z0-9_-]"), rep) - rep);	    QString variable = torep.right(torep.length()-2);	    t << line.left(rep); //output the left side	    line = line.right(line.length() - (rep + torep.length())); //now past the variable	    if(variable == "CODEWARRIOR_HEADERS" || variable == "CODEWARRIOR_SOURCES" || 	       variable == "CODEWARRIOR_LIBRARIES" || variable == "CODEWARRIOR_QPREPROCESS" ||		variable == "CODEWARRIOR_QPREPROCESSOUT") {		QString outcmd=variable.right(variable.length() - variable.findRev('_') - 1);		QStringList args;		if(outcmd == "QPREPROCESS")		    args << "UICS" << "MOCS";		else if(outcmd == "QPREPROCESSOUT")		    args << "SRCMOC" << "UICIMPLS" << "UICDELCS";		else		    args << outcmd;		for(QStringList::Iterator arit = args.begin(); arit != args.end(); ++arit) {		    QString arg = (*arit);		    QString kind = "Text";		    if(arg == "LIBRARIES")			kind = "Library";		    if(!project->variables()[arg].isEmpty()) {			QStringList &list = project->variables()[arg];			for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) {			    QString flag;			    if(project->isActiveConfig("debug")) {				bool debug = TRUE;				if(outcmd == "QPREPROCESS") {				    debug = FALSE;				} else {				    for(QStringList::Iterator hit = Option::h_ext.begin(); hit != Option::h_ext.end(); ++hit) {					if((*it).endsWith((*hit))) { 					    debug = FALSE;					    break;					}				    }				}				if(debug)				    flag = "Debug";			    }			    t << "\t\t\t\t<FILE>" << endl			      << "\t\t\t\t\t<PATHTYPE>Name</PATHTYPE>" << endl			      << "\t\t\t\t\t<PATH>" << (*it) << "</PATH>" << endl			      << "\t\t\t\t\t<PATHFORMAT>MacOS</PATHFORMAT>" << endl			      << "\t\t\t\t\t<FILEKIND>" << kind << "</FILEKIND>" << endl			      << "\t\t\t\t\t<FILEFLAGS>" << flag << "</FILEFLAGS>" << endl			      << "\t\t\t\t</FILE>" << endl;			}		    }		}	    } else if(variable == "CODEWARRIOR_SOURCES_LINKORDER" || 		      variable == "CODEWARRIOR_HEADERS_LINKORDER" ||		      variable == "CODEWARRIOR_LIBRARIES_LINKORDER" || 		      variable == "CODEWARRIOR_QPREPROCESS_LINKORDER" ||		      variable == "CODEWARRIOR_QPREPROCESSOUT_LINKORDER") {		QString outcmd=variable.mid(variable.find('_')+1, 					    variable.findRev('_')-(variable.find('_')+1));		QStringList args;		if(outcmd == "QPREPROCESS")		    args << "UICS" << "MOCS";		else if(outcmd == "QPREPROCESSOUT")		    args << "SRCMOC" << "UICIMPLS" << "UICDELCS";		else		    args << outcmd;		for(QStringList::Iterator arit = args.begin(); arit != args.end(); ++arit) {		    QString arg = (*arit);		    if(!project->variables()[arg].isEmpty()) {			QStringList &list = project->variables()[arg];			for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) {			    t << "\t\t\t\t<FILEREF>" << endl			      << "\t\t\t\t\t<PATHTYPE>Name</PATHTYPE>" << endl			      << "\t\t\t\t\t<PATH>" << (*it) << "</PATH>" << endl			      << "\t\t\t\t\t<PATHFORMAT>MacOS</PATHFORMAT>" << endl			      << "\t\t\t\t</FILEREF>" << endl;			}		    }		}	    } else if(variable == "CODEWARRIOR_HEADERS_GROUP" || 		      variable == "CODEWARRIOR_SOURCES_GROUP" ||		      variable == "CODEWARRIOR_LIBRARIES_GROUP" || 		      variable == "CODEWARRIOR_QPREPROCESS_GROUP" ||		      variable == "CODEWARRIOR_QPREPROCESSOUT_GROUP") {		QString outcmd = variable.mid(variable.find('_')+1, 					      variable.findRev('_')-(variable.find('_')+1));		QStringList args;		if(outcmd == "QPREPROCESS")		    args << "UICS" << "MOCS";		else if(outcmd == "QPREPROCESSOUT")		    args << "SRCMOC" << "UICIMPLS" << "UICDELCS";		else		    args << outcmd;		for(QStringList::Iterator arit = args.begin(); arit != args.end(); ++arit) {		    QString arg = (*arit);		    if(!project->variables()[arg].isEmpty()) {			QStringList &list = project->variables()[arg];			for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) {			    t << "\t\t\t\t<FILEREF>" << endl			      << "\t\t\t\t\t<TARGETNAME>" << var("TARGET_STEM") << "</TARGETNAME>" 			      << endl			      << "\t\t\t\t\t<PATHTYPE>Name</PATHTYPE>" << endl			      << "\t\t\t\t\t<PATH>" << (*it) << "</PATH>" << endl			      << "\t\t\t\t\t<PATHFORMAT>MacOS</PATHFORMAT>" << endl			      << "\t\t\t\t</FILEREF>" << endl;			}		    }		}	    } else if(variable == "CODEWARRIOR_FRAMEWORKS") {		if(!project->isEmpty("FRAMEWORKS")) {		    QStringList &list = project->variables()["FRAMEWORKS"];		    for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) {			t << "\t\t\t\t<FRAMEWORK>" << endl			  << "\t\t\t\t\t<FILEREF>" << endl			  << "\t\t\t\t\t\t<PATHTYPE>Name</PATHTYPE>" << endl			  << "\t\t\t\t\t\t<PATH>" << (*it) << "</PATH>" << endl			  << "\t\t\t\t\t\t<PATHFORMAT>MacOS</PATHFORMAT>" << endl			  << "\t\t\t\t\t</FILEREF>" << endl			  << "\t\t\t\t</FRAMEWORK>" << endl;		    }		}	    } else if(variable == "CODEWARRIOR_DEPENDPATH" || variable == "CODEWARRIOR_INCLUDEPATH" ||		variable == "CODEWARRIOR_FRAMEWORKPATH") {			QString arg=variable.right(variable.length()-variable.find('_')-1);		QStringList list;		if(arg == "INCLUDEPATH") {		    list = project->variables()[arg];		    list << Option::mkfile::qmakespec;		    list << QDir::current().currentDirPath();		    QStringList &l = project->variables()["QMAKE_LIBS_PATH"];		    for(QStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) {			QString p = (*val_it), v;			if(!fixifyToMacPath(p, v))			    continue;			t << "\t\t\t\t\t<SETTING>" << endl			  << "\t\t\t\t\t\t<SETTING><NAME>SearchPath</NAME>" << endl			  << "\t\t\t\t\t\t\t<SETTING><NAME>Path</NAME>"			  << "<VALUE>" << p << "</VALUE></SETTING>" << endl			  << "\t\t\t\t\t\t\t<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>" << endl			  << "\t\t\t\t\t\t\t<SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>" << endl			  << "\t\t\t\t\t\t</SETTING>" << endl			  << "\t\t\t\t\t\t<SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>" << endl			  << "\t\t\t\t\t\t<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>" << endl			  << "\t\t\t\t\t</SETTING>" << endl;		    }		} else if(variable == "DEPENDPATH") {		    QStringList &l = project->variables()[arg];		    for(QStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it)		    {			//apparently tmake used colon separation...			QStringList damn = QStringList::split(':', (*val_it));			if(!damn.isEmpty())			    list += damn;			else			    list.append((*val_it));		    }		} else {		    list = project->variables()[arg];		}		for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) {		    QString p = (*it), v, recursive = "false", framework = "false";		    if(p.startsWith("recursive--")) {			p = p.right(p.length() - 11);			recursive = "true";		    } 		    if(!fixifyToMacPath(p, v))			continue;		    if(arg == "FRAMEWORKPATH")			framework = "true";		    t << "\t\t\t\t\t<SETTING>" << endl		      << "\t\t\t\t\t\t<SETTING><NAME>SearchPath</NAME>" << endl		      << "\t\t\t\t\t\t\t<SETTING><NAME>Path</NAME>"		      << "<VALUE>" << p << "</VALUE></SETTING>" << endl		      << "\t\t\t\t\t\t\t<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>" << endl		      << "\t\t\t\t\t\t\t<SETTING><NAME>PathRoot</NAME><VALUE>" << v << "</VALUE></SETTING>" << endl		      << "\t\t\t\t\t\t</SETTING>" << endl		      << "\t\t\t\t\t\t<SETTING><NAME>Recursive</NAME><VALUE>" << recursive << "</VALUE></SETTING>" << endl		    << "\t\t\t\t\t\t<SETTING><NAME>FrameworkPath</NAME><VALUE>" << framework << "</VALUE></SETTING>" << endl		    << "\t\t\t\t\t\t<SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>" << endl		      << "\t\t\t\t\t</SETTING>" << endl;		}	    } else if(variable == "CODEWARRIOR_WARNING" || variable == "!CODEWARRIOR_WARNING") {		bool b = ((!project->isActiveConfig("warn_off")) && 			  project->isActiveConfig("warn_on"));		if(variable.startsWith("!"))		    b = !b;		t << (int)b;	    } else if(variable == "CODEWARRIOR_TEMPLATE") {		if(project->first("TEMPLATE") == "app" ) {		    t << "Executable";		} else if(project->first("TEMPLATE") == "lib") {		    if(project->isActiveConfig("staticlib"))		       t << "Library";		    else			t << "SharedLibrary";		}	    } else if(variable == "CODEWARRIOR_OUTPUT_DIR") {		QString outdir = "{Project}/", volume;		if(!project->isEmpty("DESTDIR"))		    outdir = project->first("DESTDIR");		if(project->first("TEMPLATE") == "app" && !project->isActiveConfig("console"))		    outdir += var("TARGET") + ".app/Contents/MacOS/";		if(fixifyToMacPath(outdir, volume, FALSE)) {                    t << "\t\t\t<SETTING><NAME>Path</NAME><VALUE>" << outdir << "</VALUE></SETTING>" 		      << endl		      << "\t\t\t<SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>" << endl		      << "\t\t\t<SETTING><NAME>PathRoot</NAME><VALUE>" << volume << "</VALUE></SETTING>" 		      << endl;		}	    } else if(variable == "CODEWARRIOR_PACKAGER_PANEL") {		if(project->first("TEMPLATE") == "app" && !project->isActiveConfig("console")) {		    QString outdir = "{Project}/", volume;		    if(!project->isEmpty("DESTDIR"))			outdir = project->first("DESTDIR");		    outdir += var("TARGET") + ".app";		    if(fixifyToMacPath(outdir, volume, FALSE)) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -