cmake 如何找到我的 llvm cmake 配置?



我想知道如果我没有给它任何变量告诉它在哪里找到它,cmake 如何找到我的 llvm cmake 配置。

我是LLVM的新人。我正在构建一个Hello World LLVM通行证。我使用的是 Ubuntu 16.04。我的 LLVM 版本是 8.0.0。我的 CMake 版本是 3.5.1。

这是我的/CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.1)
project(FunctionDebugger)
find_package(LLVM REQUIRED CONFIG)
include_directories(${LLVM_INCLUDE_DIRS})
add_subdirectory(FunctionDebugger)
set(CMAKE_VERBOSE_MAKEFILE on)

这是 FunctionDebugger/CMakeLists.txt 文件:

add_library(LLVMFunctionDebugger MODULE
FunctionDebugger.cpp
)
set_target_properties(LLVMFunctionDebugger PROPERTIES
COMPILE_FLAGS "-fno-rtti -std=c++11"
)

我像这样配置和编译:

mkdir build && cd build
cmake ..
make

它正确编译并链接名为 libLLVMFunctionDebugger.so 的共享库。我不明白的是 cmake 如何找到请求的包:

# <project-root>/CMakeLists.txt
find_package(LLVM REQUIRED CONFIG)

我没有给它任何路径,也没有在环境中定义任何东西,而是 LLVM 二进制文件的路径。 我阅读了 CMake 文档,但它说find_package在 CMAKE_PREFIX_PATH 下的文件夹中查找。我用message(STATUS ${CMAKE_PREFIX_PATH})打印该变量,输出为空。

您的设置看起来正确且清晰CMake正在查找LLVMConfig.cmake脚本(find_package使用LLVM 8设置传播必要的CMake变量的脚本(。

在我可以访问的 Ubuntu 16.04 机器上,LLVMConfig.cmake位于/usr/lib/llvm-8/lib/cmake/llvm/LLVMConfig.cmake,但/usr/lib/llvm-8/cmake/中也有一个符号链接。所以自然的问题是:CMake知道它应该看那里吗?答案是肯定的。在 CMake 文档中,您可以看到其中一个搜索路径是:

<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/  (U)

您可以通过打印CMAKE_SYSTEM_PREFIX_PATH来验证usr是否在前缀列表中。在我的计算机上

,设置为:
/usr/local;/usr;/;/usr;/usr/local

最后,您可以在CMake脚本中打印LLVM_DIR,以检查find_package选择了哪个版本/安装LLVM。该变量在第一次执行CMake时将为空,但随后find_package找到 LLVM-8,该变量被设置并保存在CMakeCache.txt中。

希望这有帮助。

编辑

这个答案在 Ubuntu 16.04 上进行了测试,LLVM 8 通过apt-get安装在默认的系统范围位置。如果在其他地方安装 LLVM 8,则有多种方法可以将CMake指向正确的位置,请参阅find_package文档。编辑PATH变量就是其中之一:

  1. 搜索标准系统环境变量。如果通过NO_SYSTEM_ENVIRONMENT_PATH,则可以跳过此操作。以/bin 或/sbin 结尾的路径条目会自动转换为其父目录:

PATH

从 cmake 3.17 开始,你可以使用cmake --debug-find <cmake-options>要求 cmake 输出一堆关于 find_* 函数的调试信息。在我的机器上,它输出

Standard system environment variables [CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH].
/home/jiaqi/Documents/LLVM/llvm-project/build
/home/jiaqi/.local
/home/jiaqi/.yarn
/home/jiaqi/anaconda3
/home/jiaqi/anaconda3/condabin
/usr/local
/usr
/
/usr/games
/usr/local/games
/snap
... outputs omitted...
find_package considered the following locations for LLVM's Config module:
/home/jiaqi/Documents/LLVM/Test/build/CMakeFiles/pkgRedirects/LLVMConfig.cmake
/home/jiaqi/Documents/LLVM/Test/build/CMakeFiles/pkgRedirects/llvm-config.cmake
/home/jiaqi/Documents/LLVM/llvm-project/build/LLVMConfig.cmake
/home/jiaqi/Documents/LLVM/llvm-project/build/llvm-config.cmake
/home/jiaqi/Documents/LLVM/llvm-project/build/cmake/LLVMConfig.cmake
/home/jiaqi/Documents/LLVM/llvm-project/build/cmake/llvm-config.cmake
/home/jiaqi/Documents/LLVM/llvm-project/build/lib/cmake/llvm/LLVMConfig.cmake
The file was found at
/home/jiaqi/Documents/LLVM/llvm-project/build/lib/cmake/llvm/LLVMConfig.cmake

因此,cmake 在这里使用 Config 模式,文件位于/home/jiaqi/Documents/LLVM/llvm-project/build/lib/cmake/llvm/LLVMConfig.cmake

要弄清楚cmake如何找到LLVMConfig.cmake,请查看 https://cmake.org/cmake/help/latest/command/find_package.html#search-procedure

对于第 5 步,它说 cmake 将搜索环境变量$PAT,并注意

以/bin 或/sbin 结尾的路径条目会自动转换为其父目录。

由于我已经将 llvm 可执行文件的路径放在$PATH:

$ echo $PATH
/home/jiaqi/Documents/LLVM/llvm-project/build/bin:/home/jiaqi/.local/bin:/home/jiaqi/.yarn/bin:/home/jiaqi/anaconda3/bin:/home/jiaqi/anaconda3/condabin:/home/jiaqi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

文件夹/home/jiaqi/Documents/LLVM/llvm-project/build将用作前缀。根据 https://cmake.org/cmake/help/latest/command/find_package.html#config-mode-search-procedure,将搜索文件夹<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/

最新更新