CMake: динамически добавлять зависимость к add_custom_command

У меня есть проект CMake со многими подпроектами. Каждый из них может использовать предоставленную мной функцию для создания небольшого текстового файла с некоторой определенной информацией (вызывая add_custom_command). На последнем этапе я хотел бы объединить все эти файлы в один большой текстовый файл.

Я создал собственную команду, которая ищет созданные файлы (все в одном месте) и объединяет их.

Проблема в том, что я бы хотел, чтобы этот последний шаг зависел от всех маленьких шагов, выполняемых в подпроектах, в то время как я на самом деле не знаю, сколько файлов будет предоставлено.

Моя последняя команда выглядит так:

add_custom_command(OUTPUT combination.txt
                   COMMAND create combination.txt from all files from /path/)

и моя команда create-small-text-file-for-each-subproject выглядит так:

add_custom_command(OUTPUT /path/${sub_project_name}.txt
                   COMMAND create /path/${sub_project_name}.txt)

И когда я создаю эти небольшие файлы, я хотел бы сделать что-то вроде, чтобы сделать так, чтобы "комбинация.txt" зависела от /path/$ndomsub_project_name отпуска.txt

Поэтому я хотел бы:

add_dependency(combination.txt /path/${sub_project_name}.txt)

Однако это работает только для целей.

Я также пытался использовать set_source_files_properties с OBJECT_DEPENDS, но, похоже, он не работает (может быть, он предназначен для использования с файлами cpp add_target?)

Последний способ заставить его работать, который я вижу, состоит в том, чтобы использовать переменную кэша, которая накапливает все эти небольшие пути к файлам, а затем использовать это так:

add_custom_command(OUTPUT combination.txt
                   COMMAND create combination.txt from all files from /path/
                   DEPENDS ${all_small_files_list})

но это последнее, что я хочу сделать.

1 ответ

Вместо того, чтобы использовать add_custom_command вы могли бы использовать add_custom_target с правильным определением зависимости (чтобы оно не создавалось каждый раз).

add_custom_target(project
                   COMMAND touch project.txt)

add_custom_target(project2
                   COMMAND touch project2.txt)

add_custom_target(combination
                   COMMAND cat project.txt project2.txt > combination.txt)

add_dependencies(combination project2)
add_dependencies(combination project)

add_executable(t t.c)
add_dependencies(t combination.txt)

Опять же: убедитесь, что вы используете DEPENDS аргумент add_custom_target создать реальную цепочку зависимостей, чтобы цель проекта и, следовательно, цель комбинации устарела.

ОБНОВЛЕНИЕ: я был слишком преждевременным. На самом деле cmake (по крайней мере, до 2.8.9) работает следующим образом для зависимостей: с вызовом add_dependencies Вы не можете добавить зависимость, которая является OUTPUT пользовательской команды IOW (сгенерированный) файл. С add_dependencies Вы можете только добавить target как создано add_custom_target, Однако в add_custom_target Вы можете зависеть от вывода add_custom_command используя DEPENDS-directive. Тем не менее, это делает это работает:

add_custom_command(OUTPUT project.txt
                   COMMAND uptime >> project.txt MAIN_DEPENDENCY t2.c)
add_custom_target(project DEPENDS project.txt)

add_custom_target(combination
                   COMMAND cat project.txt project2.txt > combination.txt)
add_dependencies(combination project)

Это сделает цель комбинации всегда восстанавливаемой, так как она не имеет MAIN_DEPENDENCY или же DEPENDS, но использование add_dependencies позволено.

Другие вопросы по тегам