2017-07-18 274 views
1

一位同事的項目使用手寫的Makefile和硬編碼的庫路徑。因此,例如在CXXFLAGSLDFLAGS設置如下所示:通過在命令行上指定路徑手動執行find_package的工作

-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,告訴它我已經知道它需要include和library標誌,甚至不用去查找FindEigen3.cmake文件(這不在那裏)。

有什麼方法可以覆蓋find_package並只是手動指定路徑?

回答

0

你可以採取的事實find_package()確實只認準庫優勢/包括直到它找到請求包和_FOUND變量存儲成功發現事實的路徑。

所以你的情況 - 採取Eigen3例子 - 你可以這樣做:

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

問題是在目標系統上甚至沒有找到FindEigen3.cmake文件。所以我現在選擇了一種與您的類似的不同方法,並且不需要安裝該文件。 –

0

只是讓用戶設置的變量find_package將手動設置。然後跳過find_package乾脆:

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

這樣做的好處是一個甚至不需要一個FindEigen3.cmake文件。