通过在命令行

时间:2017-07-18 15:32:03

标签: cmake

一位同事有一个项目,该项目使用带有硬编码库路径的手写Makefile。例如,CXXFLAGSLDFLAGS的设置如下:

-I/home/personA/libraries/eigen-3.2.7
-I/home/personA/libraries/boost_1_60_0
-I/home/personB/hdf5-1.8.17/include

-L/home/personA/libraries/boost_1_60_0/stage/lib/
-L/home/personB/hdf5-1.8.17/lib

没有人对此计算机拥有直接管理权限,因此只需安装带有这些库的Debian软件包,就会让管理员唠叨来安装它们。即使他这样做,也可能存在不同的依赖关系,而不是存储库。

在我的CMake文件中,我有这个:

find_package(HDF5 REQUIRED COMPONENTS C CXX)
include_directories(${HDF5_INCLUDE_DIRS})

find_package(Boost REQUIRED COMPONENTS filesystem system program_options)

find_package(Eigen3 REQUIRED)
include_directories(SYSTEM ${EIGEN3_INCLUDE_DIR})

find_package(OpenMP)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")

在我的Fedora工作站上,这很好用。在我的Ubuntu 14.04虚拟机上,它也可以工作,它也建立在Travis CI上。但是,这个项目在我们的计算集群上运行,并且依赖项处于非常奇怪的地方。

所以我想以一种方式调用cmake,告诉它我已经知道它需要的包含和库标志,甚至懒得查找FindEigen3.cmake文件(不存在)。

有没有办法覆盖find_package并只手动指定路径?

2 个答案:

答案 0 :(得分:1)

您可以利用find_package()仅查找库/包含路径的事实,直到它找到所请求的包并在_FOUND变量中存储成功的查找事实。

所以在你的情况下 - 采取Eigen3示例 - 你可以这样做:

> cmake -D Eigen3_FOUND:BOOL=ON -D EIGEN3_INCLUDE_DIR:PATH=/home/personA/libraries/eigen-3.2.7 ..

答案 1 :(得分:0)

让用户设置find_package手动设置的变量。然后完全跳过find_package

if(NOT DEFINED EIGEN3_INCLUDE_DIRS)
    find_package(Eigen3 REQUIRED)
endif()
include_directories(SYSTEM ${EIGEN3_INCLUDE_DIRS})

这样做的好处是甚至不需要FindEigen3.cmake文件。