我如何使用get_dotapp_dir?

时间:2016-09-21 13:59:50

标签: macos cmake bundle

如何使用get_dotapp_dir

我使用的是cmake 3.6和Ninja生成器(所以不是Xcode)。

例如,假设我有fred.c:

int main(void){return 0;}

和CMakeLists.txt :( cmake版本号是我坚持的东西)

cmake_minimum_required(VERSION 2.8.21.1)
include(BundleUtilities)
add_executable(fred MACOSX_BUNDLE fred.c)
set_target_properties(fred PROPERTIES BUNDLE TRUE)
get_dotapp_dir($<TARGET_FILE:fred> THING)
add_custom_command(TARGET fred POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo ${THING} VERBATIM)

我构建时的输出是/Users/worktom/tests/cmake_get_dotapp_dir/build/fred.app/Contents/MacOS/fred ...这不是捆绑文件夹!

我对此有所期待,因为生成器表达式是在构建时评估的,而不是在cmake运行时评估的。但是......它似乎很有效,因为目标文件的路径已经通过了!发生了什么事?这应该有用吗?我何时/如何实际调用get_dotapp_dir

(构建了捆绑包后,我想将其他文件复制到其中,然后在每个构建中我想将结果复制到其他文件夹中,其中没有一个与我构建的cmake项目有关。所以根据我的例子,看起来我需要一个可以传递到cmake -E的表单中的路径。)

1 个答案:

答案 0 :(得分:1)

去年在第二个项目上遇到这个问题之后,我最终得出的结论是get_dotapp_dir现在没用了,对cmake 3+没什么意义,而且可能只是向后兼容的东西。

如果你可以升级到cmake 3.9,那么会有一个新的生成器表达式只显示故障单:$<TARGET_BUNDLE_DIR:>Related SO question

我还没有升级,我最终设法解决这个问题。我的项目需要知道bundle文件夹有两个原因:

  1. 在运行时加载并需要包含在捆绑包中的资产文件。我最后为此做的是让程序在运行时找到它的EXE路径,并从文件夹中相对于该路径加载资源。然后cmake构建可以使用$<TARGET_FILE_DIR:>来决定放置文件的位置 - 在bundle文件夹中的某个位置,但确切位置并不重要。

    这种行为对Windows也有意义,因此不需要单独的代码路径。

    回购链接,因为此项目是开源的:copy files to places relative to EXE pathretrieve EXE path at runtime

  2. OS X用于加载图标的.icns文件必须放在Resources文件夹中。这可以通过将文件包含在目标的源列表中,并适当地配置该文件的包位置属性来安排。

    target_sources(b2 PRIVATE b2.icns)
    set_source_files_properties(b2.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
    

    可执行目标需要使用set_target_properties(b2 PROPERTIES MACOSX_BUNDLE_ICON_FILE b2.icns)行中的某些内容正确设置其捆绑图标文件。

    再次,回购链接:cmake stuff for OS X icns file