У меня относительно большой проект CMake с большим количеством подпапок и файлов.Я хочу запустить пользовательскую команду после создания любого двоичного файла при создании этого проекта.Я тестировал Hello World, и я знаю, что мне нужно что-то вроде этого:
РЕДАКТИРОВАТЬ: я обновил вопрос, чтобы отразить мой текущий прогресс.
# Get list of all files and folders in current dir recursively
set(SUBFDIRS)
file(GLOB_RECURSE ALLFILES LIST_DIRECTORIES true "*" "*")
foreach(SUBFILE ${ALLFILES})
IF(IS_DIRECTORY ${SUBFILE} AND NOT ${SUBFILE} MATCHES ".*CMakeFiles.*")
message("Adding directory: ${SUBFILE}")
LIST(APPEND SUBDIRS ${SUBFILE})
ENDIF()
endforeach()
# Also add current directory to directory list
LIST(APPEND SUBDIRS .)
LIST(REMOVE_DUPLICATES SUBDIRS)
message("-- Detected subdirectories: ${SUBDIRS}")
# Loop over all subdirectories
foreach(subdir ${SUBDIRS})
# Get a list of all targets
get_property(BUILDSYSTEM_TARGETS DIRECTORY ${subdir} PROPERTY BUILDSYSTEM_TARGETS)
# For each target, add a custom target that will run a custom command
foreach(TARGET_DEFINED ${BUILDSYSTEM_TARGETS})
get_target_property(target_type ${TARGET_DEFINED} TYPE)
if (target_type STREQUAL "EXECUTABLE")
message("-- Adding custom target for executable ${TARGET_DEFINED}...")
add_custom_target(custom_${TARGET_DEFINED} ALL)
add_custom_command(TARGET custom_${TARGET_DEFINED}
POST_BUILD
COMMAND my_custom_command $<TARGET_FILE:${TARGET_DEFINED}> $<TARGET_FILE:${TARGET_DEFINED}>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS $<TARGET_FILE:${TARGET_DEFINED}>
)
else()
message("-- Target ${TARGET_DEFINED} is not an executable. Ignoring!")
endif()
endforeach()
endforeach()
Это кажетсяработать так, как я хочу, за исключением того факта, что он генерирует ошибки CMake, подобные этой, при попытке получить список целей для каталога:
CMake Error at CMakeLists.txt:34 (get_property):
get_property DIRECTORY scope provided but requested directory was not
found. This could be because the directory argument was invalid or, it is
valid but has not been processed yet.