LLVM 编译的project设置的逻辑
cmake ../llvm -DLLVM_ENABLE_PROJECTS="llvm;lld"
可以开启外部项目llvm,lld,以及全部的llvm内部tools。当
没设置LLVM_ENABLE_PROJECTS_USED,且LLVM_ENABLE_PROJECTS变量为空,但还是进入了判断,并开启了很多project的构建。
日志中没有打印project is enabled
, 但是CMakeCache.txt中有
//Whether to build llvm-ar as part of LLVM
LLVM_TOOL_LLVM_AR_BUILD:BOOL=ON
可见这个设置会在其它地方打开?
确实,在AddLLVM.cmake中的函数,add_llvm_subdirectory函数中找到了。
lib/cmake/llvm/AddLLVM.cmake:1491: "Whether to build ${name} as part of ${project}" On)
LLVM_EXTERNAL_PROJECTS是空的,LLVM_KNOWN_PROJECTS有bolt;clang;clang-tools-extra;compiler-rt;cross-project-tests;libc;libclc;lld;lldb;mlir;openmp;polly;pstl;flang
可以通过直接修改
在llvm添加子目录时,当发现有llvm下的tools,直接就设置为打开了。外部工程通过llvm/CMakeLists.txt来设置,LLVM_KNOWN_PORJECTS,LLVM_ALL_PORJECTS变量,供cmake运行命令时通过LLVM_ENABLE_PROJECTS变量来选择。
# LLVM_ENABLE_PROJECTS_USED is `ON` if the user has ever used the
# `LLVM_ENABLE_PROJECTS` CMake cache variable. This exists for
# several reasons:
#
# * As an indicator that the `LLVM_ENABLE_PROJECTS` list is now the single
# source of truth for which projects to build. This means we will ignore user
# supplied `LLVM_TOOL_<project>_BUILD` CMake cache variables and overwrite
# them.
#
# * The case where the user previously had `LLVM_ENABLE_PROJECTS` set to a
# non-empty list but now the user wishes to disable building all other projects
# by setting `LLVM_ENABLE_PROJECTS` to an empty string. In that case we still
# need to set the `LLVM_TOOL_${upper_proj}_BUILD` variables so that we disable
# building all the projects that were previously enabled.
set(LLVM_ENABLE_PROJECTS_USED OFF CACHE BOOL "")
mark_as_advanced(LLVM_ENABLE_PROJECTS_USED)
if (LLVM_ENABLE_PROJECTS_USED OR NOT LLVM_ENABLE_PROJECTS STREQUAL "")
set(LLVM_ENABLE_PROJECTS_USED ON CACHE BOOL "" FORCE)
foreach(proj ${LLVM_KNOWN_PROJECTS} ${LLVM_EXTERNAL_PROJECTS})
string(TOUPPER "${proj}" upper_proj)
string(REGEX REPLACE "-" "_" upper_proj ${upper_proj})
if ("${proj}" IN_LIST LLVM_ENABLE_PROJECTS)
message(STATUS "${proj} project is enabled")
set(SHOULD_ENABLE_PROJECT TRUE)
set(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}")
if(NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}")
message(FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}")
endif()
if( LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR STREQUAL "" )
set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "" FORCE)
else()
set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "")
endif()
elseif ("${proj}" IN_LIST LLVM_EXTERNAL_PROJECTS)
message(STATUS "${proj} project is enabled")
set(SHOULD_ENABLE_PROJECT TRUE)
else()
message(STATUS "${proj} project is disabled")
set(SHOULD_ENABLE_PROJECT FALSE)
endif()
# Force `LLVM_TOOL_${upper_proj}_BUILD` variables to have values that
# corresponds with `LLVM_ENABLE_PROJECTS`. This prevents the user setting
# `LLVM_TOOL_${upper_proj}_BUILD` variables externally. At some point
# we should deprecate allowing users to set these variables by turning them
# into normal CMake variables rather than cache variables.
set(LLVM_TOOL_${upper_proj}_BUILD
${SHOULD_ENABLE_PROJECT}
CACHE
BOOL "Whether to build ${upper_proj} as part of LLVM" FORCE
)
endforeach()
endif()
unset(SHOULD_ENABLE_PROJECT)
最节省的方式构建LLVM_BOLT, 在CMakeCache.txt中仅仅只开5个Target.
//Whether to build llvm-jitlink as part of LLVM
LLVM_TOOL_LLVM_JITLINK_BUILD:BOOL=ON
//Whether to build LLVM_JITLISTENER as part of LLVM
LLVM_TOOL_LLVM_JITLISTENER_BUILD:BOOL=ON
//Whether to build llvm-jitlink as part of LLVM
LLVM_TOOL_LLVM_JITLINK_BUILD:BOOL=ON
//Whether to build LLVM_JITLISTENER as part of LLVM
LLVM_TOOL_LLVM_JITLISTENER_BUILD:BOOL=ON
//Whether to build bolt as part of LLVM 22
LLVM_TOOL_BOLT_BUILD:BOOL=ON