|
| 1 | +# https://layle.me/posts/using-llvm-with-cmake/ |
| 2 | +# This is an INTERFACE target for LLVM, usage: |
| 3 | +# target_link_libraries(${PROJECT_NAME} <PRIVATE|PUBLIC|INTERFACE> LLVM) |
| 4 | +# The include directories and compile definitions will be properly handled. |
| 5 | + |
| 6 | +set(CMAKE_FOLDER_LLVM "${CMAKE_FOLDER}") |
| 7 | +if(CMAKE_FOLDER) |
| 8 | + set(CMAKE_FOLDER "${CMAKE_FOLDER}/LLVM") |
| 9 | +else() |
| 10 | + set(CMAKE_FOLDER "LLVM") |
| 11 | +endif() |
| 12 | + |
| 13 | +# Find LLVM |
| 14 | +find_package(LLVM REQUIRED CONFIG) |
| 15 | + |
| 16 | +message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") |
| 17 | +message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") |
| 18 | + |
| 19 | +# Split the definitions properly (https://weliveindetail.github.io/blog/post/2017/07/17/notes-setup.html) |
| 20 | +separate_arguments(LLVM_DEFINITIONS) |
| 21 | + |
| 22 | +# Some diagnostics (https://stackoverflow.com/a/17666004/1806760) |
| 23 | +message(STATUS "LLVM libraries: ${LLVM_LIBRARIES}") |
| 24 | +message(STATUS "LLVM includes: ${LLVM_INCLUDE_DIRS}") |
| 25 | +message(STATUS "LLVM definitions: ${LLVM_DEFINITIONS}") |
| 26 | +message(STATUS "LLVM tools: ${LLVM_TOOLS_BINARY_DIR}") |
| 27 | + |
| 28 | +if (NOT TARGET LLVM) |
| 29 | + add_library(LLVM INTERFACE) |
| 30 | +endif() |
| 31 | + |
| 32 | +target_include_directories(LLVM SYSTEM INTERFACE ${LLVM_INCLUDE_DIRS}) |
| 33 | +target_link_libraries(LLVM INTERFACE ${LLVM_AVAILABLE_LIBS}) |
| 34 | +target_compile_definitions(LLVM INTERFACE ${LLVM_DEFINITIONS} -DNOMINMAX) |
| 35 | + |
| 36 | +set(CMAKE_FOLDER "${CMAKE_FOLDER_LLVM}") |
| 37 | +unset(CMAKE_FOLDER_LLVM) |
| 38 | + |
| 39 | +# MSVC-specific options |
| 40 | +if(MSVC) |
| 41 | + # This assumes the installed LLVM was built in Release mode |
| 42 | + set(CMAKE_C_FLAGS_RELWITHDEBINFO "/ZI /Od /Ob0 /DNDEBUG" CACHE STRING "" FORCE) |
| 43 | + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/ZI /Od /Ob0 /DNDEBUG" CACHE STRING "" FORCE) |
| 44 | + |
| 45 | + if(${LLVM_USE_CRT_RELEASE} STREQUAL "MD") |
| 46 | + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL) |
| 47 | + elseif(${LLVM_USE_CRT_RELEASE} STREQUAL "MT") |
| 48 | + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded) |
| 49 | + else() |
| 50 | + message(FATAL_ERROR "Unsupported LLVM_USE_CRT_RELEASE=${LLVM_USE_CRT_RELEASE}") |
| 51 | + endif() |
| 52 | +endif() |
0 commit comments