后台:我正在使用CMake配置构建库和应用程序组合的项目。每个应用程序都使用资源文件,例如该应用程序独有的图像和文本文件。 Xcode理解资源文件的概念,可以正确地将它们复制到应用程序包中。如果我用一个应用程序创建一个项目,那就没有问题:我可以使用CMake的set_source_files_properties(... PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
告诉Xcode将文件放入bundle的Resources目录中,以便以后调用[[NSBundle mainBundle] pathForResource:...]
会正确找到它们。 (pathForResource
方法默认搜索“Resources”目录。)这些文件也出现在Xcode项目的Resources组中。
问题:当我在CMake项目中包含多个应用程序时,会出现问题。每个项目都需要将自己的不同资源文件复制到自己的bundle的Resources目录中。因此,每个应用程序在Xcode中都需要一个不同的资源组来保存这些文件并从中复制它们。然而,这些不同的目录必须都被命名为“资源”。理想情况下,Xcode中的每个特定于应用程序的文件夹都有自己唯一的“Resources”子目录及其所有必需的资源。实际发生的是项目有一个共享资源目录,其中收集了所有资源文件,项目特定的“Resources”子目录只包含该应用程序的info.plist文件。因为所有应用程序的资源都被扔到同一个组中,并且因为名称冲突可能发生(两个项目具有相同名称的不同文件),所以项目包无法获得正确的资源文件。
有没有人找到使用CMake设置Xcode项目的方法,该项目支持具有不同资源的多个应用程序?还是其他一些解决方法?
答案 0 :(得分:3)
我的解决方案适合我,但也许这对你不满意。
我所做的是一个简单的复制文件构建后步骤,我将资源直接复制到构建的Target.app中。
我的方法存在的问题是文件没有出现在Xcode项目中。
我覆盖 ADD_EXECUTABLE 宏。在里面,它评估资源变量$ {target} _RESOURCES。
因此,在我的目标CMakeLists.txt中,我收集了一些目录和资源文件,并将它们作为列表存储在我的目标依赖资源变量中。
以下自定义命令位于我的宏中(实际上可能在任何地方):
ADD_CUSTOM_COMMAND( TARGET ${target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -DFILES_LIST="${${target}_RESOURCES}" -DDESTINATION="\${TARGET_BUILD_DIR}/\${FULL_PRODUCT_NAME}" -DEXCLUDE_EXT=".svn .git CVS .DS_Store" -P ${ROOT_DIR}/cmake/scripts/copyFiles.cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
COMMENT "Copying resource files and directories to iOS App Bundle..." )
它调用我的副本文件脚本(也许有更好的方法来添加自定义构建步骤):
SEPARATE_ARGUMENTS( FILES_LIST )
FOREACH( ENTRY ${FILES_LIST} )
MESSAGE( "copying: ${ENTRY} to ${DESTINATION}" )
FILE( COPY ${ENTRY} DESTINATION ${DESTINATION} PATTERN "${EXCLUDE_EXT}" EXCLUDE )
ENDFOREACH( ENTRY )
它对我有用。我真的不在乎资源是否出现在XCode项目中。
但我仍然想知道。 在Xcode中没有文件时是否有任何问题或问题?