📄 pbuilder_pbx.cpp
字号:
if (!project->isActiveConfig("frameworklib") && !project->isActiveConfig("staticlib")) lib.prepend("lib"); t << "\t\t\t\t" << "PRODUCT_NAME = " << lib << ";" << "\n"; } tmp = project->variables()["QMAKE_PBX_VARS"]; for(QStringList::Iterator it = tmp.begin(); it != tmp.end(); ++it) { QString var = (*it), val = getenv(var); if(!val && var == "TB") val = "/usr/bin/"; t << "\t\t\t\t" << var << " = \"" << val << "\";" << "\n"; } t << "\t\t\t" << "};" << "\n" << "\t\t\t" << "conditionalBuildSettings = {" << "\n" << "\t\t\t" << "};" << "\n" << "\t\t\t" << "dependencies = (" << "\n" << varGlue("QMAKE_PBX_TARGET_DEPENDS", "\t\t\t\t", ",\n\t\t\t\t", "\n") << "\t\t\t" << ");" << "\n" << "\t\t\t" << "productReference = " << keyFor(pbx_dir + "QMAKE_PBX_REFERENCE") << ";" << "\n" << "\t\t\t" << "shouldUseHeadermap = 1;" << "\n"; if(ideType() == MAC_XCODE) t << "\t\t\t" << "isa = PBXNativeTarget;" << "\n"; if(project->first("TEMPLATE") == "app") { if(project->isActiveConfig("console")) { if(ideType() == MAC_XCODE) t << "\t\t\t" << "productType = \"com.apple.product-type.tool\";" << "\n"; else t << "\t\t\t" << "isa = PBXToolTarget;" << "\n"; } else { if(ideType() == MAC_XCODE) t << "\t\t\t" << "productType = \"com.apple.product-type.application\";" << "\n"; else t << "\t\t\t" << "isa = PBXApplicationTarget;" << "\n"; t << "\t\t\t" << "productSettingsXML = \""; bool read_plist = false; if(QFile::exists("Info.plist")) { QFile plist("Info.plist"); if(plist.open(IO_ReadOnly)) { read_plist = true; QTextStream stream(&plist); while(!stream.eof()) t << stream.readLine().replace('"', "\\\"") << endl; } } if(!read_plist) { t << "<?xml version=" << "\\\"1.0\\\" encoding=" << "\\\"UTF-8\\\"" << "?>" << "\n" << "\t\t\t\t" << "<!DOCTYPE plist SYSTEM \\\"file://localhost/System/" << "Library/DTDs/PropertyList.dtd\\\">" << "\n" << "\t\t\t\t" << "<plist version=\\\"0.9\\\">" << "\n" << "\t\t\t\t" << "<dict>" << "\n" << "\t\t\t\t\t" << "<key>CFBundleDevelopmentRegion</key>" << "\n" << "\t\t\t\t\t" << "<string>English</string>" << "\n" << "\t\t\t\t\t" << "<key>CFBundleExecutable</key>" << "\n" << "\t\t\t\t\t" << "<string>" << project->first("QMAKE_ORIG_TARGET") << "</string>" << "\n" << "\t\t\t\t\t" << "<key>CFBundleIconFile</key>" << "\n" << "\t\t\t\t\t" << "<string>" << var("RC_FILE").section(Option::dir_sep, -1) << "</string>" << "\n" << "\t\t\t\t\t" << "<key>CFBundleInfoDictionaryVersion</key>" << "\n" << "\t\t\t\t\t" << "<string>6.0</string>" << "\n" << "\t\t\t\t\t" << "<key>CFBundlePackageType</key>" << "\n" << "\t\t\t\t\t" << "<string>APPL</string>" << "\n" << "\t\t\t\t\t" << "<key>CFBundleSignature</key>" << "\n" //Although the output below looks strange it is to avoid the trigraph ??< << "\t\t\t\t\t" << "<string>????" << "</string>" << "\n" << "\t\t\t\t\t" << "<key>CFBundleVersion</key>" << "\n" << "\t\t\t\t\t" << "<string>0.1</string>" << "\n" << "\t\t\t\t\t" << "<key>CSResourcesFileMapped</key>" << "\n" << "\t\t\t\t\t" << "<true/>" << "\n" << "\t\t\t\t" << "</dict>" << "\n" << "\t\t\t\t" << "</plist>"; } } t << "\";" << "\n"; t << "\t\t\t" << "name = \"" << project->first("QMAKE_ORIG_TARGET") << "\";" << "\n" << "\t\t\t" << "productName = " << project->first("QMAKE_ORIG_TARGET") << ";" << "\n"; } else { QString lib = project->first("QMAKE_ORIG_TARGET"); if(!project->isActiveConfig("frameworklib") && !project->isActiveConfig("staticlib")) lib.prepend("lib"); t << "\t\t\t" << "name = \"" << lib << "\";" << "\n" << "\t\t\t" << "productName = " << lib << ";" << "\n"; if(ideType() == MAC_XCODE) { if(project->isActiveConfig("staticlib")) t << "\t\t\t" << "productType = \"com.apple.product-type.library.static\";" << "\n"; else t << "\t\t\t" << "productType = \"com.apple.product-type.library.dynamic\";" << "\n"; } else { t << "\t\t\t" << "isa = PBXLibraryTarget;" << "\n"; } } t << "\t\t\t" << "startupPath = \"<<ProjectDirectory>>\";" << "\n"; if(!project->isEmpty("DESTDIR")) t << "\t\t\t" << "productInstallPath = \"" << project->first("DESTDIR") << "\";" << "\n"; t << "\t\t" << "};" << "\n"; //DEBUG/RELEASE QString active_buildstyle;#if 0 for(int as_release = 0; as_release < 2; as_release++) #else bool as_release = !project->isActiveConfig("debug");#endif { QString key = keyFor("QMAKE_PBX_" + QString(as_release ? "RELEASE" : "DEBUG")); if(project->isActiveConfig("debug") != as_release) active_buildstyle = key; project->variables()["QMAKE_PBX_BUILDSTYLES"].append(key); t << "\t\t" << key << " = {" << "\n" << "\t\t\t" << "buildRules = (" << "\n" << "\t\t\t" << ");" << "\n" << "\t\t\t" << "buildSettings = {" << "\n" << "\t\t\t\t" << "COPY_PHASE_STRIP = " << (as_release ? "YES" : "NO") << ";" << "\n"; if(as_release) { t << "\t\t\t\t" << "DEBUGGING_SYMBOLS = NO;" << "\n"; } else { t << "\t\t\t\t" << "GCC_ENABLE_FIX_AND_CONTINUE = " << (project->isActiveConfig("no_fix_and_continue") ? "NO" : "YES") << ";" << "\n" << "\t\t\t\t" << "GCC_GENERATE_DEBUGGING_SYMBOLS = YES;" << "\n" << "\t\t\t\t" << "GCC_OPTIMIZATION_LEVEL = 0;" << "\n" << "\t\t\t\t" << "ZERO_LINK =" << (project->isActiveConfig("no_zero_link") ? "NO" : "YES") << ";" << "\n"; } t << "\t\t\t" << "};" << "\n" << "\t\t\t" << "isa = PBXBuildStyle;" << "\n" << "\t\t\t" << "name = " << (as_release ? "Deployment" : "Development") << ";" << "\n" << "\t\t" << "};" << "\n"; } //ROOT t << "\t\t" << keyFor("QMAKE_PBX_ROOT") << " = {" << "\n" << "\t\t\t" << "buildStyles = (" << "\n" << varGlue("QMAKE_PBX_BUILDSTYLES", "\t\t\t\t", ",\n\t\t\t\t", "\n") << "\t\t\t" << ");" << "\n" << "\t\t\t" << "hasScannedForEncodings = 1;" << "\n" << "\t\t\t" << "isa = PBXProject;" << "\n" << "\t\t\t" << "mainGroup = " << keyFor("QMAKE_PBX_ROOT_GROUP") << ";" << "\n" << "\t\t\t" << "projectDirPath = \"\";" << "\n" << "\t\t\t" << "targets = (" << "\n" << varGlue("QMAKE_PBX_TARGETS", "\t\t\t\t", ",\n\t\t\t\t", "\n") << "\t\t\t" << ");" << "\n" << "\t\t" << "};" << "\n"; //FOOTER t << "\t" << "};" << "\n" << "\t" << "rootObject = " << keyFor("QMAKE_PBX_ROOT") << ";" << "\n" << "}" << endl; if(project->isActiveConfig("generate_pbxbuild_makefile")) { QString mkwrap = fileFixify(pbx_dir + Option::dir_sep + ".." + Option::dir_sep + project->first("MAKEFILE"), QDir::currentDirPath()); QFile mkwrapf(mkwrap); if(mkwrapf.open(IO_WriteOnly | IO_Translate)) { debug_msg(1, "pbuilder: Creating file: %s", mkwrap.latin1()); QTextStream mkwrapt(&mkwrapf); writeHeader(mkwrapt); const char *cleans = "uiclean mocclean preprocess_clean "; mkwrapt << "#This is a makefile wrapper for PROJECT BUILDER\n" << "all:" << "\n\t" << "cd " << project->first("QMAKE_ORIG_TARGET") << projectSuffix() << "/ && " << pbxbuild() << "\n" << "install: all" << "\n\t" << "cd " << project->first("QMAKE_ORIG_TARGET") << projectSuffix() << "/ && " << pbxbuild() << " install\n" << "distclean clean: preprocess_clean" << "\n\t" << "cd " << project->first("QMAKE_ORIG_TARGET") << projectSuffix() << "/ && " << pbxbuild() << " clean" << "\n" << (!did_preprocess ? cleans : "") << ":" << "\n"; if(did_preprocess) mkwrapt << cleans << ":" << "\n\t" << "make -f " << pbx_dir << Option::dir_sep << "qt_preprocess.mak $@" << endl; } } return TRUE;}QStringProjectBuilderMakefileGenerator::fixQuotes(const QString &val){ QString ret(val); ret = ret.replace(QRegExp("('|\\\\|\")"), "\\\\1"); return ret;}QStringProjectBuilderMakefileGenerator::fixEnvs(const QString &file){ QRegExp reg_var("\\$\\((.*)\\)"); for(int rep = 0; (rep = reg_var.search(file, rep)) != -1; ) { if(project->variables()["QMAKE_PBX_VARS"].findIndex(reg_var.cap(1)) == -1) project->variables()["QMAKE_PBX_VARS"].append(reg_var.cap(1)); rep += reg_var.matchedLength(); } return file;}QStringProjectBuilderMakefileGenerator::fixEnvsList(const QString &where){ QString ret; const QStringList &l = project->variables()[where]; for(QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) { fixEnvs((*it)); if(!ret.isEmpty()) ret += " "; ret += fixQuotes((*it)); } return ret;}QStringProjectBuilderMakefileGenerator::keyFor(const QString &block){#if 1 //This make this code much easier to debug.. if(project->isActiveConfig("no_pb_munge_key")) return block;#endif QString ret; if(!keys.contains(block)) { ret = qtMD5(block.utf8()).left(24).upper(); keys.insert(block, ret); } else { ret = keys[block]; } return ret;}boolProjectBuilderMakefileGenerator::openOutput(QFile &file) const{ if(QDir::isRelativePath(file.name())) file.setName(Option::output_dir + file.name()); //pwd when qmake was run QFileInfo fi(file); if(fi.extension() != "pbxproj" || file.name().isEmpty()) { QString output = file.name(); if(fi.isDir()) output += QDir::separator(); if(!output.endsWith(projectSuffix())) { if(file.name().isEmpty() || fi.isDir()) output += project->first("TARGET"); output += projectSuffix() + QDir::separator(); } else if(output[(int)output.length() - 1] != QDir::separator()) { output += QDir::separator(); } output += QString("project.pbxproj"); file.setName(output); } bool ret = UnixMakefileGenerator::openOutput(file); ((ProjectBuilderMakefileGenerator*)this)->pbx_dir = Option::output_dir.section(Option::dir_sep, 0, -1); Option::output_dir = pbx_dir.section(Option::dir_sep, 0, -2); return ret;}/* This function is such a hack it is almost pointless, but it eliminates the warning message from ProjectBuilder that the project file is for an older version. I guess this could be used someday if the format of the output is dependant upon the version of ProjectBuilder as well.*/intProjectBuilderMakefileGenerator::pbuilderVersion() const{ QString ret; if(project->isEmpty("QMAKE_PBUILDER_VERSION")) { QString version, version_plist = project->first("QMAKE_PBUILDER_VERSION_PLIST"); if(version_plist.isEmpty()) { if(ideType() == MAC_XCODE && QFile::exists("/Developer/Applications/Xcode.app/Contents/version.plist")) version_plist = "/Developer/Applications/Xcode.app/Contents/version.plist"; else version_plist = "/Developer/Applications/Project Builder.app/Contents/version.plist"; } else { version_plist = version_plist.replace(QRegExp("\""), ""); } QFile version_file(version_plist); if(version_file.open(IO_ReadOnly)) { debug_msg(1, "pbuilder: version.plist: Reading file: %s", version_plist.latin1()); QTextStream plist(&version_file); bool in_dict = FALSE; QString current_key; QRegExp keyreg("^<key>(.*)</key>$"), stringreg("^<string>(.*)</string>$"); while(!plist.eof()) { QString line = plist.readLine().stripWhiteSpace(); if(line == "<dict>") in_dict = TRUE; else if(line == "</dict>") in_dict = FALSE; else if(in_dict) { if(keyreg.exactMatch(line)) current_key = keyreg.cap(1); else if(current_key == "CFBundleShortVersionString" && stringreg.exactMatch(line)) version = stringreg.cap(1); } } version_file.close(); } else { debug_msg(1, "pbuilder: version.plist: Failure to open %s", version_plist.latin1()); } if(version_plist.contains("Xcode")) { ret = "39"; } else { if(version.startsWith("2.")) ret = "38"; else if(version == "1.1") ret = "34"; } } else { ret = project->first("QMAKE_PBUILDER_VERSION"); } if(!ret.isEmpty()) { bool ok; int int_ret = ret.toInt(&ok); if(ok) { debug_msg(1, "pbuilder: version.plist: Got version: %d", int_ret); return int_ret; } } debug_msg(1, "pbuilder: version.plist: Fallback to default version"); return 34; //my fallback}intProjectBuilderMakefileGenerator::reftypeForFile(const QString &where){ int ret = 0; //absolute is the default.. if(QDir::isRelativePath(where)) ret = 4; //relative return ret; }ProjectBuilderMakefileGenerator::IDE_TYPEProjectBuilderMakefileGenerator::ideType() const{ if(!project->isActiveConfig("no_pbx_xcode") && (QFile::exists("/Developer/Applications/Xcode.app") || project->isActiveConfig("pbx_xcode"))) return ProjectBuilderMakefileGenerator::MAC_XCODE; return ProjectBuilderMakefileGenerator::MAC_PBUILDER;}QStringProjectBuilderMakefileGenerator::projectSuffix() const{ if(ideType() == MAC_XCODE) return ".xcode"; return ".pbproj";}QStringProjectBuilderMakefileGenerator::pbxbuild(){ if(QFile::exists("/usr/bin/pbbuild")) return "pbbuild"; if(QFile::exists("/usr/bin/xcodebuild")) return "xcodebuild"; return (ideType() == MAC_XCODE ? "xcodebuild" : "pbxbuild");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -