📄 makefile.cpp
字号:
} else if(project->values((*it) + ".CONFIG").indexOf("no_link") == -1) { QStringList &list = project->values("OBJECTS"); pre_dep = false; if(!list.contains(out)) list.append(out); } else { QStringList &list = project->values("UNUSED_SOURCES"); if(!list.contains(out)) list.append(out); } if(pre_dep) { QStringList &list = project->variables()["PRE_TARGETDEPS"]; if(!list.contains(out)) list.append(out); } } } else { QStringList &tmp = project->values((*it) + ".input"); for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { QStringList &inputs = project->values((*it2)); for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) { if((*input).isEmpty()) continue; QString in = Option::fixPathToTargetOS((*input), false); if(!verifyExtraCompiler((*it), in)) //verify continue; QString out = replaceExtraCompilerVariables(tmp_out, (*input), QString()); out = fileFixify(out, Option::output_dir, Option::output_dir); bool pre_dep = (project->values((*it) + ".CONFIG").indexOf("target_predeps") != -1); if(project->variables().contains((*it) + ".variable_out")) { const QStringList &var_out = project->variables().value((*it) + ".variable_out"); for(int i = 0; i < var_out.size(); ++i) { QString v = var_out.at(i); if(v == QLatin1String("SOURCES")) v = "GENERATED_SOURCES"; else if(v == QLatin1String("OBJECTS")) pre_dep = false; QStringList &list = project->values(v); if(!list.contains(out)) list.append(out); } } else if(project->values((*it) + ".CONFIG").indexOf("no_link") == -1) { pre_dep = false; QStringList &list = project->values("OBJECTS"); if(!list.contains(out)) list.append(out); } else { QStringList &list = project->values("UNUSED_SOURCES"); if(!list.contains(out)) list.append(out); } if(pre_dep) { QStringList &list = project->variables()["PRE_TARGETDEPS"]; if(!list.contains(out)) list.append(out); } } } } } //handle dependencies depHeuristicsCache.clear(); if(!noIO()) { // dependency paths QStringList incDirs = v["DEPENDPATH"] + v["QMAKE_ABSOLUTE_SOURCE_PATH"]; if(project->isActiveConfig("depend_includepath")) incDirs += v["INCLUDEPATH"]; if(!project->isActiveConfig("no_include_pwd")) { QString pwd = qmake_getpwd(); if(pwd.isEmpty()) pwd = "."; incDirs += pwd; } QList<QMakeLocalFileName> deplist; for(QStringList::Iterator it = incDirs.begin(); it != incDirs.end(); ++it) deplist.append(QMakeLocalFileName(unescapeFilePath((*it)))); QMakeSourceFileInfo::setDependencyPaths(deplist); debug_msg(1, "Dependency Directories: %s", incDirs.join(" :: ").toLatin1().constData()); //cache info if(project->isActiveConfig("qmake_cache")) { QString cache_file; if(!project->isEmpty("QMAKE_INTERNAL_CACHE_FILE")) { cache_file = Option::fixPathToLocalOS(project->first("QMAKE_INTERNAL_CACHE_FILE")); } else { cache_file = ".qmake.internal.cache"; if(project->isActiveConfig("build_pass")) cache_file += ".BUILD." + project->first("BUILD_PASS"); } if(cache_file.indexOf(QDir::separator()) == -1) cache_file.prepend(Option::output_dir + QDir::separator()); QMakeSourceFileInfo::setCacheFile(cache_file); } //add to dependency engine for(x = 0; x < compilers.count(); ++x) { const MakefileGenerator::Compiler &comp = compilers.at(x); if(!(comp.flags & Compiler::CompilerNoCheckDeps)) addSourceFiles(v[comp.variable_in], QMakeSourceFileInfo::SEEK_DEPS, (QMakeSourceFileInfo::SourceFileType)comp.type); } } processSources(); //remove anything in SOURCES which is included (thus it need not be linked in) //all sources and generated sources must be turned into objects at some point (the one builtin compiler) v["OBJECTS"] += createObjectList(v["SOURCES"]) + createObjectList(v["GENERATED_SOURCES"]); //Translation files if(!project->isEmpty("TRANSLATIONS")) { QStringList &trf = project->values("TRANSLATIONS"); for(QStringList::Iterator it = trf.begin(); it != trf.end(); ++it) (*it) = Option::fixPathToLocalOS((*it)); } { //get the output_dir into the pwd if(fileFixify(Option::output_dir) != fileFixify(qmake_getpwd())) project->values("INCLUDEPATH").append(fileFixify(Option::output_dir, Option::output_dir, Option::output_dir)); } //fix up the target deps QString fixpaths[] = { QString("PRE_TARGETDEPS"), QString("POST_TARGETDEPS"), QString() }; for(int path = 0; !fixpaths[path].isNull(); path++) { QStringList &l = v[fixpaths[path]]; for(QStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) { if(!(*val_it).isEmpty()) (*val_it) = Option::fixPathToTargetOS((*val_it), false, false); } } //extra depends if(!project->isEmpty("DEPENDS")) { QStringList &l = v["DEPENDS"]; for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) { QStringList files = v[(*it) + ".file"] + v[(*it) + ".files"]; //why do I support such evil things? for(QStringList::Iterator file_it = files.begin(); file_it != files.end(); ++file_it) { QStringList &out_deps = findDependencies(*file_it); QStringList &in_deps = v[(*it) + ".depends"]; //even more evilness.. for(QStringList::Iterator dep_it = in_deps.begin(); dep_it != in_deps.end(); ++dep_it) { if(exists(*dep_it)) { out_deps.append(*dep_it); } else { QString dir, regex = Option::fixPathToLocalOS((*dep_it)); if(regex.lastIndexOf(Option::dir_sep) != -1) { dir = regex.left(regex.lastIndexOf(Option::dir_sep) + 1); regex = regex.right(regex.length() - dir.length()); } QStringList files = QDir(dir).entryList(QStringList(regex)); if(files.isEmpty()) { warn_msg(WarnLogic, "Dependency for [%s]: Not found %s", (*file_it).toLatin1().constData(), (*dep_it).toLatin1().constData()); } else { for(int i = 0; i < files.count(); i++) out_deps.append(dir + files[i]); } } } } } } // escape qmake command if (!project->isEmpty("QMAKE_QMAKE")) { project->values("QMAKE_QMAKE") = escapeFilePaths(project->values("QMAKE_QMAKE")); }}boolMakefileGenerator::processPrlFile(QString &file){ bool ret = false, try_replace_file=false; QString meta_file, orig_file = file; if(QMakeMetaInfo::libExists(file)) { try_replace_file = true; meta_file = file; file = ""; } else { QString tmp = file; int ext = tmp.lastIndexOf('.'); if(ext != -1) tmp = tmp.left(ext); meta_file = tmp; }// meta_file = fileFixify(meta_file); QString real_meta_file = Option::fixPathToLocalOS(meta_file); if(!meta_file.isEmpty()) { QString f = fileFixify(real_meta_file, qmake_getpwd(), Option::output_dir); if(QMakeMetaInfo::libExists(f)) { QMakeMetaInfo libinfo; debug_msg(1, "Processing PRL file: %s", real_meta_file.toLatin1().constData()); if(!libinfo.readLib(f)) { fprintf(stderr, "Error processing meta file: %s\n", real_meta_file.toLatin1().constData()); } else if(project->isActiveConfig("no_read_prl_" + libinfo.type().toLower())) { debug_msg(2, "Ignored meta file %s [%s]", real_meta_file.toLatin1().constData(), libinfo.type().toLatin1().constData()); } else { ret = true; QMap<QString, QStringList> &vars = libinfo.variables(); for(QMap<QString, QStringList>::Iterator it = vars.begin(); it != vars.end(); ++it) processPrlVariable(it.key(), it.value()); if(try_replace_file && !libinfo.isEmpty("QMAKE_PRL_TARGET")) { QString dir; int slsh = real_meta_file.lastIndexOf(Option::dir_sep); if(slsh != -1) dir = real_meta_file.left(slsh+1); file = libinfo.first("QMAKE_PRL_TARGET"); if(QDir::isRelativePath(file)) file.prepend(dir); } } } if(ret) { QString mf = QMakeMetaInfo::findLib(meta_file); if(project->values("QMAKE_PRL_INTERNAL_FILES").indexOf(mf) == -1) project->values("QMAKE_PRL_INTERNAL_FILES").append(mf); if(project->values("QMAKE_INTERNAL_INCLUDED_FILES").indexOf(mf) == -1) project->values("QMAKE_INTERNAL_INCLUDED_FILES").append(mf); } } if(try_replace_file && file.isEmpty()) {#if 0 warn_msg(WarnLogic, "Found prl [%s] file with no target [%s]!", meta_file.toLatin1().constData(), orig_file.toLatin1().constData());#endif file = orig_file; } return ret;}voidMakefileGenerator::filterIncludedFiles(const QString &var){ QStringList &inputs = project->values(var); for(QStringList::Iterator input = inputs.begin(); input != inputs.end(); ) { if(QMakeSourceFileInfo::included((*input)) > 0) input = inputs.erase(input); else ++input; }}voidMakefileGenerator::processPrlVariable(const QString &var, const QStringList &l){ if(var == "QMAKE_PRL_LIBS") { QString where = "QMAKE_LIBS"; if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) where = project->first("QMAKE_INTERNAL_PRL_LIBS"); QStringList &out = project->values(where); for(QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) { if(out.indexOf((*it)) == -1) out.append((*it)); } } else if(var == "QMAKE_PRL_DEFINES") { QStringList &out = project->values("DEFINES"); for(QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) { if(out.indexOf((*it)) == -1 && project->values("PRL_EXPORT_DEFINES").indexOf((*it)) == -1) out.append((*it)); } }}voidMakefileGenerator::processPrlFiles(){ QHash<QString, bool> processed; for(bool ret = false; true; ret = false) { //read in any prl files included.. QStringList l_out; QString where = "QMAKE_LIBS"; if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) where = project->first("QMAKE_INTERNAL_PRL_LIBS"); QStringList &l = project->values(where); for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) { QString file = (*it); if(!processed.contains(file) && processPrlFile(file)) { processed.insert(file, true); ret = true; } if(!file.isEmpty()) l_out.append(file); } if(ret) l = l_out; else break; }}voidMakefileGenerator::writePrlFile(QTextStream &t){ QString target = project->first("TARGET"); int slsh = target.lastIndexOf(Option::dir_sep); if(slsh != -1) target = target.right(target.length() - slsh - 1); QString bdir = Option::output_dir; if(bdir.isEmpty()) bdir = qmake_getpwd(); t << "QMAKE_PRL_BUILD_DIR = " << bdir << endl; if(!project->projectFile().isEmpty() && project->projectFile() != "-") t << "QMAKE_PRO_INPUT = " << project->projectFile().section('/', -1) << endl; if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH")) t << "QMAKE_PRL_SOURCE_DIR = " << project->first("QMAKE_ABSOLUTE_SOURCE_PATH") << endl; t << "QMAKE_PRL_TARGET = " << target << endl; if(!project->isEmpty("PRL_EXPORT_DEFINES")) t << "QMAKE_PRL_DEFINES = " << project->values("PRL_EXPORT_DEFINES").join(" ") << endl; if(!project->isEmpty("PRL_EXPORT_CFLAGS")) t << "QMAKE_PRL_CFLAGS = " << project->values("PRL_EXPORT_CFLAGS").join(" ") << endl; if(!project->isEmpty("PRL_EXPORT_CXXFLAGS")) t << "QMAKE_PRL_CXXFLAGS = " << project->values("PRL_EXPORT_CXXFLAGS").join(" ") << endl; if(!project->isEmpty("CONFIG")) t << "QMAKE_PRL_CONFIG = " << project->values("CONFIG").join(" ") << endl; if(!project->isEmpty("TARGET_VERSION_EXT"))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -