2015-02-24 42 views
18

Non riesco a capire cosa sto sbagliando. Ricevo sempre la stringa $<TARGET_FILE:tgt1> invece del percorso della libreria.

Ho creato il progetto fittizio.

Qui è la mia radice CMakeLists.txt

cmake_minimum_required (VERSION 3.0) # also tried 2.8 with the same result 
set(PROJECT_NAME CMP0026) 

add_subdirectory(src) 

set(TGT_PATH $<TARGET_FILE:tgt1>) 
message(STATUS "${TGT_PATH}") 

Ecco il mio src/CMakeLists.txt

add_library(tgt1 a.c) 

File a.c è creato e è vuota

Ho provato la seguente generatori: Visual Studio 2013 Win64, Ninja e MingW Makefile. Ho usato toolchain Android per gli ultimi due, scaricato da here

Mi aspetto che l'ultimo comando message(STATUS stampi il percorso completo della libreria. Tuttavia, tutte le varianti stampano la stringa $<TARGET_FILE:tgt1>.

risposta

33

Le espressioni del generatore non vengono valutate in fase di configurazione (quando CMake sta analizzando le liste CMake, eseguendo comandi come add_target() o message() ecc.). In questo momento, un generatore di espressione è solo una stringa letterale - il carattere $ seguito da <, quindi T, quindi ...

Valutazione delle espressioni generatore accade a generare tempo (è per questo che si chiamano "le espressioni del generatore "). Il tempo di generazione si verifica dopo che tutto il codice CMake è stato analizzato ed elaborato e CMake sta iniziando ad agire sui dati in esso contenuti per produrre i file di buildsystem. Solo quindi dispone di tutte le informazioni necessarie per valutare le espressioni del generatore.

Quindi è possibile utilizzare solo le espressioni del generatore per le cose che si verificano in fase di generazione o successiva (come il tempo di compilazione). Un esempio inventato sarebbe questo:

add_custom_target(
    GenexDemo 
    COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE:tgt1>" 
    VERBATIM 
) 

al momento della configurazione, CMake registrerà la stringa letterale $<TARGET_FILE:tgt1> come argomento di COMMAND. Quindi al momento della generazione (quando la posizione di tgt1 è nota per ciascuna configurazione e è garantita la non modifica più), verrà sostituita per l'espressione del generatore.

+0

Grazie. Ora vedo. Quindi la migliore variante nel mio caso sarebbe passare al vecchio comportamento di CMP0026. – wl2776

+0

@ wl2776 La domanda è: hai veramente bisogno della posizione al momento della configurazione? – Angew

+0

@ Agnew. Sembra che sì. Chiaro configure_file in una delle mie CMakeLists e quindi ho bisogno di quel percorso durante il tempo di configurazione. – wl2776

Problemi correlati