问题标签 [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 投票
0 回答
95 浏览

cmake - cmake add_custom_command 引入错误的依赖,除非 add_custom_target 也使用

我正在使用 cmake 构建一些库,所有这些库都会生成它们的一些文件。

我已经使用 add_custom_command() 创建了生成的文件,但是我发现了一些看起来像是错误依赖的东西。如果下游库有生成的文件并链接到上游库,则下游库源将不会开始编译,直到上游库完全构建。在我的项目中有许多库(超过 50 个),这种错误的依赖关系会导致构建中的序列化。

奇怪的是,我还注意到,如果生成文件的显式 add_custom_target() 与 add_dependencies() 一起使用,则错误依赖项不再存在,并且下游库中的文件将与上游库中的文件同时编译。所以我有一个解决方法,但这是预期的行为吗?

使用 Cmake 1.19、忍者 1.10.2。

以下是显示发生了什么的最小 CMakeLists.txt 文件。WORKS 选项有条件地添加 add_custom_target() 和 add_dependencies() 子句,使其工作(快速)。文件 foo.c 和 bar.c 是空的,我正在 CMakeLists.txt 目录的子目录中构建。

我放了一个名为 /tmp/x 的文件,它是 cc 的一个包装器,它休眠以显示序列化发生:

这是 CMakeLists.txt:

像这样构建它,您将看到序列化:bar.c 直到 foo.c 完成编译后才开始编译(实际上,直到构建 foo 库之后)。(我明确选择“-j 4”以确保 Ninja 将尝试并行构建)。

这显示了以下输出:

现在像这样构建它,你会看到 bar.c 与 foo.c 并行编译:

0 投票
1 回答
103 浏览

cmake - add_custom_command:在失败时删除重定向输出

考虑以下自定义命令(最新的 CMake + ninja):

script.py运行没有错误时,它工作正常。

但是,当script.py失败并出现错误时,${OUTPUT}仍然会创建。
因此,当前构建按预期失败,但下一个构建${OUTPUT}比预期更新,${INPUT}并且不会尝试再次运行自定义命令。

我希望构建系统${OUTPUT}在命令失败时自动删除,以防止这种情况,但显然这不会发生。

  • 有没有办法在自定义命令“失败”时执行操作?
    如果有,我可以${OUTPUT}在那里删除。
  • 或者,除非命令成功,否则防止输出创建的最简单方法是什么?

我天真地尝试过做类似的事情:

但这不起作用,因为命令结果代码实际上是rm结果代码而不是 Python 的结果代码,因此自定义命令不会像在后续构建中那样失败。

0 投票
0 回答
81 浏览

cmake - CMake:使用 Ninja 构建时如何处理 add_custom_command 子构建

我正在使用 CMake 构建一个 C++ 项目(在 Linux 上)。该项目由许多子项目组成,每个子项目都可以调用一个函数来创建一个有用的link_date.c源文件,其中包含链接发生时的时间戳。我使用它作为一种可靠地将构建时间嵌入到二进制文件中的方法,而不管自上次构建以来发生了哪些源更改。

这个函数是这样声明的:

该函数为调用它的每个目标创建一个link_date.c.in模板,然后使用该模板link_date.c为该目标创建。然后将其添加到特定于目标的库中,然后将其与目标可执行文件链接。finaladd_custom_command用于确保每次 CMake 即将链接目标可执行文件时都重建 link_date 库。我从这里得到了这个的原始代码。

关键是它总是将构建时间戳注入到可执行文件中,无论是谁构建它——开发人员、CI 管道等。它与 Makefiles 生成器配合得非常好,我已经使用它超过 12 个月了,没有任何问题.

最近我一直在考虑更新我们的构建以使用 Ninja,因为它在我的大多数管道中都明显更快,但是在这个项目中它遇到了一个问题,特别是最后COMMAND一个add_custom_command(PRE_LINK) 语句的最后一个,它运行子构建。这有cding 到调用的子项目的 build 子目录的效果add_link_date,但是因为 CMake 只build.ninja在 build 目录的顶部生成了一个 Ninja 文件,所以 childcmake --build失败了,因为build.ninja这个子项目目录中没有。

有没有办法修改这个过程以与忍者一起工作?

我知道并不是每个 CMake 项目都可以从 Makefiles 迁移到 Ninja,但是这是我在这个特定项目中遇到的唯一真正的障碍,所以很高兴找到一个解决方法。

0 投票
1 回答
36 浏览

cmake - cmake post build中的递归搜索

我想要一个目录中的 CMake 中具有特定扩展名的所有文件。这些扩展文件是在运行构建后生成的。我试过了

但这是在运行构建之前执行的。我想要这样的东西

在里面使用文件命令add_custom_command给了我一个语法错误。不知道如何从这里开始。

0 投票
1 回答
132 浏览

c++ - 如果我必须通过外部工具生成此库的源和 CMakeLists.txt 文件,我如何在 cmake-base 项目中使用库

我必须通过外部工具生成源(我从 IDL 文件为 fastDDS 消息生成 c++ 类),该工具还生成 CMakeLists.txt 文件,允许我将生成的文件编译为 <msgs_lib>.a 文件。

在我的一个 exec 目标的大型超级项目中,我不会检查生成文件的存在及其构建结果。如果 <msgs_lib>.a 不存在,我不会调用生成并构建它。

我知道 CMake 命令add_custom_commandadd_custom_target. 但是我不能以正确的方式使用它们,在某些情况下,即使所有文件都存在并且它们是以正确的顺序构建的,也不会生成调用,在某些情况下不会生成任何东西(并且在清理之后也不会生成任何东西),在某些情况下 exec-target 确实不明白它应该检查并调用生成。

例如,我将在上面写一个案例来开始讨论。我已经简化了很多:

github上的项目: https ://github.com/gladijos/test_project

一个 zip 文件中的项目: mediaDrive-link

或者就在这里:

项目目录树:

根 CMakeLists.txt:

tb_msgs CMakeLists.txt:

tb_msg.cpp:

tb_msg.h:

build_msgs.sh:

test_app CMakeListst.txt:

test_app main.cpp:

在这种情况下,我每次构建都会调用 scripts/build_msgs.sh,即使libtb_msgs_lib.a存在,并且是在之前构建的test_app

就比较单一。在add_custom_command OUTPUT 我放的部分.a,但在最好的情况下,这里应该是 dir gen_source/* 中的所有文件,但我认为这是另一个问题,我可以在解决主要问题后解决它。

0 投票
1 回答
52 浏览

cmake - CMake 自定义命令生成非配置文件

我读了:

cmake自定义命令复制和重命名

我想做类似的事情,但不是复制文件,而是生成一个文件。如果那不在自定义命令中,我会写:

但它似乎并不cmake -E直接支持这一点。我应该怎么做(除了运行依赖于平台的东西)?

0 投票
1 回答
42 浏览

cmake - 尽管没有更改源,CMake 仍会重建自定义目标

我在我的 CMake 文件中使用自定义目标,如下所示:

这对我来说很好,并且bar会生成。但是,如果我make generated_bar再次 -bar再次生成,即使源文件foo没有更改。

为什么会这样?

注意:这个问题是相关的。

0 投票
0 回答
39 浏览

linux - 即使在 Linux 机器上生成,也可以在 POST_BUILD 命令中运行 Windows 批处理脚本

我正在使用 Visual Studio 2019 结合 CMake 在 PC 环境(生成.sln文件)和远程 Linux 机器(生成Makefile文件)上交叉编译我的项目。我正在使用 Visual Studio 的交叉编译功能在环境之间切换。

POST_BUILD即使我在 Linux 环境中生成 CMake,是否有可能在命令上运行 Windows 批处理脚本?

即使在 Linux 上生成,我也希望这个(或任何其他实现相同的解决方案)能够工作:

(请记住,我在 Windows 环境中,因为 Visual Studio 在远程 Linux 机器上调用 CMake)

我目前添加了一个自定义命令,它shell直接从 Linux 机器运行脚本并连接到 Windows 环境,但我更喜欢直接从 Windows 运行批处理。

可能吗?

0 投票
1 回答
53 浏览

cmake - 查找需要 DEPENDS 选项的 CMake 文件生成 add_custom_command 示例

我想要一个简单的例子来说明DEPENDS文件生成的选项add_custom_command(OUTPUT ...),也就是说,如果我们对DEPENDS部分进行注释,示例将给出不同的输出或完全崩溃。

在下面的例子中(有文件london并且good.cpp在当前工作目录中),DEPENDS是可有可无的:

我确实阅读了文档。我对构建系统知之甚少,无论是 Make 还是 CMake。第一句话Specify files on which the command depends.让我很困惑。我不明白命令如何依赖于其他文件,在我的随便的例子中,命令行本身似乎可以找到所有内容。我想要一个 CMake 代码示例来展示命令如何依赖其他文件,并在 DEPENDS 的必要帮助下。

0 投票
1 回答
110 浏览

c++ - cmake add_custom_command pre_build

我是第一次写 cmake 的例子。

这是 CMakeFiles.txt 的一部分:

gdbus-codegen-glibmm使用命令语法生成代码,使用add_custom_command.

然而,与我的预期相反,当我实际执行 cmake 和 make 时,它​​看起来像这样:

然后,如果继续make,就会输出add_custom_command中COMMANT的内容,并实际生成代码。

检查生成的代码后,继续执行 cmake .. 并再次 make 以正常构建。

Server/CMakeLists.txt, Client/CMakeLists.txt 我设置了${CODEGEN_TARGET}使用 ADD_DEPENDENCIES in 的依赖关系,但它的工作方式与我预期的不同。

如何让 gdbus-codegen-glibmm 命令先运行?