问题标签 [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.
cmake - CMake:如果目标被重建,则重新生成源文件
我正在尝试将构建日期嵌入到源文件中,以便每次构建特定目标时都会刷新嵌入日期,而不会在每次构建整个项目时重新生成。
即我有一个由具有一组sbuilddate.h
的命令生成的头文件。#define
然后从其他源文件中包含此头文件。
我的第一次尝试是这样的:
这样可以正确生成头文件,但是每次都会生成头文件,无论mylibrary
目标是否需要重建。
尝试使用自定义命令,即
正确生成一次标头,但如果mylibrary
重新构建目标,则不会重新生成标头,因为builddate.h
它已经是最新的。
这感觉应该是相当普遍的事情,但我无法弄清楚自定义命令和目标的什么咒语会给我想要的效果。我想要的是每次mylibrary
构建目标时调用该命令,如果没有任何更改或构建不相关的目标(例如使用 的可执行文件mylibrary
),则不会进行虚假重建。
使用PRE_BUILD
自定义命令听起来是个好主意,但文档声明这会在PRE_LINK
Visual Studio 以外的生成器的命令之前调用,即在编译源代码之后。这似乎会使这不适合此目的,因为在编译源代码时需要标头。
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个问题:
- 为什么绝对路径的一部分被相对路径替换(所以 <path_to_repo> make 使用 "../../" 代替)?
- 如何强制使用“\”而不是“/”(以便相对
..\..\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.exe
,C:/my_tool.exe
自然路径不包含构建存储库本身的完整路径)。在为这个项目编写 cmake 时,我也无法实际使用它。
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 并行编译:
c# - NLog,在自定义目标中访问布局渲染器
我正在创建一个自定义目标,但我看不到从 Write 方法访问布局渲染器值的方法,例如 aspnet-traceidentifier https://github.com/NLog/NLog/wiki/AspNetTraceIdentifier-Layout-Renderer 。
这是我使用的代码:
cmake - CMake add_custom_target 命令查找文件并执行
我有一个 .cmake 文件,我有一个自定义目标,我需要在其中添加一个命令来查找和签署 apk 文件。我执行以下操作:
我不断收到错误
查找:缺少“-exec”的参数
如果我在控制台中单独执行命令,它工作正常。我对一个简单的 echo 命令也有同样的问题:
我假设在 add_custom_target 的 COMMAND 中执行此操作时缺少某些内容,但是什么?
编辑:
这适用于 echo 命令,但不适用于仍然给出先前错误的 jarsigner:
cmake - 为什么 CMake custom_target 运行两次?
在构建测试目标后,我有自定义目标来运行我的测试
在运行测试之前,我修补了精灵
这是运行测试的目标
问题是测试运行了两次。这里有什么错误?
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 - 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-lib与install之间的区别是什么。我注意到没有egg-info
创建文件,这是一个问题吗?因此,我也添加了install_egg_info步骤。
此外,mypogram 代码构建了两次(可执行文件和库),第三次构建 python 包。是否有一些优化可以减少编译时间?
任何其他方式来构建和安装 python/Cython 扩展和单独的独立可执行文件并帮助安装步骤找到构建代码?也许使用sdist和pip install
?
编辑
我已将 CMAKE 文件中的 INSTALL 命令更改为:
这将安装步骤减少为仅安装并且不再构建,因为现在可以找到上一个构建步骤的构建目录。
现在问题仍然存在,如何使 CMAKE 安装命令不是每次都运行,并且仅在 *.pyx 文件发生更改时运行。我知道 add_custom_target 总是被认为是过时的,所以可能有解决方法吗?
cmake - 如何在自定义目标调用的子进程中使用 CMake 缓存变量?
我的项目包含一个自定义目标,它通过.cmake
脚本生成一些输出。它看起来像这样:
但现在我想在脚本中设置缓存变量。我试着这样做:
我遇到了缓存变量没有保存的问题。它总是给我打印空输出:
我已经尝试将工作目录设置为CMAKE_BINARY_DIR
,或传递CMAKE_BINARY_DIR
cmake 命令的最后一个参数,或传递-B ${CMAKE_BINARY_DIR}
或-C ${CMAKE_BINARY_DIR}/CMakeCache.txt
作为参数等。这些都不起作用。
那么有没有办法在 CMake 子进程中重用现有缓存,或者我应该在脚本中编写自己的缓存?
msbuild - Visual Studio:“clean”命令执行自定义构建目标
我正在努力解决以下问题,但我不明白。我有一个 Visual Studio Xamarin 项目(Windows 10 上的 VS 2019)。在项目文件中,我定义了一个自定义构建目标:
我希望它始终在预定义的 PrepareForBuild 目标之后运行。当我构建项目时,我的目标被执行并且我在构建输出中看到它(我的自定义消息也显示了一些文件按照目标中的定义进行了更新)。
问题是当我为项目执行“clean”命令时,我的自定义目标也会执行(甚至可能多次!)。在这种情况下,我在输出日志中看不到我的消息(MSBuild 详细程度在选项中设置为诊断),目标也未列在任务性能摘要中,但它已执行(我的文件已更新)。这是我不明白的事情。当 clean 被调用时,PrepareForBuild 目标也不会被执行。为什么即使调用 clean 我的目标也会执行?
如果我将我的任务更改为在 BeforeBuild 之后执行,那么它不会在执行 clean 时被调用,但我需要它在 BeforeBuild 之后更早地执行。