问题标签 [add-custom-target]

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 投票
2 回答
279 浏览

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

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

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

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

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

尝试使用自定义命令,即

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

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

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

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 投票
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 回答
72 浏览

c# - NLog,在自定义目标中访问布局渲染器

我正在创建一个自定义目标,但我看不到从 Write 方法访问布局渲染器值的方法,例如 aspnet-traceidentifier https://github.com/NLog/NLog/wiki/AspNetTraceIdentifier-Layout-Renderer 。

这是我使用的代码:

0 投票
1 回答
50 浏览

cmake - CMake add_custom_target 命令查找文件并执行

我有一个 .cmake 文件,我有一个自定义目标,我需要在其中添加一个命令来查找和签署 apk 文件。我执行以下操作:

我不断收到错误

查找:缺少“-exec”的参数

如果我在控制台中单独执行命令,它工作正常。我对一个简单的 echo 命令也有同样的问题:

我假设在 add_custom_target 的 COMMAND 中执行此操作时缺少某些内容,但是什么?

编辑:

这适用于 echo 命令,但不适用于仍然给出先前错误的 jarsigner:

0 投票
0 回答
88 浏览

cmake - 为什么 CMake custom_target 运行两次?

在构建测试目标后,我有自定义目标来运行我的测试

在运行测试之前,我修补了精灵

这是运行测试的目标

问题是测试运行了两次。这里有什么错误?

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 投票
0 回答
116 浏览

cmake - Cython、CMake 和源外构建导致双重编译

我有一个大项目,其中包含多个创建库/可执行文件的项目,甚至还有一个使用库的 python 模块。

为了简单起见,我包含了一个名为的 MWE myprogram,它创建了一个可执行文件和一个共享库,供 Cython 代码使用,从而为相同的代码创建一个 python 包。我使用 CMake 编译代码,但由于我的设置,如此处详述, python 例程的构建过程执行两次(在build和期间install)。

在构建期间,输出为:

在安装过程中:

此外,当我对任何一个 pyx 代码库进行更改otherprogram.c但没有更改时myprogram,在安装阶段,无论如何都会构建该库,这会增加编译时间。

因此,我搜索了一个解决方案并从PJ_Finnegan找到了该方法,但有一些问题,所以想知道其他人是否已经解决了这个问题或可以提供帮助。

我的 MWE 工作树是:

顶层 CMakeLists.txt 包含add_subdirectory(src/myprogram)src/myprograms 中的 CMakeLists.txt 的内容是:

以及使用的 setup.py.in:

代码在不同的机器(Linux 或 macOS)上运行,我的模块之前是使用此方法构建和安装的,安装命令的--user或取决于代码是在 Linux 还是 macOS 上运行。--prefix

为了避免 python 模块的双重构建步骤,我从 PJ_Finnegan 实现了一个新方法,如上所述,并在我的 CMakeLists.txt 的代码示例中显示。此方法使用install_lib来避免第二次构建,它允许使用--build-dir它很好但不再适用--user--prefix不需要,因为它需要我手动定义路径并且路径不再自动依赖于 python 版本。

我也想知道使用install-libinstall之间的区别是什么。我注意到没有egg-info创建文件,这是一个问题吗?因此,我也添加了install_egg_info步骤。

此外,mypogram 代码构建了两次(可执行文件和库),第三次构建 python 包。是否有一些优化可以减少编译时间?

任何其他方式来构建和安装 python/Cython 扩展和单独的独立可执行文件并帮助安装步骤找到构建代码?也许使用sdistpip install?

编辑

我已将 CMAKE 文件中的 INSTALL 命令更改为:

这将安装步骤减少为仅安装并且不再构建,因为现在可以找到上一个构建步骤的构建目录。

现在问题仍然存在,如何使 CMAKE 安装命令不是每次都运行,并且仅在 *.pyx 文件发生更改时运行。我知道 add_custom_target 总是被认为是过时的,所以可能有解决方法吗?

0 投票
1 回答
77 浏览

cmake - 如何在自定义目标调用的子进程中使用 CMake 缓存变量?

我的项目包含一个自定义目标,它通过.cmake脚本生成一些输出。它看起来像这样:

但现在我想在脚本中设置缓存变量。我试着这样做:

我遇到了缓存变量没有保存的问题。它总是给我打印空输出:

我已经尝试将工作目录设置为CMAKE_BINARY_DIR,或传递CMAKE_BINARY_DIRcmake 命令的最后一个参数,或传递-B ${CMAKE_BINARY_DIR}-C ${CMAKE_BINARY_DIR}/CMakeCache.txt作为参数等。这些都不起作用。
那么有没有办法在 CMake 子进程中重用现有缓存,或者我应该在脚本中编写自己的缓存?

0 投票
1 回答
37 浏览

msbuild - Visual Studio:“clean”命令执行自定义构建目标

我正在努力解决以下问题,但我不明白。我有一个 Visual Studio Xamarin 项目(Windows 10 上的 VS 2019)。在项目文件中,我定义了一个自定义构建目标:

我希望它始终在预定义的 PrepareForBuild 目标之后运行。当我构建项目时,我的目标被执行并且我在构建输出中看到它(我的自定义消息也显示了一些文件按照目标中的定义进行了更新)。

问题是当我为项目执行“clean”命令时,我的自定义目标也会执行(甚至可能多次!)。在这种情况下,我在输出日志中看不到我的消息(MSBuild 详细程度在选项中设置为诊断),目标也未列在任务性能摘要中,但它已执行(我的文件已更新)。这是我不明白的事情。当 clean 被调用时,PrepareForBuild 目标也不会被执行。为什么即使调用 clean 我的目标也会执行?

如果我将我的任务更改为在 BeforeBuild 之后执行,那么它不会在执行 clean 时被调用,但我需要它在 BeforeBuild 之后更早地执行。