簡體   English   中英

CMake:macOS上的copy_directory自定義命令失敗

[英]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_LINKPOST_BUILD以及copy_directorycopy

為什么會失敗? 我無法在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_libraryset_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM