aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Komissarov <abbapoh@gmail.com>2021-04-17 21:23:44 +0300
committerIvan Komissarov <ABBAPOH@gmail.com>2021-04-19 10:41:41 +0000
commitf9ad1f5844af1e42c8de3cf10f6a9597924d9f9e (patch)
tree48ef6bfa3d2317ba83fc80d330f5bef3f752268e
parentd38fd9fa901cd7f30821367b831676837eb82fe3 (diff)
Allow to specify windowsSdkVersion
Previously, it was not possible to use older windows SDK version. Fix that by introducing the new property that is passed to vcvarsall.bat Task-number: QBS-1498 Change-Id: Ic526eabb8ff82ddd85c93e90fd20421595a121f4 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--doc/reference/modules/cpp-module.qdoc11
-rw-r--r--share/qbs/imports/qbs/Probes/ClangClProbe.qbs17
-rw-r--r--share/qbs/imports/qbs/Probes/MsvcProbe.qbs5
-rw-r--r--share/qbs/modules/cpp/windows-clang-cl.qbs1
-rw-r--r--share/qbs/modules/cpp/windows-msvc-base.qbs2
-rw-r--r--share/qbs/modules/cpp/windows-msvc.qbs1
-rw-r--r--src/lib/corelib/jsextensions/utilitiesextension.cpp32
-rw-r--r--src/lib/corelib/tools/msvcinfo.h6
-rw-r--r--src/lib/corelib/tools/vsenvironmentdetector.cpp6
9 files changed, 64 insertions, 17 deletions
diff --git a/doc/reference/modules/cpp-module.qdoc b/doc/reference/modules/cpp-module.qdoc
index 56f41af5d..1628bc80e 100644
--- a/doc/reference/modules/cpp-module.qdoc
+++ b/doc/reference/modules/cpp-module.qdoc
@@ -1914,3 +1914,14 @@
\defaultvalue \c{true}
*/
+
+/*!
+ \qmlproperty string cpp::windowsSdkVersion
+ \since Qbs 1.19
+
+ Which Windows SDK version should be used with MSVC toolchain. By default,
+ the latest SDK is used.
+
+ \windowsproperty
+ \nodefaultvalue
+*/
diff --git a/share/qbs/imports/qbs/Probes/ClangClProbe.qbs b/share/qbs/imports/qbs/Probes/ClangClProbe.qbs
index 8205e92fa..658da8a9f 100644
--- a/share/qbs/imports/qbs/Probes/ClangClProbe.qbs
+++ b/share/qbs/imports/qbs/Probes/ClangClProbe.qbs
@@ -42,6 +42,7 @@ PathProbe {
property string preferredArchitecture
property string _nullDevice: qbs.nullDevice
property string _pathListSeparator: qbs.pathListSeparator
+ property string winSdkVersion
// Outputs
property int versionMajor
@@ -58,9 +59,21 @@ PathProbe {
languages = ["c"];
var info = languages.contains("c")
- ? Utilities.clangClCompilerInfo(compilerFilePath, preferredArchitecture, vcvarsallFilePath, "c") : {};
+ ? Utilities.clangClCompilerInfo(
+ compilerFilePath,
+ preferredArchitecture,
+ vcvarsallFilePath,
+ "c",
+ winSdkVersion)
+ : {};
var infoCpp = languages.contains("cpp")
- ? Utilities.clangClCompilerInfo(compilerFilePath, preferredArchitecture, vcvarsallFilePath, "cpp") : {};
+ ? Utilities.clangClCompilerInfo(
+ compilerFilePath,
+ preferredArchitecture,
+ vcvarsallFilePath,
+ "cpp",
+ winSdkVersion)
+ : {};
found = (!languages.contains("c") ||
(!!info && !!info.macros && !!info.buildEnvironment))
&& (!languages.contains("cpp") ||
diff --git a/share/qbs/imports/qbs/Probes/MsvcProbe.qbs b/share/qbs/imports/qbs/Probes/MsvcProbe.qbs
index 2d5faecdd..d3624e010 100644
--- a/share/qbs/imports/qbs/Probes/MsvcProbe.qbs
+++ b/share/qbs/imports/qbs/Probes/MsvcProbe.qbs
@@ -38,6 +38,7 @@ PathProbe {
property string compilerFilePath
property stringList enableDefinesByLanguage
property string preferredArchitecture
+ property string winSdkVersion
// Outputs
property string architecture
@@ -54,9 +55,9 @@ PathProbe {
languages = ["c"];
var info = languages.contains("c")
- ? Utilities.msvcCompilerInfo(compilerFilePath, "c") : {};
+ ? Utilities.msvcCompilerInfo(compilerFilePath, "c", winSdkVersion) : {};
var infoCpp = languages.contains("cpp")
- ? Utilities.msvcCompilerInfo(compilerFilePath, "cpp") : {};
+ ? Utilities.msvcCompilerInfo(compilerFilePath, "cpp", winSdkVersion) : {};
found = (!languages.contains("c") ||
(!!info && !!info.macros && !!info.buildEnvironment))
&& (!languages.contains("cpp") ||
diff --git a/share/qbs/modules/cpp/windows-clang-cl.qbs b/share/qbs/modules/cpp/windows-clang-cl.qbs
index a34a67ad2..556efb042 100644
--- a/share/qbs/modules/cpp/windows-clang-cl.qbs
+++ b/share/qbs/modules/cpp/windows-clang-cl.qbs
@@ -53,6 +53,7 @@ MsvcBaseModule {
vcvarsallFilePath: vcvarsallPath
enableDefinesByLanguage: enableCompilerDefinesByLanguage
preferredArchitecture: qbs.architecture
+ winSdkVersion: windowsSdkVersion
}
qbs.architecture: clangClProbe.found ? clangClProbe.architecture : original
diff --git a/share/qbs/modules/cpp/windows-msvc-base.qbs b/share/qbs/modules/cpp/windows-msvc-base.qbs
index f5fde9556..81fe48385 100644
--- a/share/qbs/modules/cpp/windows-msvc-base.qbs
+++ b/share/qbs/modules/cpp/windows-msvc-base.qbs
@@ -108,6 +108,8 @@ CppModule {
}
}
+ property string windowsSdkVersion
+
Rule {
condition: useCPrecompiledHeader
inputs: ["c_pch_src"]
diff --git a/share/qbs/modules/cpp/windows-msvc.qbs b/share/qbs/modules/cpp/windows-msvc.qbs
index d5b5baf92..33c5e74c8 100644
--- a/share/qbs/modules/cpp/windows-msvc.qbs
+++ b/share/qbs/modules/cpp/windows-msvc.qbs
@@ -51,6 +51,7 @@ MsvcBaseModule {
compilerFilePath: compilerPath
enableDefinesByLanguage: enableCompilerDefinesByLanguage
preferredArchitecture: qbs.architecture
+ winSdkVersion: windowsSdkVersion
}
qbs.architecture: msvcProbe.found ? msvcProbe.architecture : original
diff --git a/src/lib/corelib/jsextensions/utilitiesextension.cpp b/src/lib/corelib/jsextensions/utilitiesextension.cpp
index 6c693cb61..282362382 100644
--- a/src/lib/corelib/jsextensions/utilitiesextension.cpp
+++ b/src/lib/corelib/jsextensions/utilitiesextension.cpp
@@ -468,9 +468,10 @@ static std::pair<QVariantMap /*result*/, QString /*error*/> msvcCompilerInfoHelp
const QString &compilerFilePath,
MSVC::CompilerLanguage language,
const QString &vcvarsallPath,
- const QString &arch)
+ const QString &arch,
+ const QString &sdkVersion)
{
- MSVC msvc(compilerFilePath, arch);
+ MSVC msvc(compilerFilePath, arch, sdkVersion);
VsEnvironmentDetector envdetector(vcvarsallPath);
if (!envdetector.start(&msvc))
return { {}, QStringLiteral("Detecting the MSVC build environment failed: ")
@@ -501,12 +502,16 @@ QScriptValue UtilitiesExtension::js_msvcCompilerInfo(QScriptContext *context, QS
return context->throwError(QScriptContext::UnknownError,
QStringLiteral("msvcCompilerInfo is not available on this platform"));
#else
- if (Q_UNLIKELY(context->argumentCount() < 2))
+ if (Q_UNLIKELY(context->argumentCount() < 3))
return context->throwError(QScriptContext::SyntaxError,
- QStringLiteral("msvcCompilerInfo expects 2 arguments"));
+ QStringLiteral("msvcCompilerInfo expects 3 arguments"));
const QString compilerFilePath = context->argument(0).toString();
const QString compilerLanguage = context->argument(1).toString();
+ const QString sdkVersion =
+ !context->argument(2).isNull() && !context->argument(2).isUndefined()
+ ? context->argument(2).toString()
+ : QString();
MSVC::CompilerLanguage language;
if (compilerLanguage == QStringLiteral("c"))
language = MSVC::CLanguage;
@@ -517,7 +522,11 @@ QScriptValue UtilitiesExtension::js_msvcCompilerInfo(QScriptContext *context, QS
QStringLiteral("msvcCompilerInfo expects \"c\" or \"cpp\" as its second argument"));
const auto result = msvcCompilerInfoHelper(
- compilerFilePath, language, {}, MSVC::architectureFromClPath(compilerFilePath));
+ compilerFilePath,
+ language,
+ {},
+ MSVC::architectureFromClPath(compilerFilePath),
+ sdkVersion);
if (result.first.isEmpty())
return context->throwError(QScriptContext::UnknownError, result.second);
return engine->toScriptValue(result.first);
@@ -531,9 +540,9 @@ QScriptValue UtilitiesExtension::js_clangClCompilerInfo(QScriptContext *context,
return context->throwError(QScriptContext::UnknownError,
QStringLiteral("clangClCompilerInfo is not available on this platform"));
#else
- if (Q_UNLIKELY(context->argumentCount() < 4))
+ if (Q_UNLIKELY(context->argumentCount() < 5))
return context->throwError(QScriptContext::SyntaxError,
- QStringLiteral("clangClCompilerInfo expects 4 arguments"));
+ QStringLiteral("clangClCompilerInfo expects 5 arguments"));
const QString compilerFilePath = context->argument(0).toString();
// architecture cannot be empty as vcvarsall.bat requires at least 1 arg, so fallback
@@ -542,9 +551,14 @@ QScriptValue UtilitiesExtension::js_clangClCompilerInfo(QScriptContext *context,
? context->argument(1).toString()
: QString::fromStdString(HostOsInfo::hostOSArchitecture());
QString vcvarsallPath = context->argument(2).toString();
- const QString compilerLanguage = context->argumentCount() > 3
+ const QString compilerLanguage =
+ !context->argument(3).isNull() && !context->argument(3).isUndefined()
? context->argument(3).toString()
: QString();
+ const QString sdkVersion =
+ !context->argument(4).isNull() && !context->argument(4).isUndefined()
+ ? context->argument(4).toString()
+ : QString();
MSVC::CompilerLanguage language;
if (compilerLanguage == QStringLiteral("c"))
language = MSVC::CLanguage;
@@ -555,7 +569,7 @@ QScriptValue UtilitiesExtension::js_clangClCompilerInfo(QScriptContext *context,
QStringLiteral("clangClCompilerInfo expects \"c\" or \"cpp\" as its fourth argument"));
const auto result = msvcCompilerInfoHelper(
- compilerFilePath, language, vcvarsallPath, arch);
+ compilerFilePath, language, vcvarsallPath, arch, sdkVersion);
if (result.first.isEmpty())
return context->throwError(QScriptContext::UnknownError, result.second);
return engine->toScriptValue(result.first);
diff --git a/src/lib/corelib/tools/msvcinfo.h b/src/lib/corelib/tools/msvcinfo.h
index de4470bf0..d081e5c15 100644
--- a/src/lib/corelib/tools/msvcinfo.h
+++ b/src/lib/corelib/tools/msvcinfo.h
@@ -81,12 +81,14 @@ public:
QString binPath;
QString pathPrefix;
QString architecture;
+ QString sdkVersion;
QProcessEnvironment environment;
MSVC() = default;
- MSVC(const QString &clPath, QString arch):
- architecture(std::move(arch))
+ MSVC(const QString &clPath, QString arch, QString sdkVersion = {}):
+ architecture(std::move(arch)),
+ sdkVersion(std::move(sdkVersion))
{
QDir parentDir = QFileInfo(clPath).dir();
binPath = parentDir.absolutePath();
diff --git a/src/lib/corelib/tools/vsenvironmentdetector.cpp b/src/lib/corelib/tools/vsenvironmentdetector.cpp
index b0788823f..a11934d52 100644
--- a/src/lib/corelib/tools/vsenvironmentdetector.cpp
+++ b/src/lib/corelib/tools/vsenvironmentdetector.cpp
@@ -241,8 +241,10 @@ void VsEnvironmentDetector::writeBatchFile(QIODevice *device, const QString &vcv
<< "setlocal" << endl;
batClearVars(s, varnames);
s << "set PATH=" << m_windowsSystemDirPath << endl; // vcvarsall.bat needs tools from here
- s << "call \"" << vcvarsallbat << "\" " << vcArchitecture(msvc)
- << " || exit /b 1" << endl;
+ s << "call \"" << vcvarsallbat << "\" " << vcArchitecture(msvc);
+ if (!msvc->sdkVersion.isEmpty())
+ s << " " << msvc->sdkVersion;
+ s << " || exit /b 1" << endl;
batPrintVars(s, varnames);
s << "endlocal" << endl;
}