问题标签 [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 回答
9559 浏览

cmake - 如何从目标中获取包含目录以在 add_custom_target 中使用?

我正在使用 建模依赖关系target_link_libraries,就像在这篇博文中所做的那样。

这很好用,但由于各种原因,我需要add_custom_target通过自定义命令对文件进行预处理。问题是,这个自定义目标依赖于 LibraryA 和 LibraryB 的包含。我真的希望像target_link_libraries工作方式一样执行以下操作(请参阅 LibraryA 和 LibraryB 位):

但是,这不起作用。LibraryA 和LibraryB 按它们出现的样子放入。即使它确实有效,我想我会得到比包含更多的东西,因为我认为目标也包括库。也许这不是一个好方法。

那么,我可以在这里做什么?如何从每个目标中提取包含目录,以便在自定义命令中使用?我发现我find_package(Foo REQUIRED)是否可以访问Foo_DIR,但这指向构建目录而不是包含所在的源目录。

0 投票
1 回答
333 浏览

cmake - CMake自定义命令中可执行的目标文件

我有一个在预链接阶段执行的自定义命令。我想要做的是计算将成为我的可执行文件一部分的所有部分的校验和。然后我想将此校验和作为全局变量链接到我的可执行文件中。

到目前为止,我可以计算将链接到我的可执行文件的所有库的校验和。但是我还需要exe的已经存在(因为它已经构建)的目标文件的校验和。有没有办法访问这个目标文件?

所以我的问题是:如何获取可执行目标的目标文件?

每次我尝试访问 executable_target 的一些生成器表达式并传递它时,CMake 由于循环依赖关系而崩溃(这对于输出可执行文件是正确的,但对于目标文件则不然,因为它们已经存在于预链接阶段)。

0 投票
1 回答
396 浏览

windows - CMake add_custom_command 在windows上用反斜杠替换斜杠

我正在尝试创建一个柯南包(提示:名称包含正斜杠)作为构建后操作,如下所示:

在 Linux/Ubuntu/WSL 上,这可以正常工作。

在 Windows 上,执行的命令如下所示:

如何防止 cmake 将 / 替换为 \?有这个设置吗?

0 投票
2 回答
279 浏览

cmake - CMake:如果目标被重建,则重新生成源文件

我正在尝试将构建日期嵌入到源文件中,以便每次构建特定目标时都会刷新嵌入日期,而不会在每次构建整个项目时重新生成。

即我有一个由具有一组sbuilddate.h的命令生成的头文件。#define然后从其他源文件中包含此头文件。

我的第一次尝试是这样的:

这样可以正确生成头文件,但是每次都会生成头文件,无论mylibrary目标是否需要重建。

尝试使用自定义命令,即

正确生成一次标头,但如果mylibrary重新构建目标,则不会重新生成标头,因为builddate.h它已经是最新的。

这感觉应该是相当普遍的事情,但我无法弄清楚自定义命令和目标的什么咒语会给我想要的效果。我想要的是每次mylibrary构建目标时调用该命令,如果没有任何更改或构建不相关的目标(例如使用 的可执行文件mylibrary),则不会进行虚假重建。

使用PRE_BUILD自定义命令听起来是个好主意,但文档声明这会在PRE_LINKVisual Studio 以外的生成器的命令之前调用,即编译源代码之后。这似乎会使这不适合此目的,因为在编译源代码时需要标头。

0 投票
1 回答
136 浏览

cmake - 目标的源尚不存在,具体取决于使用 add_custom_command 生成的源的自定义目标

我正在尝试将介子项目移植到 CMake。我的主 CMake 文件中有以下子目录:

以及以下内容protos/CMakeLists.txt

在 中qtlayershell/CMakeLists.txt,这样的目标:

但我收到一个somelongbuildpath/protos/wayland-protos/wayland-xdg-shell-protocol.c尚不存在的错误。这是完整的错误:

0 投票
0 回答
155 浏览

linux - add_custom_command 中的 CMake 命令无法运行

作为基于 CMake 的程序的配置步骤的一部分,我将程序下载到 CMAKE_BINARY_DIR 的子文件夹中,然后作为 add_custom_command() 的一部分调用它以在构建时生成一些源文件。

但是,在运行make构建项目时,进入自定义构建步骤时总是会收到此错误消息:

make使用标志重新运行VERBOSE=1以使其打印构建命令,我得到以下输出:

其中工具的路径是绝对路径CMAKE_BINARY_DIR

将完整的绝对路径复制到该工具并将其直接粘贴到我的终端中,可以使程序毫无问题地启动。

在这一点上,我不知道如何让 CMake 运行我的自定义构建阶段。有什么建议吗?

编辑:我的实际 add_custom_command 调用如下:

0 投票
1 回答
126 浏览

cmake - 使用 CMake 在项目构建文件夹中创建 git commit id 文件

  1. 首先,我定义COMMIT_ID变量:
  1. 如果您指定COMMIT_ID变量,则不会构建项目:
  1. 但是,如果您指定一个静态字符串,则项目的构建不会出错:
0 投票
0 回答
21 浏览

unit-testing - CMAKE 的 add_custom_command 中的条件检查错误

我正在尝试使用CMAKE ctest编写单元测试用例

我想对我的自定义addinverse函数进行单元测试。

加法法测试用例的区别

  1. add使用两个输入,而inverse使用单个输入
  2. 两个测试用例的第一个输入的地址不同

我的 cmake 文件的片段如下所示:

这样做后,我得到以下错误

/bin/sh:1:语法错误:“(”意外忍者:构建停止:

子命令失败。

临时固定:

但是在临时固定中,它有更多的复制和粘贴代码。我想避免这种情况并将 add_custom_command 结合在一起。

有没有办法这样做。

0 投票
0 回答
203 浏览

cmake - CMake 用 add_custom_target 中的相对“../../”替换命令的部分绝对路径

我正在尝试将自定义目标添加到我的 cmake 设置中。因为我想使用一组参数执行特定工具,所以需要它。可执行文件本身是预构建的,位于我要构建的仓库中(因此仓库中有明确的 .exe,它没有构建)。

我使用了以下 cmake 命令:

这是一个问题的症结所在:

可执行文件的路径构建为使用一些动态和静态部分的绝对路径(<path_to_repository> 显然是动态的,并在“add_custom_target”之前扣除。<path_within_repository> 是静态路径,在 cmake 中硬编码。)

例如,我们有:

问题是当我开始执行 cmake 并构建时。从日志中我可以看到,由于某种原因,<path_to_repository> 的部分总是被“../../”替换(尽管我message()用来打印完整的 <path_to_repository>/<path_within_repository> 并且它是正确的)。因此,在执行命令时,我在 make 日志中得到以下信息:

失败并显示一个相当简单的错误消息

可运行的程序或批处理文件。

因为它试图在 Windows 上构建它,所以显然带有“/”而不是“\”的相对路径不起作用(Source/SpecialTool/bin/my_tool.exe可以工作,但显然你不能在 Windows 上使用斜杠和相对路径)。

所以有2个问题:

  1. 为什么绝对路径的一部分被相对路径替换(所以 <path_to_repo> make 使用 "../../" 代替)?
  2. 如何强制使用“\”而不是“/”(以便相对..\..\Sources\...\my_tool.exe路径有效)?

我已经尝试在路径中添加反斜杠( so C:\\user\\repos\\source\\MY_REPO\\PROJECT\\Sources\\SpecialTool\\bin\\my_tool.exe),使用引号等,但似乎没有任何效果。我也尝试使用add_custom_command然后在 in 中使用它add_custom_target,但这给了我与直接调用 command in 完全相同的行为add_custom_target

唯一没有发生此问题的情况是当我手动将“my_tool.exe”放在存储库本身上方的某个文件夹层次结构中(因此C:/user/repos/source/my_tool.exeC:/my_tool.exe自然路径不包含构建存储库本身的完整路径)。在为这个项目编写 cmake 时,我也无法实际使用它。

0 投票
1 回答
1523 浏览

cmake - 如何在 CMake 中构建和添加依赖库

对于我的项目,我需要构建并包含另一个库https://github.com/t-dillon/tdoku/作为我的依赖项。

Toku 也是使用 CMake 构建的,我可以通过以下方式运行构建脚本:

这会将库文件放入./lib/tdoku/build/libtdoku.a.

我正在尝试在 CMake 中构建 Toku 库,并将其用作依赖项。我怎样才能做到这一点?

我尝试使用add_custom_target, add_custom_command, add_dependencies,add_subdirectory无济于事。

我目前的CMakeLists.txt样子: