1

我正在尝试使用 CMake 和 CPack 构建和打包 Mac OS X 应用程序,但我无法找出包含资源的正确方法。

这就是我的CMakeLists.txt样子:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(foo)
ADD_EXECUTABLE(foo foo.c foo.txt)
SET_TARGET_PROPERTIES(foo PROPERTIES MACOSX_BUNDLE TRUE)
SET_TARGET_PROPERTIES(foo PROPERTIES RESOURCE foo.txt)
INSTALL(TARGETS foo DESTINATION ".")
SET(CPACK_GENERATOR TGZ)
INCLUDE(CPack)

但是,当我使用它来构建一个包时,它foo.txt被包含两次:在Resources包的目录中,如预期的那样,但也在根目录中:

$ cd build
$ cmake ..
$ make package
$ tar -xvzf foo-0.1.1-Darwin.tar.gz 
x foo-0.1.1-Darwin/foo.app/Contents/Info.plist
x foo-0.1.1-Darwin/foo.app/Contents/MacOS/foo
x foo-0.1.1-Darwin/foo.app/Contents/Resources/foo.txt
x foo-0.1.1-Darwin/foo.txt

我究竟做错了什么?

编辑

为了更容易阅读,这是最终的工作的CMakeLists.txt样子(根据乔希的回答和我对此的评论):

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(foo)
ADD_EXECUTABLE(foo foo.c foo.txt)
SET_TARGET_PROPERTIES(foo PROPERTIES MACOSX_BUNDLE TRUE)
SET_SOURCE_FILES_PROPERTIES(foo.txt PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
INSTALL(TARGETS foo DESTINATION ".")
SET(CPACK_GENERATOR TGZ)
INCLUDE(CPack)
4

1 回答 1

3

删除线* PROPERTIES RESOURCE foo.txt)应该可以解决问题。

由于您已在 cmake 文件中包含 cpack,因此生成的 TGZ 将包含所有将与make install. 在这种情况下,您有

SET_TARGET_PROPERTIES(foo PROPERTIES MACOSX_BUNDLE TRUE)

它将构建foo为 OS X 应用程序包 ( doc),以及

SET_TARGET_PROPERTIES(foo PROPERTIES RESOURCE TRUE)

将 foo.txt 指定为资源文件 ( doc )。设置这两个属性后,make install将创建两个版本的 foo.txt。一个在捆绑包中foo.app/Contents/Resources/foot.txt, 一个在顶级目录中,foo.txt. 因此,CPack 也会生成这两个版本的 foo.txt。

于 2014-05-08T20:19:46.347 回答