summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucie Gérard <lucie.gerard@qt.io>2019-09-10 10:12:24 +0200
committerLucie Gérard <lucie.gerard@qt.io>2019-09-19 15:33:49 +0200
commitc7c081526a6d1c3d8ddf4bb89309956b06822cd6 (patch)
treec4c8490c42c481af278682f31654978f340b083d
parent1bf494714cb63a613aab0d596c1f656738a45fa4 (diff)
lupdate: check for clang in environment
The configure.pri and configure.json files, originally located in qttools/src/qdoc, are moved to qttools/global. This makes the clang environment accessible to both qdoc and lupdate. Both files are adapted to the need of the new lupdate clang-based parser. (see https://wiki.qt.io/Lupdate_clang-based_c%2B%2B_parser#Clang-environment_and_Qt_configuration for details) Note: If the clang environment is not adapted to the upcoming lupdate clang-based parser, nothing will break, the new parser option will simply not be available. Nothing is changing for qdoc. Change-Id: I7297f5894ba7aee669865b0e89aaa298b311e07e Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io> Reviewed-by: Kai Koehne <kai.koehne@qt.io> Reviewed-by: Paul Wicking <paul.wicking@qt.io>
-rw-r--r--configure.json2
-rw-r--r--src/global/configure.json (renamed from src/qdoc/configure.json)25
-rw-r--r--src/global/configure.pri526
-rw-r--r--src/global/global.pro6
-rw-r--r--src/linguist/lupdate/lupdate.pro13
-rw-r--r--src/qdoc/qdoc.pro2
-rw-r--r--src/src.pro7
-rw-r--r--sync.profile1
8 files changed, 570 insertions, 12 deletions
diff --git a/configure.json b/configure.json
index cd111df83..190c23708 100644
--- a/configure.json
+++ b/configure.json
@@ -1,5 +1,5 @@
{
"subconfigs": [
- "src/qdoc"
+ "src/global"
]
}
diff --git a/src/qdoc/configure.json b/src/global/configure.json
index f7190fcb3..f364abf79 100644
--- a/src/qdoc/configure.json
+++ b/src/global/configure.json
@@ -1,5 +1,5 @@
{
- "module": "qdoc",
+ "module": "tools",
"tests": {
"libclang": {
"label": "libclang",
@@ -8,7 +8,7 @@
}
},
"features": {
- "qdoc": {
+ "clang": {
"label": "QDoc",
"condition": "tests.libclang",
"output": [
@@ -19,25 +19,38 @@
{ "type": "varAssign", "name": "CLANG_DEFINES", "value": "tests.libclang.defines" },
{ "type": "varAssign", "name": "CLANG_VERSION", "value": "tests.libclang.version" }
]
+ },
+ "clangcpp": {
+ "label": "Clang-based lupdate parser",
+ "condition": "features.clang && tests.libclang.has_clangcpp",
+ "output": [
+ "privateFeature",
+ { "type": "varAssign", "name": "CLANGCPP_LIBS", "value": "tests.libclang.clangcpp_libs" }
+ ]
}
},
"report": [
{
"type": "warning",
- "condition": "!features.qdoc",
- "message": "QDoc will not be compiled, probably because libclang could not be located. This means that you cannot build the Qt documentation.
-
+ "condition": "!features.clang",
+ "message": "QDoc will not be compiled, probably because libclang could not be located. This means that you cannot build the Qt documentation.\n
Either ensure that llvm-config is in your PATH environment variable, or set LLVM_INSTALL_DIR to the location of your llvm installation.
On Linux systems, you may be able to install libclang by installing the libclang-dev or libclang-devel package, depending on your distribution.
On macOS, you can use Homebrew's llvm package.
On Windows, you must set LLVM_INSTALL_DIR to the installation path."
+ },
+ {
+ "type": "warning",
+ "condition": "!features.clangcpp",
+ "message": "Clang-based lupdate parser will not be available. LLVM and Clang C++ libraries have not been found."
}
],
"summary": [
{
"section": "Qt Tools",
"entries": [
- "qdoc"
+ "clang",
+ "clangcpp"
]
}
]
diff --git a/src/global/configure.pri b/src/global/configure.pri
new file mode 100644
index 000000000..a6357f4d1
--- /dev/null
+++ b/src/global/configure.pri
@@ -0,0 +1,526 @@
+defineReplace(extractVersion) { return($$replace(1, ^(\\d+\\.\\d+\\.\\d+)(svn)?$, \\1)) }
+defineReplace(extractMajorVersion) { return($$replace(1, ^(\\d+)\\.\\d+\\.\\d+(svn)?$, \\1)) }
+defineReplace(extractMinorVersion) { return($$replace(1, ^\\d+\\.(\\d+)\\.\\d+(svn)?$, \\1)) }
+defineReplace(extractPatchVersion) { return($$replace(1, ^\\d+\\.\\d+\\.(\\d+)(svn)?$, \\1)) }
+
+defineTest(versionIsAtLeast) {
+ actual_major_version = $$extractMajorVersion($$1)
+ actual_minor_version = $$extractMinorVersion($$1)
+ actual_patch_version = $$extractPatchVersion($$1)
+ required_min_major_version = $$extractMajorVersion($$2)
+ required_min_minor_version = $$extractMinorVersion($$2)
+ required_min_patch_version = $$extractPatchVersion($$2)
+
+ isEqual(actual_major_version, $$required_min_major_version) {
+ isEqual(actual_minor_version, $$required_min_minor_version) {
+ isEqual(actual_patch_version, $$required_min_patch_version): return(true)
+ greaterThan(actual_patch_version, $$required_min_patch_version): return(true)
+ }
+ greaterThan(actual_minor_version, $$required_min_minor_version): return(true)
+ }
+ greaterThan(actual_major_version, $$required_min_major_version): return(true)
+
+ return(false)
+}
+
+defineReplace(findLLVMVersionFromLibDir) {
+ libdir = $$1
+ version_dirs = $$files($$libdir/clang/*)
+ for (version_dir, version_dirs) {
+ fileName = $$basename(version_dir)
+ version = $$find(fileName, ^(\\d+\\.\\d+\\.\\d+)$)
+ !isEmpty(version) {
+ isEmpty(candidateVersion): candidateVersion = $$version
+ else: versionIsAtLeast($$version, $$candidateVersion): candidateVersion = $$version
+ }
+ }
+ return($$candidateVersion)
+}
+
+defineReplace(FindCleanLLVMInstallDir) {
+ # Assume libclang is installed on the target system
+ equals(QMAKE_HOST.os, Windows) {
+ # on Windows we have only two host compilers, MSVC or mingw. The former we never
+ # use for cross-compilation where it isn't also the target compiler. The latter
+ # is not detectable as this .prf file is evaluated against the target configuration
+ # and therefore checking for "mingw" won't work when the target compiler is clang (Android)
+ # or qcc (QNX).
+ msvc {
+ isEmpty(LLVM_INSTALL_DIR): LLVM_INSTALL_DIR = $$(LLVM_INSTALL_DIR_MSVC)
+ } else {
+ isEmpty(LLVM_INSTALL_DIR): LLVM_INSTALL_DIR = $$(LLVM_INSTALL_DIR_MINGW)
+ }
+ }
+ isEmpty(LLVM_INSTALL_DIR): LLVM_INSTALL_DIR = $$(LLVM_INSTALL_DIR)
+ isEmpty(LLVM_INSTALL_DIR) {
+ llvmConfigCandidates = \
+ llvm-config-9 \
+ llvm-config-8 \
+ llvm-config-7 \
+ llvm-config-6.0 \
+ llvm-config-5.0 \
+ llvm-config-4.0 \
+ llvm-config-3.9 \
+ llvm-config
+
+ for (candidate, llvmConfigCandidates) {
+ LLVM_INSTALL_DIR = $$system("$$candidate --prefix 2>$$QMAKE_SYSTEM_NULL_DEVICE")
+ !isEmpty(LLVM_INSTALL_DIR) {
+ CLANG_INCLUDEPATH = $$system("$$candidate --includedir 2>/dev/null")
+ LIBCLANG_MAIN_HEADER = $$CLANG_INCLUDEPATH/clang-c/Index.h
+ !exists($$LIBCLANG_MAIN_HEADER) {
+ !isEmpty(LLVM_INSTALL_DIR): \
+ qtLog("Cannot find libclang's main header file, candidate: $${LIBCLANG_MAIN_HEADER}.")
+ continue
+ } else {
+ qtLog("QDoc:" \
+ "Using Clang installation found in $${LLVM_INSTALL_DIR}." \
+ "Set the LLVM_INSTALL_DIR environment variable to override.")
+ break()
+ }
+ }
+ }
+ }
+ LLVM_INSTALL_DIR = $$clean_path($$LLVM_INSTALL_DIR)
+ return($$LLVM_INSTALL_DIR)
+}
+
+defineReplace(FindClangInstallDir) {
+ llvm_install_dir=$$1
+ contains(QMAKE_HOST.arch, x86_64): \
+ clangInstallDir = $$replace(llvm_install_dir, _ARCH_, 64)
+ else: \
+ clangInstallDir = $$replace(llvm_install_dir, _ARCH_, 32)
+ isEmpty(llvm_install_dir) {
+ macos {
+ # Default to homebrew llvm on macOS. The CLANG_VERSION test below will complain if missing.
+ clangInstallDir = $$system("brew --prefix llvm")
+ } else {
+ clangInstallDir = /usr
+ }
+ }
+ return($$clangInstallDir)
+}
+
+defineReplace(CheckClangCppLibForLupdateParser) {
+ clangLibDir = $$1
+ libToTest = clangTooling \
+ clangFrontendTool \
+ clangFrontend \
+ clangDriver \
+ clangSerialization \
+ clangCodeGen \
+ clangParse \
+ clangSema \
+ clangStaticAnalyzerFrontend \
+ clangStaticAnalyzerCheckers \
+ clangStaticAnalyzerCore \
+ clangAnalysis \
+ clangARCMigrate \
+ clangASTMatchers \
+ clangAST \
+ clangRewrite \
+ clangRewriteFrontend \
+ clangEdit \
+ clangLex \
+ clangIndex \
+ clangBasic
+
+ versionIsAtLeast($$CLANG_VERSION, "10.0.0"){
+ libToTest += clangToolingRefactoring
+ } else {
+ libToTest += clangToolingRefactor
+ }
+
+
+ CLANG_CPP_LIBS =
+ for (lib, libToTest) {
+ libFullPath =
+ msvc {
+ libFullPath += $$clangLibDir/$${lib}.lib
+ } else {
+ equals(QMAKE_HOST.os, Windows): \
+ libFullPath += $$clangLibDir/$${lib}.lib
+ else: \
+ libFullPath += $$clangLibDir/lib$${lib}.a
+ }
+ message(libFullPath= $$libFullPath)
+
+ CLANG_CPP_LIBS += -l$$lib
+ !exists($$libFullPath): {
+ CLANG_CPP_LIBS =
+ qtLog("Cannot locate $$libFullPath.")
+ return($$CLANG_CPP_LIBS)
+ }
+ }
+ return($$CLANG_CPP_LIBS)
+}
+
+defineReplace(CheckClangLlvmLibForLupdateParser) {
+ clangLibDir = $$1
+ libToTest += LLVMOption \
+ LLVMProfileData \
+ LLVMMCParser \
+ LLVMMC \
+ LLVMBitReader \
+ LLVMCore \
+ LLVMBinaryFormat \
+ LLVMSupport \
+ LLVMDemangle
+
+ versionIsAtLeast($$CLANG_VERSION, "10.0.0") {
+ libToTest += LLVMBitstreamReader\
+ LLVMRemarks
+ }
+
+ CLANG_LLVM_LIBS =
+ for (lib, libToTest) {
+ libFullPath =
+ msvc {
+ libFullPath += $$clangLibDir/$${lib}.lib
+ } else {
+ equals(QMAKE_HOST.os, Windows): \
+ libFullPath += $$clangLibDir/$${lib}.lib
+ else: \
+ libFullPath += $$clangLibDir/lib$${lib}.a
+ }
+
+ CLANG_LLVM_LIBS += -l$$lib
+ !exists($$libFullPath): {
+ CLANG_LLVM_LIBS =
+ return($$CLANG_LLVM_LIBS)
+ }
+ }
+ !equals(QMAKE_HOST.os, Windows): \
+ CLANG_LLVM_LIBS += -lz -ltinfo
+ return($$CLANG_LLVM_LIBS)
+}
+
+defineTest(qtConfTest_libclang) {
+ isEmpty(QDOC_USE_STATIC_LIBCLANG): QDOC_USE_STATIC_LIBCLANG = $$(QDOC_USE_STATIC_LIBCLANG)
+
+ LLVM_INSTALL_DIR = $$FindCleanLLVMInstallDir()
+ isEmpty(LLVM_INSTALL_DIR) {
+ win32 {
+ return(false)
+ }
+ }
+ clangInstallDir = $$FindClangInstallDir($$LLVM_INSTALL_DIR)
+
+ # note: llvm_config only exits on unix
+ llvm_config = $$clangInstallDir/bin/llvm-config
+ exists($$llvm_config) {
+ CLANG_LIBDIR = $$system("$$llvm_config --libdir 2>/dev/null")
+ CLANG_INCLUDEPATH = $$system("$$llvm_config --includedir 2>/dev/null")
+ output = $$system("$$llvm_config --version 2>/dev/null")
+ CLANG_VERSION = $$extractVersion($$output)
+ } else {
+ CLANG_LIBDIR = $$clangInstallDir/lib
+ CLANG_INCLUDEPATH = $$clangInstallDir/include
+ CLANG_VERSION = $$findLLVMVersionFromLibDir($$CLANG_LIBDIR)
+ }
+ isEmpty(CLANG_VERSION) {
+ !isEmpty(LLVM_INSTALL_DIR): \
+ qtLog("Cannot determine version of clang installation in $${clangInstallDir}.")
+ return(false)
+ }
+
+ LIBCLANG_MAIN_HEADER = $$CLANG_INCLUDEPATH/clang-c/Index.h
+ !exists($$LIBCLANG_MAIN_HEADER) {
+ !isEmpty(LLVM_INSTALL_DIR): \
+ qtLog("Cannot find libclang's main header file, candidate: $${LIBCLANG_MAIN_HEADER}.")
+ return(false)
+ }
+
+ !contains(QMAKE_DEFAULT_LIBDIRS, $$CLANG_LIBDIR): CLANG_LIBS = -L$${CLANG_LIBDIR}
+
+ CLANG_DEFINES =
+ HAS_CLANGCPP = false
+ CLANGCPP_LIB =
+
+ isEmpty(QDOC_USE_STATIC_LIBCLANG) {
+ # entering here in case of user (as opposed to CI)
+
+ #--------------- QDoc needs --------------------------------
+ equals(QMAKE_HOST.os, Windows): \
+ CLANG_LIBS += -llibclang -ladvapi32 -lshell32 -lversion
+ else: \
+ CLANG_LIBS += -lclang
+
+ #--------------- Lupdate clang-based parser needs Clang C++ and llvm libraries
+ CLANGCPP_DY_LIB = $$CLANG_LIBDIR/libclang_shared.so
+ # Checking clang cpp libraries
+ # check for shared libraries (not available for Windows at the moment)
+ exists($$CLANGCPP_DY_LIB): {
+ CLANGCPP_LIBS += -lclang_shared
+ } else {
+ # check for static libraries
+ CLANGCPP_LIBS += $$CheckClangCppLibForLupdateParser($$CLANG_LIBDIR)
+ }
+ # Checking for LLVM libraries needed for Lupdate clang-based parser
+ # At this point, if CLANGCPP_LIBS is empty, no need to go further
+ !isEmpty(CLANGCPP_LIBS): {
+ LLVM_DY_LIB = $$CLANG_LIBDIR/libLLVM.so
+ # check for shared libraries (not available for Windows at the moment)
+ exists($$LLVM_DY_LIB): {
+ CLANGCPP_LIBS += -lLLVM
+ HAS_CLANGCPP = true # Clang cpp and llvm libraries have been found
+ } else: {
+ # check for static libraries
+ CLANGLLVM_LIBS = $$CheckClangLlvmLibForLupdateParser($$CLANG_LIBDIR)
+ !isEmpty(CLANGLLVM_LIBS): {
+ CLANGCPP_LIBS += $$CLANGLLVM_LIBS
+ HAS_CLANGCPP = true # Clang cpp and llvm libraries have been found
+ }
+ }
+ #----------------------------------------------------------------------
+ }
+ } else {
+ # CI
+ HAS_CLANGCPP = true #just assuming for now
+ msvc {
+ CLANG_DEFINES += CINDEX_LINKAGE=
+ CLANG_LIBS += -llibclang_static -ladvapi32 -lshell32 -lMincore -lversion
+ } else {
+ !equals(QMAKE_HOST.os, Darwin): CLANG_LIBS+=-Wl,--start-group
+ CLANG_LIBS += -lclangAnalysis \
+ -lclangApplyReplacements \
+ -lclangARCMigrate \
+ -lclangAST \
+ -lclangASTMatchers \
+ -lclangBasic \
+ -lclangChangeNamespace \
+ -lclangCodeGen \
+ -lclangCrossTU \
+ -lclangDaemon \
+ -lclangDriver \
+ -lclangDynamicASTMatchers \
+ -lclangEdit \
+ -lclangFormat \
+ -lclangFrontend \
+ -lclangFrontendTool \
+ -lclangHandleCXX \
+ -lclangIncludeFixer \
+ -lclangIncludeFixerPlugin \
+ -lclangIndex \
+ -lclangLex \
+ -lclangMove \
+ -lclangParse \
+ -lclangQuery \
+ -lclangReorderFields \
+ -lclangRewrite \
+ -lclangRewriteFrontend \
+ -lclangSema \
+ -lclangSerialization \
+ -lclang_static \
+ -lclangStaticAnalyzerCheckers \
+ -lclangStaticAnalyzerCore \
+ -lclangStaticAnalyzerFrontend \
+ -lclangTidy \
+ -lclangTidyAndroidModule \
+ -lclangTidyBoostModule \
+ -lclangTidyBugproneModule \
+ -lclangTidyCERTModule \
+ -lclangTidyCppCoreGuidelinesModule \
+ -lclangTidyFuchsiaModule \
+ -lclangTidyGoogleModule \
+ -lclangTidyHICPPModule \
+ -lclangTidyLLVMModule \
+ -lclangTidyMiscModule \
+ -lclangTidyModernizeModule \
+ -lclangTidyMPIModule \
+ -lclangTidyObjCModule \
+ -lclangTidyPerformanceModule \
+ -lclangTidyPlugin \
+ -lclangTidyReadabilityModule \
+ -lclangTidyUtils \
+ -lclangTooling \
+ -lclangToolingASTDiff \
+ -lclangToolingCore \
+ -lclangToolingRefactor \
+ -lfindAllSymbols \
+ -lLLVMAArch64AsmParser \
+ -lLLVMAArch64AsmPrinter \
+ -lLLVMAArch64CodeGen \
+ -lLLVMAArch64Desc \
+ -lLLVMAArch64Disassembler \
+ -lLLVMAArch64Info \
+ -lLLVMAArch64Utils \
+ -lLLVMAMDGPUAsmParser \
+ -lLLVMAMDGPUAsmPrinter \
+ -lLLVMAMDGPUCodeGen \
+ -lLLVMAMDGPUDesc \
+ -lLLVMAMDGPUDisassembler \
+ -lLLVMAMDGPUInfo \
+ -lLLVMAMDGPUUtils \
+ -lLLVMAnalysis \
+ -lLLVMARMAsmParser \
+ -lLLVMARMAsmPrinter \
+ -lLLVMARMCodeGen \
+ -lLLVMARMDesc \
+ -lLLVMARMDisassembler \
+ -lLLVMARMInfo \
+ -lLLVMARMUtils \
+ -lLLVMAsmParser \
+ -lLLVMAsmPrinter \
+ -lLLVMBinaryFormat \
+ -lLLVMBitReader \
+ -lLLVMBitWriter \
+ -lLLVMBPFAsmParser \
+ -lLLVMBPFAsmPrinter \
+ -lLLVMBPFCodeGen \
+ -lLLVMBPFDesc \
+ -lLLVMBPFDisassembler \
+ -lLLVMBPFInfo \
+ -lLLVMCodeGen \
+ -lLLVMCore \
+ -lLLVMCoroutines \
+ -lLLVMCoverage \
+ -lLLVMDebugInfoCodeView \
+ -lLLVMDebugInfoDWARF \
+ -lLLVMDebugInfoMSF \
+ -lLLVMDebugInfoPDB \
+ -lLLVMDemangle \
+ -lLLVMDlltoolDriver \
+ -lLLVMExecutionEngine \
+ -lLLVMFuzzMutate \
+ -lLLVMGlobalISel \
+ -lLLVMHexagonAsmParser \
+ -lLLVMHexagonCodeGen \
+ -lLLVMHexagonDesc \
+ -lLLVMHexagonDisassembler \
+ -lLLVMHexagonInfo \
+ -lLLVMInstCombine \
+ -lLLVMInstrumentation \
+ -lLLVMInterpreter \
+ -lLLVMipo \
+ -lLLVMIRReader \
+ -lLLVMLanaiAsmParser \
+ -lLLVMLanaiAsmPrinter \
+ -lLLVMLanaiCodeGen \
+ -lLLVMLanaiDesc \
+ -lLLVMLanaiDisassembler \
+ -lLLVMLanaiInfo \
+ -lLLVMLibDriver \
+ -lLLVMLineEditor \
+ -lLLVMLinker \
+ -lLLVMLTO \
+ -lLLVMMC \
+ -lLLVMMCDisassembler \
+ -lLLVMMCJIT \
+ -lLLVMMCParser \
+ -lLLVMMipsAsmParser \
+ -lLLVMMipsAsmPrinter \
+ -lLLVMMipsCodeGen \
+ -lLLVMMipsDesc \
+ -lLLVMMipsDisassembler \
+ -lLLVMMipsInfo \
+ -lLLVMMIRParser \
+ -lLLVMMSP430AsmPrinter \
+ -lLLVMMSP430CodeGen \
+ -lLLVMMSP430Desc \
+ -lLLVMMSP430Info \
+ -lLLVMNVPTXAsmPrinter \
+ -lLLVMNVPTXCodeGen \
+ -lLLVMNVPTXDesc \
+ -lLLVMNVPTXInfo \
+ -lLLVMObjCARCOpts \
+ -lLLVMObject \
+ -lLLVMObjectYAML \
+ -lLLVMOption \
+ -lLLVMOrcJIT \
+ -lLLVMPasses \
+ -lLLVMPowerPCAsmParser \
+ -lLLVMPowerPCAsmPrinter \
+ -lLLVMPowerPCCodeGen \
+ -lLLVMPowerPCDesc \
+ -lLLVMPowerPCDisassembler \
+ -lLLVMPowerPCInfo \
+ -lLLVMProfileData \
+ -lLLVMRuntimeDyld \
+ -lLLVMScalarOpts \
+ -lLLVMSelectionDAG \
+ -lLLVMSparcAsmParser \
+ -lLLVMSparcAsmPrinter \
+ -lLLVMSparcCodeGen \
+ -lLLVMSparcDesc \
+ -lLLVMSparcDisassembler \
+ -lLLVMSparcInfo \
+ -lLLVMSupport \
+ -lLLVMSymbolize \
+ -lLLVMSystemZAsmParser \
+ -lLLVMSystemZAsmPrinter \
+ -lLLVMSystemZCodeGen \
+ -lLLVMSystemZDesc \
+ -lLLVMSystemZDisassembler \
+ -lLLVMSystemZInfo \
+ -lLLVMTableGen \
+ -lLLVMTarget \
+ -lLLVMTransformUtils \
+ -lLLVMVectorize \
+ -lLLVMWindowsManifest \
+ -lLLVMX86AsmParser \
+ -lLLVMX86AsmPrinter \
+ -lLLVMX86CodeGen \
+ -lLLVMX86Desc \
+ -lLLVMX86Disassembler \
+ -lLLVMX86Info \
+ -lLLVMX86Utils \
+ -lLLVMXCoreAsmPrinter \
+ -lLLVMXCoreCodeGen \
+ -lLLVMXCoreDesc \
+ -lLLVMXCoreDisassembler \
+ -lLLVMXCoreInfo \
+ -lLLVMXRay
+ !equals(QMAKE_HOST.os, Darwin): CLANG_LIBS+=-Wl,--end-group
+ CLANG_LIBS += -lz
+ equals(QMAKE_HOST.os, Windows): CLANG_LIBS += -lpsapi -lshell32 -lole32 -luuid -ladvapi32 -lversion
+ else: CLANG_LIBS += -ldl
+ equals(QMAKE_HOST.os, Darwin): CLANG_LIBS += -lcurses -lm -lxml2
+ }
+ }
+
+ !versionIsAtLeast($$CLANG_VERSION, "3.9.0") {
+ log("LLVM/Clang version >= 3.9.0 required, version provided: $${CLANG_VERSION}.$$escape_expand(\\n)")
+ return(false)
+ }
+
+ !versionIsAtLeast($$CLANG_VERSION, "8.0.0") {
+ # if not InitLLVM.h is missing
+ log("LLVM/Clang version >= 8.0.0 required for Clang-based lupdate parser. \
+ Version provided: $${CLANG_VERSION}.$$escape_expand(\\n)")
+ HAS_CLANGCPP = false
+ }
+
+ $${1}.libs = $$CLANG_LIBS
+ export($${1}.libs)
+ $${1}.cache += libs
+
+ $${1}.includepath = $$CLANG_INCLUDEPATH
+ export($${1}.includepath)
+ $${1}.cache += includepath
+
+ $${1}.libdir = $$CLANG_LIBDIR
+ export($${1}.libdir)
+ $${1}.cache += libdir
+
+ $${1}.defines = $$CLANG_DEFINES
+ export($${1}.defines)
+ $${1}.cache += defines
+
+ $${1}.version = $$CLANG_VERSION
+ export($${1}.version)
+ $${1}.cache += version
+
+ $${1}.has_clangcpp = $$HAS_CLANGCPP
+ export($${1}.has_clangcpp)
+ $${1}.cache += has_clangcpp
+
+ $${1}.clangcpp_libs = $$CLANGCPP_LIBS
+ export($${1}.clangcpp_libs)
+ $${1}.cache += clangcpp_libs
+
+ export($${1}.cache)
+
+ return(true)
+}
diff --git a/src/global/global.pro b/src/global/global.pro
new file mode 100644
index 000000000..42473fb8b
--- /dev/null
+++ b/src/global/global.pro
@@ -0,0 +1,6 @@
+TARGET = QtTools
+MODULE = tools
+CONFIG += internal_module header_module
+QT =
+
+load(qt_module)
diff --git a/src/linguist/lupdate/lupdate.pro b/src/linguist/lupdate/lupdate.pro
index 615b41802..497a981e5 100644
--- a/src/linguist/lupdate/lupdate.pro
+++ b/src/linguist/lupdate/lupdate.pro
@@ -1,5 +1,5 @@
option(host_build)
-QT = core-private
+QT = core-private tools-private
qtHaveModule(qmldevtools-private) {
QT += qmldevtools-private
@@ -7,6 +7,17 @@ qtHaveModule(qmldevtools-private) {
DEFINES += QT_NO_QML
}
+include($$OUT_PWD/../../global/qttools-config.pri)
+qtConfig(clangcpp) {
+ LIBS += $$CLANGCPP_LIBS $$CLANG_LIBS
+
+ !contains(QMAKE_DEFAULT_INCDIRS, $$CLANG_INCLUDEPATH): INCLUDEPATH += $$CLANG_INCLUDEPATH
+ DEFINES += $$CLANG_DEFINES
+
+ !contains(QMAKE_DEFAULT_LIBDIRS, $$CLANG_LIBDIR):!disable_external_rpath: QMAKE_RPATHDIR += $$CLANG_LIBDIR
+ DEFINES += $$shell_quote(CLANG_RESOURCE_DIR=\"$${CLANG_LIBDIR}/clang/$${CLANG_VERSION}/include\")
+}
+
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
include(../shared/formats.pri)
diff --git a/src/qdoc/qdoc.pro b/src/qdoc/qdoc.pro
index 47985f957..f9aa52225 100644
--- a/src/qdoc/qdoc.pro
+++ b/src/qdoc/qdoc.pro
@@ -11,7 +11,7 @@ qtHaveModule(qmldevtools-private) {
DEFINES += QT_NO_DECLARATIVE
}
-include($$OUT_PWD/qtqdoc-config.pri)
+include($$OUT_PWD/../global/qttools-config.pri)
LIBS += $$CLANG_LIBS
!contains(QMAKE_DEFAULT_INCDIRS, $$CLANG_INCLUDEPATH): INCLUDEPATH += $$CLANG_INCLUDEPATH
diff --git a/src/src.pro b/src/src.pro
index 5c256ea3b..90b43b4cd 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -23,9 +23,10 @@ qtConfig(library) {
!android|android_app: SUBDIRS += qtplugininfo
}
-include($$OUT_PWD/qdoc/qtqdoc-config.pri)
-QT_FOR_CONFIG += qdoc-private
-qtConfig(qdoc): qtConfig(thread): SUBDIRS += qdoc
+SUBDIRS += global
+include($$OUT_PWD/global/qttools-config.pri)
+QT_FOR_CONFIG += tools-private
+qtConfig(clang): qtConfig(thread): SUBDIRS += qdoc
!android|android_app: SUBDIRS += qtpaths
diff --git a/sync.profile b/sync.profile
index 9f88ac68d..de4261afc 100644
--- a/sync.profile
+++ b/sync.profile
@@ -1,4 +1,5 @@
%modules = ( # path to module name map
+ "QtTools" => "$basedir/src/global",
"QtHelp" => "$basedir/src/assistant/help",
"QtUiTools" => "$basedir/src/designer/src/uitools",
"QtUiPlugin" => "$basedir/src/designer/src/uiplugin",