cmake 提前结束处理命令: return

news2024/11/20 15:22:30

有时候,我们有这样的需求,当处理到某个地方的时候,后面的我们都不想处理或者不需要处理的时候,就可以提前结束当前的处理逻辑,回到父级去处理.在C/C++中,我们有break关键字跳出当前循环,continue关键字进入下一次循环,return关键字返回当前处理的函数.

cmake也提供了break(),continue(),return()命令.

  • 如果调用return()命令的地方不在一个函数中,那将结束当前文件的处理,回到引用当前文件的地方.引入一个cmake脚本文件的方式可以是include()命令,也可以是add_subdirrectory()命令.
  • 在函数中调用return()命令比较复杂,但是很重要.

在cmake 3.25版本之前,return()命令是没有参数的,从cmake3.25开始,return()命令有了类似block()命令的参数关键字:PROPAGATE,在这个关键字后面我们可以列出一些变量,这些变量在调用return()命令的时候会更新其值.

为了兼容旧版本,我们在使用return()命令的时候如果关键字参数:PROPAGATE,那么我们通常需要把CMP0140这个策略设置为NEW.

demo

目录结构顶层文件夹是021,下面有一个subdir文件夹,一个cmake文件,一个cmake脚本文件

顶层cmake文件:

 

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

project(021)

set(x 1)
set(y 2)

message(STATUS "TOP before: x = [${x}]")
message(STATUS "TOP before: y = [${y}]")

add_subdirectory(subdir)
# include(test_include.cmake)

message(STATUS "TOP after: x = [${x}]")
message(STATUS "TOP after: y = [${y}]")

subdir文件夹下的cmake文件

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

message(STATUS "sub before: x = [${x}]")
message(STATUS "sub before: y = [${y}]")

set(x 3)
unset(y)

message(STATUS "sub after: x = [${x}]")
message(STATUS "sub after: y = [${y}]")


return(PROPAGATE x y)

message(STATUS "sub after return x = [${x}]")
message(STATUS "sub after return y = [${y}]")

结果: 

 cmake脚本文件cmake内容:

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

message(STATUS "sub before: x = [${x}]")
message(STATUS "sub before: y = [${y}]")

set(x 3)
unset(y)

message(STATUS "sub after: x = [${x}]")
message(STATUS "sub after: y = [${y}]")


return()

message(STATUS "sub after return x = [${x}]")
message(STATUS "sub after return y = [${y}]")

顶层cmake文件注释add_subdirectory(subdir) 包含include 脚本文件

cmake脚本文件:

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

message(STATUS "sub before: x = [${x}]")
message(STATUS "sub before: y = [${y}]")

set(x 3)
unset(y)

message(STATUS "sub after: x = [${x}]")
message(STATUS "sub after: y = [${y}]")


return()

message(STATUS "sub after return x = [${x}]")
message(STATUS "sub after return y = [${y}]")

 注意脚本文件大体上和subdir文件夹下的cmake类似不同的是,脚本文件的return()命令是空的.为啥是空的?因为return()命令是需要有父级作用域的,使用include的方式不是父级作用域,所以不用参数.

如果return()命令有值cmake会出错的.

结果是一样的

 

block()命令结合return()命令

修改顶层cmake文件

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

project(021)

set(x 1)
set(y 2)

message(STATUS "TOP before: x = [${x}]")
message(STATUS "TOP before: y = [${y}]")

block()

    add_subdirectory(subdir)
    message(STATUS "block after: x = [${x}]")
    message(STATUS "block after: y = [${y}]")

endblock()
    # include(test_include.cmake)

message(STATUS "TOP after: x = [${x}]")
message(STATUS "TOP after: y = [${y}]")

结果:

 

 在subdir文件下下使用block

顶层cmake文件

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

project(021)

set(x 1)
set(y 2)

message(STATUS "TOP before: x = [${x}]")
message(STATUS "TOP before: y = [${y}]")

# block()

#     add_subdirectory(subdir)
#     message(STATUS "block after: x = [${x}]")
#     message(STATUS "block after: y = [${y}]")

# endblock()
add_subdirectory(subdir)
    # include(test_include.cmake)

message(STATUS "TOP after: x = [${x}]")
message(STATUS "TOP after: y = [${y}]")

subdir cmake文件

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

message(STATUS "sub before: x = [${x}]")
message(STATUS "sub before: y = [${y}]")


