首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在CMake中,如何仅在需要重新构建任何子目录时才运行自定义命令

在CMake中,可以通过添加自定义目标来实现仅在需要重新构建任何子目录时才运行自定义命令。

首先,在CMakeLists.txt中定义一个自定义目标,使用add_custom_target命令,并指定该目标所要执行的自定义命令。例如:

代码语言:txt
复制
add_custom_target(run_custom_command
    COMMAND echo "Running custom command"
)

上述代码定义了一个名为run_custom_command的自定义目标,该目标执行的命令是输出一条信息。

接下来,可以使用add_dependencies命令来指定哪些目标依赖于自定义目标。例如,如果需要在重新构建子目录时执行自定义命令,则可以将该目标添加为主目标的依赖。假设主目标名为main_target,代码如下:

代码语言:txt
复制
add_dependencies(main_target run_custom_command)

上述代码将主目标main_target添加了一个依赖关系,依赖于自定义目标run_custom_command。

当执行构建时,如果子目录的任何源文件发生变化,CMake将检测到这些变化,并重新构建相关目标。由于主目标依赖于自定义目标run_custom_command,因此在重新构建子目录时,自定义命令也会被运行。

需要注意的是,自定义命令的具体内容可以根据实际需求进行编写,可以是任何合法的命令或脚本。

此外,对于CMake中的其他常见概念和用法,可以参考腾讯云CMake产品文档和教程,以深入了解和学习。腾讯云的CMake产品提供了高效的构建工具和服务,可以帮助开发者更好地进行软件构建和部署。

参考链接:

  • 腾讯云CMake产品文档:https://cloud.tencent.com/document/product/1486
  • CMake官方文档:https://cmake.org/documentation/
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

小白入门笔记:CMake编译过程详解

Cache Variable缓存变量相当于一个全局变量,同一个CMake工程任何地方都可以使用,比如父目录,子目录等,而如上文中缓存变量的指令格式是set( ......会将父目录的所有变量拷贝到当前CMakeLists.txt,当前CMakeLists.txt的变量的作用域仅在当前子目录有效。...开源代码遵循MIT许可:只要原始版权和许可声明包含在软件/源代码的任何副本,可以以任何方式重用和重新混合代码。...同时,这种分离可以简化并加速项目的重新编译。本示例,我们将展示如何将源代码编译到库,以及如何链接这些库。...需要运行CMake显式地打印标志,也可以仔细阅读运行CMake --system-information的输出,以了解当前平台、默认编译器和语言的默认组合是什么。

5.7K31

CMake 秘籍(五)

} 我们配置外部项目,使其始终处于构建状态: BUILD_ALWAYS 1 安装步骤不会执行任何操作(我们将在第 4 个配方中重新讨论安装,即“编写安装程序”的“安装超级构建”): INSTALL_COMMAND...我们的示例将 INSTALL_COMMAND 留空,我们将在 第十章,编写安装程序更详细地讨论使用 CMake 进行安装。 测试选项:对于从源代码构建任何软件,运行测试总是一个好主意。...一旦添加了外部项目,此命令允许将附加命令作为自定义步骤附加到该项目上。...如果需要重新构建,我们不希望再次下载 Boost。 配置步骤将使用 Boost 提供的本地配置工具,CONFIGURE_COMMAND。...与前一个示例相比,我们将展示如何在配置获取 pybind11 依赖项,并使用我们第四章,创建和运行测试,示例 3,定义单元测试并与 Google Test 链接遇到的 FetchContent 方法构建我们的项目

60520

CMake 秘籍(六)

我们还展示了如何从相同的源文件构建静态和共享库。本章,我们将更深入地讨论并正式化安装发生的事情。...但是,设置动态共享对象的RPATH应该选择哪个路径?我们需要确保无论是构建树还是安装树运行可执行文件,它总是能找到正确的共享库。...默认情况下,CMake 设置可执行文件的 RPATH,假设它们将从构建运行。然而,安装,RPATH 被清除,导致用户想要运行 hello-world_wDSO 出现问题。...您可以使用此签名 CMake 脚本定义自定义安装规则。...这独特地将库标识为Debug配置的静态。 RELEASE_POSTFIX "_s":这与前面的属性类似,但仅在目标Release配置构建附加后缀给静态库。

27800

面向 C++ 的现代 CMake 教程(二)

