使用宏“覆盖”cmake 命令并恢复其默认行为

2023-12-07

我有以下(简化的)目录结构:

|-- doc/                                                                                           
    |-- subdir1/                                                                                   
    |-- subdir2/                                                                                   
    |-- CMakeLists.txt                                                                             
|-- src                                                                                            
    |-- subdir3/                                                                                   
    |-- subdir4/                                                                                   
    |-- CMakeLists.txt                                                                             
|-- test                                                                                           
    |-- subdir5/                                                                                   
    |-- subdir6/                                                                                   
    |-- CMakeLists.txt                                                                             
|-- CMakeLists.txt

顶层CMakeLists.txt包含类似以下内容:

add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(test)

仅在内部src/CMakeLists.txt我想使用我自己的 CMake 命令版本
添加子目录(),所以我使用 CMakemacro()像这样“覆盖”命令:

##src/CMakeLists.txt                                                                               
macro(add_subdirectory)                                                                            
    message(STATUS "My own 'add_subdirectory()'")                                                  
    _add_subdirectory(${ARGV})                                                                     
endmacro(add_subdirectory)                                                                         

# Call specialized version of 'add_subdirectory()'                                                 
add_subdirectory(subdir3)                                                                          
add_subdirectory(subdir4)                                                                          

顶层CMakeLists.txt包含类似以下内容:

add_subdirectory(doc)       #Uses CMake standard command 'add_subdirectory()'                      
add_subdirectory(src)       #Uses overwritten 'add_subdirectory()'                                 
add_subdirectory(test)      #Should use CMake standard command 'add_subdirectory()'                

对于目录“doc”和“src”,行为符合预期。但在“test”目录中
被覆盖add_subdirectory()仍然适用,这不是我所期望的。我当时在
印象中,由于范围规则,默认行为add_subdirectory()会被使用。

尝试通过添加来恢复默认行为

macro(add_subdirectory)                                                                            
    _add_subdirectory(${ARGV})                                                                     
endmacro(add_subdirectory)                                                                         

在运行 CMake 时,“src/CMakeLists.txt”末尾会导致分段错误,我对此
假设是无限递归调用的结果。这里提出了类似的建议:
https://cmake.org/pipermail/cmake/2012-April/050023.html

使用 CMake功能()代替macro()似乎会导致相同的行为。

所以我的问题是:是否可以在 CMake 命令执行后恢复其默认行为
被覆盖?

我正在使用 CMake 版本 3.5.2。


您可以通过在宏范围之外定义的附加变量来激活它:

set(MY_ADD_SUBDIRECTORY TRUE)

macro(add_subdirectory)
    if (MY_ADD_SUBDIRECTORY)
        message(STATUS "My own 'add_subdirectory()'")       
    endif()
    _add_subdirectory(${ARGV})
endmacro(add_subdirectory)

参考

  • 如何在使用 CURRENT_SOURCE_DIR 的子目录中定义 cmake 宏?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用宏“覆盖”cmake 命令并恢复其默认行为 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • DateTime.TryParseExact 不适用于预期的字符串

    您好 我有以下方法 我将值 07 Jan 2014 13 48 46 传递给它 据我了解 TryParseExact 应该匹配格式 dd MMM yyyy hh mm ss 并返回 true 但它返回 false 有什么想法吗 string
  • 如果字符串的第一个字符为 0,则删除该字符

    我想删除字符串的第一个字符 如果第一个字符是 0 0 可以出现多次 有没有一个简单的函数可以检查第一个字符 如果为 0 则将其删除 现在我正在用 JS 尝试slice 功能但是很别扭 您可以使用删除字符串的第一个字符substring va
  • 失败的道具类型:道具“actions”在“测试”中被标记为必需,但其值为“未定义”

    我正在使用 React 和 Redux 创建一个简单的登录表单 我的app js is import React from react import render from react dom import Input from react
  • 如何从 JFileChooser 检索 UNC 路径而不是映射的驱动器路径

    只是想知道是否有办法从使用 JFileChooser 选择的文件返回 UNC 路径 我要选择的文件将驻留在具有 UNC 路径的映射驱动器上 现在 我似乎只能拉回映射驱动器的驱动器号 From https stackoverflow com
  • 如何使用 Gmail API 检查传入的新邮件

    我已经设置了一个可以从 Gmail 帐户中提取数据的 python 脚本 但我想将其设置为仅提取自上次我进行 API 调用以来的新消息 我将定期 ping 服务器 我已经查看了推送通知和发布 订阅 但我不太确定这些是否相关 或者我应该看看其
  • 如何在一个页面上运行多个ajax调用

    如果我正在制作一个 ajax 化 用户界面 其中包含许多 ajax 调用 用于创建 重命名 删除页面上的各种内容 处理所有这些 代码隐藏 ajax 页面的最佳方法是什么 起初 我为每个调用都有一个不同的 php 文件 即 Candy Ren
  • 使用邮件包时,“短语中缺少单词:不支持字符集”

    我正在尝试解析电子邮件 但使用邮件包时出现此类错误 这是邮件包裹上的错误还是我应该自己处理的问题 missing word in phrase charset not supported gb18030 charset not suppor
  • 由于 SESSION_DOMAIN,laravel 无法登录

    我在 env 中设置了 SESSION DOMAIN example com 现在我无法使用正确的电子邮件和密码登录我的帐户 有人遇到这个问题吗 对于所有遇到此错误的人 当您更改 SESSION DOMAIN 环境参数时 Laravel 将
  • 尽管处于调试模式,Bottle.py 仍缓存模板

    我刚刚在 GAE 上构建了我的第一个 Bottle py 应用程序 它正在工作 只是当我更改模板时 我必须重新启动开发服务器才能看到更改 文档说 当 Bottle debug True 时 模板缓存应该被禁用 并且您也可以调用 Bottle
  • 使用后续查询时出现无法打开数据库文件错误

    我有以下代码 第一个光标对象工作正常 但是当我执行另一个查询并将其分配给 FlightCursor 时 它给出了错误 Cursor cursor database query CityAndAirportsTable notificatio
  • 在 Ionic 中设置 CORS

    我正在创建我的第一个离子应用程序 但我正在与cors斗争 我在这方面没有很多经验 所以这个问题可能看起来很愚蠢 我无权访问 api 站点 因此无法更改其中的任何内容 这是我用来从 api 站点获取数据的代码 我读到cors只是在使用离子服务
  • NSPredicate 精确匹配

    NSArray arrData NSArray arrayWithObjects cloud country plant country cloud plant country plant cloud clouds country plan
  • 在 Windows 中打印到控制台时需要回车吗?

    看起来只放一个换行就足够了 但我知道它应该是回车 换行 如果不输入回车符而只使用换行符 会发生什么可怕的事情吗 这是 ANSI C 格式的 不会重定向到文件或其他任何内容 只是一个普通的控制台应用程序 Windows 控制台遵循与文件或实际
  • 为什么我在 Maven 中收到“401 Unauthorized”错误?

    为什么我在 Maven 中收到 401 Unauthorized 错误 这是我调用时遇到的错误mvn deploy 完整日志位于底部 INFO BUILD FAILURE ERROR Failed to execute goal org a
  • Android 中“未找到活动”

    我正在使用navigation drawer在 eclipse 中做一个简单的 Android 应用程序的模板 我在片段方面遇到了一些麻烦 我在清单中声明了一个名为 PresenceLog Fragment 的片段 但是当我调用它时Main
  • 在哪里可以找到 docker 镜像的 sha256 代码?

    我想使用它们的 sha256 代码提取 CentOS Tomcat 的映像 例如 docker pull myimage sha256 0ecb2ad60 但我找不到可以在任何地方使用的 sha256 代码 我检查了 DockerHub 存
  • 如何在 do.call 中添加函数的更多参数?

    我的问题是我如何能够向do call功能 例如 我想画多面的grid情节与grid arrange 我如何添加更多参数 例如ncol 3 and main main title 到命令do call grid arrange plots 考
  • Scala无法解析继承的Java接口常量成员

    Java中的类层次结构 界面 Cluster Classify Class Kluster层次结构如下所示 Cluster lt Kluster Classify lt File oop Cluster java package oop p
  • 滚动多元回归面板数据

    我正在尝试对过去 36 个月内对其中 18 个月进行观察的公司执行时间 t 的滚动回归 但我无法使该函数发挥作用 我只想要 var1 的系数 X y z 是控制变量 这是我尝试运行的数据和代码的示例 structure list Year
  • 使用宏“覆盖”cmake 命令并恢复其默认行为

    我有以下 简化的 目录结构 doc subdir1 subdir2 CMakeLists txt