CMake add_custom_command() POST_BUILD 生成器表达式扩展不起作用

2024-02-23

我想在构建后运行 POST_BUILD 操作(但仅在调试配置中)。

看完之后add_custom_command 文档 https://cmake.org/cmake/help/latest/command/add_custom_command.html and a 可能的解决方案 https://discourse.cmake.org/t/custom-command-or-post-build-dependent-on-release-configuration/1912我明白我可以将我的命令“包装”成$<CONFIG:Debug>生成器表达式(确保它在发布模式下为“空”)。

我尝试了以下方法:

cmake_minimum_required(VERSION 3.18)

project(post-build CXX)
file(WRITE main.cxx "int main() {}")
add_executable(foo main.cxx)

add_custom_command(
  TARGET foo POST_BUILD
  COMMAND $<$<CONFIG:Debug>:${CMAKE_COMMAND} -E echo "hi there from debug build">
)

但这给了我 CMake 配置时警告和构建期间的硬故障(使用 Ninja 生成器):

(...) && "$<1:C:\Program Files\CMake\bin\cmake.exe" -E echo "hi there from debug build" >""
[build] The system cannot find the path specified.
[build] ninja: build stopped: subcommand failed.
[build] Build finished with exit code 1

我尝试了许多可能的引号组合(包括转义引号):
COMMAND $<$<CONFIG:Debug>:"${CMAKE_COMMAND} -E echo \"hi there from debug build\"">
and
COMMAND "$<$<CONFIG:Debug>:${CMAKE_COMMAND} -E echo \"hi there from debug build\">" etc.

但即使它删除了配置时警告,它仍然会在构建时产生硬错误。

Question: 实现我想要的目标的正确方法是什么?是否有可能像这样或者这里有 CMake 限制?

(注意:如果可能的话,我希望将整个命令保留在一个地方执行。我还知道其他可能的解决方法)


按照 Ben Boeckel 的回答here https://discourse.cmake.org/t/add-custom-command-post-build-generator-expression-expansion-not-working/3244/2:

基因内部的空间通常不形成良好的结构。您需要将空格替换为;使其正确解析(这就是为什么您在构建命令中看到半展开的残余部分)。

