Я разрабатываю модуль 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
?