只有当我们从项目中外部使用库,这个目录应该存在。它提供了其他项目在编译将消耗的公共头文件。我们将在第五章*,使用 CMake 编译 C++源代码回到这个主题,构建我们自己的库。...当我们运行cmake --build 命令而没有选择一个具体的目标,会构建ALL。...编写自定义命令 使用自定义目标有一个缺点——一旦你把它们添加到ALL目标,或者开始让它们为其他目标提供依赖,它们将会在每次构建都被构建(你仍然可以if块启用它们以限制这种情况)。...有时,这正是你所需要的,但在某些情况下,需要自定义行为来生成不应该在没有理由的情况下重新创建的文件: 生成另一个目标依赖的源代码文件 将另一种语言翻译成 C++ 另一个目标构建之前或之后立即执行自定义操作...之后,我们重点关注自定义命令(它们如何生成可以被其他目标消费、编译、翻译等的文件)以及它们的钩子函数——目标构建执行额外步骤。 本章的最后部分致力于生成表达式(genex)的概念。

37400

CMake 秘籍(四)

这包括所有内置的 CMake 变量,例如CMAKE_VERSION或CMAKE_GENERATOR,我们的示例。此外,每当模板文件被修改时,重新构建代码将触发构建系统的重新生成。...然而,file(GENERATE ...)每次运行 CMake 都会更新输出文件,这迫使所有依赖于该输出的目标重新构建。...本配方中,我们希望更进一步,并演示如何构建记录 Git 哈希(或一般而言,执行其他操作),以确保每次我们构建代码都会运行这些操作,因为我们可能只配置一次,但构建多次。...换句话说,当我们构建默认目标,我们确保自定义命令被执行。此外,请注意自定义命令将ALL目标作为输出。这样,我们确保每次都会生成version.hpp。...实际的包含命令不应该定义或修改变量,这样做的原因是,重复的包含,可能是意外的,不应该引入任何不希望的副作用。食谱 5,“重新定义函数和宏”,我们将创建一个防止意外包含的保护措施。

21220

万字总结编译利器CMake,从入门到项目实战演练

然后我们添加了一个自定义命令来详细描述如何通过运行MakeTable来产生Table.h。接下来,我们需要CMake知道mysqrt.cxx依赖于生成的文件Table.h。...我们也需要添加当前的生成目录到搜索路径,从而Table.h可以被mysqrt.cxx找到。 当这个工程被构建,它首先会构建MakeTable这个可执行程序。...此设置将存储缓存,因此用户不必每次构建目录上运行CMake设置该值。 下一个更改是使构建和链接MathFunctions库成为布尔选项。...下一步是将适当的命令添加到MathFunctions/CMakeLists.txt文件,以构建MakeTable可执行文件,然后构建过程运行它。需要一些命令来完成此操作。...add_executable(MakeTable MakeTable.cxx) 然后,我们添加一个自定义命令,该命令指定如何通过运行MakeTable生成Table.h。

1.1K00

抛弃 Autotools 向 CMake 迈进吧

最后, make install 一步,那些编译过的文件将被拷贝到( cmake 步骤扫描出来的)计算机上合适的位置。 这看起来很简单,当你使用 CMake 就是这样。...而且由于有了 CMake 之类的工具,对于高级用户而言,根据其系统需求自定义和覆盖任何不合适的选项都很容易。 使用 CMake,你只需要知道将哪些文件安装到哪个常规位置即可。它会照顾其他一切。...不再需要自定义安装脚本,它们有可能在任何未经测试的操作系统上失败。 打包 像 Autotools 一样,CMake 也得到了很好的打包支持。...许多情况下,可以自动将 CMake 项目整合到工作流如何使用 CMake 要在项目中使用 CMake,只需项目目录创建 CMakeLists.txt 文件。...快速自定义 CMake 的安装前缀(由 CMAKE_INSTALL_PREFIX 变量指定)默认是 /usr/local 这个位置,但是所有的 CMake 变量都可以在你运行 cmake 命令的时候,

42020

CMake学习笔记合集

内部构建和外部构建 上述例子就是内部构建,他生产的临时文件特别多,不方便清理 外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响强烈使用外部构建方式 外部构建方式举例 //例子目录...当然..表示上一级目录,你可以写CMakeLists.txt所在的绝对路径,生产的文件都在build目录下了 build目录下,运行make来构建工程 注意外部构建的两个变量 HELLO_SOURCE_DIR...子目录 PS:tree命令centos没有,需要提前进行安装,安装命令:yum install tree 每个目录下都要有一个CMakeLists.txt说明 [root@localhost cmake...静态库在编译时会直接整合到目标程序,编译成功的可执行文件可独立运行 动态库在编译不会放到连接的目标程序,即可执行文件无法单独运行。...构建一个新的target ,会尝试清理掉其他使用这个名字的库,因为,构建 libhello.so , 就会清理掉 libhello.a SET_TARGET_PROPERTIES(hello_static

