如何使用 get_dotapp_dir?
How do I use get_dotapp_dir?
如何使用 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 是 运行 时计算的。但是然后......它似乎有点工作,因为目标文件的路径已经通过了!这是怎么回事?这应该有效吗? When/how 我真的应该打电话给 get_dotapp_dir
吗?
(构建包后,我想将其他文件复制到其中,然后在每次构建时我想将结果复制到其他文件夹中,none 其中与我的 cmake 项目相关m building。所以看起来我需要一个可以传递到 cmake -E
的形式的路径,按照我的例子。)
去年在第二个项目中遇到这个问题后,我最终得出结论,get_dotapp_dir
如今毫无用处,对 cmake 3+ 毫无意义,可能只是为了向后兼容而存在的东西。
如果你能升级到 cmake 3.9,有一个新的生成器表达式看起来就是票:$<TARGET_BUNDLE_DIR:>
. 。
我还没有升级,最后我设法解决了这个问题。我的项目需要知道 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)
.
的内容适当地设置其捆绑包图标文件
同样,repo 链接:cmake stuff for OS X icns file.
如何使用 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 是 运行 时计算的。但是然后......它似乎有点工作,因为目标文件的路径已经通过了!这是怎么回事?这应该有效吗? When/how 我真的应该打电话给 get_dotapp_dir
吗?
(构建包后,我想将其他文件复制到其中,然后在每次构建时我想将结果复制到其他文件夹中,none 其中与我的 cmake 项目相关m building。所以看起来我需要一个可以传递到 cmake -E
的形式的路径,按照我的例子。)
去年在第二个项目中遇到这个问题后,我最终得出结论,get_dotapp_dir
如今毫无用处,对 cmake 3+ 毫无意义,可能只是为了向后兼容而存在的东西。
如果你能升级到 cmake 3.9,有一个新的生成器表达式看起来就是票:$<TARGET_BUNDLE_DIR:>
.
我还没有升级,最后我设法解决了这个问题。我的项目需要知道 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)
.同样,repo 链接:cmake stuff for OS X icns file.