block()
    set(x 3)
    unset(y)
    message(STATUS "sub after: x = [${x}]")
    message(STATUS "sub after: y = [${y}]")
    return(PROPAGATE x y)
endblock()




message(STATUS "sub after return x = [${x}]")
message(STATUS "sub after return y = [${y}]")

结果:

CMake另外一种类似与C/C++头文件防御的方式,在引入新的Cmake脚本文件的时候提前返回.

cmake各个版本通用的方式是这样的:

if (DEFINED cool_stuff_include_guard)
    return()
endif()

set(cool_stuff_include_guard 1)
# ...

 cmake 3.10开始,我们可以使用一条命令代替: include_guard()

include_guard()命令支持两个关键字,GLOBAL和DIRECTORY.一般情况下不需要.

  • GLOBAL 关键字表示在全局范围内如果曾经处理过这个文件,那就直接返回.
  • DIRECTORY 关键字只在当前目录作用域或者其子目录作用域范围内曾经处理过该文件才直接返回.

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/755659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈电脑城的衰退是好是坏社会现象_kaic

在过去很长一段时间里,想要购买电子设备都逃不开一个叫“电脑城”的地方,那里鱼龙混杂良莠不齐,是令许多人记忆深刻分外难忘之处。 但是随着时代发展电商兴起,采用传统线下销售的电脑城却逐渐衰退甚至面临消失,对此你怎…

7-3 打怪升级

B0->途经堡垒1->...->B 总耗费能量 武器总价值输入样例: 6 12 1 2 10 5 2 3 16 20 3 1 4 2 2 4 20 22 4 5 2 2 5 3 12 6 4 6 8 5 6 5 10 5 6 1 20 25 1 5 8 5 2 5 2 1 2 6 8 5 4 2 3 6 5输出样例: 5 5->2 2 1 5->1->3 12 7 5->4->6 10 7 5 0 0#inclu…

目标检测——R-CNN网络基础

目录 Overfeat模型RCNN模型算法流程候选区域生成CNN网络提取特征目标分类(SVM)目标定位预测过程 算法总结 Fast RCNN模型算法流程ROI Pooling目标分类和回归 模型训练模型总结 Overfeat模型 RCNN模型 算法流程 候选区域生成 CNN网络提取特征 目标分类&am…

osg osgText::Text 中文乱码问题修复 解决中

osg osgText::Text 中文乱码问题修复 解决中 #include <osgDB/ConvertUTF>osg::Camera* osgWidget::createTextHUD() { osgText::Font* fontHei osgText::readFontFile("Fonts/simkai.ttf");text->setFont(fontHei);// 步骤二&#xff1a;设置 文字颜…

浅谈分布式系统 - 架构演进

目录 1. 架构演进 1.1 单机架构 1.2 什么是分布式架构 1.3 数据库和应用分离 1.4 引入负载均衡 1.5 引入数据库读写分离 1.6 引入缓存 1.7 数据库分库分表 1.8 微服务架构 2. 分布式系统下的常见概念 1. 架构演进 1.1 单机架构 单机架构只有一台服务器, 这个服务器…

HTML+CSS+JavaScript:渲染柱形统计图

一、需求 用户输入四个季度的数据&#xff0c;根据数据生成柱形统计图&#xff0c;浏览器预览效果如下 二、完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…

Java利用POI导入Excel数据(多个sheet、模板)

需求&#xff1a;根据excel模板导入数据 sheet1&#xff1a;1-6行为固定格式&#xff0c;且需要取值({xxx});7行开始为数据集合(list) sheet2&#xff1a;都为固定格式&#xff0c;取值地方&#xff1a;{xxx} 1、数据格式&#xff08;两个Sheet&…

从零开始理解Linux中断架构(19)--中断线程化irq_thread

前面一节讲到的中断流处理流程是在hard_irq 流程上&#xff0c;工作在中断堆栈上。还有一种情况是使用中断线程的情形。request_threaded_irq参数中有两个处理函数handler,thread_fn是有区别的。handler主中断处理例程&#xff0c;运行hard_irq 流程上。而如果驱动程序填写thre…

利用R分别绘制配对连线散点图、云雨图、山脊图

