Refactored LLVM paths detection based on llvm-config binary
This commit is contained in:
@@ -46,6 +46,7 @@ endif(APPLE)
|
||||
#
|
||||
option(LINK_LLVM_SHARED "Should LLVM be linked using shared libraries" ON)
|
||||
set(LLVM_VERSION CACHE STRING "Major LLVM version to use (e.g. 15)")
|
||||
set(LLVM_CONFIG_PATH CACHE STRING "Path to llvm-config binary")
|
||||
|
||||
#
|
||||
# Setup version string
|
||||
@@ -58,79 +59,7 @@ message(STATUS "clang-uml version: "
|
||||
#
|
||||
# Setup LLVM
|
||||
#
|
||||
message(STATUS "Checking for LLVM and Clang...")
|
||||
if(LLVM_PREFIX)
|
||||
message(STATUS "Using llvm-config from ${LLVM_CONFIG_PATH}")
|
||||
set(LIBCLANG_LLVM_CONFIG_EXECUTABLE ${LLVM_CONFIG_PATH})
|
||||
set(LLVM_CONFIG_BINARY ${LLVM_CONFIG_PATH})
|
||||
endif(LLVM_PREFIX)
|
||||
|
||||
find_package(LLVM ${LLVM_VERSION} CONFIG REQUIRED)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR})
|
||||
include(AddLLVM)
|
||||
|
||||
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
|
||||
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
|
||||
message(STATUS "LLVM library dir: ${LLVM_LIBRARY_DIR}")
|
||||
|
||||
if(MSVC)
|
||||
# LLVM_BUILD_LLVM_DYLIB is not available on Windows
|
||||
set(LINK_LLVM_SHARED NO)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||
endif(MSVC)
|
||||
|
||||
if(LINK_LLVM_SHARED)
|
||||
set(LIBTOOLING_LIBS clang-cpp LLVM)
|
||||
else(LINK_LLVM_SHARED)
|
||||
set(LIBTOOLING_LIBS
|
||||
clangLex
|
||||
clangFrontend
|
||||
clangSerialization
|
||||
clangDriver
|
||||
clangParse
|
||||
clangSema
|
||||
clangSupport
|
||||
clangAnalysis
|
||||
clangAST
|
||||
clangBasic
|
||||
clangEdit
|
||||
clangLex
|
||||
clangTooling
|
||||
LLVMipo
|
||||
LLVMScalarOpts
|
||||
LLVMInstCombine
|
||||
LLVMTransformUtils
|
||||
LLVMAnalysis
|
||||
LLVMTarget
|
||||
LLVMOption
|
||||
LLVMMCParser
|
||||
LLVMMC
|
||||
LLVMObject
|
||||
LLVMBitReader
|
||||
LLVMCore
|
||||
LLVMSupport)
|
||||
if(MSVC)
|
||||
if(${LLVM_PACKAGE_VERSION} VERSION_LESS "15.0")
|
||||
list(REMOVE_ITEM LIBTOOLING_LIBS clangSupport)
|
||||
else()
|
||||
list(APPEND LIBTOOLING_LIBS
|
||||
LLVMWindowsDriver
|
||||
LLVMWindowsManifest)
|
||||
endif()
|
||||
endif(MSVC)
|
||||
endif(LINK_LLVM_SHARED)
|
||||
|
||||
if("${LIBTOOLING_LIBS}" STREQUAL "")
|
||||
message(FATAL_ERROR "Failed to find LibTooling libraries!")
|
||||
else()
|
||||
message(STATUS "Found LibTooling libraries: ${LIBTOOLING_LIBS}")
|
||||
endif()
|
||||
|
||||
if(APPLE OR (LLVM_VERSION_MAJOR GREATER_EQUAL 16))
|
||||
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES
|
||||
${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES})
|
||||
endif()
|
||||
include(LLVMSetup)
|
||||
|
||||
#
|
||||
# Setup custom compile options depending on various compiler
|
||||
@@ -163,8 +92,6 @@ find_package(Threads REQUIRED)
|
||||
#
|
||||
message(STATUS "Checking for yaml-cpp...")
|
||||
if(APPLE)
|
||||
|
||||
|
||||
find_package(PkgConfig)
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(YAML_CPP yaml-cpp)
|
||||
|
||||
10
Makefile
10
Makefile
@@ -31,6 +31,7 @@ else
|
||||
endif
|
||||
|
||||
LLVM_VERSION ?=
|
||||
LLVM_CONFIG_PATH ?=
|
||||
CMAKE_CXX_FLAGS ?=
|
||||
CMAKE_EXE_LINKER_FLAGS ?=
|
||||
|
||||
@@ -52,7 +53,8 @@ debug/CMakeLists.txt:
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS)" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="$(CMAKE_EXE_LINKER_FLAGS)" \
|
||||
-DLLVM_VERSION=${LLVM_VERSION}
|
||||
-DLLVM_VERSION=${LLVM_VERSION} \
|
||||
-DLLVM_CONFIG_PATH=${LLVM_CONFIG_PATH}
|
||||
|
||||
release/CMakeLists.txt:
|
||||
cmake -S . -B release \
|
||||
@@ -61,7 +63,8 @@ release/CMakeLists.txt:
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS)" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="$(CMAKE_EXE_LINKER_FLAGS)" \
|
||||
-DLLVM_VERSION=${LLVM_VERSION}
|
||||
-DLLVM_VERSION=${LLVM_VERSION} \
|
||||
-DLLVM_CONFIG_PATH=${LLVM_CONFIG_PATH}
|
||||
|
||||
debug_tidy/CMakeLists.txt:
|
||||
cmake -S . -B debug_tidy \
|
||||
@@ -71,7 +74,8 @@ debug_tidy/CMakeLists.txt:
|
||||
-DBUILD_TESTS=OFF \
|
||||
-DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS)" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="$(CMAKE_EXE_LINKER_FLAGS)" \
|
||||
-DLLVM_VERSION=${LLVM_VERSION}
|
||||
-DLLVM_VERSION=${LLVM_VERSION} \
|
||||
-DLLVM_CONFIG_PATH=${LLVM_CONFIG_PATH}
|
||||
|
||||
debug: debug/CMakeLists.txt
|
||||
echo "Using ${NUMPROC} cores"
|
||||
|
||||
90
cmake/LLVMSetup.cmake
Normal file
90
cmake/LLVMSetup.cmake
Normal file
@@ -0,0 +1,90 @@
|
||||
message(STATUS "Checking for LLVM and Clang...")
|
||||
|
||||
# If user provided a path to llvm-config executable use it to detect
|
||||
# LLVM Version and appropriate CMake module path
|
||||
if(NOT "${LLVM_CONFIG_PATH}" STREQUAL "")
|
||||
# Get LLVM prefix
|
||||
message(STATUS "Using llvm-config from ${LLVM_CONFIG_PATH}")
|
||||
set(LIBCLANG_LLVM_CONFIG_EXECUTABLE ${LLVM_CONFIG_PATH})
|
||||
set(LLVM_CONFIG_BINARY ${LLVM_CONFIG_PATH})
|
||||
execute_process(COMMAND ${LLVM_CONFIG_PATH} --prefix
|
||||
OUTPUT_VARIABLE LLVM_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(LLVM_CMAKE_DIR "${LLVM_PREFIX}/lib/cmake/llvm")
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR})
|
||||
|
||||
# Get LLVM version
|
||||
execute_process(COMMAND ${LLVM_CONFIG_PATH} --version
|
||||
OUTPUT_VARIABLE LLVM_VERSION_STR OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
|
||||
string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.(.+)"
|
||||
GIT_VERSION_MATCH ${LLVM_VERSION_STR})
|
||||
set(LLVM_VERSION ${CMAKE_MATCH_1})
|
||||
endif()
|
||||
|
||||
find_package(LLVM ${LLVM_VERSION} CONFIG REQUIRED)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH ${LLVM_CMAKE_DIR})
|
||||
include(AddLLVM)
|
||||
|
||||
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
|
||||
message(STATUS "Using LLVMConfig.cmake from: ${LLVM_CMAKE_DIR}")
|
||||
message(STATUS "LLVM library dir: ${LLVM_LIBRARY_DIR}")
|
||||
|
||||
if(MSVC)
|
||||
# LLVM_BUILD_LLVM_DYLIB is not available on Windows
|
||||
set(LINK_LLVM_SHARED NO)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||
endif(MSVC)
|
||||
|
||||
if(LINK_LLVM_SHARED)
|
||||
set(LIBTOOLING_LIBS clang-cpp LLVM)
|
||||
else(LINK_LLVM_SHARED)
|
||||
set(LIBTOOLING_LIBS
|
||||
clangLex
|
||||
clangFrontend
|
||||
clangSerialization
|
||||
clangDriver
|
||||
clangParse
|
||||
clangSema
|
||||
clangSupport
|
||||
clangAnalysis
|
||||
clangAST
|
||||
clangBasic
|
||||
clangEdit
|
||||
clangLex
|
||||
clangTooling
|
||||
LLVMipo
|
||||
LLVMScalarOpts
|
||||
LLVMInstCombine
|
||||
LLVMTransformUtils
|
||||
LLVMAnalysis
|
||||
LLVMTarget
|
||||
LLVMOption
|
||||
LLVMMCParser
|
||||
LLVMMC
|
||||
LLVMObject
|
||||
LLVMBitReader
|
||||
LLVMCore
|
||||
LLVMSupport)
|
||||
if(MSVC)
|
||||
if(${LLVM_PACKAGE_VERSION} VERSION_LESS "15.0")
|
||||
list(REMOVE_ITEM LIBTOOLING_LIBS clangSupport)
|
||||
else()
|
||||
list(APPEND LIBTOOLING_LIBS
|
||||
LLVMWindowsDriver
|
||||
LLVMWindowsManifest)
|
||||
endif()
|
||||
endif(MSVC)
|
||||
endif(LINK_LLVM_SHARED)
|
||||
|
||||
if("${LIBTOOLING_LIBS}" STREQUAL "")
|
||||
message(FATAL_ERROR "Failed to find LibTooling libraries!")
|
||||
else()
|
||||
message(STATUS "Found LibTooling libraries: ${LIBTOOLING_LIBS}")
|
||||
endif()
|
||||
|
||||
if(APPLE OR (LLVM_VERSION_MAJOR GREATER_EQUAL 16))
|
||||
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES
|
||||
${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES})
|
||||
endif()
|
||||
@@ -33,16 +33,16 @@ sudo apt install clang-uml
|
||||
|
||||
```bash
|
||||
# Fedora 36
|
||||
wget https://github.com/bkryza/clang-uml/releases/download/0.4.0/clang-uml-0.4.0-1.fc36.x86_64.rpm
|
||||
sudo dnf install ./clang-uml-0.4.0-1.fc36.x86_64.rpm
|
||||
wget https://github.com/bkryza/clang-uml/releases/download/0.4.1/clang-uml-0.4.1-1.fc36.x86_64.rpm
|
||||
sudo dnf install ./clang-uml-0.4.1-1.fc36.x86_64.rpm
|
||||
|
||||
# Fedora 37
|
||||
wget https://github.com/bkryza/clang-uml/releases/download/0.4.0/clang-uml-0.4.0-1.fc37.x86_64.rpm
|
||||
sudo dnf install ./clang-uml-0.4.0-1.fc37.x86_64.rpm
|
||||
wget https://github.com/bkryza/clang-uml/releases/download/0.4.1/clang-uml-0.4.1-1.fc37.x86_64.rpm
|
||||
sudo dnf install ./clang-uml-0.4.1-1.fc37.x86_64.rpm
|
||||
|
||||
# Fedora 38
|
||||
wget https://github.com/bkryza/clang-uml/releases/download/0.4.0/clang-uml-0.4.0-1.fc38.x86_64.rpm
|
||||
sudo dnf install ./clang-uml-0.4.0-1.fc38.x86_64.rpm
|
||||
wget https://github.com/bkryza/clang-uml/releases/download/0.4.1/clang-uml-0.4.1-1.fc38.x86_64.rpm
|
||||
sudo dnf install ./clang-uml-0.4.1-1.fc38.x86_64.rpm
|
||||
```
|
||||
|
||||
#### Conda
|
||||
@@ -78,7 +78,9 @@ make release
|
||||
release/src/clang-uml --help
|
||||
|
||||
# To build using a specific installed version of LLVM use:
|
||||
LLVM_VERSION=14 make release
|
||||
LLVM_VERSION=16 make release
|
||||
# or specify path to a specific llvm-config binary, e.g.:
|
||||
LLVM_CONFIG_PATH=/usr/bin/llvm-config-16 make release
|
||||
|
||||
# Optionally, to install in default prefix
|
||||
make install
|
||||
@@ -95,7 +97,7 @@ brew install ccache cmake llvm yaml-cpp
|
||||
|
||||
export CC=/usr/local/opt/llvm/bin/clang
|
||||
export CCX=/usr/local/opt/llvm/bin/clang++
|
||||
LLVM_VERSION=14 make release
|
||||
LLVM_VERSION=16 make release
|
||||
```
|
||||
|
||||
#### Windows
|
||||
@@ -164,10 +166,12 @@ bin\clang-uml.exe --version
|
||||
```
|
||||
It should produce something like:
|
||||
```bash
|
||||
clang-uml 0.4.0
|
||||
clang-uml 0.4.1
|
||||
Copyright (C) 2021-2023 Bartek Kryza <bkryza@gmail.com>
|
||||
Built against LLVM/Clang libraries version: 15.0.6
|
||||
Using LLVM/Clang libraries version: clang version 15.0.6 (https://github.com/llvm/llvm-project.git 088f33605d8a61ff519c580a71b1dd57d16a03f8)
|
||||
Linux x86_64 6.2.0-36-generic
|
||||
Built against LLVM/Clang libraries version: 17.0.3
|
||||
Using LLVM/Clang libraries version: Ubuntu clang version 17.0.3 (++20231010073202+37b79e779f44-1~exp1~20231010073304.52)
|
||||
|
||||
```
|
||||
|
||||
Finally, remove the temporary build directory:
|
||||
|
||||
@@ -54,10 +54,10 @@ TEST_CASE("t00056", "[test-case][class]")
|
||||
REQUIRE_THAT(
|
||||
src, IsConceptRequirement(_A("iterable<T>"), "container.end()"));
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if (LLVM_VERSION_MAJOR == 13) || (LLVM_VERSION_MAJOR == 14)
|
||||
REQUIRE_THAT(src,
|
||||
IsConceptRequirement(
|
||||
_A("convertible_to_string<T>"), "std::string{s}"));
|
||||
_A("convertible_to_string<T>"), "std::string({s})"));
|
||||
#else
|
||||
REQUIRE_THAT(src,
|
||||
IsConceptRequirement(
|
||||
@@ -161,10 +161,10 @@ TEST_CASE("t00056", "[test-case][class]")
|
||||
REQUIRE_THAT(
|
||||
src, IsConceptRequirement(_A("iterable<T>"), "container.end()"));
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if (LLVM_VERSION_MAJOR == 13) || (LLVM_VERSION_MAJOR == 14)
|
||||
REQUIRE_THAT(src,
|
||||
IsConceptRequirement(
|
||||
_A("convertible_to_string<T>"), "std::string{s}"));
|
||||
_A("convertible_to_string<T>"), "std::string({s})"));
|
||||
#else
|
||||
REQUIRE_THAT(src,
|
||||
IsConceptRequirement(
|
||||
|
||||
16
util/test_llvm_versions.sh
Executable file
16
util/test_llvm_versions.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
|
||||
declare -a llvm_configs=("llvm-config-12"
|
||||
"llvm-config-13"
|
||||
"llvm-config-14"
|
||||
"llvm-config-15"
|
||||
"llvm-config-16"
|
||||
"llvm-config-17")
|
||||
|
||||
for config_path in ${llvm_configs[@]}; do
|
||||
echo "---------------------------------------------------------"
|
||||
echo " Running clang-uml tests against LLVM $(${config_path} --version)"
|
||||
echo "---------------------------------------------------------"
|
||||
make clean
|
||||
LLVM_CONFIG_PATH=$config_path NUMPROC=12 make test
|
||||
done
|
||||
Reference in New Issue
Block a user