我一直在尝试使用 CMake 在工作的 Linux 机器上构建 Mozilla RR。我们有一个稍微古怪的安排,其中共享库存储在网络驱动器上的位置,如/sw/external/product-name/linux64_g63.dll/
. 此外,我在$HOME/sw/
. (我不是这个盒子上的sudoer。)
我很困惑我应该如何与 CMake 通信以查看非标准目录。到目前为止,我已经捏造了:
PKG_CONFIG_PATH=$HOME/sw/capnproto-0.6.1/lib/pkconfig \
CC=gcc-6.3 CXX=g++-6.3 \
cmake \
-DCMAKE_INSTALL_PREFIX=$HOME/sw/rr-5.1.0 \
-DPYTHON_EXECUTABLE=$HOME/bin/python2 \
-DCMAKE_FIND_ROOT_PATH=$HOME/sw/libseccomp-2.2.3/ \
../src/
Run Code Online (Sandbox Code Playgroud)
这显然不是一个可扩展的解决方案,但它至少成功完成了配置并发出了一些 Makefile。
如果我省略-DCMAKE_FIND_ROOT_PATH=$HOME/sw/libseccomp-2.2.3/
,CMake 将失败,抱怨缺少 libseccomp-2.2.3 依赖项。但是如果我确实有这个定义,它就可以工作,告诉我 CMake 了解 libseccomp-2.2.3 文件的位置,因此会正确地将路径添加到必要的编译器调用中。
但是,make
没有成功,因为gcc
无法从 libseccomp probject 中找到所需的头文件。检查后make VERBOSE=1
,我发现 CMake 没有添加-I$HOME/sw/libseccomp-2.2.3/include
到gcc
调用中。
我觉得这不是正确的方法。我看过的其他答案告诉我修改 CMakeLists.txt 文件,但肯定
是否有解决此问题的规范解决方案?也许每个站点的配置文件会告诉 CMake 如何为我在该站点上构建的所有项目查找库和头文件?
您的方法是正确的,但从未告知 cmake 包含 SECCOMP - 请参阅本文结尾。
cmake 获知自定义依赖目录的方式取决于搜索依赖的方式(即 CMakeLists.txt 中写入的内容)。
如果使用上述命令之一发现依赖项,则可以使用CMAKE_PREFIX_PATH轻松添加自定义搜索目录。无需添加完整路径以包含、lib 或 bin - 添加包根目录时find_ -command 将检查适当的子目录。CMAKE_PREFIX_PATH 也可以用环境变量设置。
第二个选项是CMAKE_FIND_ROOT_PATH。添加到CMAKE_FIND_ROOT_PATH列表的每个路径都被视为单独的根目录,并在系统根目录之前进行搜索。需要注意的是CMAKE_FIND_ROOT_PATH将被忽略find_用-命令NO_CMAKE_FIND_ROOT_PATH说法。
以下四个变量可用于调整CMAKE_FIND_ROOT_PATH的用法:
当不希望使用主机系统默认库时,将CMAKE_FIND_ROOT_PATH_MODE_INCLUDE和CMAKE_FIND_ROOT_PATH_MODE_LIBRARY设置为ONLY是一个好习惯。如果在CMAKE_FIND_ROOT_PATH 中找不到依赖库或头文件,则配置将失败。如果也允许 cmake 搜索系统路径,则很可能会在链接步骤甚至运行时发生错误。
有关更多详细信息,请参阅find_package文档。
以上所有内容也适用于find_package命令。
find_package可以在MODULE和CONFIG两种模式下运行。
在MODULE模式下,cmake 使用 Find[PackageName].cmake 脚本(模块)来查找依赖包。CMake 自带大量模块,自定义模块可以通过CMAKE_MODULE_PATH变量添加。通常可以通过环境或 cmake 变量通知 find-modules 自定义搜索路径。例如FindGTest.cmake搜索存储在GTEST_ROOT变量中的路径。
如果没有可用的 find 模块,则find_package进入CONFIG模式。如果依赖包提供 [PackageName]Config.cmake 或 [LowercasePackageName]-config.cmake,cmake 可以很容易地通过 [PackageName]_DIR 变量通知该包。示例:CMakeLists.txt 包含:
find_package(Qt5)
Run Code Online (Sandbox Code Playgroud)
FindQt5.cmake 不可用,但 ~/Qt5/Qt5.8/lib/cmake/Qt5Config.cmake 文件存在,所以添加
-DQt5_DIR="${HOME}/Qt5/Qt5.8/lib/cmake"
Run Code Online (Sandbox Code Playgroud)
打电话。
CMake 可以使用外部 pkg-config 工具提供的信息。通常使用pkg_check_modules命令完成。pkg-config 使用的目录可以使用PKG_CONFIG_PATH环境变量进行自定义。根据cmake 文档而不是设置PKG_CONFIG_PATH,可以通过CMAKE_PREFIX_PATH添加自定义 .pc-files 目录。如果 CMake 版本是 3.1 之前的版本,则必须将PKG_CONFIG_USE_CMAKE_PREFIX_PATH设置为TRUE ( ON ) 以启用此功能。
自定义依赖搜索路径的方法由 CMakeLists.txt 内容定义。这里没有通用的解决方案。
现在回到缺少 SECCOMP 标头...
在 CMakeLists.txt SECCOMP 标头中找到
find_path(SECCOMP NAMES "linux/seccomp.h")
Run Code Online (Sandbox Code Playgroud)
但我找不到任何命令告诉 CMake 使用找到的标头。例如:
target_include_directories(<target_name> ${SECCOMP})
Run Code Online (Sandbox Code Playgroud)
或全球:
include_directories(${SECCOMP})
Run Code Online (Sandbox Code Playgroud)
我相信 CMakeLists.txt 应该被修复。它不是平台相关的解决方案。
归档时间: |
|
查看次数: |
3297 次 |
最近记录: |