diff --git a/CMakeLists.txt b/CMakeLists.txt index 8aebad9c..9b170746 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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$<$: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) diff --git a/Makefile b/Makefile index a5a4a0d3..1aa1a44b 100644 --- a/Makefile +++ b/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" diff --git a/cmake/LLVMSetup.cmake b/cmake/LLVMSetup.cmake new file mode 100644 index 00000000..c4b7a238 --- /dev/null +++ b/cmake/LLVMSetup.cmake @@ -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$<$: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() diff --git a/docs/installation.md b/docs/installation.md index a4cd3b09..5a8b71bf 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -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 -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: diff --git a/tests/t00056/test_case.h b/tests/t00056/test_case.h index d523766f..418c5079 100644 --- a/tests/t00056/test_case.h +++ b/tests/t00056/test_case.h @@ -54,10 +54,10 @@ TEST_CASE("t00056", "[test-case][class]") REQUIRE_THAT( src, IsConceptRequirement(_A("iterable"), "container.end()")); -#ifdef _MSC_VER +#if (LLVM_VERSION_MAJOR == 13) || (LLVM_VERSION_MAJOR == 14) REQUIRE_THAT(src, IsConceptRequirement( - _A("convertible_to_string"), "std::string{s}")); + _A("convertible_to_string"), "std::string({s})")); #else REQUIRE_THAT(src, IsConceptRequirement( @@ -161,10 +161,10 @@ TEST_CASE("t00056", "[test-case][class]") REQUIRE_THAT( src, IsConceptRequirement(_A("iterable"), "container.end()")); -#ifdef _MSC_VER +#if (LLVM_VERSION_MAJOR == 13) || (LLVM_VERSION_MAJOR == 14) REQUIRE_THAT(src, IsConceptRequirement( - _A("convertible_to_string"), "std::string{s}")); + _A("convertible_to_string"), "std::string({s})")); #else REQUIRE_THAT(src, IsConceptRequirement( diff --git a/util/test_llvm_versions.sh b/util/test_llvm_versions.sh new file mode 100755 index 00000000..79df25db --- /dev/null +++ b/util/test_llvm_versions.sh @@ -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 \ No newline at end of file