3

背景: CMake を使用して、ライブラリとアプリケーションの組み合わせをビルドするプロジェクトを構成しています。各アプリケーションは、そのアプリケーションに固有の画像やテキスト ファイルなどのリソース ファイルを使用します。Xcode はリソース ファイルの概念を理解し、それらをアプリケーション バンドルに正しくコピーできます。ちょうど 1 つのアプリケーションでプロジェクトを作成している場合、問題はありません。CMake を使用set_source_files_properties(... PROPERTIES MACOSX_PACKAGE_LOCATION Resources)して、Xcode にファイルをバンドルの Resources ディレクトリに配置するように指示できます。これにより、後で を呼び出したときにファイル[[NSBundle mainBundle] pathForResource:...]が正しく検出されます。(pathForResourceメソッドは、デフォルトで「Resources」ディレクトリを検索します。) ファイルは、Xcode プロジェクト内の Resources グループにも表示されます。

質問:CMake プロジェクトに複数のアプリケーションを含めると、問題が発生します。各プロジェクトは、独自の個別のリソース ファイルを独自のバンドルの Resources ディレクトリにコピーする必要があります。したがって、各アプリケーションには、これらのファイルを保持し、そこからコピーする Xcode の個別のリソース グループが必要です。ただし、これらの個別のディレクトリにはすべて「Resources」という名前を付ける必要があります。理想的には、Xcode 内の各アプリケーション固有のフォルダーには、必要なすべてのリソースを含む独自の "Resources" サブディレクトリが必要です。実際には、プロジェクトには、すべてのリソース ファイルが収集される単一の共有 Resources ディレクトリがあり、プロジェクト固有の「Resources」サブディレクトリには、そのアプリケーションの info.plist ファイルのみが含まれます。すべてのアプリケーションのリソースが同じグループに入れられるため、

CMake を使用して、個別のリソースを持つ複数のアプリケーションをサポートする Xcode プロジェクトをセットアップする方法を見つけた人はいますか? または他の回避策はありますか?

4

1 に答える 1

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 にファイルがない場合、問題はありますか?

于 2013-02-13T17:32:14.487 に答える