2010-05-30 25 views
36

Sto provando a utilizzare add_custom_command per generare un file durante la generazione. Il comando non è mai stato eseguito, quindi ho creato questo file di test.CMake add_custom_command non viene eseguito

cmake_minimum_required(VERSION 2.6) 

add_custom_command(
    OUTPUT hello.txt 
    COMMAND touch hello.txt 
    DEPENDS hello.txt 
) 

ho provato a fare funzionare:

cmake . 
make 

E ciao.txt non è stato generato. Cosa ho fatto di sbagliato?

+0

add_custom_target [potrebbe] (http://stackoverflow.com/a/15973676/704244) essere un'alternativa a add_custom_command –

risposta

23

Aggiungere il seguente:

add_custom_target(run ALL 
    DEPENDS hello.txt) 

Se si ha familiarità con makefiles, questo significa:

all: run 
run: hello.txt 
+0

Questo non funziona, per me, CMake 3.6.1, OSX. Ho fatto la seguente nel mio CMakeLists.txt 'add_custom_command ( USCITA ciao.txt comando touch ARG Hello.txt DIPENDE ciao.txt )' e 'aggiunto add_custom_target (eseguire tutti DIPENDE ciao.txt ) ' – linello

+0

' add_custom_target' viene eseguito ogni volta, usare 'add_custom_command' come consigliato da Rian invece –

+0

@linello Rimuove il DEPENDS dalla chiamata' add_custom_command() ', crea una dipendenza circolare. Solo 'add_custom_target() 'dovrebbe avere l'argomento DEPENDS qui. Funziona per me su OS X quando lo aggiusti (testato con CMake 3.8.0). –

40

La soluzione add_custom_target(run ALL ... funzionerà per i casi più semplici quando si ha un solo bersaglio sei costruire, ma si rompe quando hai più obiettivi di primo livello, ad es app e test.

Mi sono imbattuto in questo stesso problema quando stavo cercando di impacchettare alcuni file di dati di test in un file oggetto in modo che i miei test di unità non dipendessero da nulla di esterno. Ho risolto il problema utilizzando add_custom_command e alcune magie di dipendenza aggiuntive con set_property.

add_custom_command(
    OUTPUT testData.cpp 
    COMMAND reswrap 
    ARGS testData.src > testData.cpp 
    DEPENDS testData.src 
) 
set_property(SOURCE unit-tests.cpp APPEND PROPERTY OBJECT_DEPENDS testData.cpp) 

add_executable(app main.cpp) 
add_executable(tests unit-tests.cpp) 

Così ora testData.cpp sarà generato prima unità-tests.cpp viene compilato, e ogni volta testData.src modifiche. Se il comando che stai chiamando è molto lento ottieni il bonus aggiuntivo che quando costruisci solo l'obiettivo dell'app non dovrai aspettare per quel comando (di cui solo l'eseguibile di test ha bisogno) per terminare.

Non è mostrato sopra, ma un'applicazione accurata di ${PROJECT_BINARY_DIR}, ${PROJECT_SOURCE_DIR} and include_directories() manterrà pulito l'albero dei sorgenti dei file generati.

+4

Questo momento imbarazzante in cui la risposta migliore non è quella con un'icona di controllo verde :) Grazie Rian! –

+2

Non dovrei 'add_dependencies' essere in grado di fare il lavoro della riga' set_property (... '? – dom0

+0

Ci sono così tante altre cose positive su cmake. Una delle cose principali che mi piacciono molto sono i Generatori (Makefile, file ninja, Visual Studio, Eclipse, ecc.) Il linguaggio di CMake non è così evoluto come quello di qualsiasi normale linguaggio di programmazione di alto livello, ma è molto semplice una volta che ci si impegna in un paio d'ore. popolare in passato. Pensa a questo: perché ci sono così tante persone che usano cmake al posto degli autotools? È più facile da imparare e offre molti più vantaggi. –

Problemi correlati