Cmake добавить команду и вывод к уже определенной цели - PullRequest
0 голосов
/ 12 марта 2019

Я разрабатываю модуль cmake (версия 3.13 и выше) для структуры генерации кода.

Я определил некоторые функции

cmake_minimum_required(VERSION 3.13)

function(configure_component
  COMPONENT_NAME
  )
  MESSAGE("Configuring component ${COMPONENT_NAME}")
  set(COMPONENT_GENERATED_FILES ${COMPONENT_NAME}_impl.cpp)
  list(APPEND GENERATED_FILES ${COMPONENT_GENERATED_FILES})
  set(GENERATED_FILES ${GENERATED_FILES} PARENT_SCOPE)
  set_source_files_properties(${GENERATED_FILES} PROPERTIES GENERATED TRUE)
  add_library(${COMPONENT_NAME} SHARED ${COMPONENT_NAME}_impl.cpp)
endfunction(configure_component)

# This function depends in fact from a file describing the model
# used by the generator. The list of generated files comes from
# this external file.
function(configure_project)
add_custom_command(
  OUTPUT
      ${GENERATED_FILES}
  COMMAND
    cmake -E touch foo_impl.cpp
  COMMAND
    cmake -E touch bar_impl.cpp
  COMMENT
    "Generating ${GENERATED_FILES}"
    )

add_custom_target(project_generation
DEPENDS
${GENERATED_FILES}
)
endfunction(configure_project)

Затем пользователь может использоватьбиблиотека как:

configure_component(foo)
configure_component(bar)
configure_project()

Но в некоторых случаях пользователь может также создать библиотеку, которая не появляется в описании модели, но использует в основном тот же код, что и существующие компоненты.В этом случае пользователь может написать в своем CMakeLists.txt:

add_custom_command(
    OUTPUT
         bar2_impl.cpp
    DEPENDS 
        project_generation
    COMMAND
        ${CMAKE_COMMAND} -E copy
        ${CMAKE_CURRENT_BINARY_DIR}/bar_impl.cpp
        ${CMAKE_CURRENT_BINARY_DIR}/bar2_impl.cpp
    COMMENT
        "Generating file specific to bar2"
)

configure_component(bar2)

Это будет работать (т.е. будет сгенерирована библиотека libbar2.so), но bar2_impl.cpp будет добавлено в качестве вывода пользовательскогокоманда, но не генерируется в результате команды.Следовательно, команда будет выполняться на каждом шаге.

Есть ли способ для пользователя добавить вывод своей пользовательской команды в вывод команды, определенной библиотекой?

Я думал датьпользователь советует использовать POST_BUILD как

add_custom_command(
    TARGET
        project_generation
    POST_BUILD
    COMMAND
        ${CMAKE_COMMAND} -E copy
        ${CMAKE_CURRENT_BINARY_DIR}/bar_impl.cpp
        ${CMAKE_CURRENT_BINARY_DIR}/bar2_impl.cpp
    BYPRODUCTS
         bar2_impl.cpp
    COMMENT
        "Generating file specific to bar2"
)

Но документ состояний

Должен быть определен в текущем каталоге;цели, определенные в других каталогах, могут не указываться.

Есть ли другое решение, о котором я не думал?Может быть, используя BYPRODUCTS?

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