在使用CMake和CPack构建的Mac OS X应用程序包中,资源文件包含两次

时间:2014-05-08 07:39:58

标签: cmake cpack

我正在尝试使用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被包含两次:在预期的bundle的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的样子(根据Josh的回答和我的评论):

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)

1 个答案:

答案 0 :(得分: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)。使用这两个PROPERTIES集,make install将创建两个版本的foo.txt。捆绑包中的一个foo.app/Contents/Resources/foot.txt和顶级目录中的一个foo.txt。因此,CPack还将生成这两个版本的foo.txt。