|
| 1 | +cmake_minimum_required(VERSION 3.20) |
| 2 | + |
| 3 | +# -------------------------------------------------------------------------- |
| 4 | +# LLVM/Clang/LLD — fetched via CPM as static libraries |
| 5 | +# -------------------------------------------------------------------------- |
| 6 | +# CPM.cmake is at the cccl repo root: cccl/cmake/CPM.cmake |
| 7 | +# From c/parallel/src/clangjit/ that's ../../../../cmake/CPM.cmake |
| 8 | +set(_cccl_cmake_dir "${CMAKE_CURRENT_SOURCE_DIR}/../../../../cmake") |
| 9 | +if (EXISTS "${_cccl_cmake_dir}/CPM.cmake") |
| 10 | + include("${_cccl_cmake_dir}/CPM.cmake") |
| 11 | +else() |
| 12 | + message(FATAL_ERROR "CPM.cmake not found at ${_cccl_cmake_dir}/CPM.cmake") |
| 13 | +endif() |
| 14 | + |
| 15 | +if (MSVC AND CMAKE_BUILD_TYPE STREQUAL "Debug") |
| 16 | + message( |
| 17 | + FATAL_ERROR |
| 18 | + "clangjit does not support Debug builds on Windows. " |
| 19 | + "The statically-linked LLVM Debug build is too large and causes stack " |
| 20 | + "overflows at runtime. Use MinSizeRel, Release, or RelWithDebInfo instead." |
| 21 | + ) |
| 22 | +endif() |
| 23 | + |
| 24 | +set(CLANGJIT_LLVM_VERSION "llvmorg-22.1.1" CACHE STRING "LLVM git tag to fetch") |
| 25 | + |
| 26 | +# List options must be set before CPMAddPackage |
| 27 | +set(LLVM_ENABLE_PROJECTS "clang;lld" CACHE STRING "" FORCE) |
| 28 | +set(LLVM_TARGETS_TO_BUILD "X86;NVPTX" CACHE STRING "" FORCE) |
| 29 | + |
| 30 | +CPMAddPackage( |
| 31 | + NAME llvm_project |
| 32 | + GIT_REPOSITORY https://github.com/llvm/llvm-project.git |
| 33 | + GIT_TAG ${CLANGJIT_LLVM_VERSION} |
| 34 | + GIT_SHALLOW ON |
| 35 | + SOURCE_SUBDIR llvm |
| 36 | + EXCLUDE_FROM_ALL YES |
| 37 | + OPTIONS |
| 38 | + "LLVM_BUILD_LLVM_C_DYLIB OFF" |
| 39 | + "LLVM_BUILD_TOOLS OFF" |
| 40 | + "LLVM_BUILD_UTILS OFF" |
| 41 | + "LLVM_BUILD_RUNTIME OFF" |
| 42 | + "LLVM_BUILD_RUNTIMES OFF" |
| 43 | + "LLVM_INCLUDE_BENCHMARKS OFF" |
| 44 | + "LLVM_INCLUDE_DOCS OFF" |
| 45 | + "LLVM_INCLUDE_EXAMPLES OFF" |
| 46 | + "LLVM_INCLUDE_RUNTIMES OFF" |
| 47 | + "LLVM_INCLUDE_TESTS OFF" |
| 48 | + "LLVM_INCLUDE_TOOLS ON" |
| 49 | + "LLVM_INCLUDE_UTILS OFF" |
| 50 | + "LLVM_ENABLE_ZLIB OFF" |
| 51 | + "LLVM_ENABLE_ZSTD OFF" |
| 52 | + "LLVM_ENABLE_TERMINFO OFF" |
| 53 | + "LLVM_ENABLE_BINDINGS OFF" |
| 54 | + "CLANG_BUILD_TOOLS OFF" |
| 55 | + "CLANG_ENABLE_ARCMT OFF" |
| 56 | + "CLANG_ENABLE_STATIC_ANALYZER OFF" |
| 57 | +) |
| 58 | + |
| 59 | +# Ensure the clang resource directory exists |
| 60 | +file( |
| 61 | + MAKE_DIRECTORY "${llvm_project_BINARY_DIR}/lib/clang/${LLVM_VERSION_MAJOR}" |
| 62 | +) |
| 63 | + |
| 64 | +# Find CUDA toolkit (may already be found by parent) |
| 65 | +if (NOT CUDAToolkit_FOUND) |
| 66 | + find_package(CUDAToolkit) |
| 67 | +endif() |
| 68 | + |
| 69 | +# -------------------------------------------------------------------------- |
| 70 | +# clangjit library |
| 71 | +# -------------------------------------------------------------------------- |
| 72 | +add_library(clangjit_lib compiler.cpp config.cpp loader.cpp jit_compiler.cpp) |
| 73 | + |
| 74 | +# CCCL_SOURCE_DIR points to the cccl repo root |
| 75 | +# From c/parallel/src/clangjit -> c/parallel/src -> c/parallel -> c -> cccl |
| 76 | +cmake_path(GET CMAKE_CURRENT_SOURCE_DIR PARENT_PATH _src_dir) # c/parallel/src |
| 77 | +cmake_path(GET _src_dir PARENT_PATH _c_parallel_dir) # c/parallel |
| 78 | +cmake_path(GET _c_parallel_dir PARENT_PATH _c_dir) # c |
| 79 | +cmake_path(GET _c_dir PARENT_PATH _cccl_root) # cccl |
| 80 | + |
| 81 | +target_include_directories( |
| 82 | + clangjit_lib |
| 83 | + PUBLIC |
| 84 | + ${CMAKE_CURRENT_SOURCE_DIR}/include |
| 85 | + ${_c_parallel_dir}/include |
| 86 | + ${llvm_project_SOURCE_DIR}/llvm/include |
| 87 | + ${llvm_project_BINARY_DIR}/include |
| 88 | + ${llvm_project_SOURCE_DIR}/clang/include |
| 89 | + ${llvm_project_BINARY_DIR}/tools/clang/include |
| 90 | + ${llvm_project_SOURCE_DIR}/lld/include |
| 91 | + ${llvm_project_BINARY_DIR}/tools/lld/include |
| 92 | +) |
| 93 | + |
| 94 | +target_compile_definitions( |
| 95 | + clangjit_lib |
| 96 | + PRIVATE |
| 97 | + CCCL_C_EXPERIMENTAL=1 |
| 98 | + CCCL_SOURCE_DIR="${_cccl_root}" |
| 99 | + CLANG_RESOURCE_DIR="${llvm_project_BINARY_DIR}/lib/clang/${LLVM_VERSION_MAJOR}" |
| 100 | + CLANG_HEADERS_DIR="${llvm_project_SOURCE_DIR}/clang/lib/Headers" |
| 101 | + CLANGJIT_INCLUDE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/include" |
| 102 | +) |
| 103 | + |
| 104 | +if (CUDAToolkit_FOUND) |
| 105 | + target_include_directories(clangjit_lib PUBLIC ${CUDAToolkit_INCLUDE_DIRS}) |
| 106 | + cmake_path(GET CUDAToolkit_BIN_DIR PARENT_PATH CUDA_TOOLKIT_ROOT_FROM_CMAKE) |
| 107 | + target_compile_definitions( |
| 108 | + clangjit_lib |
| 109 | + PRIVATE |
| 110 | + CUDA_TOOLKIT_PATH="${CUDA_TOOLKIT_ROOT_FROM_CMAKE}" |
| 111 | + CUDA_SDK_VERSION="${CUDAToolkit_VERSION_MAJOR}.0" |
| 112 | + ) |
| 113 | +endif() |
| 114 | + |
| 115 | +# Link against LLVM/Clang/LLD |
| 116 | +target_link_libraries( |
| 117 | + clangjit_lib |
| 118 | + PUBLIC |
| 119 | + # LLVM |
| 120 | + LLVMCore |
| 121 | + LLVMSupport |
| 122 | + LLVMIRReader |
| 123 | + LLVMMC |
| 124 | + LLVMObject |
| 125 | + LLVMX86CodeGen |
| 126 | + LLVMX86AsmParser |
| 127 | + LLVMX86Desc |
| 128 | + LLVMX86Info |
| 129 | + LLVMNVPTXCodeGen |
| 130 | + LLVMNVPTXDesc |
| 131 | + LLVMNVPTXInfo |
| 132 | + LLVMLinker |
| 133 | + LLVMPasses |
| 134 | + # Clang |
| 135 | + clangAST |
| 136 | + clangBasic |
| 137 | + clangCodeGen |
| 138 | + clangDriver |
| 139 | + clangFrontend |
| 140 | + clangFrontendTool |
| 141 | + clangLex |
| 142 | + clangParse |
| 143 | + clangSema |
| 144 | + clangEdit |
| 145 | + clangAnalysis |
| 146 | + clangRewrite |
| 147 | + clangSerialization |
| 148 | + # LLD |
| 149 | + $<IF:$<PLATFORM_ID:Windows>,lldCOFF,lldELF> |
| 150 | + lldCommon |
| 151 | +) |
| 152 | + |
| 153 | +if (NOT WIN32) |
| 154 | + target_link_libraries(clangjit_lib PUBLIC dl) |
| 155 | +endif() |
| 156 | + |
| 157 | +if (CUDAToolkit_FOUND) |
| 158 | + target_link_libraries(clangjit_lib PUBLIC CUDA::cuda_driver CUDA::cudart) |
| 159 | + if (WIN32) |
| 160 | + # On Windows, static CUDA libs are built with /MT which conflicts with |
| 161 | + # the project's dynamic CRT (/MD). Use dynamic variants instead. |
| 162 | + target_link_libraries(clangjit_lib PUBLIC CUDA::nvJitLink CUDA::nvfatbin) |
| 163 | + else() |
| 164 | + target_link_libraries( |
| 165 | + clangjit_lib |
| 166 | + PUBLIC |
| 167 | + CUDA::nvJitLink_static |
| 168 | + CUDA::nvptxcompiler_static |
| 169 | + CUDA::nvfatbin_static |
| 170 | + ) |
| 171 | + endif() |
| 172 | +endif() |
| 173 | + |
| 174 | +if (NOT MSVC) |
| 175 | + target_compile_options(clangjit_lib PRIVATE -fno-rtti) |
| 176 | +endif() |
| 177 | + |
| 178 | +set_target_properties( |
| 179 | + clangjit_lib |
| 180 | + PROPERTIES CXX_STANDARD 20 POSITION_INDEPENDENT_CODE ON |
| 181 | +) |
| 182 | + |
| 183 | +# On Windows with multi-config generators (Visual Studio), exclude clangjit |
| 184 | +# targets from Debug builds — the LLVM Debug build causes stack overflows. |
| 185 | +if (MSVC) |
| 186 | + set_target_properties( |
| 187 | + clangjit_lib |
| 188 | + PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_DEBUG TRUE |
| 189 | + ) |
| 190 | +endif() |
0 commit comments