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

📄 pbuilder_pbx.cpp

📁 Trolltech公司发布的基于C++图形开发环境
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	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 + -