2015-02-06 4 views
8

In meinem CMake-Projekt stelle ich einen Standardpfad zu Boost zur Verfügung, der vom Benutzer bearbeitet werden kann.CMake - Erzwinge find_package, um Cache-Variablen zu aktualisieren

set(PATH_BOOST_DEFAULT "/softs/boost/${BOOST_VER}/${ARCH}/gcc/${GCCVER}") 
set(PATH_BOOST "${PATH_BOOST_DEFAULT}" CACHE PATH "Default path to Boost") 

Danach, ich versuche, die Libs zu finden, mit:

set(BOOST_ROOT "${PATH_BOOST}") 
set(Boost_USE_MULTITHREAD ON) 
set(Boost_USE_STATIC_LIBS ON) 
find_package(Boost 1.53.0 REQUIRED COMPONENTS thread system) 

Dies funktioniert gut, und viele Cache-Variablen wie Boost_INCLUDE_DIR, Boost_LIBRARY_DIRS oder Boost_THREAD_LIBRARY_DEBUG erzeugt.

Mein Problem kommt, wenn ich versuche, die Cache-Variable PATH_BOOST zu ändern: Die Cache-Variablen von FindBoost.cmake generiert werden nicht aktualisiert. Das Skript FindBoost.cmake scheint erneut aufgerufen zu werden (es werden Nachrichten über gefundene Komponenten gedruckt). Ich denke die Variablen wie Boost_INCLUDE_DIR werden nicht aktualisiert, weil sie im Cache sind.

Gibt es eine Möglichkeit, zu Cmake zu sagen: "Wenn der Pfad vom Benutzer geändert wird, refind das Paket durch Erzwingen der Cache-Variablen"?

Gibt es auch eine bessere Möglichkeit zu erkennen, eine Cache-Variable wurde nur als die folgende hässliche Idee geändert? : -/

set(MY_VAR ${MY_VAR_DEFAULT} CACHE TYPE "") 
if(NOT DEFINED MY_VAR_copy) 
    set(MY_VAR_copy ${MY_VAR} CACHE INTERNAL "") 
    mark_as_advanced(FORCE MY_VAR_copy) 
endif() 
if(NOT "${MY_VAR}" STREQUAL "${MY_VAR_copy}") 
    # my_var is modified : do something 
    set(MY_VAR_copy ${MY_VAR} CACHE INTERNAL "") 
endif() 

Antwort

0

Ich denke, ich habe das gleiche Problem wie Sie. Mein Setup versucht, eine bestimmte Version eines Pakets zu finden:

set (MYPACK_REQUIRED_VERSION 1.2.3) 
find_package (mypack ${MYPACK_REQUIRED_VERSION} EXACT) 

Das Paket Konfigurationsskript setzt die zwischengespeicherte Variable MYPACK_LIBRARIES, die dann zu einem späteren Zeitpunkt verwendet wird. Allerdings, wenn ich die MYPACK_REQUIRED_VERSION variable cmake ändern immer noch die alte MYPACK_LIBRARIES statt zu versuchen, nach der neuen Version zu suchen.

Ich glaube, ich das Problem gelöst habe nun unsetting diesen Cache Variable:

set (MYPACK_REQUIRED_VERSION 1.2.3) 
unset (MYPACK_LIBRARIES CACHE) 
find_package (mypack ${MYPACK_REQUIRED_VERSION} EXACT) 

Dies scheint die find_package Prozedur wieder in meinem Fall auszulösen. Es gibt einige feinere Details der find_package Prozedur, die ich nicht vollständig verstehe, also funktioniert das in Ihrem Fall vielleicht nicht, aber es könnte einen Versuch wert sein.

Verwandte Themen