4

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

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

我尝试了几种方法来创建捆绑包。第一个是使用SET_SOURCE_FILES_PROPERTIES( ${resourcePath} PROPERTIES MACOSX_PACKAGE_LOCATION ${pathInsideBundle} )并将它们(框架\资源)添加到 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 对路径进行硬编码,因为在存档的情况下这将是错误的。

我更常见的问题是:有没有更简单的方法可以使用 CMake 为 Qt 应用程序创建包?也许我的整个方法都是错误的?

PS我已在此处将完整的脚本发布到 Code Review中。

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

4

1 回答 1

1

我已经完成了仅macdeployqt在 Mac OSX 平台上使用该实用程序的操作。我使用 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 上的帖子)。

于 2013-01-02T16:39:55.190 回答