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

batch-file - CMake 围绕 add_custom_command() 的命令生成附加代码

遇到 CMake POST_BUILD 命令的问题。每当我尝试构建我的 CMake 项目 (libFDSequencer) 时,都会出现伪随机错误代码(介于 123 和 9009 之间的任何错误代码)。我已将问题的根源缩小到 CMake 显然会围绕 a add_custom_command() 调用生成额外的批处理代码这一事实。我通过使用 Visual Studio 构建我的项目、转到我的项目属性并检查 POST_BUILD 命令来发现这一点。

我运行自定义命令的 CMake 代码如下所示...

在我的 POST_BUILD 项目属性部分中使用 CMake 生成代码的版本如下所示...

但是,当我像这样运行 echo Hello World 时(我假设它是由 add_custom_command() 运行的)(在 VS 项目属性的 POST_BUILD 命令字段中编辑)

当我删除额外的代码时它工作得很好。我想知道是否有任何方法可以从 CMake 禁用此代码生成,或者是否有一个包含此生成代码的文件我可以以某种方式覆盖?有谁知道为什么会产生这个(除了不必要的错误处理)?

0 投票
1 回答
15919 浏览

cmake - 如何每次在 CMake 构建中运行 python 脚本?

目前我需要每次在 CMake 中运行一个 Python 脚本,它会生成一个 .qrc 文件。我不能使用 Qt Designer,我必须使用 CMake。正在使用 set(CMAKE_AUTORCC ON) 并且每当添加资源或更改名称时都会失败,这就是 python 脚本的原因。脚本本身已经生成输出,之后一切正常,所以我不需要 CMake 本身的输出。我目前尝试了以下方法:

它有效,但并非每次都执行。它仅在修改 CMakeLists.txt 时执行。

所以经过一番搜索,人们建议使用

我也试过这个:

它根本不运行脚本。我知道它没有运行脚本,因为我在 Notepad++ 中打开了文件,并且它不会像 execute_process() 运行后那样询问我是否要切换到文件的较新版本。add_custom_command() 的其他变体也不会运行该脚本。没有与此运行相关的错误,除非我不包含 ${PYTHON_EXECUTABLE} 导致“%1 不是有效的 Win32 命令”。那么如何有效地让 Python 脚本在 CMake 中每次都运行呢?

编辑:这里的答案不起作用。 无论任何依赖关系如何在构建时始终运行命令?

0 投票
1 回答
749 浏览

android - CMAKE add_custom_command 仍然令人困惑

我查看了对 cmake 使用 add_custom_command 的响应,但无法让它在 android studio 中工作。运行时找不到目标。

我得到以下信息:

FAILURE:构建失败并出现异常。

什么地方出了错:

在https://help.gradle.org获得更多帮助

32 秒内构建失败

每次运行时似乎都找不到目标文件。你能在这件事上提供一些帮助吗?

0 投票
0 回答
341 浏览

cmake - 复制头文件的 add_custom_command 不起作用

这是我的项目树状格式:

如您所见,我的项目中有一个模块(通用),我的目标是使用 add_custom_command 将所有头文件从 PROJECT_SOURCE_DIR/common/Headers 复制到 PROJECT_BINARY_DIR/includes。
这是常见的/CMakeLists.txt

但是包含目录中不存在任何文件,并且在构建我的项目后始终为空。
我哪里错了?

0 投票
1 回答
852 浏览

cmake - CMake 的 add_custom_command 有时会删除它的第一个输出吗?

在我的 CMake 文件中,我有一个自定义命令,它调用一些外部代码生成。生成的文件是用户将他/她自己的代码放入其中的存根。因此,代码生成确保不会覆盖已经存在的文件。我的自定义命令如下所示:

现在我注意到,至少有时${generatedOnceSrc}(foo.h在这种情况下) 的第一个元素会被删除并重新生成。当然,一旦用户开始编辑生成的foo.h.

的文档add_custom_command没有提到这种行为,但也没有否认。所以我的问题是:

我的观察是否正确?

请注意,我已经找到了这样的解决方法

不幸的是,这会${generateCmd}在每个构建中调用,因为符号文件generatorOutput总是被认为是过时的,CMake 不再检查是否存在${generatedOnceSrc}

版本

  • 生成器:Unix Makefiles
  • CMake 3.5.1
  • Ubuntu 16.04

编辑

忘了提到我使用Unix Makefiles生成器观察到了这种行为,它在我的 Ubuntu 16.04 系统上默认使用。

0 投票
0 回答
170 浏览

