[英]CMake: copy_directory custom command fails on macOS
我有一個跨平台(Windows,Mac,iOS)CMake項目,需要將二進制資源(圖像,音頻,文本文件等)復制到最終應用程序。 之前,我只是將所有資源添加到add_executable
命令中,並且在我希望將所有內容組織到子目錄中之前,它都可以正常工作。
為了在保持文件夾結構的同時復制應用程序資產,我最終在Windows目標中使用以下自定義命令:
add_custom_command(
TARGET ${APP_TARGET_NAME} PRE_LINK
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_CURRENT_SOURCE_DIR}/${APP_ASSETS_DIR}
$<TARGET_FILE_DIR:${APP_TARGET_NAME}>/assets
)
哪個效果很好。 當我嘗試在macOS上執行相同的操作時,就會出現問題。 當我在macOS上使用相同的$<TARGET_FILE_DIR>
技巧時,我得到了輸出應用程序捆綁包的地址(非常好),因此我在其末尾添加了/resources
並嘗試在其中復制,但這失敗了。
在XCode中,出現以下錯誤:
PhaseScriptExecution CMake\ PreLink\ Rules /Users/someuser/Documents/Build/Test/Test.build/Debug/Test_MAC.build/Script-2CF8724D08BC49E4A13B9E75.sh
cd /Users/someuser/Documents/GitHub/Test
/bin/sh -c /Users/someuser/Documents/Build/Test/Test.build/Debug/Test_MAC.build/Script-2CF8724D08BC49E4A13B9E75.sh
/Users/someuser/Documents/Build/Test/Debug/Test_MAC.app/Contents/MacOS/Test_MAC -E copy_directory /Users/someuser/Documents/GitHub/Test/assets /Users/someuser/Documents/Build/Test/Debug/Test_MAC.app/Contents/Resources
make: *** [Test_MAC_buildpart_0] Segmentation fault: 11
Command /bin/sh failed with exit code 2
這不是特別有用。 我已經嘗試過PRE_LINK
和POST_BUILD
以及copy_directory
和copy
。
為什么會失敗? 我無法在iOS上進行測試,但我想兩者可以以類似的方式工作。
如何將資產復制到macOS(也是iOS)上的捆綁軟件中?
網上沒有多少有用的文檔來說明使用CMake生成框架/捆綁軟件。 大多數智慧隱藏在CMakeLists.txt文件中,而不隱藏在CMake教程中。
兩種方法都可以使用,但是要正確使用起來有些棘手。 我在CMake的Unix Makefiles
生成器的版本化框架項目中將它們一起使用。
首先,你將資源添加到您的框架/束(礦具有相同的名稱作為項目,因此我使用${PROJECT_NAME}
整個以下線)將其添加為自變量要么 add_library
,如
add_library(${PROJECT_NAME} SHARED ${SOURCES} ${HEADERS} ${RESOURCES})
然后為框架/捆綁包設置目標屬性:
if(BUILD_MAC_FRAMEWORK)
# Set the framework target properties just to make sure the relevant links inside the framework
# are created. Because the default framework name differs from the project name we change the
# output name property.
set_target_properties(${PROJECT_NAME} PROPERTIES
FRAMEWORK TRUE
FRAMEWORK_VERSION ${MAC_FRAMEWORK_VERSION}
#PUBLIC_HEADER "${PUBLIC_HEADERS}" # does not work recursively
#PRIVATE_HEADER "${PRIVATE_HEADERS}" # does not work recursively
RESOURCE "${CMAKE_BINARY_DIR}/version.plist" # does not work recursively
MACOSX_FRAMEWORK_IDENTIFIER org.company.sampleFramework.framework
MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PROJECT_VERSION}
MACOSX_FRAMEWORK_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_FRAMEWORK_INFO_PLIST "${CMAKE_BINARY_DIR}/Info.plist"
OUTPUT_NAME ${MAC_FRAMEWORK_NAME}
)
endif()
稍后使用幫助程序功能相對於Resources
目錄設置資源文件的框架路徑
# determine which subdirectory this file (header, resource) should be installed into.
function(set_macosx_properties _removable_prefixes _install_prefix _source_files)
foreach(_file ${_source_files})
get_filename_component(_loc "${_file}" DIRECTORY)
foreach(_prefix ${_removable_prefixes})
string(REPLACE "${_prefix}" "" _loc "${_loc}")
endforeach()
set_source_files_properties(${_file} PROPERTIES MACOSX_PACKAGE_LOCATION ${_install_prefix}${_loc})
endforeach()
endfunction()
set_macosx_properties("${CMAKE_SOURCE_DIR}/include;${CMAKE_BINARY_DIR}/include" "Headers" "${HEADERS}")
set_macosx_properties("${CMAKE_SOURCE_DIR}/data;${CMAKE_BINARY_DIR}/data" "Resources" "${RESOURCES}")
helper函數將刪除指定的前綴,並將其替換為安裝前綴。
確保從同一目錄/ CMakeLists.txt
調用兩個命令( add_library
和set_macosx_properties
)! 命令的不同位置不起作用。
或者,您可以使用對add_custom_command
的調用,如下所示。 我不記得其他類型的目標是否無效,但我一直使用POST_BUILD
自定義目標。
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:${PROJECT_NAME}>/Documentation
COMMAND ${CMAKE_COMMAND} -E create_symlink ./Versions/Current/Documentation $<TARGET_FILE_DIR:${PROJECT_NAME}>/../../Documentation
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/html $<TARGET_FILE_DIR:${PROJECT_NAME}>/Documentation/html)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E remove $<TARGET_FILE_DIR:${PROJECT_NAME}>/Documentation/html/${PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.qch
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/html/${PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.qch $<TARGET_FILE_DIR:${PROJECT_NAME}>/Documentation)
最后,安裝是通過單個命令完成的:
install(TARGETS ${PROJECT_NAME} FRAMEWORK DESTINATION . COMPONENT development)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.