📄 makefile.cpp
字号:
//files are already properly fixified.
for(QStringList::Iterator it = quc.begin(); it != quc.end(); ++it) {
QString tmp_out = project->variables()[(*it) + ".output"].first();
if(tmp_out.isEmpty())
continue;
if(project->variables()[(*it) + ".CONFIG"].indexOf("combine") != -1) {
QStringList &compilerInputs = project->variables()[(*it) + ".input"];
// Don't generate compiler output if it doesn't have input.
if (compilerInputs.isEmpty() || project->variables()[compilerInputs.first()].isEmpty())
continue;
if(tmp_out.indexOf("$") == -1) {
if(!verifyExtraCompiler((*it), QString())) //verify
continue;
QString out = fileFixify(tmp_out, Option::output_dir, Option::output_dir);
bool pre_dep = (project->variables()[(*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->variables()[v];
if(!list.contains(out))
list.append(out);
}
} else if(project->variables()[(*it) + ".CONFIG"].indexOf("no_link") == -1) {
pre_dep = false;
QStringList &list = project->variables()["OBJECTS"];
if(!list.contains(out))
list.append(out);
} else {
QStringList &list = project->variables()["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->variables()[(*it) + ".input"];
for(QStringList::Iterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) {
QStringList &inputs = project->variables()[(*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->variables()[(*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->variables()[v];
if(!list.contains(out))
list.append(out);
}
} else if(project->variables()[(*it) + ".CONFIG"].indexOf("no_link") == -1) {
pre_dep = false;
QStringList &list = project->variables()["OBJECTS"];
if(!list.contains(out))
list.append(out);
} else {
QStringList &list = project->variables()["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((*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"]);
{ //lex files (should just be an extra compiler)
QStringList &impls = v["LEXIMPLS"];
QStringList &l = v["LEXSOURCES"];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QString dir;
QFileInfo fi = fileInfo((*it));
if(fi.path() != ".")
dir = fi.path() + Option::dir_sep;
dir = fileFixify(dir, qmake_getpwd(), Option::output_dir);
if(!dir.isEmpty() && dir.right(Option::dir_sep.length()) != Option::dir_sep)
dir += Option::dir_sep;
QString impl = dir + fi.completeBaseName() + Option::lex_mod + Option::cpp_ext.first();
checkMultipleDefinition(impl, "SOURCES");
impls.append(impl);
if(!project->isActiveConfig("lex_included")) {
v["SOURCES"].append(impl);
// attribute deps of lex file to impl file
QStringList &lexdeps = findDependencies((*it));
QStringList &impldeps = findDependencies(impl);
for(QStringList::ConstIterator d = lexdeps.begin(); d != lexdeps.end(); ++d) {
if(!impldeps.contains(*d))
impldeps.append(*d);
}
lexdeps.clear();
}
}
if(!project->isActiveConfig("lex_included"))
v["OBJECTS"] += (v["LEXOBJECTS"] = createObjectList(impls));
}
{ //yacc files (should just be an extra compiler)
QStringList &decls = v["YACCCDECLS"], &impls = v["YACCIMPLS"];
QStringList &l = v["YACCSOURCES"];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QString dir;
QFileInfo fi = fileInfo((*it));
if(fi.path() != ".")
dir = fi.path() + Option::dir_sep;
dir = fileFixify(dir, qmake_getpwd(), Option::output_dir);
if(!dir.isEmpty() && dir.right(Option::dir_sep.length()) != Option::dir_sep)
dir += Option::dir_sep;
QString impl = dir + fi.completeBaseName() + Option::yacc_mod + Option::cpp_ext.first();
checkMultipleDefinition(impl, "GENERATED_SOURCES");
QString decl = dir + fi.completeBaseName() + Option::yacc_mod + Option::h_ext.first();
checkMultipleDefinition(decl, "HEADERS");
decls.append(decl);
impls.append(impl);
v["GENERATED_SOURCES"].append(impl);
QStringList &impldeps = findDependencies(impl);
impldeps.append(decl);
// attribute deps of yacc file to impl file
QStringList &yaccdeps = findDependencies((*it));
for(QStringList::ConstIterator d = yaccdeps.begin(); d != yaccdeps.end(); ++d) {
if(!impldeps.contains(*d))
impldeps.append(*d);
}
if(project->isActiveConfig("lex_included")) {
// is there a matching lex file ? Transfer its dependencies.
QString lexsrc = fi.completeBaseName() + Option::lex_ext;
if(fi.path() != ".")
lexsrc.prepend(fi.path() + Option::dir_sep);
if(v["LEXSOURCES"].indexOf(lexsrc) != -1) {
QString trg = dir + fi.completeBaseName() + Option::lex_mod + Option::cpp_ext.first();
impldeps.append(trg);
impldeps += findDependencies(lexsrc);
dependsCache[lexsrc].clear();
}
}
yaccdeps.clear();
}
v["OBJECTS"] += (v["YACCOBJECTS"] = createObjectList(impls));
}
//Translation files
if(!project->isEmpty("TRANSLATIONS")) {
QStringList &trf = project->variables()["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->variables()["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]);
}
}
}
}
}
}
//find out where qmake (myself) lives
if (project->isEmpty("QMAKE_QMAKE")) {
if (!Option::qmake_abslocation.isNull())
project->variables()["QMAKE_QMAKE"].append(Option::qmake_abslocation);
else
project->variables()["QMAKE_QMAKE"].append("qmake");
}
}
bool
MakefileGenerator::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())) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -