$ <target_bundle_dir:tgt>生成器相当于cmake&lt; 3.9

时间:2017-08-01 08:17:47

标签: macos cmake

从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目录确实存在。

1 个答案:

答案 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;,您可以尝试以下解决方案:

  1. 将CMP0026设置为OLD,并使用LOCATION属性获取可执行文件的路径,并将此路径提供给get_dotapp_dir以检索相应的包路径。这个解决方案绝对不可移植,可能会在将来停止工作,不建议......
  2. 如果您需要从自定义命令或自定义目标(在构建时)访问捆绑路径,您可以使用脚本(python,php,bash,perl等)来计算捆绑的路径可执行的路径。
  3. 目前,我们在某个项目中使用了类似的内容:

    add_custom_command(TARGET MyTarget POST_BUILD
        COMMAND ${PYTHON_EXECUTABLE} -u MakeRelease.py $<TARGET_FILE:MyTarget>
    )
    

    不幸的是,目前在配置时没有干净的方法来检索捆绑路径...