问题标签 [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.
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 并行编译:
cmake - add_custom_command:在失败时删除重定向输出
考虑以下自定义命令(最新的 CMake + ninja):
当script.py
运行没有错误时,它工作正常。
但是,当script.py
失败并出现错误时,${OUTPUT}
仍然会创建。
因此,当前构建按预期失败,但下一个构建${OUTPUT}
比预期更新,${INPUT}
并且不会尝试再次运行自定义命令。
我希望构建系统${OUTPUT}
在命令失败时自动删除,以防止这种情况,但显然这不会发生。
- 有没有办法在自定义命令“失败”时执行操作?
如果有,我可以${OUTPUT}
在那里删除。 - 或者,除非命令成功,否则防止输出创建的最简单方法是什么?
我天真地尝试过做类似的事情:
但这不起作用,因为命令结果代码实际上是rm
结果代码而不是 Python 的结果代码,因此自定义命令不会像在后续构建中那样失败。
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) 语句的最后一个,它运行子构建。这有cd
ing 到调用的子项目的 build 子目录的效果add_link_date
,但是因为 CMake 只build.ninja
在 build 目录的顶部生成了一个 Ninja 文件,所以 childcmake --build
失败了,因为build.ninja
这个子项目目录中没有。
有没有办法修改这个过程以与忍者一起工作?
我知道并不是每个 CMake 项目都可以从 Makefiles 迁移到 Ninja,但是这是我在这个特定项目中遇到的唯一真正的障碍,所以很高兴找到一个解决方法。
cmake - cmake post build中的递归搜索
我想要一个目录中的 CMake 中具有特定扩展名的所有文件。这些扩展文件是在运行构建后生成的。我试过了
但这是在运行构建之前执行的。我想要这样的东西
在里面使用文件命令add_custom_command
给了我一个语法错误。不知道如何从这里开始。
c++ - 如果我必须通过外部工具生成此库的源和 CMakeLists.txt 文件,我如何在 cmake-base 项目中使用库
我必须通过外部工具生成源(我从 IDL 文件为 fastDDS 消息生成 c++ 类),该工具还生成 CMakeLists.txt 文件,允许我将生成的文件编译为 <msgs_lib>.a 文件。
在我的一个 exec 目标的大型超级项目中,我不会检查生成文件的存在及其构建结果。如果 <msgs_lib>.a 不存在,我不会调用生成并构建它。
我知道 CMake 命令add_custom_command
和add_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/* 中的所有文件,但我认为这是另一个问题,我可以在解决主要问题后解决它。
cmake - CMake 自定义命令生成非配置文件
我读了:
我想做类似的事情,但不是复制文件,而是生成一个文件。如果那不在自定义命令中,我会写:
但它似乎并不cmake -E
直接支持这一点。我应该怎么做(除了运行依赖于平台的东西)?
cmake - 尽管没有更改源,CMake 仍会重建自定义目标
我在我的 CMake 文件中使用自定义目标,如下所示:
这对我来说很好,并且bar
会生成。但是,如果我make generated_bar
再次 -bar
再次生成,即使源文件foo
没有更改。
为什么会这样?
注意:这个问题是相关的。
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 运行批处理。
可能吗?
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 的必要帮助下。
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 命令先运行?