CMake команды сценариев работают только в CMake контексте и выполняются немедленно .
Но COMMAND
в add_custom_command
( или add_custom_target
) выполняется в контексте инструмента сборки (например, Makefile), а не в контексте CMake.
Однако вы можете поместить команды сценариев CMake в отдельный CMake скрипт , и назовите этот скрипт из COMMAND
. Это решение имеет те же независимые от платформы свойства, что и сам CMakeLists.txt
.
Вы можете параметризовать отдельный скрипт либо:
- С помощью
configure_file
команды CMake. - Передав
-D
параметров в CMake при вызове скрипта.
Первый подход довольно прост: вы пишете скрипт так же, как вы пишете CMakeLists.txt
. Но он генерирует дополнительные файлы для каждого набора параметризации.
Второй подход полезен для многоцелевых (или многоразовых) сценариев, поскольку он не создает дополнительную копию сценария для каждого использования. Но это требует некоторого проектирования параметров.
Использование 'configure_file'
copy_sources.cmake.in (как если бы команды были написаны в CMakeLists.txt
):
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/" DESTINATION ${CMAKE_BINARY_DIR}
PATTERN "file_to_exclude.txt" EXCLUDE
PATTERN "dir_to_exclude" EXCLUDE
)
CMakeLists.txt :
# Instantiate the parameterized script in the binary directory.
configure_file(copy_sources.cmake.in copy_sources.cmake)
add_custom_target(my-target
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/copy_sources.cmake
)
Использование параметров -D
copy_sources.cmake :
# Expect the script to be called from the source directory.
# This saves one parameter.
#
# DEST_DIR denotes the directory for copy to.
file(COPY "${CMAKE_SOURCE_DIR}/" DESTINATION ${DEST_DIR}
PATTERN "file_to_exclude.txt" EXCLUDE
PATTERN "dir_to_exclude" EXCLUDE
)
CMakeLists.txt :
add_custom_target(my-target
COMMAND ${CMAKE_COMMAND}
-DDEST_DIR=${CMAKE_BINARY_DIR} # all '-D' options should preceed '-P' one
-P ${CMAKE_CURRENT_SOURCE_DIR}/copy_sources.cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} # The script assumes proper current directory
)