Проблема 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