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(../../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)

View File

@@ -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}
}