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

posted @ 2024-01-22 08:20  zwlwf  阅读(87)  评论(0编辑  收藏  举报