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
позволено.