2015-09-10 5 views
5

voglio fare un eseguibile, per esempio, test_runner.cpp:cmake eseguibile con le fonti generate automaticamente

add_executable(myexe ${CMAKE_CURRENT_BINARY_DIR}/test_runner.cpp) 

ma questo particolare file cpp è essa stessa generato automaticamente in un comando pre-build:

add_custom_command(
    TARGET myexe PRE_BUILD 
    COMMAND deps/cxxtest-4.4/bin/cxxtestgen --error-printer -o "${CMAKE_CURRENT_BINARY_DIR}/test_runner.cpp" src/My_test_suite.h 
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 
) 

Ma ora non riesco a generare nuovi file di build cmake perché si lamenta della fonte mancante, che in effetti manca fino alla pre-compilazione.

risposta

8

Il nodo del problema è applicare GENERATED property a "test_runner.cpp". Ciò indica a CMake di non verificare la sua esistenza al momento della configurazione, poiché viene creato come parte del processo di compilazione.

È possibile applicare questa proprietà manualmente (ad esempio utilizzando set_source_files_properties). Tuttavia, il modo corretto per gestire ciò è utilizzare l'altro modulo di add_custom_command, ad esempio add_custom_command(OUTPUT ...) anziché add_custom_command(TARGET ...).

Se si specifica "test_runner.cpp" come output della chiamata add_custom_command(OUTPUT ...), qualsiasi destinazione che lo consuma (in questo caso "myexe") farà sì che il comando personalizzato venga richiamato prima che la destinazione venga creata.

Quindi è davvero solo bisogno di modificare il codice a qualcosa di simile:

set(TestRunner "${CMAKE_CURRENT_BINARY_DIR}/test_runner.cpp") 
add_executable(myexe ${TestRunner}) 
add_custom_command(
    OUTPUT ${TestRunner} 
    COMMAND deps/cxxtest-4.4/bin/cxxtestgen --error-printer -o "${TestRunner}" src/My_test_suite.h 
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 
) 
+0

che era perfetta. Grazie. Sto scoprendo che cmake è più esaustivo e sfumato di quanto non sembri, e ho sicuramente bisogno di leggere la sua copertina della documentazione per la copertina. Ma ne varrà la pena alla fine, perché cmake è così ridicolmente dannatamente utile. –