从cmake 3.9开始,引入了以下generator expression:
$<TARGET_BUNDLE_DIR:tgt>
文件说明:
捆绑目录的完整路径(my.app,my.framework或my.bundle),其中tgt是目标的名称。
如果使用cmake&lt;
如何获得相同的结果(bundle目录的路径)? 3.9
我尝试了以下内容:
include(BundleUtilities)
get_dotapp_dir($<TARGET_FILE:my_target> DOTAPP_DIR)
不幸的是它不起作用。 get_dotapp_dir
的文档说:
返回最近的父目录,其名称以“.app”结尾,给定可执行文件的完整路径。如果没有这样的父目录,那么只需返回包含可执行文件的目录。
包含可执行文件的目录正是我从中获取的,即使父.app
目录确实存在。
答案 0 :(得分:2)
不幸的是,$<TARGET_FILE:my_target>
是一个生成器表达式。根据文档,它在构建时(而不是在CMake生成时)进行评估。请参阅相关文档(重点是我的):
生成器表达式在构建系统生成期间评估为 生成特定于每个构建配置的信息。
在许多目标的上下文中允许生成器表达式 属性,例如LINK_LIBRARIES,INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS等。它们也可以在使用时使用 用于填充这些属性的命令,例如 target_link_libraries(),target_include_directories(), target_compile_definitions()和其他人。
换句话说,您不能将$<TARGET_FILE:my_target>
用作get_dotapp_dir
的参数。您必须传递一个包含可执行文件完整路径的变量。
从CMake 3开始,如果没有此生成器表达式,则无法检索生成目标的完整路径。有关详细信息,请参阅CMP0026。
因此,只要您将此策略设置为其默认值,您将无法计算可执行文件或父包的完整路径。
You are not the first试图解决这个问题。但是,根据&#34;如何处理此捆绑路径&#34;,您可以尝试以下解决方案:
OLD
,并使用LOCATION属性获取可执行文件的路径,并将此路径提供给get_dotapp_dir
以检索相应的包路径。这个解决方案绝对不可移植,可能会在将来停止工作,不建议...... 目前,我们在某个项目中使用了类似的内容:
add_custom_command(TARGET MyTarget POST_BUILD
COMMAND ${PYTHON_EXECUTABLE} -u MakeRelease.py $<TARGET_FILE:MyTarget>
)
不幸的是,目前在配置时没有干净的方法来检索捆绑路径...