如何在 Windows 上使 add_custom_command 配置特定?

2024-01-04

为了在我的一个项目中运行单元测试,我有一个自定义命令,它将可执行文件、库和其他相关文件复制到其他位置,以便它们可以使用特定的设置运行,而不是在它们所在的位置运行它们建造的。在 Linux 上,这非常简单。但在 Windows 上,我遇到了一些障碍,因为 cmake 将配置名称附加到输出目录(我通常喜欢这样,但它搞砸了我在这种情况下所做的事情)。这使得确定生成的库或可执行文件的路径变得困难。例如,如果我有一个自定义命令,只需将可执行文件复制到另一个目录

set(EXE_PATH "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/exeName${CMAKE_EXECUTABLE_SUFFIX}")
set(NEW_EXE_PATH "${RUN_UNITTESTS_DIR}/exeName${CMAKE_EXECUTABLE_SUFFIX}")

add_custom_command(TARGET unitTests POST_BUILD
                   COMMAND ${CMAKE_COMMAND} ARGS -E copy "${EXE_PATH}" "${NEW_EXE_PATH}")

它会在 Windows 上卡住,因为可执行文件实际上并不在CMAKE_RUNTIME_OUTPUT_DIRECTORY。根据配置类型,它可以是${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Release or ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug。在 Linux 上,可以通过使用轻松修复CMAKE_BUILD_TYPE并将其添加到路径中,但这不适用于 Windows,因为在 Windows 上,cmake 生成多个配置,而不仅仅是一个。所以,我想做的是

add_custom_command(TARGET unitTests POST_BUILD
                   debug
                   COMMAND ${CMAKE_COMMAND} ARGS -E copy "${DEBUG_EXE_PATH}" "${DEBUG_NEW_EXE}")

add_custom_command(TARGET unitTests POST_BUILD
                   release
                   COMMAND ${CMAKE_COMMAND} ARGS -E copy "${RELEASE_EXE_PATH}" "${RELEASE_NEW_EXE}")

一些 cmake 命令认为能够做到这一点(例如target_link_libraries),但据我所知,add_custom_target不提供这种能力。那么,问题是我该怎么做?如何在 Windows 上使自定义命令特定于配置?


它可以借助下一个“生成器表达式”(CMake 2.8.10)来解决:

  • $<0:...>= 空字符串(忽略“...”)
  • $<1:...>=“...”的内容
  • $<CONFIG:cfg>= '1' 如果配置是“cfg”,否则为 '0'

您可以将它们组合起来以达到您需要的行为(伪代码):

if debug then ${DEBUG_EXE_PATH} elseif release then ${RELEASE_EXE_PATH}

翻译过来就是:

$<$<CONFIG:debug>:${DEBUG_EXE_PATH}>$<$<CONFIG:release>:${RELEASE_EXE_PATH}>

所以你的字符串看起来像:

add_custom_command(TARGET unitTests POST_BUILD
                       COMMAND ${CMAKE_COMMAND} ARGS -E copy "$<$<CONFIG:debug>:${DEBUG_EXE_PATH}>$<$<CONFIG:release>:${RELEASE_EXE_PATH}>" "$<$<CONFIG:debug>:${DEBUG_NEW_EXE}>$<$<CONFIG:release>:${RELEASE_NEW_EXE}>")

细节:CMake:add_custom_command https://cmake.org/cmake/help/latest/command/add_custom_command.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Windows 上使 add_custom_command 配置特定? 的相关文章

随机推荐

  • 如果结构具有 ReadOnlySpan 字段,如何将 ref 结构参数传递给 MethodInfo

    我有一个MethodInfo代表一个方法的对象 该方法采用ref struct作为参数 并且该结构有一个ReadOnlySpan
  • 使用 GoLang Web 服务器提供静态内容

    我正在探索 Go 的深度 并且一直在尝试编写一个简单的 Web 应用程序来理解所有内容 我正在尝试提供 React js 应用程序 下面是Go服务器的代码 我有默认路线 服务于index html工作正常 我正在努力允许将静态文件提供给该索
  • Python - 访问列表中嵌套字典中的值

    我有一个 JSON API 响应 如下所示 json data sales list date all country all units product promotions 0 downloads 1 updates 2 refunds
  • “错误:无法生成视图绑定器 java.lang.NullPointerException”的可能原因

    我正在使用 Android Studio 来处理我的 Android 项目 当构建因奇怪的堆栈跟踪而崩溃时 我遇到了一个问题 如下所示 Error Execution failed for task app compileDevDebugJ
  • DrRacket、R5RS和错误程序

    我喜欢 DrRacket IDE 但目前我正在构建一个我希望独立于它的宠物项目 这意味着我致力于仅使用 R5RS 标准程序 问题是 在 DrRacket 中有一个名为 错误 的过程 我想继续使用它 但我在标准中找不到它 我想知道是否有一种方
  • publishHtml reportFiles 参数语法是什么

    我正在尝试通过 Jenkinsfile 为 Jenkins 配置 HTML Publisher 插件来发布一些 html 文件 如下所示 publishHTML target allowMissing false alwaysLinkToL
  • 如何在 R 中创建条件虚拟对象?

    我有一个时间序列数据的数据框 其中包含每日温度观测值 我需要创建一个虚拟变量 对温度高于阈值 5C 的每一天进行计数 这本身很容易 但存在一个附加条件 仅在连续十天高于阈值后才开始计数 这是一个示例数据框 df lt data frame
  • 如何在酶中等待私人功能的承诺?

    我是 React 和任何 JavaScript 测试框架的新手 我有一个简单的组件 可以从 API 检索项目并将其显示在屏幕上 函数 getItems 是从 componentWillMount 调用的 是否可以等到 getItems 完成
  • Bitfinex 数据 API

    我正在尝试使用 bitfinex REST api 获取历史 OHLC 数据 文档如下 https bitfinex readme io v2 reference rest public candles https bitfinex rea
  • 如何在 C++ 中比较两个位图屏幕截图的字节到字节

    在问题的最后我的最后编辑 大家好 我必须实现一个功能来比较屏幕一部分的两个镜头 以便知道是否存在差异 变化 我写了类似下面的代码 但我无法让它工作 在代码中 COORDINATES RECT 是一个结构体 typedef struct CO
  • 当 Windows 进入睡眠模式然后唤醒时 setTimeout 不起作用

    我在 Chrome 中注意到了这一点 有人知道出了什么问题或解决方法吗 您可以使用setInterval相反 它继续运行 如果您需要一次性解决方案 请使用clearInterval删除计时器 setInterval如果计算机处于睡眠状态 而
  • 在视图模式中打开会话

    鉴于我选择的 JPA Hibernate 实现 Spring 和 开发框架 我问这个问题 我一直在思考实体层中的关系 例如 我有一个包含许多订单行的订单实体 我已经设置了我的应用程序 以便它急切地加载每个订单的订单行 您是否认为这是一种解决
  • C 使用信号同步进程

    好吧 我正在尝试自学如何发送信号 但我遇到了一个小问题 我不知道我做错了什么 现在发生的事情是 它正在执行父级 然后转到子级 然后返回父级 它没有执行我希望它执行的操作 即执行父级 用户定义其运行的时间量 然后杀死它然后转到子进程并在相同的
  • 使 tkinter 按钮大小相同

    我想让所有 tkinter 按钮的大小相同 无论文本如何 是否可以拉伸其他按钮以相互匹配或设置特定尺寸 因为我很难在文档中找到如何执行此操作 目前 按钮根据文本的大小进行拉伸 我的意思的例子 https i stack imgur com
  • 在 Selenium IDE 中使用 waitForCondition ( script,timeout )

    我使用 Firefox 的 Selenium IDE 扩展录制了一个脚本 我想添加命令 waitForCondition 我发现它需要两个参数 脚本和超时 在 Selenium IDE 中 每个命令都有 3 个文本字段 命令名称 我假设为
  • SendMessage(WM_COPYDATA) + 记录 + 字符串

    我想发送一条记录 现在只有一个字符串 但我将添加更多变量 这是我第一次处理记录 所以这可能是一个愚蠢的问题 但是 为什么这有效 type TDataPipe record WindowTitle String 255 end var Dat
  • Typescript 自动获取类中的接口属性

    你好 TypeScript 专家 我有以下代码 但我必须在类中重复接口属性 否则我会得到 类错误地实现了接口 使用接口时 是否有 TypeScript 简写可以执行此操作而无需声明Id number 以及该类中的所有其他属性 谢谢 inte
  • AffineTransform 不变换 Stroke?

    使用 Graphics2D 时scale 具有两个不同参数的函数 在 x 和 y 方向按不同比例缩放 稍后在此 Graphics2D 对象上绘制的所有内容也会缩放 这会产生奇怪的效果 即在一个方向上绘制的线条比在另一方向上绘制的线条更粗 下
  • EF Code First:获取 DbContext 的所有 POCO 类型

    有没有办法从指定的 DbContext 实例获取 POCO 的类型 您需要访问元数据工作区 http msdn microsoft com en us library system data metadata edm metadatawor
  • 如何在 Windows 上使 add_custom_command 配置特定?

    为了在我的一个项目中运行单元测试 我有一个自定义命令 它将可执行文件 库和其他相关文件复制到其他位置 以便它们可以使用特定的设置运行 而不是在它们所在的位置运行它们建造的 在 Linux 上 这非常简单 但在 Windows 上 我遇到了一