大家好&#xff0c;我是带我去滑雪&#xff01; 精美的科研绘图总会给人眼前一亮&#xff0c;今天学习利用R绘制多组配对连线散点图、云雨图、山脊图&#xff0c;这三幅图最近都曾出现在Nature Communications (IF 16.6)中&#xff0c;比如配对连线散点图&#xff0c;如下所示&…

AI智能助手的未来:与人类互动的下一代人工智能技术

自我介绍⛵ &#x1f4e3;我是秋说&#xff0c;研究人工智能、大数据等前沿技术&#xff0c;传递Java、Python等语言知识。 &#x1f649;主页链接&#xff1a;秋说的博客 &#x1f4c6; 学习专栏推荐&#xff1a;人工智能&#xff1a;创新无限、MySQL进阶之路、C刷题集、网络安…

AIGC文生图:使用ControlNet 控制 Stable Diffusion

1 ControlNet介绍 1.1 ControlNet是什么&#xff1f; ControlNet是斯坦福大学研究人员开发的Stable Diffusion的扩展&#xff0c;使创作者能够轻松地控制AI图像和视频中的对象。它将根据边缘检测、草图处理或人体姿势等各种条件来控制图像生成。 论坛地址&#xff1a;Adding…

操作系统进行设备控制的方式

一.I/O控制方式 上一篇的博客介绍了设备管理的一些概念基础知识点&#xff0c;其中I/O控制方式这一块没有详细说明。设备管理的主要任务之一是控制设备和内存或CPU之间的数据传送。外围设备和内存之间的输入/输出控制方式有4种&#xff0c;下面分别加以介绍。 二.程序直接控制…

ITIL 4—事件管理实践

1 关于本文 本文档提供事件管理实践实用指南。分为五个主要部分&#xff0c;内容包括&#xff1a; 本实践的一般信息实践的流程和活动及其在服务价值链中的作用参与实践的组织和人员支持实践的信息和技术对实践的合作伙伴和供应商的考虑。 1.1 ITIL4 认证方案 本文档的部分…

Ubuntu 安装 Docker

本文目录 1. 卸载旧版本 Docker2. 更新及安装工具软件2.1 更新软件包列表2.2 安装几个工具软件2.3 增加一个 docker 的官方 GPG key2.4 下载仓库文件 3. 安装 Docker3.1 再次更新系统3.2 安装 docker-ce 软件 4. 查看是否启动 Docker5. 验证是否安装成功 1. 卸载旧版本 Docker …

图片文字对齐 图片文字居中对齐

方法一: 用 vertical-align: middle; <view class="container"><view class="search"><image src="../../images/icon/search.png" alt="" /><text class="tex">搜索</text></view>&…

手写对象浅比较(React中pureComponent和Component区别)

PureComponent和Component的区别 PureComponent会给类组件默认加一个shouldComponentUpdate这样的周期函数 //PureComponent类似自动加了这段shouldComponentUpdate(nextProps,nextState){let { props, state } this;// props/state:修改之前的属性状态// nextProps/nextState…

layui入门增删改查

layui入门增删改查 创建Lauiyi对象1.后台准备1.dao方法2.子实现类 2.R工具类的使用3.查询前端代码实现前端页面 4.增删改实现2.浮层3分离的js代码1.userManage.js2.userEdit.js3.index.js 5.运行效果 作为一名开发人员&#xff0c;我们经常需要对数据库中的数据进行增删改查&am…

120、仿真-51单片机温湿度光照强度C02 LCD1602 报警设计(Proteus仿真+程序+元器件清单等)

方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ&#xff0c;在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

刷题 DAY4

题目1 给定一个有序数组arr&#xff0c;给定一个正数aim (1)返回累加和为aim的&#xff0c;所有不同二元组 (2)返回累加和为aim的&#xff0c;所有不同三元组 问题一 暴力的解法就是 遍历每一个二元组 找和为aim的 当然 只用暴力解很难ac 想一想有序 那肯定就是能加速 我们…

RocketMQ下载安装、集群搭建保姆级教程

目录 1.下载安装 2.配置 3.测试 4.集群配置 4.1.规划 4.2.环境准备 4.3.节点配置 4.3.1.master1 4.3.2.slave2 4.3.3.master2 4.3.4.slave1 4.4.启动 4.5.测试 1.下载安装 前置条件&#xff1a; JDK环境 下载地址&#xff1a; 下载 | RocketMQ 博主下载的是4.…