2015-02-24 32 views
18

Ich kann nicht verstehen, was ich falsch mache. Ich bekomme immer die Zeichenfolge $<TARGET_FILE:tgt1> anstelle des Pfades zur Bibliothek.

Ich habe das Dummy-Projekt erstellt.

Hier ist meine Wurzel 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}") 

Hier mein src/CMakeLists.txt ist

add_library(tgt1 a.c) 

Datei a.c erstellt und ist leer

ich folgendes versucht haben, Generatoren: Visual Studio 2013 Win64, Ninja und MingW Makefile. Ich habe Android Toolchain für die letzten zwei, heruntergeladen von here

Ich erwarte, dass der letzte message(STATUS Befehl würde den vollständigen Pfad zur Bibliothek drucken. Alle Varianten drucken jedoch die Zeichenfolge $<TARGET_FILE:tgt1>.

Antwort

33

Generatorausdrücke werden nicht zur Konfigurationszeit ausgewertet (wenn CMake CMakeLists analysiert, werden Befehle wie add_target() oder message() usw. ausgeführt). Zu diesem Zeitpunkt ist ein Generator Ausdruck nur eine Zeichenkette - das Zeichen $ von < gefolgt, dann T, dann ...

Auswertung des Generator Ausdrücke geschieht bei Zeit erzeugen (das ist, warum sie genannt werden „Generator Ausdrücke "). Die Generierungszeit tritt auf, nachdem der gesamte CMake-Code analysiert und verarbeitet wurde, und CMake beginnt, auf die darin enthaltenen Daten einzuwirken, um Build-Systemdateien zu erzeugen. Nur dann hat es alle Informationen, die notwendig sind, um Generatorausdrücke zu bewerten.

So können Sie Generatorausdrücke nur wirklich für Dinge verwenden, die zum Zeitpunkt der Generierung oder später auftreten (z. B. Build-Zeit). Ein konstruiertes Beispiel wäre dies:

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

Bei configure Zeit, CMake wird die Zeichenkette $<TARGET_FILE:tgt1> als Argument COMMAND aufzuzeichnen. Dann zur Erzeugungszeit (wenn die Position von tgt1 für jede Konfiguration bekannt ist und garantiert wird, dass sie sich nicht mehr ändert), wird sie sie für den Generatorausdruck ersetzen.

+0

Danke. Jetzt sehe ich. Daher wäre die beste Variante in meinem Fall die Umstellung auf das alte CMP0026-Verhalten. – wl2776

+0

@ wl2776 Die Frage ist, brauchen Sie wirklich den Ort zum Zeitpunkt der Konfiguration? – Angew

+0

@Agnew. Sieht so aus als ob ich es tue. Ich rufe configure_file in einer meiner CMakeLists auf und benötige daher diesen Pfad während der Konfigurationszeit. – wl2776