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
变量就是其中之一:
- 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
我想知道如果我没有给它任何变量告诉它在哪里找到它,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
变量就是其中之一:
- 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