c++ - tutorial - cmake add_custom_command problema con múltiples archivos de salida
descarga cmake (1)
Esto es, de hecho, un error en CMake 2.8.12.1. De acuerdo con la gente de CMake, la primera salida está siendo tratada especialmente por el generador de Makefile (aunque probablemente no haya una razón para tratarla especialmente). Se ha realizado una corrección a CMake, y está dirigido a CMake 3.2.
Consulte el informe de errores de CMake: http://www.cmake.org/Bug/view.php?id=15116
Estoy notando un posible comportamiento incorrecto en cmake cuando trabajo con add_custom_command
y múltiples archivos de salida. Pude aislar el problema en un ejemplo mínimo (ver a continuación). Parece que cuando tengo dos archivos de salida especificados en my add_custom_command
, las dependencias de segundo add_custom_command
del archivo de salida no se siguen correctamente en algunos casos. La documentación de cmake menciona claramente que se permiten múltiples archivos de salida. Lo interesante aquí es que intercambiar el orden de los archivos de salida provoca un comportamiento diferente, lo que sugiere que el primer archivo OUTPUT
se trata de manera diferente.
Consulte el siguiente ejemplo de juguete que muestra este comportamiento. La primera llamada para hacer corre bien. Después de tocar a.txt
, la Copying baz.cpp to baz2.cpp
no se ejecuta en la primera llamada que se make
, sino que se ejecuta en la segunda llamada a make
. Esto significa que la compilación seguirá estando obsoleta después de una sola llamada para make
. Tenga en cuenta que este problema se soluciona cambiando el orden de las salidas en 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")
A continuación están los comandos que ejecuto:
> 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 )
Esto ha sido probado usando CMake versión 2.8.12.2 en una máquina Linux.
¡Gracias de antemano por tu ayuda!