summaryrefslogtreecommitdiffstats
path: root/qmake/generators/makefile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qmake/generators/makefile.cpp')
-rw-r--r--qmake/generators/makefile.cpp188
1 files changed, 104 insertions, 84 deletions
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index d37089ee35..83354b9114 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -93,17 +93,12 @@ bool MakefileGenerator::canExecute(const QStringList &cmdline, int *a) const
QString MakefileGenerator::mkdir_p_asstring(const QString &dir, bool escape) const
{
- QString ret = "@$(CHK_DIR_EXISTS) ";
+ QString ret = "@" + chkdir + " ";
if(escape)
ret += escapeFilePath(dir);
else
ret += dir;
- ret += " ";
- if(isWindowsShell())
- ret += "$(MKDIR)";
- else
- ret += "|| $(MKDIR)";
- ret += " ";
+ ret += " " + chkglue + "$(MKDIR) ";
if(escape)
ret += escapeFilePath(dir);
else
@@ -198,12 +193,12 @@ MakefileGenerator::initOutPaths()
QHash<QString, QStringList> &v = project->variables();
//for shadow builds
if(!v.contains("QMAKE_ABSOLUTE_SOURCE_PATH")) {
- if(Option::mkfile::do_cache && !Option::mkfile::cachefile.isEmpty() &&
+ if (Option::mkfile::do_cache && !project->cacheFile().isEmpty() &&
v.contains("QMAKE_ABSOLUTE_SOURCE_ROOT")) {
QString root = v["QMAKE_ABSOLUTE_SOURCE_ROOT"].first();
root = QDir::fromNativeSeparators(root);
if(!root.isEmpty()) {
- QFileInfo fi = fileInfo(Option::mkfile::cachefile);
+ QFileInfo fi = fileInfo(project->cacheFile());
if(!fi.makeAbsolute()) {
QString cache_r = fi.path(), pwd = Option::output_dir;
if(pwd.startsWith(cache_r) && !pwd.startsWith(root)) {
@@ -431,6 +426,15 @@ MakefileGenerator::init()
init_already = true;
QHash<QString, QStringList> &v = project->variables();
+
+ chkdir = v["QMAKE_CHK_DIR_EXISTS"].join(" ");
+ chkfile = v["QMAKE_CHK_FILE_EXISTS"].join(" ");
+ if (chkfile.isEmpty()) // Backwards compat with Qt4 specs
+ chkfile = isWindowsShell() ? "if not exist" : "test -f";
+ chkglue = v["QMAKE_CHK_EXISTS_GLUE"].join(" ");
+ if (chkglue.isEmpty()) // Backwards compat with Qt4 specs
+ chkglue = isWindowsShell() ? "" : "|| ";
+
QStringList &quc = v["QMAKE_EXTRA_COMPILERS"];
//make sure the COMPILERS are in the correct input/output chain order
@@ -853,8 +857,8 @@ MakefileGenerator::init()
}
// escape qmake command
- QStringList &qmk = project->values("QMAKE_QMAKE");
- qmk = escapeFilePaths(qmk);
+ project->values("QMAKE_QMAKE") =
+ escapeFilePaths(QStringList(Option::fixPathToTargetOS(Option::qmake_abslocation, false)));
}
bool
@@ -1771,10 +1775,6 @@ MakefileGenerator::writeExtraTargets(QTextStream &t)
if(!cmd.isEmpty())
t << "\n\t" << cmd;
t << endl << endl;
-
- project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_TARGETS.") + (*it)) << escapeDependencyPath(targ);
- project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_DEPS.") + (*it) + escapeDependencyPath(targ)) << deps.split(" ", QString::SkipEmptyParts);
- project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_CMD.") + (*it) + escapeDependencyPath(targ)) << cmd;
}
}
@@ -1973,17 +1973,13 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
QString cmd = replaceExtraCompilerVariables(tmp_cmd, escapeFilePaths(inputs), QStringList(tmp_out));
t << escapeDependencyPath(tmp_out) << ":";
- project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_TARGETS.") + (*it)) << escapeDependencyPath(tmp_out);
// compiler.CONFIG+=explicit_dependencies means that ONLY compiler.depends gets to cause Makefile dependencies
if(project->values((*it) + ".CONFIG").indexOf("explicit_dependencies") != -1) {
t << " " << valList(escapeDependencyPaths(fileFixify(tmp_dep, Option::output_dir, Option::output_dir)));
- project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_DEPS.") + (*it) + escapeDependencyPath(tmp_out)) << tmp_dep;
} else {
t << " " << valList(escapeDependencyPaths(inputs)) << " " << valList(escapeDependencyPaths(deps));
- project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_DEPS.") + (*it) + escapeDependencyPath(tmp_out)) << inputs << deps;
}
t << "\n\t" << cmd << endl << endl;
- project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_CMD.") + (*it) + escapeDependencyPath(tmp_out)) << cmd;
continue;
}
for(QStringList::ConstIterator input = tmp_inputs.begin(); input != tmp_inputs.end(); ++input) {
@@ -2087,9 +2083,6 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
}
t << escapeDependencyPath(out) << ": " << valList(escapeDependencyPaths(deps)) << "\n\t"
<< cmd << endl << endl;
- project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_TARGETS.") + (*it)) << escapeDependencyPath(out);
- project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_DEPS.") + (*it) + escapeDependencyPath(out)) << deps;
- project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_CMD.") + (*it) + escapeDependencyPath(out)) << cmd;
}
}
t << "compiler_clean: " << clean_targets << endl << endl;
@@ -2193,7 +2186,9 @@ QString MakefileGenerator::buildArgs(const QString &outdir)
if(!Option::mkfile::do_dep_heuristics)
ret += " -nodependheuristics";
if(!Option::mkfile::qmakespec_commandline.isEmpty())
- ret += " -spec " + specdir(outdir);
+ ret += " -spec " + specdir(outdir, 1);
+ if (!Option::mkfile::xqmakespec_commandline.isEmpty())
+ ret += " -xspec " + specdir(outdir, 0);
if (Option::target_mode_overridden) {
if (Option::target_mode == Option::TARG_MACX_MODE)
ret += " -macx";
@@ -2307,7 +2302,7 @@ MakefileGenerator::findSubDirsSubTargets() const
if(!project->isEmpty(fixedSubdir + ".makefile")) {
st->makefile = project->first(fixedSubdir + ".makefile");
} else {
- st->makefile = "$(MAKEFILE)";
+ st->makefile = "Makefile";
if(!st->profile.isEmpty()) {
QString basename = st->in_directory;
int new_slsh = basename.lastIndexOf(Option::dir_sep);
@@ -2360,7 +2355,7 @@ void
MakefileGenerator::writeSubDirs(QTextStream &t)
{
QList<SubTarget*> targets = findSubDirsSubTargets();
- t << "first: make_default" << endl;
+ t << "first: make_first" << endl;
int flags = SubTargetInstalls;
if(project->isActiveConfig("ordered"))
flags |= SubTargetOrdered;
@@ -2377,6 +2372,22 @@ void MakefileGenerator::writeSubMakeCall(QTextStream &t, const QString &callPref
}
void
+MakefileGenerator::writeSubTargetCall(QTextStream &t,
+ const QString &in_directory, const QString &in, const QString &out_directory, const QString &out,
+ const QString &out_directory_cdin, const QString &makefilein, const QString &out_directory_cdout)
+{
+ QString pfx;
+ if (!in.isEmpty()) {
+ if (!in_directory.isEmpty())
+ t << "\n\t" << mkdir_p_asstring(out_directory);
+ pfx = "( " + chkfile + " " + out + " " + chkglue
+ + "$(QMAKE) " + in + buildArgs(in_directory) + " -o " + out
+ + " ) && ";
+ }
+ writeSubMakeCall(t, out_directory_cdin + pfx, makefilein, out_directory_cdout);
+}
+
+void
MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubTarget*> targets, int flags)
{
// blasted includes
@@ -2405,8 +2416,6 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
t << "SYMLINK = " << var("QMAKE_SYMBOLIC_LINK") << endl;
t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl;
t << "MOVE = " << var("QMAKE_MOVE") << endl;
- t << "CHK_DIR_EXISTS= " << var("QMAKE_CHK_DIR_EXISTS") << endl;
- t << "MKDIR = " << var("QMAKE_MKDIR") << endl;
t << "SUBTARGETS = "; // subtargets are sub-directory
for(int target = 0; target < targets.size(); ++target)
t << " \\\n\t\t" << targets.at(target)->target;
@@ -2417,11 +2426,13 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
QStringList targetSuffixes;
const QString abs_source_path = project->first("QMAKE_ABSOLUTE_SOURCE_PATH");
if (!(flags & SubTargetSkipDefaultTargets)) {
- targetSuffixes << "make_default" << "make_first" << "all" << "clean" << "distclean"
+ targetSuffixes << "make_first" << "all" << "clean" << "distclean"
<< QString((flags & SubTargetInstalls) ? "install_subtargets" : "install")
<< QString((flags & SubTargetInstalls) ? "uninstall_subtargets" : "uninstall");
}
+ bool dont_recurse = project->isActiveConfig("dont_recurse");
+
// generate target rules
for(int target = 0; target < targets.size(); ++target) {
SubTarget *subtarget = targets.at(target);
@@ -2434,11 +2445,6 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
if(!abs_source_path.isEmpty() && out_directory.startsWith(abs_source_path))
out_directory = Option::output_dir + out_directory.mid(abs_source_path.length());
- QString mkfile = subtarget->makefile;
- if(!in_directory.isEmpty())
- mkfile.prepend(out_directory);
-
- QString in_directory_cdin, in_directory_cdout, out_directory_cdin, out_directory_cdout;
#define MAKE_CD_IN_AND_OUT(directory) \
if(!directory.isEmpty()) { \
if(project->isActiveConfig("cd_change_global")) { \
@@ -2459,25 +2465,28 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
} else { \
directory ## _cdin = "\n\t"; \
}
- MAKE_CD_IN_AND_OUT(in_directory);
+
+ QString out_directory_cdin, out_directory_cdout;
MAKE_CD_IN_AND_OUT(out_directory);
+ QString makefilein = " -f " + subtarget->makefile;
+
//qmake it
+ QString out;
+ QString in;
if(!subtarget->profile.isEmpty()) {
- QString out = subtarget->makefile;
- QString in = escapeFilePath(fileFixify(in_directory + subtarget->profile, FileFixifyAbsolute));
+ out = subtarget->makefile;
+ in = escapeFilePath(fileFixify(in_directory + subtarget->profile, FileFixifyAbsolute));
if(out.startsWith(in_directory))
out = out.mid(in_directory.length());
- t << mkfile << ": " << "\n\t";
- if(!in_directory.isEmpty()) {
- t << mkdir_p_asstring(out_directory)
- << out_directory_cdin
- << "$(QMAKE) " << in << buildArgs(in_directory) << " -o " << out
- << in_directory_cdout << endl;
+ t << subtarget->target << "-qmake_all: ";
+ if (flags & SubTargetOrdered) {
+ if (target)
+ t << targets.at(target - 1)->target << "-qmake_all";
} else {
- t << "$(QMAKE) " << in << buildArgs(in_directory) << " -o " << out << endl;
+ if (!subtarget->depends.isEmpty())
+ t << valGlue(subtarget->depends, QString(), "-qmake_all ", "-qmake_all");
}
- t << subtarget->target << "-qmake_all: ";
if(project->isEmpty("QMAKE_NOFORCE"))
t << " FORCE";
t << "\n\t";
@@ -2485,21 +2494,24 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
t << mkdir_p_asstring(out_directory)
<< out_directory_cdin
<< "$(QMAKE) " << in << buildArgs(in_directory) << " -o " << out
- << in_directory_cdout << endl;
+ << out_directory_cdout;
} else {
- t << "$(QMAKE) " << in << buildArgs(in_directory) << " -o " << out << endl;
+ t << "$(QMAKE) " << in << buildArgs(in_directory) << " -o " << out;
}
+ if (!dont_recurse)
+ writeSubMakeCall(t, out_directory_cdin, makefilein + " qmake_all", out_directory_cdout);
+ else
+ t << endl;
}
- QString makefilein = " -f " + subtarget->makefile;
-
{ //actually compile
- t << subtarget->target << ": " << mkfile;
+ t << subtarget->target << ":";
if(!subtarget->depends.isEmpty())
t << " " << valList(subtarget->depends);
if(project->isEmpty("QMAKE_NOFORCE"))
t << " FORCE";
- writeSubMakeCall(t, out_directory_cdin, makefilein, out_directory_cdout);
+ writeSubTargetCall(t, in_directory, in, out_directory, out,
+ out_directory_cdin, makefilein, out_directory_cdout);
}
for(int suffix = 0; suffix < targetSuffixes.size(); ++suffix) {
@@ -2509,34 +2521,31 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
else if(s == "uninstall_subtargets")
s = "uninstall";
else if(s == "make_first")
- s = "first";
- else if(s == "make_default")
s = QString();
if(flags & SubTargetOrdered) {
- t << subtarget->target << "-" << targetSuffixes.at(suffix) << "-ordered: " << mkfile;
+ t << subtarget->target << "-" << targetSuffixes.at(suffix) << "-ordered:";
if(target)
t << " " << targets.at(target-1)->target << "-" << targetSuffixes.at(suffix) << "-ordered ";
if(project->isEmpty("QMAKE_NOFORCE"))
t << " FORCE";
- writeSubMakeCall(t, out_directory_cdin, makefilein + " " + s, out_directory_cdout);
+ writeSubTargetCall(t, in_directory, in, out_directory, out,
+ out_directory_cdin, makefilein + " " + s, out_directory_cdout);
}
- t << subtarget->target << "-" << targetSuffixes.at(suffix) << ": " << mkfile;
+ t << subtarget->target << "-" << targetSuffixes.at(suffix) << ":";
if(!subtarget->depends.isEmpty())
t << " " << valGlue(subtarget->depends, QString(), "-" + targetSuffixes.at(suffix) + " ",
"-"+targetSuffixes.at(suffix));
if(project->isEmpty("QMAKE_NOFORCE"))
t << " FORCE";
- writeSubMakeCall(t, out_directory_cdin, makefilein + " " + s, out_directory_cdout);
+ writeSubTargetCall(t, in_directory, in, out_directory, out,
+ out_directory_cdin, makefilein + " " + s, out_directory_cdout);
}
}
t << endl;
if (!(flags & SubTargetSkipDefaultTargets)) {
- if(project->values("QMAKE_INTERNAL_QMAKE_DEPS").indexOf("qmake_all") == -1)
- project->values("QMAKE_INTERNAL_QMAKE_DEPS").append("qmake_all");
-
- writeMakeQmake(t);
+ writeMakeQmake(t, true);
t << "qmake_all:";
if(!targets.isEmpty()) {
@@ -2560,7 +2569,7 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
t << suffix << ":";
for(int target = 0; target < targets.size(); ++target) {
SubTarget *subTarget = targets.at(target);
- if((suffix == "make_first" || suffix == "make_default")
+ if (suffix == "make_first"
&& project->values(subTarget->name + ".CONFIG").indexOf("no_default_target") != -1) {
continue;
}
@@ -2629,28 +2638,31 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
if(!recurse.contains(subtarget->name))
continue;
- QString mkfile = subtarget->makefile;
- if(!in_directory.isEmpty()) {
- if(!out_directory.endsWith(Option::dir_sep))
- mkfile.prepend(out_directory + Option::dir_sep);
- else
- mkfile.prepend(out_directory);
- }
+
QString out_directory_cdin, out_directory_cdout;
MAKE_CD_IN_AND_OUT(out_directory);
QString makefilein = " -f " + subtarget->makefile;
+ QString out;
+ QString in;
+ if (!subtarget->profile.isEmpty()) {
+ out = subtarget->makefile;
+ in = escapeFilePath(fileFixify(in_directory + subtarget->profile, FileFixifyAbsolute));
+ if (out.startsWith(in_directory))
+ out = out.mid(in_directory.length());
+ }
+
//write the rule/depends
if(flags & SubTargetOrdered) {
const QString dep = subtarget->target + "-" + (*qut_it) + "_ordered";
- t << dep << ": " << mkfile;
+ t << dep << ":";
if(target)
t << " " << targets.at(target-1)->target << "-" << (*qut_it) << "_ordered ";
deps += " " + dep;
} else {
const QString dep = subtarget->target + "-" + (*qut_it);
- t << dep << ": " << mkfile;
+ t << dep << ":";
if(!subtarget->depends.isEmpty())
t << " " << valGlue(subtarget->depends, QString(), "-" + (*qut_it) + " ", "-" + (*qut_it));
deps += " " + dep;
@@ -2661,12 +2673,8 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
sub_targ = project->first((*qut_it) + ".recurse_target");
//write the commands
- if(!out_directory.isEmpty()) {
- writeSubMakeCall(t, out_directory_cdin, makefilein + " " + sub_targ,
- out_directory_cdout);
- } else {
- writeSubMakeCall(t, "\n\t", makefilein + " " + sub_targ, QString());
- }
+ writeSubTargetCall(t, in_directory, in, out_directory, out,
+ out_directory_cdin, makefilein + " " + sub_targ, out_directory_cdout);
}
}
if(project->isEmpty("QMAKE_NOFORCE") &&
@@ -2688,7 +2696,7 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
}
void
-MakefileGenerator::writeMakeQmake(QTextStream &t)
+MakefileGenerator::writeMakeQmake(QTextStream &t, bool noDummyQmakeAll)
{
QString ofile = Option::fixPathToTargetOS(fileFixify(Option::output.fileName()));
if(project->isEmpty("QMAKE_FAILED_REQUIREMENTS") && !project->isEmpty("QMAKE_INTERNAL_PRL_FILE")) {
@@ -2702,8 +2710,12 @@ MakefileGenerator::writeMakeQmake(QTextStream &t)
QString qmake = build_args();
if(!ofile.isEmpty() && !project->isActiveConfig("no_autoqmake")) {
t << escapeFilePath(ofile) << ": " << escapeDependencyPath(fileFixify(pfile)) << " ";
- if(Option::mkfile::do_cache)
- t << escapeDependencyPath(fileFixify(Option::mkfile::cachefile)) << " ";
+ if (Option::mkfile::do_cache) {
+ if (!project->confFile().isEmpty())
+ t << escapeDependencyPath(fileFixify(project->confFile())) << " ";
+ if (!project->cacheFile().isEmpty())
+ t << escapeDependencyPath(fileFixify(project->cacheFile())) << " ";
+ }
if(!specdir().isEmpty()) {
if(exists(Option::fixPathToLocalOS(specdir()+QDir::separator()+"qmake.conf")))
t << escapeDependencyPath(specdir() + Option::dir_sep + "qmake.conf") << " ";
@@ -2718,11 +2730,18 @@ MakefileGenerator::writeMakeQmake(QTextStream &t)
}
}
if(project->first("QMAKE_ORIG_TARGET") != "qmake") {
- t << "qmake: " <<
- project->values("QMAKE_INTERNAL_QMAKE_DEPS").join(" \\\n\t\t");
+ t << "qmake:";
if(project->isEmpty("QMAKE_NOFORCE"))
t << " FORCE";
t << "\n\t" << "@" << qmake << endl << endl;
+ if (!noDummyQmakeAll) {
+ t << "qmake_all:";
+ if (project->isEmpty("QMAKE_NOFORCE"))
+ t << " FORCE";
+ if (project->isActiveConfig("no_empty_targets"))
+ t << "\n\t" << "@cd .";
+ t << endl << endl;
+ }
}
}
}
@@ -3046,13 +3065,14 @@ QStringList
}
QString
-MakefileGenerator::specdir(const QString &outdir)
+MakefileGenerator::specdir(const QString &outdir, int host_build)
{
#if 0
if(!spec.isEmpty())
return spec;
#endif
- spec = fileFixify(Option::mkfile::qmakespec, outdir);
+ spec = fileFixify((host_build >= 0 ? bool(host_build) : project->isHostBuild())
+ ? Option::mkfile::qmakespec : Option::mkfile::xqmakespec, outdir);
return spec;
}
@@ -3142,7 +3162,7 @@ MakefileGenerator::pkgConfigPrefix() const
{
if(!project->isEmpty("QMAKE_PKGCONFIG_PREFIX"))
return project->first("QMAKE_PKGCONFIG_PREFIX");
- return QLibraryInfo::rawLocation(QLibraryInfo::PrefixPath);
+ return QLibraryInfo::rawLocation(QLibraryInfo::PrefixPath, QLibraryInfo::FinalPaths);
}
QString