Как построить цель B, которая зависит от выполнения и вывода цели A - PullRequest
0 голосов
/ 21 января 2020

Учитывая цель CMake A и цель B, где B зависит от A, а A является препроцессором для кода, принадлежащего B. Я пытаюсь получить следующее поведение:

A создается, выполняется и его стандартный вывод используется для записи определения C директив / макросов препроцессора, которые необходимо переслать в описание здания B через target_compile_definitions (...)

Я попытался добавить промежуточную пользовательскую цель, pre-B, который вызывает программу А и сохраняет ее вывод.

add_custom_target(
    pre-B
    COMMAND A OUTPUT_VARIABLE DEFS
)
# pre-B executable outputs C preprocessor definitions into DEFS

target_compile_definitions(B PRIVATE  ${DEFS})

add_dependencies(B pre-B)

Я считаю, что проблема заключается в том, что когда я вызываю target_compile_definitions с $ {DEFS} в качестве аргумента, он пуст во время оценки, что приводит к мой вопрос.

Как определить определения компиляции для цели B, когда они поступают с выхода выполнения цели A? (CMake 3.0 +)

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Вместо этого можно попробовать execute_process().

execute_process(
  COMMAND A
  OUTPUT_VARIABLE DEFS
)

Обе команды выполняются, пока CMake обрабатывает проект перед созданием системы сборки. Используйте add_custom_target () и add_custom_command () для создания пользовательских команд, которые запускаются во время сборки.

sr c: https://cmake.org/cmake/help/latest/command/execute_process.html

0 голосов
/ 22 января 2020

Если вместо этого вы можете сгенерировать файл, содержащий определения и иметь возможность добавить #include(defs.h) в целевые источники B, я бы порекомендовал использовать add_custom_command().

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

ср c: https://cmake.org/cmake/help/latest/command/add_custom_command.html#generating -файлы

add_custom_command(
  OUTPUT DEFS
  COMMAND ....)

add_library(B ... ${DEFS})

Согласно do c из add_custom_target()

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

sr c: https://cmake.org/cmake/help/latest/command/add_custom_target.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...