2015-09-10 6 views
5

chcę uczynić wykonywalny z, na przykład, test_runner.cpp:CUpewnij wykonywalny z generowanych automatycznie źródeł

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

ale tym konkretnym pliku cpp sama jest automatycznie wygenerowana w poleceniu 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}" 
) 

Ale teraz nie mogę wygenerować nowych plików kompilacji cmake, ponieważ narzekają na brakujące źródło, którego faktycznie brakuje do czasu wstępnej kompilacji.

Odpowiedz

8

Sedno problemu jest zastosowanie „test_runner.cpp” GENERATED property do. To mówi CMake, aby nie sprawdzał jego istnienia w czasie konfiguracji, ponieważ zostanie on utworzony jako część procesu kompilacji.

Możesz zastosować tę właściwość ręcznie (np. Używając set_source_files_properties). Jednak właściwym sposobem radzenia sobie z tym jest użycie innej postaci add_custom_command, tj. add_custom_command(OUTPUT ...) zamiast add_custom_command(TARGET ...).

Jeśli określisz "test_runner.cpp" jako wynik połączenia add_custom_command(OUTPUT ...), każdy cel, który go zużyje (w tym przypadku "myexe") spowoduje wywołanie komendy niestandardowej przed zbudowaniem tego celu.

Tak naprawdę wystarczy zmienić kod, aby coś takiego:

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

To było idealne. Dziękuję Ci. Odkrywam, że cmake jest bardziej wyczerpujący i zniuansowany, niż to się początkowo wydaje, i zdecydowanie muszę przeczytać jego okładkę z dokumentacją, żeby ją ukryć. Ale na końcu będzie warto, bo cmake jest tak cholernie użyteczny. –

Powiązane problemy