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)
|
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_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
|
# Setup version string
|
||||||
@@ -58,79 +59,7 @@ message(STATUS "clang-uml version: "
|
|||||||
#
|
#
|
||||||
# Setup LLVM
|
# Setup LLVM
|
||||||
#
|
#
|
||||||
message(STATUS "Checking for LLVM and Clang...")
|
include(LLVMSetup)
|
||||||
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()
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Setup custom compile options depending on various compiler
|
# Setup custom compile options depending on various compiler
|
||||||
@@ -163,8 +92,6 @@ find_package(Threads REQUIRED)
|
|||||||
#
|
#
|
||||||
message(STATUS "Checking for yaml-cpp...")
|
message(STATUS "Checking for yaml-cpp...")
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
|
||||||
|
|
||||||
find_package(PkgConfig)
|
find_package(PkgConfig)
|
||||||
if(PKG_CONFIG_FOUND)
|
if(PKG_CONFIG_FOUND)
|
||||||
pkg_check_modules(YAML_CPP yaml-cpp)
|
pkg_check_modules(YAML_CPP yaml-cpp)
|
||||||
|
|||||||
10
Makefile
10
Makefile
@@ -31,6 +31,7 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
LLVM_VERSION ?=
|
LLVM_VERSION ?=
|
||||||
|
LLVM_CONFIG_PATH ?=
|
||||||
CMAKE_CXX_FLAGS ?=
|
CMAKE_CXX_FLAGS ?=
|
||||||
CMAKE_EXE_LINKER_FLAGS ?=
|
CMAKE_EXE_LINKER_FLAGS ?=
|
||||||
|
|
||||||
@@ -52,7 +53,8 @@ debug/CMakeLists.txt:
|
|||||||
-DCMAKE_BUILD_TYPE=Debug \
|
-DCMAKE_BUILD_TYPE=Debug \
|
||||||
-DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS)" \
|
-DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS)" \
|
||||||
-DCMAKE_EXE_LINKER_FLAGS="$(CMAKE_EXE_LINKER_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:
|
release/CMakeLists.txt:
|
||||||
cmake -S . -B release \
|
cmake -S . -B release \
|
||||||
@@ -61,7 +63,8 @@ release/CMakeLists.txt:
|
|||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS)" \
|
-DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS)" \
|
||||||
-DCMAKE_EXE_LINKER_FLAGS="$(CMAKE_EXE_LINKER_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:
|
debug_tidy/CMakeLists.txt:
|
||||||
cmake -S . -B debug_tidy \
|
cmake -S . -B debug_tidy \
|
||||||
@@ -71,7 +74,8 @@ debug_tidy/CMakeLists.txt:
|
|||||||
-DBUILD_TESTS=OFF \
|
-DBUILD_TESTS=OFF \
|
||||||
-DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS)" \
|
-DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS)" \
|
||||||
-DCMAKE_EXE_LINKER_FLAGS="$(CMAKE_EXE_LINKER_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
|
debug: debug/CMakeLists.txt
|
||||||
echo "Using ${NUMPROC} cores"
|
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
|
```bash
|
||||||
# Fedora 36
|
# Fedora 36
|
||||||
wget https://github.com/bkryza/clang-uml/releases/download/0.4.0/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.0-1.fc36.x86_64.rpm
|
sudo dnf install ./clang-uml-0.4.1-1.fc36.x86_64.rpm
|
||||||
|
|
||||||
# Fedora 37
|
# Fedora 37
|
||||||
wget https://github.com/bkryza/clang-uml/releases/download/0.4.0/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.0-1.fc37.x86_64.rpm
|
sudo dnf install ./clang-uml-0.4.1-1.fc37.x86_64.rpm
|
||||||
|
|
||||||
# Fedora 38
|
# Fedora 38
|
||||||
wget https://github.com/bkryza/clang-uml/releases/download/0.4.0/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.0-1.fc38.x86_64.rpm
|
sudo dnf install ./clang-uml-0.4.1-1.fc38.x86_64.rpm
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Conda
|
#### Conda
|
||||||
@@ -78,7 +78,9 @@ make release
|
|||||||
release/src/clang-uml --help
|
release/src/clang-uml --help
|
||||||
|
|
||||||
# To build using a specific installed version of LLVM use:
|
# 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
|
# Optionally, to install in default prefix
|
||||||
make install
|
make install
|
||||||
@@ -95,7 +97,7 @@ brew install ccache cmake llvm yaml-cpp
|
|||||||
|
|
||||||
export CC=/usr/local/opt/llvm/bin/clang
|
export CC=/usr/local/opt/llvm/bin/clang
|
||||||
export CCX=/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
|
#### Windows
|
||||||
@@ -164,10 +166,12 @@ bin\clang-uml.exe --version
|
|||||||
```
|
```
|
||||||
It should produce something like:
|
It should produce something like:
|
||||||
```bash
|
```bash
|
||||||
clang-uml 0.4.0
|
clang-uml 0.4.1
|
||||||
Copyright (C) 2021-2023 Bartek Kryza <bkryza@gmail.com>
|
Copyright (C) 2021-2023 Bartek Kryza <bkryza@gmail.com>
|
||||||
Built against LLVM/Clang libraries version: 15.0.6
|
Linux x86_64 6.2.0-36-generic
|
||||||
Using LLVM/Clang libraries version: clang version 15.0.6 (https://github.com/llvm/llvm-project.git 088f33605d8a61ff519c580a71b1dd57d16a03f8)
|
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:
|
Finally, remove the temporary build directory:
|
||||||
|
|||||||
@@ -54,10 +54,10 @@ TEST_CASE("t00056", "[test-case][class]")
|
|||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
src, IsConceptRequirement(_A("iterable<T>"), "container.end()"));
|
src, IsConceptRequirement(_A("iterable<T>"), "container.end()"));
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#if (LLVM_VERSION_MAJOR == 13) || (LLVM_VERSION_MAJOR == 14)
|
||||||
REQUIRE_THAT(src,
|
REQUIRE_THAT(src,
|
||||||
IsConceptRequirement(
|
IsConceptRequirement(
|
||||||
_A("convertible_to_string<T>"), "std::string{s}"));
|
_A("convertible_to_string<T>"), "std::string({s})"));
|
||||||
#else
|
#else
|
||||||
REQUIRE_THAT(src,
|
REQUIRE_THAT(src,
|
||||||
IsConceptRequirement(
|
IsConceptRequirement(
|
||||||
@@ -161,10 +161,10 @@ TEST_CASE("t00056", "[test-case][class]")
|
|||||||
REQUIRE_THAT(
|
REQUIRE_THAT(
|
||||||
src, IsConceptRequirement(_A("iterable<T>"), "container.end()"));
|
src, IsConceptRequirement(_A("iterable<T>"), "container.end()"));
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#if (LLVM_VERSION_MAJOR == 13) || (LLVM_VERSION_MAJOR == 14)
|
||||||
REQUIRE_THAT(src,
|
REQUIRE_THAT(src,
|
||||||
IsConceptRequirement(
|
IsConceptRequirement(
|
||||||
_A("convertible_to_string<T>"), "std::string{s}"));
|
_A("convertible_to_string<T>"), "std::string({s})"));
|
||||||
#else
|
#else
|
||||||
REQUIRE_THAT(src,
|
REQUIRE_THAT(src,
|
||||||
IsConceptRequirement(
|
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