2.2K20

解决CMAKE_CURRENT_SOURCE_DIR

解决CMAKE_CURRENT_SOURCE_DIR使用CMake构建项目,经常会用到 ​​CMAKE_CURRENT_SOURCE_DIR​​ 这个变量,用于获取当前源代码目录的路径。...而且,这种设置方式对于多级子目录也是适用的,可以确保在任何子目录中都能正确解析出头文件的路径。CMake是一种跨平台的构建工具,用于生成和管理项目的构建脚本。...编写CMakeLists.txt文件:CMakeLists.txt文件,使用CMake提供的语法和命令来描述项目的构建过程,例如定义变量、设置编译选项、添加源文件、链接库等。...运行CMake:使用CMake命令行工具或者图形界面工具,指定CMakeLists.txt文件的路径,然后运行CMakeCMake会解析CMakeLists.txt文件,并生成相应的构建脚本。...以下是一些常用的CMakeLists.txt命令:project:用于指定项目名称和项目版本。cmake_minimum_required:用于指定需要CMake版本。

38330

【C++】基础:代码编译与构建工具介绍

以下是一些建议: 对于小型项目,可以使用简单的命令行工具进行编译和链接。 对于大型项目,建议使用构建工具自动化编译和链接过程。 如果需要跨平台编译,建议使用 CMake 等跨平台构建工具。 2....makefile文件行,执行make all这个命令后make会根据makefile命令进行编译。...cmake 大型工程的编译,一版使用cmake,对应的编译文件是CMakeList.txt。...同样开源工程很常见,对源码的编译通常是: mkdir build && cd build cmake .. make make install CMake通过CMakeLists.txt文件来描述项目的构建过程...depend-target2 …) 用于添加一个需要进行构建子目录:add_subdirectory(Lib) 用于指定 target 需要链接 item1 item2 …。

14410

CMake学习笔记

上述例子就是内部构建,他生产的临时文件特别多,不方便清理 外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响强烈使用外部构建方式 外部构建方式举例 //例子目录,CMakeLists.txt...当然..表示上一级目录,你可以写CMakeLists.txt所在的绝对路径,生产的文件都在build目录下了 3、build目录下,运行make来构建工程 注意外部构建的两个变量 1、HELLO_SOURCE_DIR...二进制 将构建后的目标文件放入构建目录的 bin 子目录 将 doc 目录 的内容以及 COPYRIGHT/README 安装到/usr/share/doc/cmake/ 将目标文件放入构建目录的 bin...静态库在编译时会直接整合到目标程序,编译成功的可执行文件可独立运行 动态库在编译不会放到连接的目标程序,即可执行文件无法单独运行。...构建一个新的target ,会尝试清理掉其他使用这个名字的库,因为,构建 libhello.so , 就会清理掉 libhello.a SET_TARGET_PROPERTIES(hello_static

2.1K20

cmake终极奥义

一、初识cmake cmake集中开源,跨平台,能够管理大型项目,简化编译构建过程和编译过程,高效率,可扩展于一体,简单而强大的项目构建工具 二,安装cmake 一般不需要安装,cmake目前已经成为各大...(注意,..代表父目录)查看一下build目录,就会发现了生成了编译需要的Makefile以及其他的中间文件。 (3)、运行make构建工程,就会在当前目录(build目录)获得目标文件demo。...自定义编译项目 同样使用外部编译,为了便于交互式的选择该变量的值,可以使用cmake -i 命令(也可以使用 ccmake 命令,该命令会提供一个会话式的交互式配置界面): [root@ecs-x-medium...上面是交互命令,有提示让你输入选项,回车默认不修改,可设置OFF和ON, 从中可以找到刚刚定义的 USE_MYCALC 选项,选项设置OFF,make一下运行如下 [root@ecs-x-medium...ON,重新,make一下运行如下 [root@ecs-x-medium-2-linux-20200312093025 build]# .

1.3K20

Xmake v2.7.1 发布,更好的 C++ Modules 支持

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时。...另外,我们新增了一个 xmake watch 插件,可以实时监控当前工程文件更新,自动触发增量构建,或者运行一些自定义命令。...这个版本,我们新增了 xmake watch 插件命令,可以自动监视项目文件更新,然后触发自动构建,或者运行一些自定义命令。...这通常用于个人开发时候,实现快速的实时增量编译,而不需要每次手动执行编译命令,提高开发效率。 项目更新后自动构建 默认行为就是监视整个项目根目录,任何文件改动都会触发项目的增量编译。...$ xmake watch -p src $ xmake watch -p "src;tests/*" 监视并运行指定命令 如果想在自动构建后,还想自动运行构建的程序,我们可以使用自定义命令集。

1.6K10

CMake使用教程和原理

但是,有时需要Windows端口,gmake创建了系统。Unix编译器和Windows编译器均可与此gmake基于此的系统一起使用。...要使构建正常进行,每次执行构建需要设置所有这些外部变量。所有CMakeFile配置阶段解决了这个问题。...解析完这些变量,cmake在内存中有了项目(可执行程序、库、用户自定义Command)的构建表达方法。...上面的例子,hello_src是一个自定义变量,执行了aux_source_directory(....比如被搜索的路径下添加源文件,此时没有修改CMakeLists脚本,但是CMakeLists并不需要(没有)变化,构建系统无法察觉到新加的文件,除非手动重新运行cmake,否则新添加的文件就不会被编译到项目结果

12K296

面向 C++ 的现代 CMake 教程(一)

CMake 本身不能构建任何东西——它依赖于系统的其他工具来执行实际的编译、链接等任务。你可以把它看作是你构建过程的协调者:它知道需要做哪些步骤,最终目标是什么,以及如何找到合适的工人和材料。...精通命令行 本书的大部分内容将教你如何为你的用户准备 CMake 项目。为了满足他们的需求,我们需要彻底了解用户不同场景如何CMake 互动。这将允许你测试项目文件,并确保它们正确运行。...安装项目 当构建工件,用户可以将它们安装到系统。通常,这意味着将文件复制到正确的目录,安装库,或者从 CMake 脚本运行一些自定义安装逻辑。... CMake 作用域的概念如何工作有着有趣的暗示,这在其他语言中并不常见。如果你一个嵌套作用域中执行时取消设置(unset())了父作用域中创建的变量,它将消失,但仅在嵌套作用域中。...这种方法非常复杂的项目中有很多嵌套函数非常有用。希望您永远不需要它,但我觉得这是一个非常好的例子,展示了函数作用域实际如何工作的。

88001

CMake 秘籍(八)

我们很快将开始添加目标,以使构建更加充实。 如何同时允许传统配置和 CMake 配置 CMake 的一个非常好的特性是,我们可以源代码目录之外构建构建目录可以是任何目录,而不必是项目目录的子目录。...我们的示例,我们不会引入cmake子目录,而是将辅助文件更靠近需要它们的目标和源文件,但我们会注意保持几乎所有用于传统 Autotools 构建的文件不变,只有一个例外:我们将对自动生成的文件进行少量修改...如第五章重新定义函数和宏所述,第七章,项目结构,我们可以使用包含保护来防止不小心多次运行代码。 它确保完全控制函数内部定义的变量的作用域。这避免了这些定义泄漏并污染主作用域。...我们这里的例子,代价可能是不必要的代码重复。 移植测试 现在让我们讨论如何将测试从参考构建移植到我们的 CMake 构建。...add_test中最少需要指定的是测试名称和一个运行命令。该命令可以是任何语言编写的任何脚本。对于 CMake 来说,关键的是如果测试成功,脚本返回零,如果测试失败,则返回非零。

15410

cmake 简介2021-10-03

,如VTK_DIR目录 ,一般这一步不需要配置,直接执行第二条语句即可,但当出现错误时,这里就需要认为配置了,这一步真正派上用场; 第二条命令用于根据CMakeLists.txt生成Makefile文件...,如VTK_DIR目录 ,一般这一步不需要配置,直接执行第二条语句即可,但当出现错误时,这里就需要认为配置了,这一步真正派上用场; 第二条命令用于根据CMakeLists.txt生成Makefile文件...第二步,子目录的 CmakeLists.txt 子目录 src 创建 CmakeLists.txt。文件内容如下: 清单 4....处理多源文件目录 cmake 的执行结果 执行 cmake 的过程,首先解析目录 step2 的 CMakeLists.txt ,当程序执行命令 ADD_SUBDIRECTORY( src...处理多源文件目录 cmake 的执行结果 执行 cmake 的过程,首先解析目录 step2 的 CMakeLists.txt ,当程序执行命令 ADD_SUBDIRECTORY( src

33820
领券