CMake,OS X bundle,递归地将目录复制到Resources

Ibo*_*lit 5 macos qt cmake

我正在尝试将我们的Qt应用程序转换为CMake,其中一个目标是OS X应用程序.它需要将某个文件夹放在其our.app/Contents/Resources文件夹中.我尝试使用文件属性添加它,但我只设法复制文件夹本身没有它的内容.如何递归复制?

这是我做的:

set (
  RES_SOURCES
  ${SOURCE_ROOT}/data-folder
)
add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${SRC} ${RES_SOURCES})
SET_SOURCE_FILES_PROPERTIES(${RES_SOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
,但感觉不对.

小智 5

正如已经提到的,您可以使用 获取目录内所有文件的列表file(GLOB_RECURSE RES_SOURCES "${SOURCE_ROOT}/data-folder/*")。使用SET_SOURCE_FILES_PROPERTIES(${RES_SOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)为列表中的每个文件设置相同的位置属性${RES_SOURCES}(在本例中将所有文件放入平面结构中Resources)。

此命令不考虑 的结构data-folder,如果您想复制文件和目录结构,则必须自己指定:

#Get a list of all of the files in the data-folder
file(GLOB_RECURSE RES_SOURCES "${SOURCE_ROOT}/data-folder/*")

#Add our executable, and all of the files as "Source Files"
add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${SRC} ${RES_SOURCES})

#individually set the file's path properties
foreach(RES_FILE ${RES_SOURCES})

  #Get the relative path from the data-folder to the particular file
  file(RELATIVE_PATH RES_PATH "${SOURCE_ROOT}/data-folder" ${RES_FILE})

  #Set it's location inside the app package (under Resources)
  set_property(SOURCE ${RES_FILE} PROPERTY MACOSX_PACKAGE_LOCATION "Resources/${RES_PATH}")

endforeach(RES_FILE)
Run Code Online (Sandbox Code Playgroud)

此代码片段会将 的内容复制data-folderResources应用程序中的文件夹中,并保留结构,就像您期望复制命令所做的那样。


hgs*_*gs3 5

2021 年的答案:Alex Hamilton 的解决方案为每个文件生成了冗余文件夹 - 我已经更正了他的代码,这样就不会发生这种情况。我还将这些文件分组到 Xcode 中的“Resources”文件夹中,因为否则它们会显示为平面列表。

# Get a list of all of the files in the data-folder.
file(GLOB_RECURSE RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/data-folder/*")

# Add our executable, and all of the files as "Source Files".
add_executable(YourApp ${RESOURCES})

# Individually set the file's path properties.
foreach (FILE ${RESOURCES})
    # Get the relative path from the data-folder to the particular file.
    file(RELATIVE_PATH NEW_FILE "${CMAKE_CURRENT_SOURCE_DIR}/data-folder" ${FILE})

    # Get the relative path to the file.
    get_filename_component(NEW_FILE_PATH ${NEW_FILE} DIRECTORY)

    # Set it's location inside the app package (under Resources).
    set_property(SOURCE ${FILE} PROPERTY MACOSX_PACKAGE_LOCATION "Resources/${NEW_FILE_PATH}")

    # Optional: Add the file to the 'Resources' folder group in Xcode.
    #           This also preserves folder structure.
    source_group("Resources/${NEW_FILE_PATH}" FILES "${FILE}")
endforeach ()
Run Code Online (Sandbox Code Playgroud)