CMAKE为dylib创建OSX包?

时间:2014-10-07 15:10:12

标签: c++ macos cmake

我需要一些不同于我的人的帮助,实际上对CMAKE了解一些。

问题: 我有这个CMAKE项目,它生成一个.so / .dylib / .dll(它是另一个应用程序的插件),到目前为止一切都很好,它编译和链接并产生预期的输出。它的设置是建立一个像这样的MODULE:

ADD_LIBRARY(${PROJECT_NAME} MODULE ${CORE_SRC} ${CORE_HEADERS})

拥有一组健康的外部依赖项和一些编译器/链接器设置。

使用两个自定义目标进行构建:

ADD_CUSTOM_TARGET(debug
        COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_SOURCE_DIR}
        COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all
        COMMENT "Switch CMAKE_BUILD_TYPE to Debug")

ADD_CUSTOM_TARGET(release
        COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Release ${CMAKE_SOURCE_DIR}
        COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all
        COMMENT "Switch CMAKE_BUILD_TYPE to Release")

我的问题是,在osx上,这个dylib必须打包为osx BUNDLE或者它不会加载。我可以手动创建捆绑目录结构,但由于我不太全面的CMAKE知识,我相信我应该能够为我生成它。我确实尝试过一些例子,但我只能让它用于可执行文件。

我想要的是将我的dylib安装到一个包中,其资源位于我的源目录之外。在其他平台上,资源只会进入dylib旁边的文件夹。然后将捆绑软件或dll和文件夹安装到目的地的任何目的地。

那么如何捆绑模块?甚至可能还是我在浪费时间?

1 个答案:

答案 0 :(得分:3)

这对cmake来说是完全可能的;我记得我也很难搞清楚这一切。

我有一个相当复杂的项目,它使用dylib,框架和一系列插件(碰巧也是.so)来完成这件事。 Here是其CMakeLists.txt文件之一,涵盖了您需要的大部分内容(第38行)。

如果您希望cmake为您创建捆绑包,则需要在添加可执行文件(MACOSX_BUNDLE)时传递ADD_EXECUTABLE。请注意,这适用于应用程序本身,而不适用于dylib

如果你可以将dylib构建为框架(FRAMEWORK属性),那么当你添加它时,cmake 应该自动将它作为bundle的frameworks目录。 dito for plugins如果使用BUNDLE属性构建它们。

您也可以manually assignMACOSX_PACKAGE_LOCATION属性添加到您喜欢的任何内容

我相信您也可能需要在目标上执行SET(CMAKE_INSTALL_RPATH @loader_path/../Frameworks)之类的操作。

如果您有任何问题,请告诉我,我会更新我的答案。