以及 CMake 邮件列表中的一些讨论(here https://cmake.org/pipermail/cmake/2018-April/067433.html),最终对我有用的是:

add_custom_command(
  TARGET foo POST_BUILD
  COMMAND "$<$<CONFIG:Debug>:${CMAKE_COMMAND};-E;echo;\"hi there from debug build\">"
  COMMAND_EXPAND_LISTS
)

(注意整个genex周围的引号,用分号分隔,对字符串进行反引号,以及COMMAND_EXPAND_LISTS以消除输出中的分号——总而言之,绝对不是读起来最令人愉快的事情)

编辑: 这也有效:

set(HELLO_FROM_DEBUG ${CMAKE_COMMAND} -E echo "hi there")

add_custom_command(
  TARGET foo POST_BUILD
  COMMAND "$<$<CONFIG:Debug>:${HELLO_FROM_DEBUG}>"
  COMMAND_EXPAND_LISTS
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake add_custom_command() POST_BUILD 生成器表达式扩展不起作用 的相关文章

随机推荐

  • 如何在maven配置中正确指定jcenter存储库?

    在 Gradle 中 我只需添加 repositories jcenter 在 maven pom xml 中执行相同操作的最简单且正确的方法是什么 或者我在哪里可以获得 jcenter 存储库的正确 url 您必须像下面这样定义setti
  • (何时)m2crypto 会移植到 Python3 吗?

    m2crypto 是否正在向 Python3 移植 我将开始一个需要跨平台 跨语言加密的新玩具项目 m2crypto 看起来像是可行的方法 但我宁愿使用 Py3 以避免必须在任何地方显式转换为 UTF8 该库的移植是否正在进行中 代码位于h
  • 升级到 OS X Mavericks 后 Python 出现奇怪问题

    将我的 OS X Lion 升级到 Mavericks 后 我遇到了一些奇怪的问题 起初 它给了我分段故障 or 总线错误 经过一番搜索后 我发现它与readline图书馆 该解决方案描述为bugs python org curl O ht
  • alpine 包 py-pip 丢失

    我尝试使用 Docker compose 文件在我的 alpine 中安装 python pip 但出现以下错误 ERROR unsatisfiable constraints py pip missing required by worl
  • React 中的类变量与 ES6

    这个问题可能已经在其他地方得到了回答 但在标记为重复之前 请帮助我解决这个问题 我指的是使用react和d3的以下codepen https codepen io swizec pen oYNvpQ https codepen io swi
  • 滚动查看并刷新内容

    我使用以下用户界面 父级相对布局parentLayout尺寸为 800x600 宽 x 高 第二个相对布局childLayout 它是父布局的子布局 它的尺寸为 800x1000 即它大于父布局 parentLayout addView c
  • 在 xampp windows 中安装 Yaml

    我正在尝试安装YAML http www yaml org in XAMPP windows 64 bit 从以下位置下载了 dll 文件http pecl php net package yaml 1 1 1 windows http p
  • 如何使用子进程popen Python [重复]

    这个问题在这里已经有答案了 Since os popen正在被取代subprocess popen 我想知道如何转换 os popen swfdump tmp filename swf d to subprocess popen I tri
  • PHP ini file_get_contents 外部 url

    我使用以下 PHP 函数 file get contents http example com 每当我在某个服务器上执行此操作时 结果都是空的 当我在其他地方执行此操作时 结果就是页面的内容是什么 然而 当我在结果为空的服务器上 在本地使用
  • iOS 启动故事板:如何更改选项卡栏的色调颜色?

    我在做什么 使用 启动故事板 它非常简单 并且包含一个默认的 UITabBarController 我已在启动情节提要以及我的应用程序中将选项卡栏的 tintColor 设置为红色 我使用的是 Xcode 7 iOS 9 什么不起作用 启动
  • 为什么“IN”查询标签在sql存储过程中的成本如此之高?

    如何改善我的性能问题 我有一个带有 IN 的 sql 查询 我猜 IN 会造成一些代价高昂的性能问题 但我需要索引我的 sql 查询吗 Mysql查询 SELECT p ReferencedxxxId FROM Common xxxRefe
  • 插槽算作 Azure 中的 VM 吗?

    我目前有一个通过应用服务免费计划部署到 Azure 的 Web 应用程序 作为上线的一部分 我有兴趣转向使用插槽 这主要是因为它使我能够将新代码部署到暂存中 然后在经过验证后无缝切换 现在 要使用插槽 我知道我需要标准计划 并且该计划至少需
  • 如何通过 Gmail API 发送电子邮件?去

    我正在尝试通过以下方式发送电子邮件谷歌邮箱API https developers google com gmail api v1 reference users messages send using Go http golang org
  • python 导入应该花这么长时间吗?

    对于以下命令 time python test py 在此脚本上 test py import numpy as np from math import import matplotlib pyplot as plt import matp
  • 如何设置$_GET变量

    我如何设置变量 GET函数将能够使用 无需提交表单action GET GET包含在 URL 中传递给脚本的键 值 如果您有以下网址 http www example com test php a 10 b plop Then GET将包含
  • android c2dm编程示例

    我是 Android 应用程序开发新手 我正在使用 c2dm 开发 Android 应用程序 谁能告诉我如何从 c2dm 接收应用程序的注册 ID 请告诉我详细的例子和解释 public class C2dmEx extends Activ
  • 使用 GoogleMaps 时,myLocationEnabled 会在 swift 上更改为 isMyLocationEnabled

    我正在尝试使用谷歌地图 API 来显示用户当前位置 我已经为这个问题苦苦挣扎了好几个星期 代码可以运行 但当我更改模拟器中的位置时 代码不会更新到当前位置 我的代码如下 在查看其他人如何执行此操作后 他们都有 mapView myLocat
  • 如何清理这个 jinja2 和/或布尔表达式

    block content for blog dict in blogs sort reverse True attribute date if not file name filter or blog dict filename file
  • MongoDB - 查询数组的最后一个元素?

    我知道 MongoDB 支持以下语法find array 0 field value 但我特别想对数组中的最后一个元素执行此操作 这意味着我不知道索引 有某种操作员可以做到这一点 还是我运气不好 编辑 为了澄清 我希望 find 仅返回数组
  • CMake add_custom_command() POST_BUILD 生成器表达式扩展不起作用

    我想在构建后运行 POST BUILD 操作 但仅在调试配置中 看完之后add custom command 文档 https cmake org cmake help latest command add custom command h