2017-07-18 3 views
1

Ein Kollege hat ein Projekt, das ein handgeschriebenes Makefile mit fest codierten Bibliothekspfaden verwendet. So zum Beispiel sind die CXXFLAGS und die LDFLAGS gesetzt wie folgt aus:Erledigen Sie die Arbeit von find_package manuell, indem Sie die Pfade in der Befehlszeile angeben

-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 

Niemand direkte administrative Rechte auf dieser Maschine hat, so dass nur die Debian-Pakete mit diesen Bibliotheken Installation wird beinhalten den Administrator Gezeter um sie zu installieren. Und selbst wenn, könnte es eine andere Abhängigkeit geben, die nicht in den Repositories ist.

In meiner CMake-Datei, ich habe dies:

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}") 

Auf meiner Fedora-Workstation funktioniert dies gut. Auf meiner Ubuntu 14.04 virtuellen Maschine funktioniert es auch, es baut auch auf Travis CI auf. Dieses Projekt läuft jedoch auf unserem Rechencluster und die Abhängigkeiten sind an wirklich merkwürdigen Stellen.

So würde ich gerne cmake auf eine Weise aufrufen, die ihm sagt, dass ich bereits kenne, dass Bibliotheksflaggen es braucht und nicht einmal nach einer FindEigen3.cmake Datei suchen (die nicht da ist).

Gibt es eine Möglichkeit, die find_package zu überschreiben und nur die Pfade manuell anzugeben?

Antwort

0

Sie können die Tatsache nutzen, dass find_package() nur nach den Bibliotheken/include Pfaden sucht, bis es das angeforderte Paket gefunden hat und eine erfolgreiche Fund Fakt in _FOUND Variablen speichert.

Also in Ihrem Fall - das Eigen3 Beispiel genommen - können Sie tun:

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

Das Problem ist, dass auf dem Zielsystem nicht einmal eine 'FindEigen3.cmake' Datei existiert. Daher habe ich jetzt einen anderen Ansatz gewählt, der dem Ihren ähnlich ist und nicht erfordert, dass diese Datei installiert wird. –

0

Lassen Sie einfach die Benutzer die Variablen festgelegt, dass find_package manuell eingestellt würde. Dann überspringt die find_package insgesamt:

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

Dies hat den Vorteil, dass man nicht einmal eine FindEigen3.cmake Datei benötigt.

Verwandte Themen