summaryrefslogtreecommitdiffstats
path: root/qmake/generators
diff options
context:
space:
mode:
Diffstat (limited to 'qmake/generators')
-rw-r--r--qmake/generators/mac/pbuilder_pbx.cpp83
-rw-r--r--qmake/generators/makefile.cpp6
-rw-r--r--qmake/generators/unix/unixmake.cpp14
-rw-r--r--qmake/generators/win32/msvc_vcproj.cpp2
-rw-r--r--qmake/generators/win32/winmakefile.cpp16
5 files changed, 82 insertions, 39 deletions
diff --git a/qmake/generators/mac/pbuilder_pbx.cpp b/qmake/generators/mac/pbuilder_pbx.cpp
index 719507c61d..524603aa63 100644
--- a/qmake/generators/mac/pbuilder_pbx.cpp
+++ b/qmake/generators/mac/pbuilder_pbx.cpp
@@ -301,6 +301,8 @@ ProjectBuilderMakefileGenerator::writeSubDirs(QTextStream &t)
QString defaultConfig;
for(int as_release = 0; as_release < 2; as_release++)
{
+ QString configName = (as_release ? "Release" : "Debug");
+
QMap<QString, QString> settings;
settings.insert("COPY_PHASE_STRIP", (as_release ? "YES" : "NO"));
if(as_release)
@@ -311,6 +313,12 @@ ProjectBuilderMakefileGenerator::writeSubDirs(QTextStream &t)
const ProStringList &l = project->values("QMAKE_MAC_XCODE_SETTINGS");
for(int i = 0; i < l.size(); ++i) {
ProString name = l.at(i);
+ const ProKey buildKey(name + ".build");
+ if (!project->isEmpty(buildKey)) {
+ const QString build = project->values(buildKey).first().toQString();
+ if (build.toLower() != configName.toLower())
+ continue;
+ }
const ProKey nkey(name + ".name");
if (!project->isEmpty(nkey))
name = project->first(nkey);
@@ -319,10 +327,9 @@ ProjectBuilderMakefileGenerator::writeSubDirs(QTextStream &t)
}
}
- QString name = (as_release ? "Release" : "Debug");
if (project->isActiveConfig("debug") != (bool)as_release)
- defaultConfig = name;
- QString key = keyFor("QMAKE_SUBDIR_PBX_BUILDCONFIG_" + name);
+ defaultConfig = configName;
+ QString key = keyFor("QMAKE_SUBDIR_PBX_BUILDCONFIG_" + configName);
project->values("QMAKE_SUBDIR_PBX_BUILDCONFIGS").append(key);
t << "\t\t" << key << " = {\n"
<< "\t\t\t" << writeSettings("isa", "XCBuildConfiguration", SettingsNoQuote) << ";\n"
@@ -330,7 +337,7 @@ ProjectBuilderMakefileGenerator::writeSubDirs(QTextStream &t)
for (QMap<QString, QString>::Iterator set_it = settings.begin(); set_it != settings.end(); ++set_it)
t << "\t\t\t\t" << writeSettings(set_it.key(), set_it.value()) << ";\n";
t << "\t\t\t};\n"
- << "\t\t\t" << writeSettings("name", name) << ";\n"
+ << "\t\t\t" << writeSettings("name", configName) << ";\n"
<< "\t\t};\n";
}
t << "\t\t" << keyFor("QMAKE_SUBDIR_PBX_BUILDCONFIG_LIST") << " = {\n"
@@ -867,6 +874,20 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
debug_msg(1, "pbuilder: Found library (%s) via PRL %s (%s)",
opt.toLatin1().constData(), lib_file.toLatin1().constData(), library.toLatin1().constData());
remove = true;
+
+ if (project->isActiveConfig("xcode_dynamic_library_suffix")) {
+ QString suffixSetting = project->first("QMAKE_XCODE_LIBRARY_SUFFIX_SETTING").toQString();
+ if (!suffixSetting.isEmpty()) {
+ QString librarySuffix = project->first("QMAKE_XCODE_LIBRARY_SUFFIX").toQString();
+ suffixSetting = "$(" + suffixSetting + ")";
+ if (!librarySuffix.isEmpty()) {
+ library = library.replace(librarySuffix, suffixSetting);
+ name = name.remove(librarySuffix);
+ } else {
+ library = library.replace(name, name + suffixSetting);
+ }
+ }
+ }
}
}
}
@@ -998,6 +1019,27 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
<< "\t\t\t" << writeSettings("shellScript", "make -C " + IoUtils::shellQuoteUnix(qmake_getpwd()) + " -f " + IoUtils::shellQuoteUnix(mkfile)) << ";\n"
<< "\t\t};\n";
}
+
+ if (!project->isEmpty("QMAKE_PRE_LINK")) {
+ QString phase_key = keyFor("QMAKE_PBX_PRELINK_BUILDPHASE");
+ project->values("QMAKE_PBX_BUILDPHASES").append(phase_key);
+ t << "\t\t" << phase_key << " = {\n"
+ << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n"
+ << "\t\t\t" << writeSettings("files", ProStringList(), SettingsAsList, 4) << ";\n"
+ // The build phases are not executed in the order they are defined, but by their
+ // resolved dependenices, so we have to ensure that this phase is run after the
+ // compilation phase, and before the link phase. Making the phase depend on all the
+ // object files, and "write" to the list of files to link achieves that.
+ << "\t\t\t" << writeSettings("inputPaths", ProStringList("$(OBJECT_FILE_DIR_$(CURRENT_VARIANT))/$(CURRENT_ARCH)/*" + Option::obj_ext), SettingsAsList, 4) << ";\n"
+ << "\t\t\t" << writeSettings("outputPaths", ProStringList("$(LINK_FILE_LIST_$(CURRENT_VARIANT)_$(CURRENT_ARCH))"), SettingsAsList, 4) << ";\n"
+ << "\t\t\t" << writeSettings("isa", "PBXShellScriptBuildPhase", SettingsNoQuote) << ";\n"
+ << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n"
+ << "\t\t\t" << writeSettings("name", "Qt Prelink") << ";\n"
+ << "\t\t\t" << writeSettings("shellPath", "/bin/sh") << ";\n"
+ << "\t\t\t" << writeSettings("shellScript", project->values("QMAKE_PRE_LINK")) << ";\n"
+ << "\t\t};\n";
+ }
+
//LIBRARY BUILDPHASE
if(!project->isEmpty("QMAKE_PBX_LIBRARIES")) {
tmp = project->values("QMAKE_PBX_LIBRARIES");
@@ -1023,6 +1065,24 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
<< "\t\t\t" << writeSettings("name", escapeFilePath(grp)) << ";\n"
<< "\t\t};\n";
}
+
+ if (!project->isEmpty("QMAKE_POST_LINK")) {
+ QString phase_key = keyFor("QMAKE_PBX_POSTLINK_BUILDPHASE");
+ project->values("QMAKE_PBX_BUILDPHASES").append(phase_key);
+ t << "\t\t" << phase_key << " = {\n"
+ << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n"
+ << "\t\t\t" << writeSettings("files", ProStringList(), SettingsAsList, 4) << ";\n"
+ // The build phases are not executed in the order they are defined, but by their
+ // resolved dependenices, so we have to ensure the phase is run after linking.
+ << "\t\t\t" << writeSettings("inputPaths", ProStringList("$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)"), SettingsAsList, 4) << ";\n"
+ << "\t\t\t" << writeSettings("isa", "PBXShellScriptBuildPhase", SettingsNoQuote) << ";\n"
+ << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n"
+ << "\t\t\t" << writeSettings("name", "Qt Postlink") << ";\n"
+ << "\t\t\t" << writeSettings("shellPath", "/bin/sh") << ";\n"
+ << "\t\t\t" << writeSettings("shellScript", project->values("QMAKE_POST_LINK")) << ";\n"
+ << "\t\t};\n";
+ }
+
if (!project->isEmpty("DESTDIR")) {
QString phase_key = keyFor("QMAKE_PBX_TARGET_COPY_PHASE");
QString destDir = project->first("DESTDIR").toQString();
@@ -1244,6 +1304,8 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
QString defaultConfig;
for(int as_release = 0; as_release < 2; as_release++)
{
+ QString configName = (as_release ? "Release" : "Debug");
+
QMap<QString, QString> settings;
settings.insert("COPY_PHASE_STRIP", (as_release ? "YES" : "NO"));
settings.insert("GCC_GENERATE_DEBUGGING_SYMBOLS", as_release ? "NO" : "YES");
@@ -1255,6 +1317,12 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
const ProStringList &l = project->values("QMAKE_MAC_XCODE_SETTINGS");
for(int i = 0; i < l.size(); ++i) {
ProString name = l.at(i);
+ const ProKey buildKey(name + ".build");
+ if (!project->isEmpty(buildKey)) {
+ const QString build = project->values(buildKey).first().toQString();
+ if (build.toLower() != configName.toLower())
+ continue;
+ }
const QString value = project->values(ProKey(name + ".value")).join(QString(Option::field_sep));
const ProKey nkey(name + ".name");
if (!project->isEmpty(nkey))
@@ -1271,11 +1339,10 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
settings.insert("PRODUCT_NAME", escapeFilePath(lib.toQString()));
}
- QString name = (as_release ? "Release" : "Debug");
if (project->isActiveConfig("debug") != (bool)as_release)
- defaultConfig = name;
+ defaultConfig = configName;
for (int i = 0; i < buildConfigGroups.size(); i++) {
- QString key = keyFor("QMAKE_PBX_BUILDCONFIG_" + name + buildConfigGroups.at(i));
+ QString key = keyFor("QMAKE_PBX_BUILDCONFIG_" + configName + buildConfigGroups.at(i));
project->values(ProKey("QMAKE_PBX_BUILDCONFIGS_" + buildConfigGroups.at(i))).append(key);
t << "\t\t" << key << " = {\n"
<< "\t\t\t" << writeSettings("isa", "XCBuildConfiguration", SettingsNoQuote) << ";\n"
@@ -1429,7 +1496,7 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
}
}
t << "\t\t\t};\n"
- << "\t\t\t" << writeSettings("name", name) << ";\n"
+ << "\t\t\t" << writeSettings("name", configName) << ";\n"
<< "\t\t};\n";
}
}
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 570f3216e3..9ebaf60843 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -3240,7 +3240,8 @@ MakefileGenerator::writePkgConfigFile()
}
}
}
- t << var << "=" << val << endl;
+ if (!val.isEmpty())
+ t << var << "=" << val << endl;
}
t << endl;
@@ -3331,8 +3332,7 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QSt
{
QString ret;
if (project->isEmpty(replace_rule)
- || project->isActiveConfig("no_sed_meta_install")
- || project->isEmpty("QMAKE_STREAM_EDITOR")) {
+ || project->isActiveConfig("no_sed_meta_install")) {
ret += "-$(INSTALL_FILE) \"" + src + "\" \"" + dst + "\"";
} else {
ret += "-$(SED)";
diff --git a/qmake/generators/unix/unixmake.cpp b/qmake/generators/unix/unixmake.cpp
index adeb55af86..1c95392932 100644
--- a/qmake/generators/unix/unixmake.cpp
+++ b/qmake/generators/unix/unixmake.cpp
@@ -106,20 +106,8 @@ UnixMakefileGenerator::init()
return; /* subdirs is done */
}
- //If the TARGET looks like a path split it into DESTDIR and the resulting TARGET
- if(!project->isEmpty("TARGET")) {
+ if (!project->isEmpty("TARGET"))
project->values("TARGET") = escapeFilePaths(project->values("TARGET"));
- ProString targ = unescapeFilePath(project->first("TARGET"));
- int slsh = qMax(targ.lastIndexOf('/'), targ.lastIndexOf(Option::dir_sep));
- if(slsh != -1) {
- if(project->isEmpty("DESTDIR"))
- project->values("DESTDIR").append("");
- else if(project->first("DESTDIR").right(1) != Option::dir_sep)
- project->values("DESTDIR") = ProStringList(project->first("DESTDIR") + Option::dir_sep);
- project->values("DESTDIR") = ProStringList(project->first("DESTDIR") + targ.left(slsh+1));
- project->values("TARGET") = ProStringList(targ.mid(slsh+1));
- }
- }
project->values("QMAKE_ORIG_TARGET") = project->values("TARGET");
project->values("QMAKE_ORIG_DESTDIR") = project->values("DESTDIR");
diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp
index 86d31b01dc..a30129fa27 100644
--- a/qmake/generators/win32/msvc_vcproj.cpp
+++ b/qmake/generators/win32/msvc_vcproj.cpp
@@ -449,7 +449,7 @@ ProStringList VcprojGenerator::collectDependencies(QMakeProject *proj, QHash<QSt
if (!qmake_setpwd(dir))
fprintf(stderr, "Cannot find directory: %s", dir.toLatin1().constData());
}
- Option::output_dir = Option::globals->shadowedPath(QDir::cleanPath(fi.absoluteFilePath()));
+ Option::output_dir = Option::globals->shadowedPath(QDir::cleanPath(dir));
if (tmp_proj.read(fn)) {
// Check if all requirements are fulfilled
if (!tmp_proj.isEmpty("QMAKE_FAILED_REQUIREMENTS")) {
diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp
index 2ef2d82b5a..30d28e6e11 100644
--- a/qmake/generators/win32/winmakefile.cpp
+++ b/qmake/generators/win32/winmakefile.cpp
@@ -274,20 +274,6 @@ Win32MakefileGenerator::processPrlFiles()
void Win32MakefileGenerator::processVars()
{
- //If the TARGET looks like a path split it into DESTDIR and the resulting TARGET
- if(!project->isEmpty("TARGET")) {
- ProString targ = project->first("TARGET");
- int slsh = qMax(targ.lastIndexOf('/'), targ.lastIndexOf(Option::dir_sep));
- if(slsh != -1) {
- if(project->isEmpty("DESTDIR"))
- project->values("DESTDIR").append("");
- else if(project->first("DESTDIR").right(1) != Option::dir_sep)
- project->values("DESTDIR") = ProStringList(project->first("DESTDIR") + Option::dir_sep);
- project->values("DESTDIR") = ProStringList(project->first("DESTDIR") + targ.left(slsh+1));
- project->values("TARGET") = ProStringList(targ.mid(slsh+1));
- }
- }
-
project->values("QMAKE_ORIG_TARGET") = project->values("TARGET");
if (project->isEmpty("QMAKE_PROJECT_NAME"))
project->values("QMAKE_PROJECT_NAME") = project->values("QMAKE_ORIG_TARGET");
@@ -315,6 +301,8 @@ void Win32MakefileGenerator::processVars()
project->values("QMAKE_COPY_FILE").append("$(COPY)");
if(project->isEmpty("QMAKE_COPY_DIR"))
project->values("QMAKE_COPY_DIR").append("xcopy /s /q /y /i");
+ if (project->isEmpty("QMAKE_STREAM_EDITOR"))
+ project->values("QMAKE_STREAM_EDITOR").append("$(QMAKE) -install sed");
if(project->isEmpty("QMAKE_INSTALL_FILE"))
project->values("QMAKE_INSTALL_FILE").append("$(COPY_FILE)");
if(project->isEmpty("QMAKE_INSTALL_PROGRAM"))