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 <marco.bubke@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2015-06-08 16:08:05 +02:00
parent 9b0abb2489
commit 6c780c765e
2 changed files with 91 additions and 118 deletions

View File

@@ -1,76 +1,72 @@
include(../../qtcreatorplugin.pri) include(../../qtcreatorplugin.pri)
include(../../shared/clang/clang_installation.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 LIBS += $$LLVM_LIBS
INCLUDEPATH += $$LLVM_INCLUDEPATH INCLUDEPATH += $$LLVM_INCLUDEPATH
DEFINES += CLANGCODEMODEL_LIBRARY 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\' 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 += \ SOURCES += \
$$PWD/clangcodemodelplugin.cpp \ $$PWD/clangcodemodelplugin.cpp \
$$PWD/clangcompleter.cpp \
$$PWD/clangcompletion.cpp \
$$PWD/clangeditordocumentparser.cpp \ $$PWD/clangeditordocumentparser.cpp \
$$PWD/clangeditordocumentprocessor.cpp \ $$PWD/clangeditordocumentprocessor.cpp \
$$PWD/sourcemarker.cpp \ $$PWD/clangmodelmanagersupport.cpp \
$$PWD/symbol.cpp \ $$PWD/clangprojectsettings.cpp \
$$PWD/sourcelocation.cpp \ $$PWD/clangprojectsettingspropertiespage.cpp \
$$PWD/unit.cpp \ $$PWD/clangutils.cpp \
$$PWD/utils.cpp \ $$PWD/completionproposalsbuilder.cpp \
$$PWD/utils_p.cpp \ $$PWD/cppcreatemarkers.cpp \
$$PWD/semanticmarker.cpp \ $$PWD/cxprettyprinter.cpp \
$$PWD/diagnostic.cpp \ $$PWD/diagnostic.cpp \
$$PWD/unsavedfiledata.cpp \
$$PWD/fastindexer.cpp \ $$PWD/fastindexer.cpp \
$$PWD/pchinfo.cpp \ $$PWD/pchinfo.cpp \
$$PWD/pchmanager.cpp \ $$PWD/pchmanager.cpp \
$$PWD/clangprojectsettings.cpp \
$$PWD/clangprojectsettingspropertiespage.cpp \
$$PWD/raii/scopedclangoptions.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 += \ HEADERS += \
$$PWD/clangcodemodelplugin.h \ $$PWD/clangcodemodelplugin.h \
$$PWD/clangcompleter.h \
$$PWD/clangcompletion.h \
$$PWD/clangeditordocumentparser.h \ $$PWD/clangeditordocumentparser.h \
$$PWD/clangeditordocumentprocessor.h \ $$PWD/clangeditordocumentprocessor.h \
$$PWD/clang_global.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/constants.h \
$$PWD/symbol.h \ $$PWD/cppcreatemarkers.h \
$$PWD/cxprettyprinter.h \
$$PWD/cxraii.h \ $$PWD/cxraii.h \
$$PWD/sourcelocation.h \
$$PWD/unit.h \
$$PWD/utils.h \
$$PWD/utils_p.h \
$$PWD/semanticmarker.h \
$$PWD/diagnostic.h \ $$PWD/diagnostic.h \
$$PWD/unsavedfiledata.h \
$$PWD/fastindexer.h \ $$PWD/fastindexer.h \
$$PWD/pchinfo.h \ $$PWD/pchinfo.h \
$$PWD/pchmanager.h \ $$PWD/pchmanager.h \
$$PWD/clangprojectsettings.h \
$$PWD/clangprojectsettingspropertiespage.h \
$$PWD/raii/scopedclangoptions.h \ $$PWD/raii/scopedclangoptions.h \
$$PWD/clangmodelmanagersupport.h $$PWD/semanticmarker.h \
$$PWD/sourcelocation.h \
HEADERS += clangutils.h \ $$PWD/sourcemarker.h \
cxprettyprinter.h $$PWD/symbol.h \
$$PWD/unit.h \
SOURCES += clangutils.cpp \ $$PWD/unsavedfiledata.h \
cxprettyprinter.cpp $$PWD/utils.h \
$$PWD/utils_p.h
contains(DEFINES, CLANG_INDEXING) { contains(DEFINES, CLANG_INDEXING) {
HEADERS += \ HEADERS += \
@@ -86,6 +82,8 @@ contains(DEFINES, CLANG_INDEXING) {
# $$PWD/dependencygraph.cpp \ # $$PWD/dependencygraph.cpp \
} }
FORMS += $$PWD/clangprojectsettingspropertiespage.ui
equals(TEST, 1) { equals(TEST, 1) {
RESOURCES += \ RESOURCES += \
$$PWD/test/clang_tests_database.qrc $$PWD/test/clang_tests_database.qrc
@@ -94,8 +92,8 @@ equals(TEST, 1) {
$$PWD/test/completiontesthelper.h $$PWD/test/completiontesthelper.h
SOURCES += \ SOURCES += \
$$PWD/test/completiontesthelper.cpp \ $$PWD/test/clangcompletion_test.cpp \
$$PWD/test/clangcompletion_test.cpp $$PWD/test/completiontesthelper.cpp
DISTFILES += \ DISTFILES += \
$$PWD/test/cxx_regression_1.cpp \ $$PWD/test/cxx_regression_1.cpp \
@@ -110,14 +108,12 @@ equals(TEST, 1) {
$$PWD/test/cxx_snippets_1.cpp \ $$PWD/test/cxx_snippets_1.cpp \
$$PWD/test/cxx_snippets_2.cpp \ $$PWD/test/cxx_snippets_2.cpp \
$$PWD/test/cxx_snippets_3.cpp \ $$PWD/test/cxx_snippets_3.cpp \
test/cxx_snippets_4.cpp \ $$PWD/test/cxx_snippets_4.cpp \
test/objc_messages_1.mm \ $$PWD/test/objc_messages_1.mm \
test/objc_messages_2.mm \ $$PWD/test/objc_messages_2.mm \
test/objc_messages_3.mm $$PWD/test/objc_messages_3.mm
} }
FORMS += $$PWD/clangprojectsettingspropertiespage.ui
macx { macx {
LIBCLANG_VERSION=3.3 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) 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)

View File

@@ -1,41 +1,31 @@
isEmpty(LLVM_INSTALL_DIR):LLVM_INSTALL_DIR=$$(LLVM_INSTALL_DIR) isEmpty(LLVM_INSTALL_DIR):LLVM_INSTALL_DIR=$$(LLVM_INSTALL_DIR)
LLVM_INSTALL_DIR = $$clean_path($$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 defineReplace(findLLVMVersionFromLibDir) {
DEFINES += CLANG_HIGHLIGHTING libdir = $$1
#DEFINES += CLANG_INDEXING version_dirs = $$files($$libdir/clang/*)
for (version_dir, version_dirs) {
defineReplace(findLLVMConfig) { fileName = $$basename(version_dir)
LLVM_CONFIG_VARIANTS = \ version = $$find(fileName, ^(\\d+\\.\\d+\\.\\d+)$)
llvm-config llvm-config-3.2 llvm-config-3.3 llvm-config-3.4 \ !isEmpty(version): return($$version)
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)
}
} }
} }
# Find llvm-config* in PATH defineReplace(findClangLibInLibDir) {
ENV_PATH = $$(PATH) libdir = $$1
ENV_PATH = $$split(ENV_PATH, $$QMAKE_DIRLIST_SEP) exists ($${libdir}/libclang.*) {
for(variant, LLVM_CONFIG_VARIANTS) { #message("LLVM was build with autotools")
for(path, ENV_PATH) { return("clang")
subvariant = $$path/$$variant } else {
exists($$subvariant) { exists ($${libdir}/liblibclang.*) {
return($$subvariant) #message("LLVM was build with CMake")
return("libclang")
} }
} }
} }
# Fallback
return(llvm-config)
}
defineReplace(findClangOnWindows) { defineReplace(findClangOnWindows) {
FILE_EXTS = a dll FILE_EXTS = a dll
win32-msvc*: FILE_EXTS = lib dll win32-msvc*: FILE_EXTS = lib dll
@@ -48,54 +38,41 @@ defineReplace(findClangOnWindows) {
} }
} }
} }
error("Cannot find clang shared library at $${LLVM_INSTALL_DIR}")
} }
win32 { win32 {
LLVM_INCLUDEPATH = "$$LLVM_INSTALL_DIR/include" LLVM_INCLUDEPATH = "$$LLVM_INSTALL_DIR/include"
CLANG_LIB_PATH = $$findClangOnWindows() LLVM_LIBDIR = $$findClangOnWindows()
CLANG_LIB = clang isEmpty(LLVM_LIBDIR): error("Cannot find clang shared library at $${LLVM_INSTALL_DIR}")
!exists("$${CLANG_LIB_PATH}/clang.*"):CLANG_LIB = libclang 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_LIBS += -ladvapi32 -lshell32
LLVM_VERSION = 3.4
} }
unix { unix {
LLVM_CONFIG = $$findLLVMConfig() llvm_config = $$LLVM_INSTALL_DIR/bin/llvm-config
exists($$llvm_config) {
LLVM_VERSION = $$system($$LLVM_CONFIG --version 2>/dev/null) #message("llvm-config found, querying it for paths and version")
LLVM_VERSION = $$replace(LLVM_VERSION, ^(\\d+\\.\\d+\\.\\d+).*$, \\1) LLVM_LIBDIR = $$system($$llvm_config --libdir 2>/dev/null)
message("... version $$LLVM_VERSION") LLVM_INCLUDEPATH = $$system($$llvm_config --includedir 2>/dev/null)
output = $$system($$llvm_config --version 2>/dev/null)
LLVM_INCLUDEPATH = $$system($$LLVM_CONFIG --includedir 2>/dev/null) LLVM_VERSION = $$replace(output, ^(\\d+\\.\\d+\\.\\d+)$, \\1)
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
} else { } else {
exists ($${LLVM_LIBDIR}/liblibclang.*) { #message("llvm-config not found, concluding paths and version from LLVM_INSTALL_DIR")
#message("LLVM was build with CMake") LLVM_INCLUDEPATH = $$LLVM_INSTALL_DIR/include
CLANG_LIB = libclang LLVM_LIBDIR = $$LLVM_INSTALL_DIR/lib
} else { LLVM_VERSION = $$findLLVMVersionFromLibDir($$LLVM_LIBDIR)
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!")
}
}
} }
LLVM_LIBS = -L$${LLVM_LIBDIR} !exists($$LLVM_INCLUDEPATH): error("Cannot detect include dir for clang, candidate: $$LLVM_INCLUDEPATH")
LLVM_LIBS += -l$${CLANG_LIB} !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}\\\" LLVM_LIBS = -L$${LLVM_LIBDIR} -l$${clang_lib}
DEFINES += "\"CLANG_RESOURCE_DIR=\\\"$${LLVM_LIBDIR}/clang/$${LLVM_VERSION}/include\\\"\"" }