Как я могу скопировать папку «Ресурсы» в папку «Ресурсы» приложения macos bundle с помощью cmake?

#macos #cmake

Вопрос:

Я создаю приложение для пакета macos, и мне нужно включить папку «Ресурсы» в папку «Ресурсы».

Прямо сейчас мне удалось скопировать отдельные файлы в эту папку, но я потерял структуру папки:

 set(ASSETS ${CMAKE_SOURCE_DIR}/assets/textures/awesomeface.png)
target_sources(${PROJECT_NAME} PRIVATE ${ASSETS})

set_target_properties(${PROJECT_NAME} PROPERTIES
  MACOSX_BUNDLE ON
  MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME}
  MACOSX_BUNDLE_SHORT_VERSION_STRING ${VERSION}
  RESOURCE "${ASSETS}"
)
 

Я мог бы использовать GLOB_RECURSE, чтобы найти все файлы в папке «Ресурсы» и переместить их в ресурсы, но если я это сделаю, я потеряю структуру папок.

Как правильно это сделать?

Ответ №1:

Используйте свойство MACOSX_PACKAGE_LOCATION исходного файла:

 set(textures assets/textures/awesomeface.png ...)
target_sources(target PRIVATE ${textures})
set_source_files_properties(
  ${textures}
  PROPERTIES
    MACOSX_PACKAGE_LOCATION Resources/assets/textures
)
 

Что-то подобное вышесказанному должно сработать (хотя у меня нет под рукой mac, чтобы протестировать его).

Смотрите документы здесь: https://cmake.org/cmake/help/latest/prop_sf/MACOSX_PACKAGE_LOCATION.html

Комментарии:

1. Я просто хочу скопировать папку, в которой много файлов, для этого мне придется вручную просмотреть каждую папку и подпапку

2. @ellipticaldoor — я здесь всего лишь посыльный. Свойство исходного файла-это то, как вы это делаете в CMake. Вы можете сделать это менее ужасным с помощью функций и циклов управления путями CMake.

3. Я вижу, что это невозможно, в конце концов, я просто использовал пользовательскую команду для копирования папки

Ответ №2:

Простое копирование папки выполняется с помощью пользовательской команды

 add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_directory
    "${CMAKE_SOURCE_DIR}/assets"
    "

lt;TARGET_FILE_DIR:${PROJECT_NAME}>/../Resources/assets"
)