c++ - 使用 CMake 在生成的 Makefile 中正确添加自定义命令的最佳方法是什么?

我想使用CMakeLists.txt文件生成带有特定自定义命令的 Makefile,以便在这样的终端中使用它们:

$> make command1 ... $> make command2 ...

我一直在寻找add_custom_command但我不想在运行命令时生成输出文件。我也听说过 CMake 函数,但我不确定我们是否可以在终端中使用它们,除非我错过了什么。

那么,使用 CMake 在生成的 Makefile 中正确添加自定义命令的最佳方法是什么?

0 投票
1 回答
183 浏览

cmake - 在 add_custom_command 中处理大量的转义字符

我有一个包含一堆数据的文件。我想将其转换为 C++ 字符串文字,因为我需要将此数据编译为二进制文件 - 我无法从磁盘读取它。

这样做的一种方法是只生成一个 C++ 源文件,该文件声明一个具有已知名称的字符串文字。执行此操作的 CMake 代码很简单,即使有些糟糕:

这可以工作并且可以满足我的要求(printf有必要避免在原始字符串介绍器之后出现新行)。然而,这里发生的大量逃逸使得很难看到发生了什么。有没有办法编写这个函数,使它实际上是可读的?


请注意,我不能在这里使用file(READ ...)/configure_file(...)组合,因为source_file可能是 CMake 在构建时生成的东西,因此在配置时可能不存在。

0 投票
0 回答
47 浏览

cmake - CMAKE自定义编译器不覆盖

在 CMAKE 项目中,我需要为文件类型 (.osl) 定义一个自定义命令,该文件类型 (.osl) 由工具 (oslc) 编译,该工具 (oslc) 编译为另一种文件类型 (.oso)

我设法通过一个可以在源文件列表上运行的函数来做到这一点:

由于该DEPENDS指令,编译器仅在源比输出文件更新时运行。但是,编译器不会覆盖输出文件,因此它不起作用。

在自定义命令不起作用之前使用 file(REMOVE ...) 删除,因为它会删除所有文件,而不仅仅是需要重新编译的文件。此外,它在 cmake 执行时删除,而不是在 make 时删除。

我也许可以用“rm”定义另一个自定义命令,但这不是跨平台的(我需要为 Windows 添加特定的行,我不喜欢)。

任何想法?

谢谢!

0 投票
1 回答
103 浏览

cmake - add_custom_command 用于将 *.y 复制到 *.txt 文件

我正在尝试使用CMake 命令将生成的*.y输出(平面亮度值,无标题信息)复制到文本文件。add_custom_command如何copy在中添加命令add_custom_command

我想将生成的*.y输出重定向到文本文件。但是>重定向没有直接在 CMake 中运行add_custom_command,所以我尝试使用add_custom_command. 在这里我想使用copy而不是>,但在这两种情况下我都无法将*.y输出重定向或复制到*.txt文件。

运行此代码后,我想生成两个文本文件,但上述 CMake 更改仍然无法实现。

0 投票
1 回答
224 浏览

cmake - cmake 3.15 adding JOB_POOL to add_custom_command SOMETIMES

For users that are using cmake 3.15 or later and are also using Ninja as a generator, I want to set the new JOB_POOL argument to some large add_custom_command() blocks. For other users, I want to keep my add_custom_command() the same (no JOB_POOL).

In earlier steps, I check the version and the generator and set ${JOB_POOLS} and I also set a variable such that users who should use a pool will see (something like):

For historical reasons, I leave this here, although @Tsyvarev points out that this is the source of my problem! The double-quotes are NOT wanted here!

Users that are not using a pool will not have that variable set.

Now how to leverage that variable in my custom command...?

1.) Generator expressions don't work, just including the text with the previous line...

2.) I can't seem to simply place the variable in the command, again just including the variable contents on the previous line. For example, when ${JOB_POOL} is set to the string "JOB_POOL pool_A", this code...

For historical reasons, I leave this here, although @Tsyvarev points out that this is the source of my problem! Don't use a STRING! No double-quotes!

gives this error...

It simply considers the ${JOB_POOL} string to be another dependency!

3.) I can't use the "APPEND" feature of add_custom_command(). It's just ignored...

The only thing that seems to work is to put an "if" around my entire command, which offends my sensibility since I don't like to duplicate so much code...

Do you have a better idea...?

Here's a standalone example for @tsyvarev:

It considers the string to be a dependency... If I move the USE_POOL to after the comment, it considers it part of the comment... If I move it to after the command, it considers it part of the command...