如何在CMake脚本中获取应用程序包的路径以将其提供给fixup_bundle()?

时间:2012-11-16 16:01:14

标签: macos qt cmake bundle

我有一个用C ++,Qt和一点点Objective C编写的Win和Mac OSX平台的跨平台应用程序。经过一段时间支持两个不相关的平台特定项目(VS 2010和xCode),我们决定创建一个CMake脚本。我们生成一个特定于平台的项目并与之合作。

经过长时间的钻研,我设法编译并链接我的应用程序。但是创建一个合适的bundle仍然存在很多问题(没有任何努力xCode只是创建一个二进制文件)。设置几个变量后,xCode编译并创建一个没有plist文件和app可执行文件的虚拟包。所以我需要将所有必需的框架和资源复制到捆绑包中。

我尝试了一些创建捆绑的方法。第一个是使用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框架复制到捆绑包,但问题是我无法复制Qt框架,因为FIND_PACKAGE${QT_LIBRARIES}变量留空,所以我无法“手动”复制框架的路径。

现在我将使用“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脚本中获取正确的路径(使用Debug)?我想避免使用Debug对路径进行硬编码,因为在存档的情况下这将是错误的。

我更常见的问题:使用CMake为Qt应用程序创建捆绑包是否更简单?也许整个我的方法都错了?

P.S。我已将完整的脚本发布到代码审核here

P.P.S。对于那些认为我的问题过于冗长的人。我发布完整脚本并编写我的尝试(除了我想让它工作)的原因是互联网上关于在CMake中使用Mac OSX框架,捆绑包等的信息很少。我不得不阅读很多邮件列表,因为我找不到任何结构化的教程或至少是一个体面的文档。学习的唯一来源是其他人编写的其他脚本。所以我希望我的剧本和解释会对某人有所帮助。

1 个答案:

答案 0 :(得分:2)

我已经完成了在Mac OSX平台上仅使用macdeployqt实用程序。我使用xCode构建我的应用程序,所以我已经解决了xCode的宏${CONFIGURATION}这样的路径问题:

....
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上更新我的帖子)。