summaryrefslogtreecommitdiff
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
parent640ba75dfbbce3c498647572f54ece469cff4c29 (diff)
downloadqt-creator-3bcbcfa626866db36ba94261ea9fdd36c090806a.tar.gz
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>
-rw-r--r--qbs/modules/libclang/functions.js68
-rw-r--r--qbs/modules/libclang/libclang.qbs24
-rw-r--r--src/plugins/clangpchmanager/clangpchmanager.qbs48
-rw-r--r--src/plugins/clangrefactoring/clangrefactoring.qbs80
-rw-r--r--src/plugins/plugins.qbs2
-rw-r--r--src/tools/clangpchmanagerbackend/clangpchmanagerbackend.qbs83
-rw-r--r--src/tools/clangrefactoringbackend/clangrefactoringbackend.qbs86
-rw-r--r--src/tools/tools.qbs2
8 files changed, 393 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) {
diff --git a/src/plugins/clangpchmanager/clangpchmanager.qbs b/src/plugins/clangpchmanager/clangpchmanager.qbs
new file mode 100644
index 0000000000..b8ade5b6ce
--- /dev/null
+++ b/src/plugins/clangpchmanager/clangpchmanager.qbs
@@ -0,0 +1,48 @@
+import qbs
+import qbs.FileInfo
+
+QtcPlugin {
+ name: "ClangPchManager"
+
+ Depends { name: "libclang"; required: false }
+ condition: libclang.present && libclang.toolingEnabled
+
+ Depends { name: "ClangSupport" }
+ Depends { name: "Utils" }
+
+ Depends { name: "Core" }
+ Depends { name: "CppTools" }
+ Depends { name: "ProjectExplorer" }
+
+ cpp.defines: {
+ var defines = base;
+ defines.push("CLANGPCHMANAGER_LIB");
+
+ // The following defines are used to determine the clang include path for intrinsics.
+ defines.push('CLANG_VERSION="' + libclang.llvmVersion + '"');
+ var resourceDir = FileInfo.joinPaths(libclang.llvmLibDir, "clang", libclang.llvmVersion,
+ "include");
+ defines.push('CLANG_RESOURCE_DIR="' + resourceDir + '"');
+ return defines;
+ }
+
+ cpp.includePaths: ["."]
+
+ files: [
+ "clangpchmanagerplugin.cpp",
+ "clangpchmanagerplugin.h",
+ "clangpchmanager_global.h",
+ "pchmanagerclient.cpp",
+ "pchmanagerclient.h",
+ "pchmanagernotifierinterface.cpp",
+ "pchmanagernotifierinterface.h",
+ "pchmanagerconnectionclient.cpp",
+ "pchmanagerconnectionclient.h",
+ "pchmanagerprojectupdater.cpp",
+ "pchmanagerprojectupdater.h",
+ "projectupdater.cpp",
+ "projectupdater.h",
+ "qtcreatorprojectupdater.cpp",
+ "qtcreatorprojectupdater.h",
+ ]
+}
diff --git a/src/plugins/clangrefactoring/clangrefactoring.qbs b/src/plugins/clangrefactoring/clangrefactoring.qbs
new file mode 100644
index 0000000000..15c2ada59e
--- /dev/null
+++ b/src/plugins/clangrefactoring/clangrefactoring.qbs
@@ -0,0 +1,80 @@
+import qbs
+import qbs.FileInfo
+
+QtcPlugin {
+ name: "ClangRefactoring"
+
+ Depends { name: "libclang"; required: false }
+ condition: libclang.present && libclang.toolingEnabled
+
+ Depends { name: "ClangSupport" }
+ Depends { name: "Utils" }
+
+ Depends { name: "ClangPchManager" }
+ Depends { name: "Core" }
+ Depends { name: "CppTools" }
+ Depends { name: "ProjectExplorer" }
+ Depends { name: "TextEditor" }
+
+ cpp.defines: {
+ var defines = base;
+ defines.push("CLANGPCHMANAGER_LIB");
+
+ // The following defines are used to determine the clang include path for intrinsics.
+ defines.push('CLANG_VERSION="' + libclang.llvmVersion + '"');
+ var resourceDir = FileInfo.joinPaths(libclang.llvmLibDir, "clang", libclang.llvmVersion,
+ "include");
+ defines.push('CLANG_RESOURCE_DIR="' + resourceDir + '"');
+ return defines;
+ }
+
+ cpp.includePaths: ["."]
+
+ files: [
+ "baseclangquerytexteditorwidget.cpp",
+ "baseclangquerytexteditorwidget.h",
+ "clangqueryexamplehighlighter.cpp",
+ "clangqueryexamplehighlighter.h",
+ "clangqueryexamplehighlightmarker.h",
+ "clangqueryexampletexteditorwidget.cpp",
+ "clangqueryexampletexteditorwidget.h",
+ "clangqueryhighlighter.cpp",
+ "clangqueryhighlighter.h",
+ "clangqueryhighlightmarker.h",
+ "clangqueryhoverhandler.cpp",
+ "clangqueryhoverhandler.h",
+ "clangqueryprojectsfindfilter.cpp",
+ "clangqueryprojectsfindfilter.h",
+ "clangqueryprojectsfindfilter.ui",
+ "clangqueryprojectsfindfilterwidget.cpp",
+ "clangqueryprojectsfindfilterwidget.h",
+ "clangquerytexteditorwidget.cpp",
+ "clangquerytexteditorwidget.h",
+ "clangrefactoringplugin.cpp",
+ "clangrefactoringplugin.h",
+ "projectpartutilities.cpp",
+ "projectpartutilities.h",
+ "qtcreatorclangqueryfindfilter.cpp",
+ "qtcreatorclangqueryfindfilter.h",
+ "qtcreatorsearch.cpp",
+ "qtcreatorsearch.h",
+ "qtcreatorsearchhandle.cpp",
+ "qtcreatorsearchhandle.h",
+ "querysqlitestatementfactory.h",
+ "refactoringclient.cpp",
+ "refactoringclient.h",
+ "refactoringconnectionclient.cpp",
+ "refactoringconnectionclient.h",
+ "refactoringengine.cpp",
+ "refactoringengine.h",
+ "refactoringprojectupdater.cpp",
+ "refactoringprojectupdater.h",
+ "searchhandle.cpp",
+ "searchhandle.h",
+ "searchinterface.cpp",
+ "searchinterface.h",
+ "sourcelocations.h",
+ "symbolquery.cpp",
+ "symbolquery.h",
+ ]
+}
diff --git a/src/plugins/plugins.qbs b/src/plugins/plugins.qbs
index 1b9bf695e1..4b15441e7e 100644
--- a/src/plugins/plugins.qbs
+++ b/src/plugins/plugins.qbs
@@ -13,6 +13,8 @@ Project {
"bineditor/bineditor.qbs",
"bookmarks/bookmarks.qbs",
"clangcodemodel/clangcodemodel.qbs",
+ "clangpchmanager/clangpchmanager.qbs",
+ "clangrefactoring/clangrefactoring.qbs",
"clangstaticanalyzer/clangstaticanalyzer.qbs",
"classview/classview.qbs",
"clearcase/clearcase.qbs",
diff --git a/src/tools/clangpchmanagerbackend/clangpchmanagerbackend.qbs b/src/tools/clangpchmanagerbackend/clangpchmanagerbackend.qbs
new file mode 100644
index 0000000000..adb7e0c62b
--- /dev/null
+++ b/src/tools/clangpchmanagerbackend/clangpchmanagerbackend.qbs
@@ -0,0 +1,83 @@
+import qbs
+import qbs.FileInfo
+
+QtcTool {
+ name: "clangpchmanagerbackend"
+ Depends { name: "libclang"; required: false }
+ condition: libclang.present
+ && libclang.toolingEnabled
+ && (!qbs.targetOS.contains("windows") || libclang.llvmBuildModeMatches)
+
+ Depends { name: "ClangSupport" }
+
+ Depends { name: "Qt.network" }
+
+ cpp.cxxFlags: base.concat(libclang.llvmToolingCxxFlags)
+ cpp.defines: {
+ var list = base.concat(libclang.llvmToolingDefines);
+ list.push('CLANG_COMPILER_PATH="'
+ + FileInfo.joinPaths(FileInfo.path(libclang.llvmConfig), "clang") + '"');
+ return list;
+ }
+ cpp.includePaths: base.concat(libclang.llvmIncludeDir).concat(libclang.llvmToolingIncludes)
+ .concat(["source", "../clangrefactoringbackend/source"])
+ cpp.libraryPaths: base.concat(libclang.llvmLibDir)
+ cpp.dynamicLibraries: base.concat(libclang.llvmToolingLibs)
+
+ Properties {
+ condition: qbs.targetOS.contains("unix") && !qbs.targetOS.contains("macos")
+ cpp.rpaths: base.concat(libclang.llvmLibDir)
+ }
+
+ files: [
+ "clangpchmanagerbackendmain.cpp",
+ ]
+
+ Group {
+ prefix: "source/"
+ files: [
+ "changedfilepathcompressor.h",
+ "clangpathwatcherinterface.cpp",
+ "clangpathwatcherinterface.h",
+ "clangpathwatchernotifier.cpp",
+ "clangpathwatchernotifier.h",
+ "clangpathwatcher.cpp",
+ "clangpathwatcher.h",
+ "clangpchmanagerbackend_global.h",
+ "collectincludesaction.h",
+ "collectincludespreprocessorcallbacks.h",
+ "collectincludestoolaction.h",
+ "environment.h",
+ "idpaths.cpp",
+ "idpaths.h",
+ "includecollector.cpp",
+ "includecollector.h",
+ "pchcreatorinterface.cpp",
+ "pchcreatorinterface.h",
+ "pchcreator.cpp",
+ "pchcreator.h",
+ "pchgenerator.h",
+ "pchgeneratorinterface.cpp",
+ "pchgeneratorinterface.h",
+ "pchgeneratornotifierinterface.cpp",
+ "pchgeneratornotifierinterface.h",
+ "pchmanagerserver.cpp",
+ "pchmanagerserver.h",
+ "pchnotcreatederror.h",
+ "projectpartsinterface.cpp",
+ "projectpartsinterface.h",
+ "projectparts.cpp",
+ "projectparts.h",
+ ]
+ }
+
+ Group {
+ name: "sources from clangrefactoring"
+ prefix: "../clangrefactoringbackend/source/"
+ files: [
+ "clangtool.cpp",
+ "refactoringcompilationdatabase.cpp",
+ ]
+ }
+}
+
diff --git a/src/tools/clangrefactoringbackend/clangrefactoringbackend.qbs b/src/tools/clangrefactoringbackend/clangrefactoringbackend.qbs
new file mode 100644
index 0000000000..1381b5b3df
--- /dev/null
+++ b/src/tools/clangrefactoringbackend/clangrefactoringbackend.qbs
@@ -0,0 +1,86 @@
+import qbs
+import qbs.FileInfo
+
+QtcTool {
+ name: "clangrefactoringbackend"
+ Depends { name: "libclang"; required: false }
+ condition: libclang.present
+ && libclang.toolingEnabled
+ && (!qbs.targetOS.contains("windows") || libclang.llvmBuildModeMatches)
+
+ Depends { name: "ClangSupport" }
+
+ Depends { name: "Qt.network" }
+
+ cpp.cxxFlags: base.concat(libclang.llvmToolingCxxFlags)
+ cpp.defines: base.concat(libclang.llvmToolingDefines)
+ cpp.includePaths: base.concat(libclang.llvmIncludeDir).concat(libclang.llvmToolingIncludes)
+ .concat(["source"])
+ cpp.libraryPaths: base.concat(libclang.llvmLibDir)
+ cpp.dynamicLibraries: base.concat(libclang.llvmToolingLibs)
+
+ Properties {
+ condition: qbs.targetOS.contains("unix") && !qbs.targetOS.contains("macos")
+ cpp.rpaths: base.concat(libclang.llvmLibDir)
+ }
+
+ files: [
+ "clangrefactoringbackendmain.cpp",
+ ]
+
+ Group {
+ prefix: "source/"
+ files: [
+ "clangquery.cpp",
+ "clangquerygatherer.cpp",
+ "clangquerygatherer.h",
+ "clangquery.h",
+ "clangrefactoringbackend_global.h",
+ "clangtool.cpp",
+ "clangtool.h",
+ "collectmacrossourcefilecallbacks.cpp",
+ "collectmacrossourcefilecallbacks.h",
+ "collectsymbolsaction.cpp",
+ "collectsymbolsaction.h",
+ "collectsymbolsastvisitor.h",
+ "collectsymbolsconsumer.h",
+ "findcursorusr.h",
+ "findlocationsofusrs.h",
+ "findusrforcursoraction.cpp",
+ "findusrforcursoraction.h",
+ "locationsourcefilecallbacks.cpp",
+ "locationsourcefilecallbacks.h",
+ "macropreprocessorcallbacks.cpp",
+ "macropreprocessorcallbacks.h",
+ "refactoringcompilationdatabase.cpp",
+ "refactoringcompilationdatabase.h",
+ "refactoringserver.cpp",
+ "refactoringserver.h",
+ "sourcelocationentry.cpp",
+ "sourcelocationentry.h",
+ "sourcelocationsutils.h",
+ "sourcerangeextractor.cpp",
+ "sourcerangeextractor.h",
+ "sourcerangefilter.cpp",
+ "sourcerangefilter.h",
+ "storagesqlitestatementfactory.h",
+ "symbolentry.cpp",
+ "symbolentry.h",
+ "symbolfinder.cpp",
+ "symbolfinder.h",
+ "symbolindexer.cpp",
+ "symbolindexer.h",
+ "symbolindexing.cpp",
+ "symbolindexing.h",
+ "symbolindexinginterface.h",
+ "symbollocationfinderaction.cpp",
+ "symbollocationfinderaction.h",
+ "symbolscollector.cpp",
+ "symbolscollector.h",
+ "symbolscollectorinterface.h",
+ "symbolstorage.cpp",
+ "symbolstorage.h",
+ "symbolstorageinterface.h",
+ ]
+ }
+}
diff --git a/src/tools/tools.qbs b/src/tools/tools.qbs
index d1b8e93fc8..b3f27424e6 100644
--- a/src/tools/tools.qbs
+++ b/src/tools/tools.qbs
@@ -5,6 +5,8 @@ Project {
references: [
"buildoutputparser/buildoutputparser.qbs",
"clangbackend/clangbackend.qbs",
+ "clangpchmanagerbackend/clangpchmanagerbackend.qbs",
+ "clangrefactoringbackend/clangrefactoringbackend.qbs",
"cplusplustools.qbs",
"qml2puppet/qml2puppet.qbs",
"qtcdebugger/qtcdebugger.qbs",