Генератор кода, генерирующий собственные файлы и цели CMake - PullRequest
0 голосов
/ 28 сентября 2018

Предположим, у меня есть скрипт, который генерирует набор исходных файлов, образующих цель, с которой я хочу связать в CMakeLists.txt.Если имена файлов известны последним, то обычные команды add_custom_target() и add_custom_command() позволят использовать сгенерированные файлы в качестве целевых источников.

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

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

Идея # 1

Сценарий также генерирует файл generated.cmake, включенный родителем.один с использованием include(generated.cmake).Проблема: CMake не находит generated.cmake, поскольку он не существует во время конфигурации.

Идея # 2

Похожа на идею № 1, но сценарийвызывается с execute_process(), так что generated.cmake присутствует во время конфигурации.Проблема: Сценарий больше не вызывается при последующих сборках, поэтому игнорируются возможные изменения его входных данных.

Idea # 3

Сценарий возвращает список целей ифайлы, которые каким-то образом считаются родительскими CMakeLists.txt.До сих пор я не мог найти способ сделать это.

1 Ответ

0 голосов
/ 09 октября 2018

Решение, с которым я пришел, в конечном итоге представляет собой смесь всех трех идей.

Решение проблемы идеи № 1

execute_process() фактически гарантирует, что generated_targets.cmake присутствует во время настройки.

Решение проблем идеи № 2 и № 3

Как указано в , этот ответ на «Добавить зависимость к самой генерируемой CMake системе сборки» , CMAKE_CONFIGURE_DEPENDS свойство каталогов можно редактировать для добавления файлов, касание которых вызывает этап настройки.

Ключевым фактором успеха является то, что это свойство можно установить после первоначального вызова execute_process(), чтобы скрипт мог идентифицировать и перечислитьего входные зависимости (в выходном файле), которые затем добавляются к CMAKE_CONFIGURE_DEPENDS, что также решает проблему входных зависимостей.

Результирующий псевдокод

# The script generates:
# - <output_dir>/cmake/input_files
# - <output_dir>/cmake/generated_targets.cmake
execute_process(
  COMMAND myScript
    --output-dir ${CMAKE_CURRENT_BINARY_DIR}/generated
)

# Mark the input files as configure step dependencies so that the execute_process
# commands are retriggered on input file change.
file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/generated/cmake/input_files _input_files)

set_property(
  DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
    ${_input_files}
)

# Add the generated CMake targets.
include(${CMAKE_CURRENT_BINARY_DIR}/generated/cmake/generated_targets.cmake)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...