问题标签 [cmake-custom-command]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1465 浏览

cmake - CMake:添加可编译的文件类型

我正在为嵌入式系统编译代码。该系统是任何好奇的人的视差螺旋桨,但您无需熟悉它即可回答我的问题。

自定义版本的 GCC (propgcc) 有一个新的输入和输出文件类型:一个 .cogc 文件可以编译成一个 .cog 文件。

我找到了 CMake 的 add_custom_command (对于没有看到它的任何人,您可能对这里的文档感兴趣)但我无法弄清楚如何正确使用它。我见过的所有示例都使用精确的文件名进行输入和输出,而不是通配符等。我不想编译一个特定的文件 foo.cogc... 我想让我的工具链文件的用户编译任何.cogc 文件。

所以,简短而甜蜜:我如何允许我的工具链文件的用户使用诸​​如

谢谢,

大卫

0 投票
2 回答
12703 浏览

c++ - How to call a CMake function from add_custom_target/command?

Is it possible to call a CMake function out of an add_custom_target or add_custom_command?

I know I could move the CMake function to a Python (or whatever) script and call it from add_custom_target/command but I would like to avoid having tons of script next to the existing CMake infra.

What I want to achieve is to use CPack for generating a zip package of binary artifacts and publish them in an artifact repository. For the publishing part I have already the CMake function created but now I need to combine the packaging and publishing together.

Thanks for any help/hints in advance.

0 投票
1 回答
2730 浏览

c++ - CMake:带有 PRE_BUILD 的 add_custom_command 不起作用

在下面的 CMakeLists.txt 文件中,虽然我设置了一个add_custom_command带有PRE_BUILD选项的命令,但在生成主可执行文件之前并不总是执行自定义命令:

所以我决定add_custom_commandadd_custom_targetand替换add_dependencies

它奏效了。现在,SetVersion.cmake每次在制作主可执行文件之前都会执行该文件。add_custom_command我的 CMake 文件有什么问题?

文件内容SetVersion.cmake

和内容version.h.in

0 投票
3 回答
10271 浏览

cmake - CMake:执行宏/函数作为 add_custom_command 的命令

我正在使用一个外部库,它提供了一个用于自动生成代码的 CMake 函数,用于我的 CMakeLists。问题是,每当我修改 CMakeLists 时,该函数就会再次运行,从而触发重新编译新生成但未更改的源。我需要像 add_custom_command 这样的东西,可以将 CMake 函数指定为 COMMAND 而不是可执行文件,以便仅当自动生成的文件不存在时才运行该函数。这可行吗?如果不是,是否存在获得相同结果的另一种方法?谢谢。

0 投票
2 回答
1936 浏览

cmake - add_custom_command -- 更新重建的依赖列表

查看上次状态更新

初始状态

  • 生成一组以一个输入文件为参数的 c++ 源代码的代码生成器
  • 输入文件可能包含其他输入文件
  • 已经解决了获取输出文件列表、解析输入代码生成文件以获得完整的代码生成输入列表的任务。即 add_custom_command 首次提供了正确的依赖集:

    /li>

问题场景

  • 当前系统运行良好,直到有人修改 codegen 输入文件之一以包含新输入文件或删除现有输入文件的包含。这种情况下,需要更新提供给 add_custom_command 作为依赖项的 codegen 输入文件列表,但我不知道如何

什么不见​​了

  • 通过项目重建更新 add_custom_command 依赖项的能力

有没有办法在不进行完整项目重建的情况下解决它?

更新 - 替代(更好?)问题描述

我在 cmake 邮件列表上发现了类似的未回答问题,为了更清楚起见,将其发布在这里:http: //article.gmane.org/gmane.comp.programming.tools.cmake.user/52279

我试图让代码生成工具在依赖项方面表现得与 C 源文件“相同”。我的意思是,假设你有一个 C 文件“ac”。因为它可以#include 文件,所以每次内容a.c变化时,它的依赖关系也可能发生变化。使用 -MMD 重新扫描依赖项。我想要一些方法来模拟我的代码生成器。首先我尝试了 add_custom_command,它采用一个固定的 DEPENDS 列表,在定义自定义命令时确定。具体来说,我的意思是这样的:

但这仅在构建系统生成时捕获依赖关系。每次自定义命令运行时,可能需要更改 DEPENDS 列表,因为更改可能意味着新的依赖项。我应该如何执行此操作?

更新 2 - 可能的解决方案

以下我认为是事实 - 网络上有关于 cmake 支持动态依赖项的声音,这是平滑集成许多非平凡代码生成工具所必需的 - 没有现成可用的最佳解决方案,正如我们所说的那样实际上需要钩子来添加对自定义 DSL 的支持到 IMPLICIT_DEPENDS

从cmake手册:

IMPLICIT_DEPENDS 选项请求扫描输入文件的隐式依赖项。给定的语言指定了应该使用其对应的依赖扫描程序的编程语言。目前仅支持 C 和 CXX 语言扫描程序。必须为 IMPLICIT_DEPENDS 列表中的每个文件指定语言。从扫描中发现的依赖关系会在构建时添加到自定义命令的依赖关系中

