summaryrefslogtreecommitdiffstats
path: root/qmake/generators
diff options
context:
space:
mode:
Diffstat (limited to 'qmake/generators')
-rw-r--r--qmake/generators/integrity/gbuild.cpp1
-rw-r--r--qmake/generators/mac/pbuilder_pbx.cpp40
-rw-r--r--qmake/generators/makefile.cpp22
-rw-r--r--qmake/generators/makefile.h1
-rw-r--r--qmake/generators/unix/unixmake2.cpp20
-rw-r--r--qmake/generators/win32/msbuild_objectmodel.cpp13
-rw-r--r--qmake/generators/win32/msvc_nmake.cpp18
-rw-r--r--qmake/generators/win32/msvc_objectmodel.cpp20
-rw-r--r--qmake/generators/win32/msvc_objectmodel.h1
-rw-r--r--qmake/generators/win32/msvc_vcproj.cpp49
10 files changed, 107 insertions, 78 deletions
diff --git a/qmake/generators/integrity/gbuild.cpp b/qmake/generators/integrity/gbuild.cpp
index 8a3a75b7d9..e8e992b694 100644
--- a/qmake/generators/integrity/gbuild.cpp
+++ b/qmake/generators/integrity/gbuild.cpp
@@ -417,6 +417,7 @@ QString GBuildMakefileGenerator::writeOne(QString filename, QString pathtoremove
bool
GBuildMakefileGenerator::openOutput(QFile &file, const QString &build) const
{
+ Q_UNUSED(build)
debug_msg(1, "file is %s", file.fileName().toLatin1().constData());
QFileInfo fi(file);
if (fi.filePath().isEmpty())
diff --git a/qmake/generators/mac/pbuilder_pbx.cpp b/qmake/generators/mac/pbuilder_pbx.cpp
index 524603aa63..2674f31d03 100644
--- a/qmake/generators/mac/pbuilder_pbx.cpp
+++ b/qmake/generators/mac/pbuilder_pbx.cpp
@@ -463,12 +463,12 @@ ProjectBuilderSources::files(QMakeProject *project) const
{
QStringList ret = project->values(ProKey(key)).toQStringList();
if(key == "QMAKE_INTERNAL_INCLUDED_FILES") {
+ QStringList newret;
for(int i = 0; i < ret.size(); ++i) {
- QStringList newret;
if(!ret.at(i).endsWith(Option::prf_ext))
newret.append(ret.at(i));
- ret = newret;
}
+ ret = newret;
}
if(key == "SOURCES" && project->first("TEMPLATE") == "app" && !project->isEmpty("ICON"))
ret.append(project->first("ICON").toQString());
@@ -1260,11 +1260,33 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
<< "\t\t\t" << writeSettings("sourceTree", "<Group>") << ";\n"
<< "\t\t};\n";
+ {
+ QString aggregate_target_key = keyFor(pbx_dir + "QMAKE_PBX_AGGREGATE_TARGET");
+ project->values("QMAKE_PBX_TARGETS").append(aggregate_target_key);
+ t << "\t\t" << aggregate_target_key << " = {\n"
+ << "\t\t\t" << writeSettings("buildPhases", project->values("QMAKE_PBX_PRESCRIPT_BUILDPHASES"), SettingsAsList, 4) << ";\n"
+ << "\t\t\t" << writeSettings("dependencies", ProStringList(), SettingsAsList, 4) << ";\n"
+ << "\t\t\t" << writeSettings("buildConfigurationList", keyFor("QMAKE_PBX_BUILDCONFIG_LIST_TARGET"), SettingsNoQuote) << ";\n"
+ << "\t\t\t" << writeSettings("isa", "PBXAggregateTarget", SettingsNoQuote) << ";\n"
+ << "\t\t\t" << writeSettings("buildRules", ProStringList(), SettingsAsList) << ";\n"
+ << "\t\t\t" << writeSettings("productName", "Qt Preprocess") << ";\n"
+ << "\t\t\t" << writeSettings("name", "Qt Preprocess") << ";\n"
+ << "\t\t};\n";
+
+ QString aggregate_target_dep_key = keyFor(pbx_dir + "QMAKE_PBX_AGGREGATE_TARGET_DEP");
+ t << "\t\t" << aggregate_target_dep_key << " = {\n"
+ << "\t\t\t" << writeSettings("isa", "PBXTargetDependency", SettingsNoQuote) << ";\n"
+ << "\t\t\t" << writeSettings("target", aggregate_target_key) << ";\n"
+ << "\t\t};\n";
+
+ project->values("QMAKE_PBX_TARGET_DEPENDS").append(aggregate_target_dep_key);
+ }
+
//TARGET
QString target_key = keyFor(pbx_dir + "QMAKE_PBX_TARGET");
- project->values("QMAKE_PBX_TARGETS").append(target_key);
+ project->values("QMAKE_PBX_TARGETS").prepend(target_key);
t << "\t\t" << target_key << " = {\n"
- << "\t\t\t" << writeSettings("buildPhases", project->values("QMAKE_PBX_PRESCRIPT_BUILDPHASES") + project->values("QMAKE_PBX_BUILDPHASES"),
+ << "\t\t\t" << writeSettings("buildPhases", project->values("QMAKE_PBX_BUILDPHASES"),
SettingsAsList, 4) << ";\n";
t << "\t\t\t" << writeSettings("dependencies", project->values("QMAKE_PBX_TARGET_DEPENDS"), SettingsAsList, 4) << ";\n"
<< "\t\t\t" << writeSettings("productReference", keyFor(pbx_dir + "QMAKE_PBX_REFERENCE")) << ";\n";
@@ -1367,7 +1389,7 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
if ((project->first("TEMPLATE") == "app" && project->isActiveConfig("app_bundle")) ||
(project->first("TEMPLATE") == "lib" && !project->isActiveConfig("staticlib") &&
project->isActiveConfig("lib_bundle"))) {
- QString plist = fileFixify(project->first("QMAKE_INFO_PLIST").toQString());
+ QString plist = fileFixify(project->first("QMAKE_INFO_PLIST").toQString(), Option::output_dir, input_dir);
if (plist.isEmpty())
plist = specdir() + QDir::separator() + "Info.plist." + project->first("TEMPLATE");
if (exists(plist)) {
@@ -1382,7 +1404,10 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
} else {
plist_in_text = plist_in_text.replace("@LIBRARY@", project->first("QMAKE_ORIG_TARGET").toQString());
}
- plist_in_text = plist_in_text.replace("@BUNDLEIDENTIFIER@", QLatin1String("${PRODUCT_NAME:rfc1034identifier}"));
+ QString bundlePrefix = project->first("QMAKE_TARGET_BUNDLE_PREFIX").toQString();
+ if (bundlePrefix.isEmpty())
+ bundlePrefix = "com.yourcompany";
+ plist_in_text = plist_in_text.replace("@BUNDLEIDENTIFIER@", bundlePrefix + "." + QLatin1String("${PRODUCT_NAME:rfc1034identifier}"));
if (!project->values("VERSION").isEmpty()) {
plist_in_text = plist_in_text.replace("@SHORT_VERSION@", project->first("VER_MAJ") + "." +
project->first("VER_MIN"));
@@ -1397,6 +1422,8 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
t << "\t\t\t\t" << writeSettings("INFOPLIST_FILE", "Info.plist") << ";\n";
}
}
+ } else {
+ warn_msg(WarnLogic, "Could not resolve Info.plist: '%s'. Check if QMAKE_INFO_PLIST points to a valid file.", plist.toLatin1().constData());
}
}
@@ -1770,6 +1797,7 @@ ProjectBuilderMakefileGenerator::reftypeForFile(const QString &where)
QString ProjectBuilderMakefileGenerator::sourceTreeForFile(const QString &where)
{
+ Q_UNUSED(where)
// We always use absolute paths, instead of maintaining the SRCROOT
// build variable and making files relative to that.
return QLatin1String("<absolute>");
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 9ebaf60843..d88c6e447a 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -43,6 +43,9 @@
#include "option.h"
#include "cachekeys.h"
#include "meta.h"
+
+#include <ioutils.h>
+
#include <qdir.h>
#include <qfile.h>
#include <qtextstream.h>
@@ -52,6 +55,7 @@
#include <qbuffer.h>
#include <qsettings.h>
#include <qdatetime.h>
+
#if defined(Q_OS_UNIX)
#include <unistd.h>
#else
@@ -92,7 +96,7 @@ bool MakefileGenerator::canExecute(const QStringList &cmdline, int *a) const
QString MakefileGenerator::mkdir_p_asstring(const QString &dir, bool escape) const
{
- QString edir = escape ? escapeFilePath(dir) : dir;
+ QString edir = escape ? escapeFilePath(Option::fixPathToTargetOS(dir, false, false)) : dir;
return "@" + makedir.arg(edir);
}
@@ -2261,7 +2265,7 @@ QString MakefileGenerator::buildArgs()
{
QString ret;
- foreach (const QString &arg, Option::qmake_args)
+ foreach (const QString &arg, Option::globals->qmake_args)
ret += " " + escapeFilePath(arg);
return ret;
}
@@ -3270,7 +3274,11 @@ MakefileGenerator::writePkgConfigFile()
}
}
t << "Description: " << desc << endl;
- t << "Version: " << project->first("VERSION") << endl;
+ ProString version = project->first("QMAKE_PKGCONFIG_VERSION");
+ if (version.isEmpty())
+ version = project->first("VERSION");
+ if (!version.isEmpty())
+ t << "Version: " << version << endl;
// libs
t << "Libs: ";
@@ -3341,11 +3349,17 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QSt
const ProString match = project->first(ProKey(replace_rules.at(r) + ".match")),
replace = project->first(ProKey(replace_rules.at(r) + ".replace"));
if (!match.isEmpty() /*&& match != replace*/)
- ret += " -e \"s," + match + "," + replace + ",g\"";
+ ret += " -e " + shellQuote("s," + match + "," + replace + ",g");
}
ret += " \"" + src + "\" >\"" + dst + "\"";
}
return ret;
}
+QString MakefileGenerator::shellQuote(const QString &str)
+{
+ return isWindowsShell() ? QMakeInternal::IoUtils::shellQuoteWin(str)
+ : QMakeInternal::IoUtils::shellQuoteUnix(str);
+}
+
QT_END_NAMESPACE
diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h
index 09327c599c..4b8a96c15f 100644
--- a/qmake/generators/makefile.h
+++ b/qmake/generators/makefile.h
@@ -271,6 +271,7 @@ public:
virtual bool mergeBuildProject(MakefileGenerator * /*other*/) { return false; }
virtual bool openOutput(QFile &, const QString &build) const;
bool isWindowsShell() const { return Option::dir_sep == QLatin1String("\\"); }
+ QString shellQuote(const QString &str);
};
inline void MakefileGenerator::setNoIO(bool o)
diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
index 2373059f79..35639a33bf 100644
--- a/qmake/generators/unix/unixmake2.cpp
+++ b/qmake/generators/unix/unixmake2.cpp
@@ -285,13 +285,13 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
t << odir << ".deps/%.d: " << pwd << "/%.cpp\n\t";
if(project->isActiveConfig("echo_depend_creation"))
t << "@echo Creating depend for $<\n\t";
- t << mkdir_p_asstring("$(@D)") << "\n\t"
+ t << mkdir_p_asstring("$(@D)", false) << "\n\t"
<< "@$(CXX) " << cmd << " $< | sed \"s,^\\($(*F).o\\):," << odir << "\\1:,g\" >$@\n\n";
t << odir << ".deps/%.d: " << pwd << "/%.c\n\t";
if(project->isActiveConfig("echo_depend_creation"))
t << "@echo Creating depend for $<\n\t";
- t << mkdir_p_asstring("$(@D)") << "\n\t"
+ t << mkdir_p_asstring("$(@D)", false) << "\n\t"
<< "@$(CC) " << cmd << " $< | sed \"s,^\\($(*F).o\\):," << odir << "\\1:,g\" >$@\n\n";
static const char * const src[] = { "SOURCES", "GENERATED_SOURCES", 0 };
@@ -502,7 +502,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
incr_lflags += var("QMAKE_LFLAGS_RELEASE");
t << incr_target_dir << ": $(INCREMENTAL_OBJECTS)\n\t";
if(!destdir.isEmpty())
- t << mkdir_p_asstring(destdir) << "\n\t";
+ t << mkdir_p_asstring(destdir, false) << "\n\t";
t << "$(LINK) " << incr_lflags << " " << var("QMAKE_LINK_O_FLAG") << incr_target_dir <<
" $(INCREMENTAL_OBJECTS)\n";
//communicated below
@@ -528,7 +528,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
<< " " << var("POST_TARGETDEPS");
}
if(!destdir.isEmpty())
- t << "\n\t" << mkdir_p_asstring(destdir);
+ t << "\n\t" << mkdir_p_asstring(destdir, false);
if(!project->isEmpty("QMAKE_PRE_LINK"))
t << "\n\t" << var("QMAKE_PRE_LINK");
@@ -685,7 +685,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
if(!project->first("QMAKE_PKGINFO").isEmpty()) {
ProString pkginfo = escapeFilePath(project->first("QMAKE_PKGINFO"));
- QString destdir = escapeFilePath(project->first("DESTDIR") + project->first("QMAKE_BUNDLE") + "/Contents");
+ QString destdir = project->first("DESTDIR") + project->first("QMAKE_BUNDLE") + "/Contents";
t << pkginfo << ": \n\t";
if(!destdir.isEmpty())
t << mkdir_p_asstring(destdir) << "\n\t";
@@ -697,7 +697,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
if(!project->first("QMAKE_BUNDLE_RESOURCE_FILE").isEmpty()) {
ProString resources = escapeFilePath(project->first("QMAKE_BUNDLE_RESOURCE_FILE"));
bundledFiles << resources;
- QString destdir = escapeFilePath(project->first("DESTDIR") + project->first("QMAKE_BUNDLE") + "/Contents/Resources");
+ QString destdir = project->first("DESTDIR") + project->first("QMAKE_BUNDLE") + "/Contents/Resources";
t << resources << ": \n\t";
t << mkdir_p_asstring(destdir) << "\n\t";
t << "@touch " << resources << "\n\t\n";
@@ -710,7 +710,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
QString destdir = info_plist_out.section(Option::dir_sep, 0, -2);
t << info_plist_out << ": \n\t";
if(!destdir.isEmpty())
- t << mkdir_p_asstring(destdir) << "\n\t";
+ t << mkdir_p_asstring(destdir, false) << "\n\t";
ProStringList commonSedArgs;
if (!project->values("VERSION").isEmpty())
commonSedArgs << "-e \"s,@SHORT_VERSION@," << project->first("VER_MAJ") << "." << project->first("VER_MIN") << ",g\" ";
@@ -804,7 +804,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
project->first("OBJECTS_DIR")) + ddir,
Option::output_dir, Option::output_dir));
t << "dist: \n\t"
- << mkdir_p_asstring(ddir_c) << "\n\t"
+ << mkdir_p_asstring(ddir_c, false) << "\n\t"
<< "$(COPY_FILE) --parents $(SOURCES) $(DIST) " << ddir_c << Option::dir_sep << " && ";
if(!project->isEmpty("QMAKE_EXTRA_COMPILERS")) {
const ProStringList &quc = project->values("QMAKE_EXTRA_COMPILERS");
@@ -920,7 +920,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
t << "\t-$(DEL_FILE) " << destdir << "$(TARGET0) " << destdir << "$(TARGET1) "
<< destdir << "$(TARGET2) $(TARGETA)\n";
} else {
- t << "\t-$(DEL_FILE) $(TARGET) \n";
+ t << "\t-$(DEL_FILE) " << destdir << "$(TARGET) \n";
}
t << varGlue("QMAKE_DISTCLEAN","\t-$(DEL_FILE) "," ","\n");
{
@@ -1266,6 +1266,8 @@ void UnixMakefileGenerator::init2()
alldeps += path + Option::dir_sep + fileInfo(files[file].toQString()).fileName();
}
}
+ } else {
+ warn_msg(WarnLogic, "Could not resolve Info.plist: '%s'. Check if QMAKE_INFO_PLIST points to a valid file.", plist.toLatin1().constData());
}
}
}
diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp
index a83f8f364b..f5a6e15a7b 100644
--- a/qmake/generators/win32/msbuild_objectmodel.cpp
+++ b/qmake/generators/win32/msbuild_objectmodel.cpp
@@ -147,6 +147,7 @@ const char _HeapReserveSize[] = "HeapReserveSize";
const char _IgnoreAllDefaultLibraries[] = "IgnoreAllDefaultLibraries";
const char _IgnoreEmbeddedIDL[] = "IgnoreEmbeddedIDL";
const char _IgnoreImportLibrary[] = "IgnoreImportLibrary";
+const char _ImageHasSafeExceptionHandlers[] = "ImageHasSafeExceptionHandlers";
const char _IgnoreSpecificDefaultLibraries[] = "IgnoreSpecificDefaultLibraries";
const char _IgnoreStandardIncludePath[] = "IgnoreStandardIncludePath";
const char _ImportLibrary[] = "ImportLibrary";
@@ -1494,6 +1495,7 @@ void VCXProjectWriter::write(XmlOutput &xml, const VCLinkerTool &tool)
<< attrTagT(_IgnoreAllDefaultLibraries, tool.IgnoreAllDefaultLibraries)
<< attrTagT(_IgnoreEmbeddedIDL, tool.IgnoreEmbeddedIDL)
<< attrTagT(_IgnoreImportLibrary, tool.IgnoreImportLibrary)
+ << attrTagT(_ImageHasSafeExceptionHandlers, tool.ImageHasSafeExceptionHandlers)
<< attrTagX(_IgnoreSpecificDefaultLibraries, tool.IgnoreDefaultLibraryNames, ";")
<< attrTagS(_ImportLibrary, tool.ImportLibrary)
<< attrTagS(_KeyContainer, tool.KeyContainer)
@@ -1760,9 +1762,6 @@ void VCXProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, XmlOutpu
else
root = new XTreeNode;
- QString name, extfilter;
- triState parse;
-
for (int i = 0; i < project.SingleProjects.count(); ++i) {
VCFilter filter;
const VCProjectSingleConfig &singleCfg = project.SingleProjects.at(i);
@@ -1792,14 +1791,6 @@ void VCXProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, XmlOutpu
// Merge all files in this filter to root tree
for (int x = 0; x < filter.Files.count(); ++x)
root->addElement(filter.Files.at(x));
-
- // Save filter setting from first filter. Next filters
- // may differ but we cannot handle that. (ex. extfilter)
- if (name.isEmpty()) {
- name = filter.Name;
- extfilter = filter.Filter;
- parse = filter.ParseFiles;
- }
}
if (!root->hasElements())
diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp
index f50b3dd0d0..6d148e41a2 100644
--- a/qmake/generators/win32/msvc_nmake.cpp
+++ b/qmake/generators/win32/msvc_nmake.cpp
@@ -113,9 +113,7 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
qPrintable(variables["QMAKESPEC"].first().toQString()));
return false;
}
- }
-#ifdef Q_OS_WIN
- else if (project->isActiveConfig(QStringLiteral("winrt"))) {
+ } else if (project->isActiveConfig(QStringLiteral("winrt"))) {
QString arch = project->first("VCPROJ_ARCH").toQString().toLower();
QString compiler;
QString compilerArch;
@@ -143,6 +141,8 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
return false;
}
+ const bool isPhone = project->isActiveConfig(QStringLiteral("winphone"));
+#ifdef Q_OS_WIN
QString regKeyPrefix;
#if !defined(Q_OS_WIN64) && _WIN32_WINNT >= 0x0501
BOOL isWow64;
@@ -160,7 +160,6 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
return false;
}
- const bool isPhone = project->isActiveConfig(QStringLiteral("winphone"));
regKey = regKeyPrefix
+ (isPhone ? QStringLiteral("Microsoft\\Microsoft SDKs\\WindowsPhone\\v")
: QStringLiteral("Microsoft\\Microsoft SDKs\\Windows\\v"))
@@ -170,6 +169,10 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
fprintf(stderr, "Failed to find the Windows Kit installation directory.\n");
return false;
}
+#else
+ const QString vcInstallDir = "/fake/vc_install_dir";
+ const QString kitDir = "/fake/sdk_install_dir";
+#endif // Q_OS_WIN
QStringList incDirs;
QStringList libDirs;
@@ -209,7 +212,6 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
t << "\nLIB = " << nmakePathList(libDirs);
t << "\nPATH = " << nmakePathList(binDirs) << '\n';
}
-#endif // Q_OS_WIN
}
writeNmakeParts(t);
return MakefileGenerator::writeMakefile(t);
@@ -251,8 +253,10 @@ QString NmakeMakefileGenerator::defaultInstall(const QString &t)
if(targetdir.right(1) != Option::dir_sep)
targetdir += Option::dir_sep;
- if(t == "target" && project->first("TEMPLATE") == "lib") {
- if(project->isActiveConfig("shared") && project->isActiveConfig("debug")) {
+ if (project->isActiveConfig("debug")) {
+ if (t == "dlltarget"
+ || (project->first("TEMPLATE") == "lib"
+ && project->isActiveConfig("shared"))) {
QString pdb_target = getPdbTarget();
pdb_target.remove('"');
QString src_targ = (project->isEmpty("DESTDIR") ? QString("$(DESTDIR)") : project->first("DESTDIR")) + pdb_target;
diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp
index 09213bec8e..019bb2504d 100644
--- a/qmake/generators/win32/msvc_objectmodel.cpp
+++ b/qmake/generators/win32/msvc_objectmodel.cpp
@@ -1172,6 +1172,7 @@ VCLinkerTool::VCLinkerTool()
IgnoreAllDefaultLibraries(unset),
IgnoreEmbeddedIDL(unset),
IgnoreImportLibrary(_True),
+ ImageHasSafeExceptionHandlers(unset),
LargeAddressAware(addrAwareDefault),
LinkDLL(unset),
LinkIncremental(linkIncrementalDefault),
@@ -1198,7 +1199,6 @@ VCLinkerTool::VCLinkerTool()
TurnOffAssemblyGeneration(unset),
TypeLibraryResourceID(0),
GenerateManifest(unset),
- GenerateWindowsMetadata(unset),
EnableUAC(unset),
UACUIAccess(unset),
SectionAlignment(-1),
@@ -1206,7 +1206,8 @@ VCLinkerTool::VCLinkerTool()
AllowIsolation(unset),
AssemblyDebug(unset),
CLRUnmanagedCodeCheck(unset),
- DelaySign(unset)
+ DelaySign(unset),
+ GenerateWindowsMetadata(unset)
{
}
@@ -1654,11 +1655,12 @@ bool VCLinkerTool::parseOption(const char* option)
StackCommitSize = both[1].toLongLong();
}
break;
- case 0x75AA4D8: // /SAFESH:{NO}
- {
+ case 0x75AA4D8: // /SAFESEH:{NO}
+ if (config->CompilerVersion >= NET2010)
+ ImageHasSafeExceptionHandlers = (option[8] == ':') ? _False : _True;
+ else
AdditionalOptions += option;
- break;
- }
+ break;
case 0x9B3C00D:
case 0x78dc00d: // /SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|WINDOWSCE}[,major[.minor]]
{
@@ -2119,9 +2121,9 @@ VCPreLinkEventTool::VCPreLinkEventTool()
// VCConfiguration --------------------------------------------------
VCConfiguration::VCConfiguration()
- : ATLMinimizesCRunTimeLibraryUsage(unset),
- WinRT(false),
+ : WinRT(false),
WinPhone(false),
+ ATLMinimizesCRunTimeLibraryUsage(unset),
BuildBrowserInformation(unset),
CharacterSet(charSetNotSet),
ConfigurationType(typeApplication),
@@ -2859,7 +2861,7 @@ void VCProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, const QSt
root = new TreeNode;
QString name, extfilter, guid;
- triState parse;
+ triState parse = unset;
for (int i = 0; i < project.SingleProjects.count(); ++i) {
VCFilter filter;
diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h
index 4e19a43a8c..58b528301c 100644
--- a/qmake/generators/win32/msvc_objectmodel.h
+++ b/qmake/generators/win32/msvc_objectmodel.h
@@ -615,6 +615,7 @@ public:
QStringList IgnoreDefaultLibraryNames;
triState IgnoreEmbeddedIDL;
triState IgnoreImportLibrary;
+ triState ImageHasSafeExceptionHandlers;
QString ImportLibrary;
addressAwarenessType LargeAddressAware;
triState LinkDLL;
diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp
index a30129fa27..934902fd4a 100644
--- a/qmake/generators/win32/msvc_vcproj.cpp
+++ b/qmake/generators/win32/msvc_vcproj.cpp
@@ -124,17 +124,17 @@ DotNET which_dotnet_version()
// Fallback to .NET 2002
current_version = NET2002;
- QStringList warnPath;
+ const DotNetCombo *lowestInstalledVersion = 0;
QHash<DotNET, QString> installPaths;
int installed = 0;
int i = 0;
for(; dotNetCombo[i].version; ++i) {
QString path = qt_readRegistryKey(HKEY_LOCAL_MACHINE, dotNetCombo[i].regKey);
if (!path.isEmpty() && installPaths.value(dotNetCombo[i].version) != path) {
- installPaths.insert(dotNetCombo[i].version, path);
+ lowestInstalledVersion = &dotNetCombo[i];
+ installPaths.insert(lowestInstalledVersion->version, path);
++installed;
- current_version = dotNetCombo[i].version;
- warnPath += QString("%1").arg(dotNetCombo[i].versionStr);
+ current_version = lowestInstalledVersion->version;
}
}
@@ -143,35 +143,20 @@ DotNET which_dotnet_version()
// More than one version installed, search directory path
QString paths = qgetenv("PATH");
- QStringList pathlist = paths.toLower().split(";");
-
- i = installed = 0;
- for(; dotNetCombo[i].version; ++i) {
- QString productPath = qt_readRegistryKey(HKEY_LOCAL_MACHINE, dotNetCombo[i].regKey).toLower();
- if (productPath.isEmpty())
- continue;
- QStringList::iterator it;
- for(it = pathlist.begin(); it != pathlist.end(); ++it) {
- if((*it).contains(productPath)) {
- ++installed;
- current_version = dotNetCombo[i].version;
- warnPath += QString("%1 in path").arg(dotNetCombo[i].versionStr);
- break;
- }
+ const QStringList pathlist = paths.split(QLatin1Char(';'));
+ foreach (const QString &path, pathlist) {
+ for (i = 0; dotNetCombo[i].version; ++i) {
+ const QString productPath = installPaths.value(dotNetCombo[i].version);
+ if (productPath.isEmpty())
+ continue;
+ if (path.startsWith(productPath, Qt::CaseInsensitive))
+ return dotNetCombo[i].version;
}
}
- switch(installed) {
- case 1:
- break;
- case 0:
- warn_msg(WarnLogic, "Generator: MSVC.NET: Found more than one version of Visual Studio, but"
- " none in your path! Fallback to lowest version (%s)", warnPath.join(", ").toLatin1().data());
- break;
- default:
- warn_msg(WarnLogic, "Generator: MSVC.NET: Found more than one version of Visual Studio in"
- " your path! Fallback to lowest version (%s)", warnPath.join(", ").toLatin1().data());
- break;
- }
+
+ warn_msg(WarnLogic, "Generator: MSVC.NET: Found more than one version of Visual Studio, but"
+ " none in your PATH. Falling back to lowest version (%s)",
+ qPrintable(lowestInstalledVersion->versionStr));
return current_version;
#endif
@@ -514,7 +499,7 @@ ProStringList VcprojGenerator::collectDependencies(QMakeProject *proj, QHash<QSt
// We want to store it as the .lib name.
if (newDep->target.endsWith(".dll"))
newDep->target = newDep->target.left(newDep->target.length()-3) + "lib";
- projGuids.insert(val.first, newDep->target);
+ projGuids.insert(newDep->orig_target, newDep->target);
if (val.second.size()) {
const ProStringList depends = val.second;