2014-06-25 11 views
12

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

+1 per esempio, IMHO si tratta di un bug –

+0

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

+0

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

risposta

5

Si tratta di un bug in CMake 2.8.12.1. Secondo la gente di CMake, la prima uscita viene trattata in modo speciale dal generatore di Makefile (anche se probabilmente non c'è una ragione per cui debba essere trattato in modo speciale). Una correzione per CMake è stata effettuata ed è destinata a CMake 3.2.

Vedi l'bugreport CMake: http://www.cmake.org/Bug/view.php?id=15116

Problemi correlati