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

How is cmake finding my llvm cmake configuration?

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

我是LLVM新手。我正在构建一个 Hello World LLVM pass。我在 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 用来传播必要 CMake 变量与 LLVM 8 设置)。

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

<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 中的哪个 version/installation。变量在CMake第一次执行时为空,但随后find_package找到LLVM-8,变量被设置并保存在CMakeCache.txt.

希望对您有所帮助。

编辑

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

  1. Search the standard system environment variables. This can be skipped if NO_SYSTEM_ENVIRONMENT_PATH is passed. Path entries ending in /bin or /sbin are automatically converted to their parent directories:

PATH