From 6c780c765e96396c3ba23c5d6cf1f4d11f52dfb7 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 8 Jun 2015 16:08:05 +0200 Subject: [PATCH] Clang: Clean up / Improve *clang*.{pri,pro} clang_installation.pri * Remove pointless CLANG_COMPLETION, CLANG_HIGHLIGHTING defines * Remove auto-detection of llvm-config-* variants in PATH. This does not make any sense if the user has to provide LLVM_INSTALL_DIR. * If llvm-config is not found in LLVM_INSTALL_DIR, determine the clang version by looking into the lib dir (there should exist e.g. "clang/3.6.1") * Check paths for existence * Simplify logic * Do not call error() in helper functions clangcodemodel.pro * Print detected version * Sort HEADERS/SOURCES Change-Id: I020d2e78aea37ef01a337e6da658d7f5e56b3ac5 Reviewed-by: Marco Bubke --- src/plugins/clangcodemodel/clangcodemodel.pro | 96 +++++++-------- src/shared/clang/clang_installation.pri | 113 +++++++----------- 2 files changed, 91 insertions(+), 118 deletions(-) diff --git a/src/plugins/clangcodemodel/clangcodemodel.pro b/src/plugins/clangcodemodel/clangcodemodel.pro index f797df6b78f..b48e7a99a4a 100644 --- a/src/plugins/clangcodemodel/clangcodemodel.pro +++ b/src/plugins/clangcodemodel/clangcodemodel.pro @@ -1,76 +1,72 @@ include(../../qtcreatorplugin.pri) include(../../shared/clang/clang_installation.pri) -message("Building ClangCodeModel plugin with Clang from $$LLVM_INSTALL_DIR") -message(" INCLUDEPATH += $$LLVM_INCLUDEPATH") -message(" LIBS += $$LLVM_LIBS") - LIBS += $$LLVM_LIBS INCLUDEPATH += $$LLVM_INCLUDEPATH DEFINES += CLANGCODEMODEL_LIBRARY +# The following defines are used to determine the clang include path for intrinsics +DEFINES += CLANG_VERSION=\\\"$${LLVM_VERSION}\\\" +DEFINES += "\"CLANG_RESOURCE_DIR=\\\"$${LLVM_LIBDIR}/clang/$${LLVM_VERSION}/include\\\"\"" + unix:QMAKE_LFLAGS += -Wl,-rpath,\'$$LLVM_LIBDIR\' -contains(DEFINES, CLANG_COMPLETION) { - HEADERS += clangcompletion.h clangcompleter.h completionproposalsbuilder.h - SOURCES += clangcompletion.cpp clangcompleter.cpp completionproposalsbuilder.cpp -} - -contains(DEFINES, CLANG_HIGHLIGHTING) { - HEADERS += cppcreatemarkers.h - SOURCES += cppcreatemarkers.cpp -} - SOURCES += \ $$PWD/clangcodemodelplugin.cpp \ + $$PWD/clangcompleter.cpp \ + $$PWD/clangcompletion.cpp \ $$PWD/clangeditordocumentparser.cpp \ $$PWD/clangeditordocumentprocessor.cpp \ - $$PWD/sourcemarker.cpp \ - $$PWD/symbol.cpp \ - $$PWD/sourcelocation.cpp \ - $$PWD/unit.cpp \ - $$PWD/utils.cpp \ - $$PWD/utils_p.cpp \ - $$PWD/semanticmarker.cpp \ + $$PWD/clangmodelmanagersupport.cpp \ + $$PWD/clangprojectsettings.cpp \ + $$PWD/clangprojectsettingspropertiespage.cpp \ + $$PWD/clangutils.cpp \ + $$PWD/completionproposalsbuilder.cpp \ + $$PWD/cppcreatemarkers.cpp \ + $$PWD/cxprettyprinter.cpp \ $$PWD/diagnostic.cpp \ - $$PWD/unsavedfiledata.cpp \ $$PWD/fastindexer.cpp \ $$PWD/pchinfo.cpp \ $$PWD/pchmanager.cpp \ - $$PWD/clangprojectsettings.cpp \ - $$PWD/clangprojectsettingspropertiespage.cpp \ $$PWD/raii/scopedclangoptions.cpp \ - $$PWD/clangmodelmanagersupport.cpp + $$PWD/semanticmarker.cpp \ + $$PWD/sourcelocation.cpp \ + $$PWD/sourcemarker.cpp \ + $$PWD/symbol.cpp \ + $$PWD/unit.cpp \ + $$PWD/unsavedfiledata.cpp \ + $$PWD/utils.cpp \ + $$PWD/utils_p.cpp HEADERS += \ $$PWD/clangcodemodelplugin.h \ + $$PWD/clangcompleter.h \ + $$PWD/clangcompletion.h \ $$PWD/clangeditordocumentparser.h \ $$PWD/clangeditordocumentprocessor.h \ $$PWD/clang_global.h \ - $$PWD/sourcemarker.h \ + $$PWD/clangmodelmanagersupport.h \ + $$PWD/clangprojectsettings.h \ + $$PWD/clangprojectsettingspropertiespage.h \ + $$PWD/clangutils.h \ + $$PWD/completionproposalsbuilder.h \ $$PWD/constants.h \ - $$PWD/symbol.h \ + $$PWD/cppcreatemarkers.h \ + $$PWD/cxprettyprinter.h \ $$PWD/cxraii.h \ - $$PWD/sourcelocation.h \ - $$PWD/unit.h \ - $$PWD/utils.h \ - $$PWD/utils_p.h \ - $$PWD/semanticmarker.h \ $$PWD/diagnostic.h \ - $$PWD/unsavedfiledata.h \ $$PWD/fastindexer.h \ $$PWD/pchinfo.h \ $$PWD/pchmanager.h \ - $$PWD/clangprojectsettings.h \ - $$PWD/clangprojectsettingspropertiespage.h \ $$PWD/raii/scopedclangoptions.h \ - $$PWD/clangmodelmanagersupport.h - -HEADERS += clangutils.h \ - cxprettyprinter.h - -SOURCES += clangutils.cpp \ - cxprettyprinter.cpp + $$PWD/semanticmarker.h \ + $$PWD/sourcelocation.h \ + $$PWD/sourcemarker.h \ + $$PWD/symbol.h \ + $$PWD/unit.h \ + $$PWD/unsavedfiledata.h \ + $$PWD/utils.h \ + $$PWD/utils_p.h contains(DEFINES, CLANG_INDEXING) { HEADERS += \ @@ -86,6 +82,8 @@ contains(DEFINES, CLANG_INDEXING) { # $$PWD/dependencygraph.cpp \ } +FORMS += $$PWD/clangprojectsettingspropertiespage.ui + equals(TEST, 1) { RESOURCES += \ $$PWD/test/clang_tests_database.qrc @@ -94,8 +92,8 @@ equals(TEST, 1) { $$PWD/test/completiontesthelper.h SOURCES += \ - $$PWD/test/completiontesthelper.cpp \ - $$PWD/test/clangcompletion_test.cpp + $$PWD/test/clangcompletion_test.cpp \ + $$PWD/test/completiontesthelper.cpp DISTFILES += \ $$PWD/test/cxx_regression_1.cpp \ @@ -110,14 +108,12 @@ equals(TEST, 1) { $$PWD/test/cxx_snippets_1.cpp \ $$PWD/test/cxx_snippets_2.cpp \ $$PWD/test/cxx_snippets_3.cpp \ - test/cxx_snippets_4.cpp \ - test/objc_messages_1.mm \ - test/objc_messages_2.mm \ - test/objc_messages_3.mm + $$PWD/test/cxx_snippets_4.cpp \ + $$PWD/test/objc_messages_1.mm \ + $$PWD/test/objc_messages_2.mm \ + $$PWD/test/objc_messages_3.mm } -FORMS += $$PWD/clangprojectsettingspropertiespage.ui - macx { LIBCLANG_VERSION=3.3 POSTL = install_name_tool -change "@executable_path/../lib/libclang.$${LIBCLANG_VERSION}.dylib" "$$LLVM_INSTALL_DIR/lib/libclang.$${LIBCLANG_VERSION}.dylib" "\"$${DESTDIR}/lib$${TARGET}.dylib\"" $$escape_expand(\\n\\t) diff --git a/src/shared/clang/clang_installation.pri b/src/shared/clang/clang_installation.pri index ec2f3749b1f..8a3df51e3d2 100644 --- a/src/shared/clang/clang_installation.pri +++ b/src/shared/clang/clang_installation.pri @@ -1,39 +1,29 @@ isEmpty(LLVM_INSTALL_DIR):LLVM_INSTALL_DIR=$$(LLVM_INSTALL_DIR) LLVM_INSTALL_DIR = $$clean_path($$LLVM_INSTALL_DIR) +isEmpty(LLVM_INSTALL_DIR): error("No LLVM_INSTALL_DIR provided") +!exists($$LLVM_INSTALL_DIR): error("LLVM_INSTALL_DIR does not exist: $$LLVM_INSTALL_DIR") -DEFINES += CLANG_COMPLETION -DEFINES += CLANG_HIGHLIGHTING -#DEFINES += CLANG_INDEXING +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): return($$version) + } +} -defineReplace(findLLVMConfig) { - LLVM_CONFIG_VARIANTS = \ - llvm-config llvm-config-3.2 llvm-config-3.3 llvm-config-3.4 \ - llvm-config-3.5 llvm-config-3.6 llvm-config-4.0 llvm-config-4.1 - - # Prefer llvm-config* from LLVM_INSTALL_DIR - !isEmpty(LLVM_INSTALL_DIR) { - for(variant, LLVM_CONFIG_VARIANTS) { - variant=$$LLVM_INSTALL_DIR/bin/$$variant - exists($$variant) { - return($$variant) - } +defineReplace(findClangLibInLibDir) { + libdir = $$1 + exists ($${libdir}/libclang.*) { + #message("LLVM was build with autotools") + return("clang") + } else { + exists ($${libdir}/liblibclang.*) { + #message("LLVM was build with CMake") + return("libclang") } } - - # Find llvm-config* in PATH - ENV_PATH = $$(PATH) - ENV_PATH = $$split(ENV_PATH, $$QMAKE_DIRLIST_SEP) - for(variant, LLVM_CONFIG_VARIANTS) { - for(path, ENV_PATH) { - subvariant = $$path/$$variant - exists($$subvariant) { - return($$subvariant) - } - } - } - - # Fallback - return(llvm-config) } defineReplace(findClangOnWindows) { @@ -48,54 +38,41 @@ defineReplace(findClangOnWindows) { } } } - error("Cannot find clang shared library at $${LLVM_INSTALL_DIR}") } win32 { LLVM_INCLUDEPATH = "$$LLVM_INSTALL_DIR/include" - CLANG_LIB_PATH = $$findClangOnWindows() - CLANG_LIB = clang - !exists("$${CLANG_LIB_PATH}/clang.*"):CLANG_LIB = libclang + LLVM_LIBDIR = $$findClangOnWindows() + isEmpty(LLVM_LIBDIR): error("Cannot find clang shared library at $${LLVM_INSTALL_DIR}") + LLVM_VERSION = $$findLLVMVersionFromLibDir($$LLVM_LIBDIR) - LLVM_LIBS = -L"$${CLANG_LIB_PATH}" -l$${CLANG_LIB} + clang_lib = clang + !exists("$${LLVM_LIBDIR}/clang.*"): clang_lib = libclang + + LLVM_LIBS = -L"$${LLVM_LIBDIR}" -l$${clang_lib} LLVM_LIBS += -ladvapi32 -lshell32 - LLVM_VERSION = 3.4 } unix { - LLVM_CONFIG = $$findLLVMConfig() - - LLVM_VERSION = $$system($$LLVM_CONFIG --version 2>/dev/null) - LLVM_VERSION = $$replace(LLVM_VERSION, ^(\\d+\\.\\d+\\.\\d+).*$, \\1) - message("... version $$LLVM_VERSION") - - LLVM_INCLUDEPATH = $$system($$LLVM_CONFIG --includedir 2>/dev/null) - isEmpty(LLVM_INCLUDEPATH):LLVM_INCLUDEPATH=$$LLVM_INSTALL_DIR/include - LLVM_LIBDIR = $$system($$LLVM_CONFIG --libdir 2>/dev/null) - isEmpty(LLVM_LIBDIR):LLVM_LIBDIR=$$LLVM_INSTALL_DIR/lib - - exists ($${LLVM_LIBDIR}/libclang.*) { - #message("LLVM was build with autotools") - CLANG_LIB = clang + llvm_config = $$LLVM_INSTALL_DIR/bin/llvm-config + exists($$llvm_config) { + #message("llvm-config found, querying it for paths and version") + LLVM_LIBDIR = $$system($$llvm_config --libdir 2>/dev/null) + LLVM_INCLUDEPATH = $$system($$llvm_config --includedir 2>/dev/null) + output = $$system($$llvm_config --version 2>/dev/null) + LLVM_VERSION = $$replace(output, ^(\\d+\\.\\d+\\.\\d+)$, \\1) } else { - exists ($${LLVM_LIBDIR}/liblibclang.*) { - #message("LLVM was build with CMake") - CLANG_LIB = libclang - } else { - exists ($${LLVM_INSTALL_DIR}/lib/libclang.*) { - #message("libclang placed separately from LLVM") - CLANG_LIB = clang - LLVM_LIBDIR = $${LLVM_INSTALL_DIR}/lib - LLVM_INCLUDEPATH=$${LLVM_INSTALL_DIR}/include - } else { - error("Cannot find Clang shared library!") - } - } + #message("llvm-config not found, concluding paths and version from LLVM_INSTALL_DIR") + LLVM_INCLUDEPATH = $$LLVM_INSTALL_DIR/include + LLVM_LIBDIR = $$LLVM_INSTALL_DIR/lib + LLVM_VERSION = $$findLLVMVersionFromLibDir($$LLVM_LIBDIR) } - LLVM_LIBS = -L$${LLVM_LIBDIR} - LLVM_LIBS += -l$${CLANG_LIB} -} + !exists($$LLVM_INCLUDEPATH): error("Cannot detect include dir for clang, candidate: $$LLVM_INCLUDEPATH") + !exists($$LLVM_LIBDIR): error("Cannot detect lib dir for clang, candidate: $$LLVM_LIBDIR") + isEmpty(LLVM_VERSION): error("Cannot determine clang version at $$LLVM_INSTALL_DIR") + clang_lib = $$findClangLibInLibDir($$LLVM_LIBDIR) + isEmpty(clang_lib): error("Cannot find Clang shared library in $$LLVM_LIBDIR") -DEFINES += CLANG_VERSION=\\\"$${LLVM_VERSION}\\\" -DEFINES += "\"CLANG_RESOURCE_DIR=\\\"$${LLVM_LIBDIR}/clang/$${LLVM_VERSION}/include\\\"\"" + LLVM_LIBS = -L$${LLVM_LIBDIR} -l$${clang_lib} +}