2015-07-23 15 views

risposta

4

(Si prega di notare che ho cambiato la mia risposta dopo aver esaminato la questione, perché il commento di Florian. Maggiori informazioni sul modifica sotto)

La documentazione del execute_process afferma chiaramente che non fa uso di shell intermedi, così reindirizzamento gli operatori non lavorano lì.

Ma non è vero per il add_custom_command. Il reindirizzamento dovrebbe funzionare lì come previsto. [EDIT] Il motivo a volte non sembra funzionare è una sfortunata combinazione del generatore CMake, dello specificatore VERBATIM e dello spazio (mancante) tra > e il nome del file.

Si è scoperto se si effettua che ci sia uno spazio tra > e il nome del file che funziona con nella maggior parte dei casi, anche con VERBATIM:

add_custom_command(OUTPUT ${some-file} 
    COMMAND cmake --version > ${some-file} 
    VERBATIM # optional 
) 

Una nota su una soluzione alternativa: in precedenza Pensavo allo add_custom_command, così come lo execute_process non utilizza una shell intermedia quindi ho suggerito di chiamare uno script CMake che contiene un comando execute_process che esegue il comando effettivo, reindirizzando il suo output con l'opzione OUTPUT_FILE.

Se per qualche motivo la soluzione di cui sopra ancora non riesce per voi, provate la soluzione alternativa utilizzando un ExecuteProcessWrapper.cmake

+3

Credo che l'implementazione di CMake di comando personalizzato può essere dipendente dalla piattaforma. Puoi aggiungere un esempio in cui il comando personalizzato non sta utilizzando una shell intermedia? Ho utilizzato correttamente il reindirizzamento stderr/stderr con i generatori Ninja e Visual Studio. Questi generatori eseguono il prefisso 'cmd.exe/c' per i comandi personalizzati su Windows. E i comandi pipe sono testati nel [custom command unit test] di CMake (https://github.com/Kitware/CMake/blob/master/Tests/CustomCommand/CMakeLists.txt#L231). – Florian

+0

@ Florian, hai ragione, ho sbagliato. Sto fissando la mia risposta. –

+1

Ho trovato quel thread sul forum degli sviluppatori di CMake: http://cmake.3232098.n2.nabble.com/Redirect-output-from-add-custom-target-td7583901.html. Scrivono, che il reindirizzamento in 'add_custom_target()' potrebbe non funzionare in alcuni casi. Dall'altro lato, sia 'add_custom_command()' che 'add_custom_target()' accettano l'opzione 'VERBATIM', che non ha alcun senso fino a quando la shell non è coinvolta. Contrariamente, 'execute_process()' non accetta quell'opzione e ha un'osservazione esplicita sul reindirizzamento. Quindi, dov'è la verità? – Tsyvarev

Problemi correlati