aboutsummaryrefslogtreecommitdiffstats
path: root/qbs
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2017-09-29 15:04:05 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2017-10-23 12:18:34 +0000
commit3bcbcfa626866db36ba94261ea9fdd36c090806a (patch)
tree59406b6181093aae57f0680a1755d9e99d62da14 /qbs
parent640ba75dfbbce3c498647572f54ece469cff4c29 (diff)
Add qbs project files for some clang-related tools and plugins
Change-Id: I4882be50c6b007715f7b281f95d111abc5cda62a Reviewed-by: David Schulz <david.schulz@qt.io> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io> Reviewed-by: Jake Petroules <jake.petroules@qt.io> Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'qbs')
-rw-r--r--qbs/modules/libclang/functions.js68
-rw-r--r--qbs/modules/libclang/libclang.qbs24
2 files changed, 92 insertions, 0 deletions
diff --git a/qbs/modules/libclang/functions.js b/qbs/modules/libclang/functions.js
index 17d1bc4f9a..fe61da62dd 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 871b1e0f69..402e492217 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) {