windows - Cmake 'set' virker ikke på samme variabel efter 'find\_path' blev kaldt

Indlæg af Hanne Mølgaard Plasc

Problem



Inden for et Cmake-modul forsøger jeg at finde forskellige stier. Under nogle omstændigheder vil jeg gerne 'sætte' en variabel efter at jeg oprindeligt kaldte 'find\_path' med samme variabel:


# general search for this include dir
find\_path(LIBRARY\_INCLUDE\_DIR
  NAMES LibraryName/LibraryHeader.h
)

# specific option enabled by user
if(USE\_OTHER\_LIB)
find\_path(OTHER\_LIB\_ROOT\_DIR
  NAMES OtherLib/OtherLib.h
)
set(LIBRARY\_INCLUDE\_DIR ${OTHER\_LIB\_ROOT\_DIR}/database/include)
endif(USE\_OTHER\_LIB)


Denne fremgangsmåde fungerede fint under Windows XP (CMake 2.8.1). Det fungerede dog ikke under Mac OS 10.6 (CMake 2.8.3). Er der nogen der ved, om der er forskel på Mac/Windows-versionen og hvordan man løser dette?


Mange tak!

Bedste reference


Dette er en almindelig misforståelse om 'set' og CMake cache variabler.


Linjen:


set(LIBRARY\_INCLUDE\_DIR ${OTHER\_LIB\_ROOT\_DIR}/database/include)


angiver en lokal overstyringsværdi for LIBRARY\_INCLUDE\_DIR, der træder i kraft for resten af ​​behandlingen af ​​CMakeLists-filen, men den har ingen effekt på cachevariablen med samme navn. Derfor er det ikke synligt i cmake-gui eller ccmake cache redigeringsprogrammer.


Hvis du vil gøre det synligt, skal du tvinge sin værdi til cache-variablen med samme navn, måske sådan:


set(LIBRARY\_INCLUDE\_DIR ${OTHER\_LIB\_ROOT\_DIR}/database/include)
set(LIBRARY\_INCLUDE\_DIR ${LIBRARY\_INCLUDE\_DIR} CACHE FILEPATH "" FORCE)


Dette er imidlertid generelt frygtet, for når en slutbruger justerer værdien i cmake-gui-programmet, overskriver din kode brugerens valg med FORCE-d-værdien. Så ... Jeg vil anbefale bare at bruge den linje, du har brugt: modstå FORCE.


For at se, at det virkelig træder i kraft, skal du blot tilføje denne kode i slutningen af ​​CMakeLists.txt:


message(STATUS "LIBRARY\_INCLUDE\_DIR='${LIBRARY\_INCLUDE\_DIR}'")


Så ... da din kode er korrekt, skal der være noget andet der foregår, der får dig til at tro at noget er forkert. Jeg er nysgerrig efter, hvad det måtte være ... måske dit næste Stack Overflow-spørgsmål.