Проблема cmake add_custom_command с несколькими выходными файлами
Я замечаю некоторое потенциальное неправильное поведение в cmake при работе с add_custom_command
и несколькими выходными файлами. Я смог изолировать проблему до минимального примера (см. Ниже). Кажется, что, когда у меня есть два выходных файла, указанных в моем add_custom_command
, в некоторых случаях зависимостей второго выходного файла вверх не отслеживаются. В документации cmake четко указано, что разрешено несколько выходных файлов. Что интересно, так это то, что замена порядка выходных файлов вызывает другое поведение, предполагая, что первый OUTPUT
файл обрабатывается по-разному.
Пожалуйста, обратитесь к приведенному ниже примеру игрушки, демонстрирующему это поведение. Первый звонок, чтобы сделать прогоны просто отлично. После касания a.txt
правило Copying baz.cpp to baz2.cpp
не выполняется при первом вызове make
, но выполняется при втором вызове make
. Это означает, что сборка будет по-прежнему устаревать после одного вызова make
. Обратите внимание, что эта проблема фиксируется путем изменения порядка выходов в add_custom_command
до 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")
Ниже приведены команды, которые я запускаю:
> 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 )
Это было протестировано с использованием CMake версии 2.8.12.2 на Linux-машине.
Заранее благодарим за помощь!
Ответы
Ответ 1
Это на самом деле ошибка в CMake 2.8.12.1. Согласно людям CMake, первый выход обрабатывается специально генератором Makefile (хотя, вероятно, для этого не требуется особого обращения). Исправление для CMake было сделано и предназначено для CMake 3.2.
См. сообщение об ошибке CMake: http://www.cmake.org/Bug/view.php?id=15116