📄 metrowerks_xml.cpp
字号:
/************************************************************************ 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 + -