aboutsummaryrefslogtreecommitdiffstats
path: root/share/qbs/modules/cpp/windows-msvc.qbs
diff options
context:
space:
mode:
Diffstat (limited to 'share/qbs/modules/cpp/windows-msvc.qbs')
-rw-r--r--share/qbs/modules/cpp/windows-msvc.qbs199
1 files changed, 199 insertions, 0 deletions
diff --git a/share/qbs/modules/cpp/windows-msvc.qbs b/share/qbs/modules/cpp/windows-msvc.qbs
new file mode 100644
index 000000000..535df9491
--- /dev/null
+++ b/share/qbs/modules/cpp/windows-msvc.qbs
@@ -0,0 +1,199 @@
+import qbs.base 1.0
+import qbs.fileinfo 1.0 as FileInfo
+import '../utils.js' as ModUtils
+import 'msvc.js' as MSVC
+
+CppModule {
+ condition: qbs.hostOS == 'windows' && qbs.targetOS == 'windows' && qbs.toolchain == 'msvc'
+
+ id: module
+
+ defines: ['UNICODE', 'WIN32']
+ warningLevel: "default"
+
+ property bool generateManifestFiles: true
+ property string toolchainInstallPath: "UNKNOWN"
+ property string windowsSDKPath: "UNKNOWN"
+ property string architecture: "x86"
+ property int responseFileThreshold: 32000
+
+ setupBuildEnvironment: {
+ var v = new ModUtils.EnvironmentVariable("INCLUDE", ";", true)
+ v.prepend(toolchainInstallPath + "/VC/ATLMFC/INCLUDE")
+ v.prepend(toolchainInstallPath + "/VC/INCLUDE")
+ v.prepend(windowsSDKPath + "/include")
+ v.set()
+
+ if (architecture == 'x86') {
+ v = new ModUtils.EnvironmentVariable("PATH", ";", true)
+ v.prepend(toolchainInstallPath + "/Common7/IDE")
+ v.prepend(toolchainInstallPath + "/VC/bin")
+ v.prepend(toolchainInstallPath + "/Common7/Tools")
+ v.set()
+
+ v = new ModUtils.EnvironmentVariable("LIB", ";", true)
+ v.prepend(toolchainInstallPath + "/VC/ATLMFC/LIB")
+ v.prepend(toolchainInstallPath + "/VC/LIB")
+ v.prepend(windowsSDKPath + "/lib")
+ v.set()
+ } else if (architecture == 'x86_64') {
+ v = new ModUtils.EnvironmentVariable("PATH", ";", true)
+ v.prepend(toolchainInstallPath + "/Common7/IDE")
+ v.prepend(toolchainInstallPath + "/VC/bin/amd64")
+ v.prepend(toolchainInstallPath + "/Common7/Tools")
+ v.set()
+
+ v = new ModUtils.EnvironmentVariable("LIB", ";", true)
+ v.prepend(toolchainInstallPath + "/VC/ATLMFC/LIB/amd64")
+ v.prepend(toolchainInstallPath + "/VC/LIB/amd64")
+ v.prepend(windowsSDKPath + "/lib/x64")
+ v.set()
+ }
+ }
+
+ Artifact {
+ // This adds the filename in precompiledHeader to the set of source files.
+ // If its already in there, then this makes sure it has the right file tag.
+ condition: precompiledHeader != null
+ fileName: precompiledHeader
+ fileTags: ["hpp_pch"]
+ }
+
+ Rule {
+ id: pchCompiler
+ inputs: ["hpp_pch"]
+ Artifact {
+ fileTags: ['obj']
+ // ### make the object file dir overridable
+ fileName: ".obj/" + product.name + "/" + input.baseName + '.obj'
+ }
+ Artifact {
+ fileTags: ['c++_pch']
+ // ### make the object file dir overridable
+ fileName: ".obj/" + product.name + "/" + product.name + '.pch'
+ }
+ TransformProperties {
+ property var defines: ModUtils.appendAll(input, 'defines')
+ property var includePaths: ModUtils.appendAll(input, 'includePaths')
+ property var compilerFlags: ModUtils.appendAll(input, 'compilerFlags')
+ }
+ prepare: {
+ return MSVC.prepareCompiler(product, input, outputs)
+ }
+ }
+
+ Rule {
+ id: compiler
+ inputs: ["cpp", "c"]
+ explicitlyDependsOn: ["c++_pch"]
+ Artifact {
+ fileTags: ['obj']
+ // ### make the object file dir overridable
+ fileName: ".obj/" + product.name + "/" + input.baseDir + "/" + input.baseName + ".obj"
+ }
+
+ TransformProperties {
+ property var defines: ModUtils.appendAll(input, 'defines')
+ property var includePaths: ModUtils.appendAll(input, 'includePaths')
+ property var compilerFlags: ModUtils.appendAll(input, 'compilerFlags')
+ }
+
+ prepare: {
+ return MSVC.prepareCompiler(product, input, outputs, defines, includePaths, compilerFlags)
+ }
+ }
+
+ Rule {
+ id: applicationLinker
+ multiplex: true
+ inputs: ['obj']
+ usings: ['staticlibrary', 'dynamiclibrary_import']
+ Artifact {
+ fileTags: ["application"]
+ fileName: product.destinationDirectory + "/" + product.name + ".exe"
+ }
+
+ TransformProperties {
+ property var libraryPaths: ModUtils.appendAll(product, 'libraryPaths')
+ property var dynamicLibraries: ModUtils.appendAllFromArtifacts(product, inputs.dynamiclibrary_import, 'cpp', 'dynamicLibraries')
+ property var staticLibraries: ModUtils.appendAllFromArtifacts(product, (inputs.staticlibrary || []).concat(inputs.obj), 'cpp', 'staticLibraries')
+ }
+
+ prepare: {
+ return MSVC.prepareLinker(product, inputs, outputs, libraryPaths, dynamicLibraries, staticLibraries)
+ }
+ }
+
+ Rule {
+ id: dynamicLibraryLinker
+ multiplex: true
+ inputs: ['obj']
+ usings: ['staticlibrary', 'dynamiclibrary_import']
+
+ Artifact {
+ fileTags: ["dynamiclibrary"]
+ fileName: product.destinationDirectory + "/" + product.name + ".dll"
+ }
+
+ Artifact {
+ fileTags: ["dynamiclibrary_import"]
+ fileName: product.destinationDirectory + "/" + product.name + "_imp.lib"
+ }
+
+ TransformProperties {
+ property var libraryPaths: ModUtils.appendAll(product, 'libraryPaths')
+ property var dynamicLibraries: ModUtils.appendAll(product, 'dynamicLibraries')
+ property var staticLibraries: ModUtils.appendAllFromArtifacts(product, (inputs.staticlibrary || []).concat(inputs.obj), 'cpp', 'staticLibraries')
+ }
+
+ prepare: {
+ return MSVC.prepareLinker(product, inputs, outputs, libraryPaths, dynamicLibraries, staticLibraries)
+ }
+ }
+
+ Rule {
+ id: libtool
+ multiplex: true
+ inputs: ["obj"]
+ usings: ["staticlibrary"]
+
+ Artifact {
+ fileTags: ["staticlibrary"]
+ fileName: product.destinationDirectory + "/" + product.name + ".lib"
+ cpp.staticLibraries: {
+ var result = []
+ for (var i in inputs.staticlibrary) {
+ var lib = inputs.staticlibrary[i]
+ result.push(lib.fileName)
+ var impliedLibs = ModUtils.appendAll(lib, 'staticLibraries')
+ result.concat(impliedLibs)
+ }
+ return result
+ }
+ }
+
+ prepare: {
+ var toolchainInstallPath = product.module.toolchainInstallPath
+
+ var args = ['/nologo']
+ var nativeOutputFileName = FileInfo.toWindowsSeparators(output.fileName)
+ args.push('/OUT:' + nativeOutputFileName)
+ for (var i in inputs.obj) {
+ var fileName = FileInfo.toWindowsSeparators(inputs.obj[i].fileName)
+ args.push(fileName)
+ }
+ var is64bit = (product.module.architecture == "x86_64")
+ var linkerPath = toolchainInstallPath + '/VC/bin/'
+ if (is64bit)
+ linkerPath += 'amd64/'
+ linkerPath += 'lib.exe'
+ var cmd = new Command(linkerPath, args)
+ cmd.description = 'creating ' + FileInfo.fileName(output.fileName)
+ cmd.highlight = 'linker';
+ cmd.workingDirectory = FileInfo.path(output.fileName)
+ cmd.responseFileThreshold = product.module.responseFileThreshold
+ cmd.responseFileUsagePrefix = '@';
+ return cmd;
+ }
+ }
+}