如何使用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
的表单中的路径。)
答案 0 :(得分:1)
去年在第二个项目上遇到这个问题之后,我最终得出的结论是get_dotapp_dir
现在没用了,对cmake 3+没什么意义,而且可能只是向后兼容的东西。
如果你可以升级到cmake 3.9,那么会有一个新的生成器表达式只显示故障单:$<TARGET_BUNDLE_DIR:>
。 Related SO question
我还没有升级,我最终设法解决这个问题。我的项目需要知道bundle文件夹有两个原因:
在运行时加载并需要包含在捆绑包中的资产文件。我最后为此做的是让程序在运行时找到它的EXE路径,并从文件夹中相对于该路径加载资源。然后cmake构建可以使用$<TARGET_FILE_DIR:>
来决定放置文件的位置 - 在bundle文件夹中的某个位置,但确切位置并不重要。
这种行为对Windows也有意义,因此不需要单独的代码路径。
回购链接,因为此项目是开源的:copy files to places relative to EXE path,retrieve EXE path at runtime。
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。