Sto notando alcuni potenziali comportamenti errati in cmake quando si lavora con add_custom_command
e più file di output. Sono stato in grado di isolare il problema con un esempio minimo (vedi sotto). Sembra che quando ho due file di output specificati nel mio add_custom_command
, le dipendenze upstream del secondo file di output non vengano tracciate correttamente in alcuni casi. Lo cmake documentation indica chiaramente che sono consentiti più file di output. Ciò che è interessante qui è che lo scambio dell'ordine dei file di output causa un comportamento diverso, suggerendo che il primo file OUTPUT
viene trattato in modo diverso.cmake problema add_custom_command con più file di output
Fare riferimento all'esempio di esempio seguente che presenta questo comportamento. La prima chiamata per fare corse va bene. Dopo aver toccato a.txt
, la regola Copying baz.cpp to baz2.cpp
non viene eseguita alla prima chiamata a make
, ma viene eseguita sulla seconda chiamata a make
. Ciò significa che la generazione sarà ancora obsoleta dopo una singola chiamata a make
. Si noti che questo problema viene risolto modificando l'ordine delle uscite in add_custom_command
a OUTPUT baz.cpp bar.cpp
Example CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
add_library(mybaz baz.cpp)
add_custom_command(
OUTPUT baz2.cpp
COMMAND cp baz.cpp baz2.cpp
DEPENDS baz.cpp
COMMENT "Copying baz.cpp to baz2.cpp")
add_custom_target(mytarget
DEPENDS baz2.cpp
COMMENT "Running mytarget")
add_dependencies(mybaz mytarget)
add_custom_command(
OUTPUT bar.cpp baz.cpp
COMMAND cat a.txt > bar.cpp
COMMAND cat a.txt > baz.cpp
DEPENDS a.txt
COMMENT "Generating bar.cpp and baz.cpp")
Questi sono i comandi che corro:
> touch a.txt
> cmake .
...snip... (configuration runs fine)
> make
Scanning dependencies of target mytarget
[ 20%] Generating bar.cpp and baz.cpp
[ 40%] Copying baz.cpp to baz2.cpp
[ 60%] Running mytarget
[ 60%] Built target mytarget
Scanning dependencies of target mybaz
[ 80%] Building CXX object CMakeFiles/mybaz.dir/baz.cpp.o
Linking CXX static library libmybaz.a
[100%] Built target mybaz
(everything looks good)
> touch a.txt
> make
[ 20%] Generating bar.cpp and baz.cpp
[ 40%] Running mytarget
[ 60%] Built target mytarget
Scanning dependencies of target mybaz
[ 80%] Building CXX object CMakeFiles/mybaz.dir/baz.cpp.o
Linking CXX static library libmybaz.a
[100%] Built target mybaz
(I seem to be missing the 'Copying baz.cpp to baz2.cpp' line)
> make
[ 20%] Copying baz.cpp to baz2.cpp
[ 40%] Running mytarget
[ 60%] Built target mytarget
[100%] Built target mybaz
(The 'Copying baz.cpp to baz2.cpp' executes this time)
Questa è stata testata usando CMake versione 2.8.12.2 su una macchina Linux.
Grazie in anticipo per il vostro aiuto!
+1 per esempio, IMHO si tratta di un bug –
Ho un paio di domande. 1) Il target personalizzato 'mytarget' è necessario per riprodurre il problema? 2) Perché i file 'bar.cpp' e' baz2.cpp' non sono aggiunti alla libreria? – legalize
Questo potrebbe non essere un bug in CMake, potrebbe essere una condizione di competizione del filesystem. Hai presentato una segnalazione di bug con CMake? – Beanz