CMake add_custom_command из подключаемого файла

Подскажите, как заставить (или прописать) команду (add_custom_command), выполняться из подключаемого MakeLists.txt файла ?

У меня есть основной файл CMakeLists.txt, который в свою очередь вызывает другой CMake файл из иной директории следующим способом:

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../Resource\ files\ Extention ${CMAKE_CURRENT_BINARY_DIR}/Resource\ files\ Extention)

В вызываемом файле есть команда:

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME_ONLY}.o
                                WORKING_DIRECTORY ${FILEPATH_ONLY}
                                COMMAND ${CMAKE_OBJCOPY} 
                                ARGS -I binary -O elf64-x86-64 -B i386 ${FILENAME_ONLY} ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME_ONLY}.o )

Данная команда, должна формировать объектные файлы из бинарных, однако выполняет она свою функцию лишь если переместить ее в основной CMakeLists.txt файл. Если же она находится в вызываемом файле, то данная команда игнорируется и файлы не формируются.

Как я понял погуглив, команды добавляемые с помощью add_custom_command - должны всегда находиться в основном файле, однако я для своих целей намерен вынести ее в сторонний файл. Подскажите можно ли сделать подобное ?


Ответы (1 шт):

Автор решения: Andrej Levkovitch

У вас проблема в этой строке:

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../Resource\ files\ Extention ${CMAKE_CURRENT_BINARY_DIR}/Resource\ files\ Extention)

subdirectory, как ни странно, должна быть именно субдиректорией! Вы не можете легально включить в CMakeLists.txt другой CMakeLists.txt если он не находится в одной из субдиректорий. Вообще в таких случаях cmake генерит ошибку а-ля:

CMake Error at CMakeLists.txt:5 (add_subdirectory):
  add_subdirectory not given a binary directory but the given source
  directory "/home/levkovitch/Public/tmp/cmake_test/beta" is not a
  subdirectory of "/home/levkovitch/Public/tmp/cmake_test/alpha".  When
  specifying an out-of-tree source a binary directory must be explicitly
  specified.

Посмотрите - у вас должна быть аналогичная

→ Ссылка