以下解决方案(希望)符合以下标准:

  • 避免在重建时进行不必要的依赖扫描
  • 避免在重建时运行不必要的代码生成器
  • 允许向客户提供 cmake 函数来注册他们的模型并从该代码生成代码/创建库,而不强加任何项目结构要求(即没有负责代码生成的子项目,模型使用项目特定的策略分布在项目层次结构中)

解决方案思路

无法注册自定义语言扫描器,但可以重用现有的。这个想法是自定义模型文件的依赖关系/层次结构反映为“C”头文件的层次结构。每个层次结构节点在模型文件注册时添加,C 文件包含匹配模型文件包含。如果模型文件包含被更改,C 文件包含被更改。因此,每个 codegen 调用将仅依赖于一个生成的反映传递模型的 C 标头。每个反映的文件都将依赖于模型文件并涉及模型文件的更改。

总结:可能,我的措辞在这一点上不是很清楚,但关于其他人的需求和社区帮助我调查这个问题,我将发布通用解决方案(+链接到 github 或新的 cmake wiki 页面)没有我准备好后的项目细节(1-3 天内)。

0 投票
0 回答
1305 浏览

cmake - CMake/CPack:add_custom_command 目标包 POST_BUILD

遇到与此处描述的相同问题,我想将 shell 脚本作为 TARGET“包”的 POST_BUILD 命令执行。目标平台是 Debian/Ubuntu。

我在 CMakeLists 的末尾添加以下内容:

但这不起作用。当我调用“make package”时,脚本不会改变。

目前我有一个自定义目标的解决方法:

但是,如果在调用“make package”时自动完成,对我来说会更舒服,更安全。

顺便说一句,生成${PROJECT_BINARY_DIR}/fixup_deb.sh也适用于:

0 投票
1 回答
4029 浏览

cmake - cmake add_custom_command 和 DEPENDS/TARGET

我的顶级 CMakeLists.txt 中有这个:

在数据子目录中,我想在构建 ${PROJECT_NAME} 时创建一个文件。以下不起作用,返回目标“foo”不存在:

这也行不通。返回:目标名称“foo”在此上下文中是未知的

但这按预期工作:

问题:

1.- 在不使用目标的情况下构建“foo”时,如何使用 add_custom_command 运行命令?

2.- add_dependencies 怎么知道“foo”但纯 add_custom_command 不知道?

更新#1:简单代码:

0 投票
3 回答
37249 浏览

cmake - add_custom_command 没有生成目标

也许这是不可能的,我误读了cmake 3.2 文档,但我虽然创建自定义命令会在 Makefile 中创建自定义“目标”,以便我可以通过调用输出文件的名称来构建目标。CMake 文档说:

在 makefile 术语中,这会以以下形式创建一个新目标:

所以我想我可以然后运行make OUTPUT。也许文档将 CMake 目标与 Makefile 目标混淆了?

例如,

我想要做

它会让foo_out. 但是,如果我这样做,我会得到

果然,“foo_out”这个词在 cmake 二进制输出目录的任何文件中都不存在。如果我把它改成这个

那我可以做

我能做到

但我还是做不到

问题make bar在于它不直观,因为实际文件输出foo_out不是bar.

我该怎么做呢?

在我的例子中,我需要对标准可执行目标运行一个特殊的处理步骤,它将可选资源插入 ELF 文件。我希望能够将两个可执行文件都作为 Makefile 目标,这样我就可以构建裸 ELF 可执行文件以及注入资源的 ELF 可执行文件。

如果我正在编写自定义 Makefile,这很简单!

我可以做make foo_inmake foo_out

0 投票
1 回答
1688 浏览

cmake - 如何为 CMake 构建过程本身添加_custom_command()?

有什么方法可以做相当于 add_custom_command (在某个文件更改时运行外部脚本),但是对于应该在 CMake 脚本执行本身期间运行的东西?(即,用于依赖图生成。)

我们将源代码文件拆分为多个子库,并且配置文件列出了哪个源文件与哪个库一起使用。(这些配置文件的格式由我们使用的另一个工具固定。)目前,我们运行一个自定义外部脚本来解析这些配置文件并写入新文件,然后由 CMake 构建过程加载以提供文件名列表传递给 add_library()。这意味着每次添加/删除源文件时,我们需要记住在重新运行 CMake 之前重新运行 prebuild 命令,然后重新启动 build 命令。

我知道 CMake 可以识别它需要重新运行自己,所以我希望我们可以让 CMake 1)识别配置文件已更改 2)重新运行配置文件解析器 3)加载新文件列表 4)使用新文件列表重新生成依赖关系树 5) 最后启动包含新文件的实际构建/编译过程。...所有这些都来自标准构建命令,而无需手动运行外部配置文件解析器或手动重新运行 CMake 命令,并且在配置文件未更改时无需执行。

在搜索中,我确实找到了这个问题,建议使用 configure_file() ,但这并没有解决如何调用外部配置文件解析器脚本。

0 投票
1 回答
6115 浏览

cmake - cmake add_custom_command 不起作用

我正在尝试gperfcmake文件中运行。

我在下面创建了一个非常小的CMakeLists.txt

当我运行它时

它不创建example.hpp文件

下面可能有什么问题CMakeLists.txt