4

C++、Qt、および少しの Objective C で記述された Win および Mac OSX プラットフォーム用のクロスプラットフォーム アプリケーションがあります。2 つの無関係なプラットフォーム固有のプロジェクト (VS 2010 および xCode) をサポートする期間の後、単一の CMake を作成することにしました。脚本。プラットフォーム固有のプロジェクトを生成し、それを操作します。

かなり長い間掘り下げた後、アプリケーションをコンパイルしてリンクすることができました。しかし、適切なバンドルを作成するにはまだ多くの問題があります (何の努力もせずに xCode はバイナリを作成するだけです)。いくつかの変数を設定した後、xCode は plist ファイルとアプリの実行可能ファイルなしでダミー バンドルをコンパイルして作成します。そのため、必要なすべてのフレームワークとリソースをバンドルにコピーする必要があります。

バンドルを作成するためにいくつかのアプローチを試しました。最初のものは、次のように使用SET_SOURCE_FILES_PROPERTIES( ${resourcePath} PROPERTIES MACOSX_PACKAGE_LOCATION ${pathInsideBundle} )して、それら (frameworks\resources) を ADD_EXECUTABLE に追加することでした: ADD_EXECUTABLE( FranchiseTracker MACOSX_BUNDLE ${headers} ${sources} ${form_headers} ${resources_rcc} ${thirdparty_sources} ${BUNDLE_COPY_RESOURCES} ). そしてうまくいきました-アイコンとSparkleフレームワークをバンドルにコピーすることはできましたFIND_PACKAGEが、${QT_LIBRARIES}変数を空のままにしたため、Qtフレームワークをコピーできなかったため、へのパスを取得できませんでした。フレームワークを「手動で」コピーします。

ここでは、"fix_bundle" アプローチを使用します。これにより、介入なしで必要なすべてのリソースをコピーできることが約束されるからです。だから、ここに fixup_bundle() に関連する私のコードがあります:

# Fixup bundle, copy dynamic libraries into app bundle
SET( EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/out )
SET( APPS "\${CMAKE_CURRENT_BINARY_DIR}/out/${APP_NAME}.app" ) # paths to executables
SET( DIRS "${CMAKE_SOURCE_DIR}/osx/FRP/vendors/libraries/lib" ) # directories to search for prerequisites
INSTALL( CODE "
    include(BundleUtilities)
    fixup_bundle(\"${APPS}\" \"\" \"${DIRS}\")
")

今、私は少しの洗練に困惑しています。問題は、頑固な xCode が私のバンドルを生成して書き込む${CMAKE_CURRENT_BINARY_DIR}/out/Debugために固執するため、fixup_bundle がバンドルをまったく見つけられないことです。

私の特定の質問(タイトルのように):CMakeスクリプトで(デバッグを使用して)正しいパスを取得するにはどうすればよいですか? アーカイブの場合に間違っているため、デバッグでパスをハードコードすることは避けたいです。

私のより一般的な質問: CMake を使用して Qt アプリケーションのバンドルを作成する簡単な方法はありますか? たぶん私のアプローチ全体が間違っていますか?

PSスクリプト全体を Code Review hereに投稿しました。

PPS私の質問が冗長すぎると考える人のために。私が完全なスクリプトを投稿し、私の試みを書いた理由 (私がそれを動かしたいことを除いて) は、CMake での Mac OSX フレームワーク、バンドルなどの操作に関する情報がインターネット上にほとんどないためです。構造化されたチュートリアルや少なくとも適切なドキュメントが見つからなかったため、多くのメーリング リストを読まなければなりませんでした。そして、学ぶべき唯一の情報源は、他の人が書いた他のスクリプトでした。ですから、私のスクリプトと説明が誰かの役に立てば幸いです。

4

1 に答える 1

1

macdeployqtMacOSXプラットフォームでユーティリティのみを使用し終えました。私はxCodeを使用してアプリケーションを構築しているので、次の${CONFIGURATION}ようなxCodeのマクロでパスの問題を解決しました。

....
elseif( APPLE )
    ADD_EXECUTABLE( FranchiseTracker MACOSX_BUNDLE ${headers} ${sources} ${form_headers} ${resources_rcc} ${thirdparty_sources} ${BUNDLE_COPY_RESOURCES} )
    SET_TARGET_PROPERTIES( FranchiseTracker PROPERTIES OUTPUT_NAME ${APP_NAME} )
    SET_TARGET_PROPERTIES( FranchiseTracker PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/osx/FRP/info.plist") #or else you'll get an auto generated plist

    # Fixup bundle, copy dynamic libraries into app bundle
    ADD_CUSTOM_COMMAND( TARGET FranchiseTracker COMMAND macdeployqt ARGS ${CMAKE_CURRENT_BINARY_DIR}/\${CONFIGURATION}/${APP_NAME}.app ) # add -dmg for an image
endif( WIN32 )

$文字をエスケープ${CONFIGURATION}して、CMake変数として展開されないように注意してください。

PS私がCodeReviewに投稿したコードは少し古くなっているので、誰かが同じ問題に遭遇し(OSXでバンドルを作成することで)、完全に機能するバリアントを見たい場合は、私に知らせてください。どこかに投稿します。 (多分CodeReviewの私の投稿を更新してください)。

于 2013-01-02T16:39:55.190 に答える