diff options
Diffstat (limited to 'qbs')
-rw-r--r-- | qbs/modules/libclang/functions.js | 68 | ||||
-rw-r--r-- | qbs/modules/libclang/libclang.qbs | 24 |
2 files changed, 92 insertions, 0 deletions
diff --git a/qbs/modules/libclang/functions.js b/qbs/modules/libclang/functions.js index 17d1bc4f9a6..fe61da62dd1 100644 --- a/qbs/modules/libclang/functions.js +++ b/qbs/modules/libclang/functions.js @@ -14,6 +14,11 @@ function readOutput(executable, args) return output; } +function readListOutput(executable, args) +{ + return readOutput(executable, args).split(/\s+/); +} + function isSuitableLLVMConfig(llvmConfigCandidate, qtcFunctions) { if (File.exists(llvmConfigCandidate)) { @@ -75,3 +80,66 @@ function libraries(targetOS) { return targetOS.contains("windows") ? ["libclang.lib", "advapi32.lib", "shell32.lib"] : ["clang"] } + +function toolingLibs(llvmConfig, targetOS) +{ + var fixedList = [ + "clangTooling", + "clangFrontend", + "clangIndex", + "clangParse", + "clangSerialization", + "clangSema", + "clangEdit", + "clangAnalysis", + "clangDriver", + "clangDynamicASTMatchers", + "clangASTMatchers", + "clangToolingCore", + "clangAST", + "clangLex", + "clangBasic", + ]; + if (targetOS.contains("windows")) + fixedList.push("version"); + var dynamicList = readListOutput(llvmConfig, ["--libs"]) + .concat(readListOutput(llvmConfig, ["--system-libs"])); + return fixedList.concat(dynamicList.map(function(s) { + return s.startsWith("-l") ? s.slice(2) : s; + })); +} + +function toolingParameters(llvmConfig) +{ + var params = { + defines: [], + includes: [], + cxxFlags: [], + }; + var allCxxFlags = readListOutput(llvmConfig, ["--cxxflags"]); + for (var i = 0; i < allCxxFlags.length; ++i) { + var flag = allCxxFlags[i]; + if (flag.startsWith("-D") || flag.startsWith("/D")) { + params.defines.push(flag.slice(2)); + continue; + } + if (flag.startsWith("-I") || flag.startsWith("/I")) { + params.includes.push(flag.slice(2)); + continue; + } + if (!flag.startsWith("-std") && !flag.startsWith("-O") && !flag.startsWith("/O") + && !flag.startsWith("-march") + && !flag.startsWith("/EH") && flag !== "-fno-exceptions" + && flag !== "/W4" && flag !== "-Werror=date-time" + && flag !== "-Wcovered-switch-default" && flag !== "-fPIC" && flag !== "-pedantic" + && flag !== "-Wstring-conversion" && flag !== "-gsplit-dwarf") { + params.cxxFlags.push(flag); + } + } + return params; +} + +function buildMode(llvmConfig) +{ + return readOutput(llvmConfig, ["--build-mode"]); +} diff --git a/qbs/modules/libclang/libclang.qbs b/qbs/modules/libclang/libclang.qbs index 871b1e0f693..402e4922176 100644 --- a/qbs/modules/libclang/libclang.qbs +++ b/qbs/modules/libclang/libclang.qbs @@ -1,5 +1,7 @@ import qbs +import qbs.Environment import qbs.File +import qbs.Utilities import QtcFunctions import "functions.js" as ClangFunctions @@ -12,6 +14,11 @@ Module { property string llvmIncludeDir property string llvmLibDir property stringList llvmLibs + property stringList llvmToolingLibs + property stringList llvmToolingDefines + property stringList llvmToolingIncludes + property stringList llvmToolingCxxFlags + property string llvmBuildMode configure: { llvmConfig = ClangFunctions.llvmConfig(qbs, QtcFunctions); @@ -19,6 +26,12 @@ Module { llvmIncludeDir = ClangFunctions.includeDir(llvmConfig); llvmLibDir = ClangFunctions.libDir(llvmConfig); llvmLibs = ClangFunctions.libraries(qbs.targetOS); + llvmToolingLibs = ClangFunctions.toolingLibs(llvmConfig, qbs.targetOS); + llvmBuildMode = ClangFunctions.buildMode(llvmConfig); + var toolingParams = ClangFunctions.toolingParameters(llvmConfig); + llvmToolingDefines = toolingParams.defines; + llvmToolingIncludes = toolingParams.includes; + llvmToolingCxxFlags = toolingParams.cxxFlags; found = llvmConfig && File.exists(llvmIncludeDir.concat("/clang-c/Index.h")); } } @@ -28,6 +41,17 @@ Module { property string llvmIncludeDir: clangProbe.llvmIncludeDir property string llvmLibDir: clangProbe.llvmLibDir property stringList llvmLibs: clangProbe.llvmLibs + property stringList llvmToolingLibs: clangProbe.llvmToolingLibs + property string llvmBuildMode: clangProbe.llvmBuildMode + property bool llvmBuildModeMatches: qbs.buildVariant === llvmBuildMode.toLowerCase() + property stringList llvmToolingDefines: clangProbe.llvmToolingDefines + property stringList llvmToolingIncludes: clangProbe.llvmToolingIncludes.filter(function(incl) { + return incl != llvmIncludeDir; + }) + property stringList llvmToolingCxxFlags: clangProbe.llvmToolingCxxFlags + property bool toolingEnabled: !Environment.getEnv("QTC_NO_CLANG_LIBTOOLING") + && Utilities.versionCompare(llvmVersion, "3.9") > 0 + && Utilities.versionCompare(llvmVersion, "4") < 0 validate: { if (!clangProbe.found) { |