Makefile基础教程(条件判断语句)

news2024/10/7 14:22:47

文章目录

  • 前言
  • 一、条件判断语句概念讲解
    • 1.ifeq 和 ifneq
    • 2.ifdef 和 ifndef
    • 3.ifeq 的比较操作符
  • 二、条件判断语句的使用
  • 三、条件判断语句使用的注意事项
  • 四、条件判断语句只在预处理阶段有效
  • 总结


前言

本篇文章开始讲解Makefile中的条件判断语句,在各种编程语言中都存在条件判断语句,Makefile作为一种脚本语言也是有条件判断语句的,那么现在就让我们来学习一下在Makefile中是如何使用的吧。

一、条件判断语句概念讲解

Makefile 中有多个条件判断语句,可以根据不同条件执行不同的命令。以下是常见的 Makefile 条件判断语句:

1.ifeq 和 ifneq

ifeq 和 ifneq 分别表示等于和不等于的条件判断语句,用法如下:

ifeq ($(VARIABLE),value)
    ...
else
    ...
endif

ifneq ($(VARIABLE),value)
    ...
else
    ...
endif

其中,$(VARIABLE) 是需要被判断的变量名,value是需要和变量比较的值。如果判断是正确的,则执行第一组命令;否则执行第二组命令。

2.ifdef 和 ifndef

ifdef 和 ifndef 用于判断变量是否被定义,用法如下:

ifdef VARIABLE
    ...
else
    ...
endif

ifndef VARIABLE
    ...
else
    ...
endif

如果变量 VARIABLE 被定义,则执行第一组命令;否则执行第二组命令。

3.ifeq 的比较操作符

ifeq 还支持比较操作符,如 >、<、>=、<=、!= 等。例如:

ifeq ($(NUM1), $(NUM2))
    ...
endif

ifeq ($(NUM1), 10)
    ...
else ifeq ($(NUM1), 20)
    ...
else
    ...
endif

ifeq ($(strip $(SOME_VAR)),)
    ...
endif

这里用到了比较两个变量的值,根据不同条件执行不同命令。第三个例子中,使用了 strip 函数,去掉变量值中的所有空格,并且判断是否为空。

需要注意的是,在 Makefile 中使用条件判断语句时,整个语句块必须以 Tab 键开头。否则会引发语法错误。

二、条件判断语句的使用

代码示例:

var := A
var1 := $(var)
var2 := 


test : 
    ifeq ($(var),$(var1))
	@echo "var == var1"
    else
    @echo "var != var1"
    endif

    ifneq ($(var),$(var1))
	@echo "var != var1"
    else
	@echo "var == var1"
    endif

    ifdef var2
	@echo "var2 is define"
    else
	@echo "var2 is not define"
    endif

    ifndef var2
	@echo "var2 is not define"
    else
	@echo "var2 is define"
    endif


执行结果:
在这里插入图片描述

三、条件判断语句使用的注意事项

在使用条件判断语句时,需要注意以下事项:

1.语法:条件判断语句必须以 Tab 键开头,并以 endif 结束,否则会出现语法错误。

2.变量括号:在条件判断语句中,变量必须使用括号包含起来,否则可能会引起错误。例如,正确的写法是 $(VARIABLE),而不是 $VARIABLE。

3.空格问题:在使用条件判断语句时,可能会遇到空格的问题。为了避免这些问题,可以使用 $(strip) 函数来去除变量值两端的空格;也可以使用双引号 "$(VARIABLE)" 来避免因空格错误导致语法非法的情况。

4.多行语句:在条件判断语句中,可以使用多行语句来表示不同的命令,但是需要注意语法。

例如:

ifeq ($(VARIABLE),value)
    command1 \
    command2
else
    command3
endif

在上面的代码中,使用了多行语句表示条件判断的两个命令。需要注意,第二行和第三行命令必须以 Tab 键开头,否则会出现语法错误。

5.变量赋值:在条件判断语句中,可以使用变量赋值语句。如果需要在条件判断语句中定义变量,需要使用 := 进行赋值。例如:

ifeq ($(VARIABLE),value)
    NEW_VARIABLE := some value
else
    NEW_VARIABLE := another value
endif

在上面的代码中,根据 VARIABLE 的值,定义了一个新的变量 NEW_VARIABLE,并分别赋值为 some value 或者 another value。

四、条件判断语句只在预处理阶段有效

Makefile 语言是分为读取阶段和解释执行阶段的。在读取阶段,Makefile 会将 Makefile 中所有的变量和规则读取进来,同时对所有的预处理命令进行处理,包括条件判断语句。在解释执行阶段,Makefile 会根据具体的规则执行相关的命令。

因此,条件判断语句只在 Makefile 文件读取阶段有用,在解释执行阶段并不会生效。换句话说,条件判断语句的作用是决定 Makefile 文件中哪些规则会被解释执行,哪些规则不会被执行。

需要注意的是,在 Makefile 文件读取阶段,Makefile 会对条件判断语句进行预处理,并根据条件判断语句的结果生成不同的 Makefile 文件。因此,如果在条件判断语句中使用了动态变量或者命令,它们的值并不会被保留到解释执行阶段。如果想要在解释执行阶段获取变量或命令的值,需要在条件判断语句中将它们保存到变量中,并在后续的解释执行阶段中使用这些变量。

这个注意事项这里我们举一个例子来说明:

var1 :=
var2 := $(var1)

var3 =
var4 = $(var3)


test:
    ifdef var1 
		@echo "var1 is defined"
    else
		@echo "var1 is NOT defined"
    endif
    
    ifdef var2
		@echo "var2 is defined"    
    else
		@echo "var2 is NOT defined"    
    endif
    
    ifdef var3 
		@echo "var3 is defined"
    else
		@echo "var3 is NOT defined"
    endif
    
    ifdef var4
		@echo "var4 is defined"    
    else
		@echo "var4 is NOT defined"    
    endif

运行结果:
在这里插入图片描述
那么导致这样的结果是为什么呢?

因为递归赋值也是在 Makefile 文件读取阶段进行处理的,也就是在预处理的时候处理的,当预处理到var4的时候并不会认为var4是空的,会认为var4已经被定义了,所以就会得出这样的结果。

总结

总之,在使用条件判断语句时,需要先了解 Makefile 的基本语法和规则,同时根据实际情况选择合适的条件判断语句,并且注意语法和变量的正确使用。

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

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

相关文章

远程桌面连接可以传文件么?

远程桌面连接是一种远程管理计算机的方式。它允许用户通过网络远程控制其他计算机。远程桌面连接可以用于各种目的&#xff0c;例如从远程地方访问办公室电脑、支持远程用户、教育、游戏等等。但是&#xff0c;在使用远程桌面连接时&#xff0c;用户可能会遇到一些问题&#xf…

8. 类的静态成员

一、对象的生产期 生存期&#xff1a;对象从诞生到结束的这段时间生存期分为静态生存期和动态生存期 1.1 静态生存期 对象的生存期与程序的运行期相同&#xff0c;则称它具有静态生存期在文件作用域中声明的对象都是具有静态生存期的若在函数内部的局部作用域中声明具有静态…

配置Windows终端像Linux终端一样直接执行Python脚本

配置Windows终端像Linux终端一样直接执行Python脚本 1. 将Python加入环境变量2. 将Python后缀加入环境变量PATHEXT中3. 修改Python脚本的默认打开方式4. *将Python脚本命令加入环境变量*5. 测试 在Linux系统中&#xff0c;在Python脚本的开头指定Python解释器路径&#xff0c;即…

Terry部落简介

通过一个简单的服务&#xff0c;整理使用的技术 服务简介 Terry部落&#xff0c;基于目前主流 Java Web 技术栈&#xff08;SpringBoot MyBatis-plus MySQL Redis Kafka Elasticsearch shiro …&#xff09;实现的个人博客服务。包含登陆、注册、文章发布、资源发布、鉴…

ACM - 数学 - 提高(还没学多少)

ACM - 数学 练习题 一、数论1、分解质因数 &#xff1a;AcWing 197. 阶乘分解2、求约数个数&#xff08;1&#xff09;AcWing 1294. 樱花 &#xff08;求 n&#xff01;约数个数之和&#xff09;&#xff08;2&#xff09;AcWing 198. 反素数 &#xff08;求 1 ~ N 中约数最多的…

human-NeRF 代码运行环境完全打包(根据照片视频生成三维模型)

包含模型和可以直接运行的数据的代码环境&#xff08;window环境&#xff0c;linux应该也可以运行&#xff09;&#xff0c;下载链接放在文章最后&#xff0c;不需要你自己再去下载任何的代码和模型了。 下载后输入三行命令在命令行界面即可将代码跑起来&#xff1a; pip insta…

C++14:AVL树

由于二叉搜索树在某些特定的情况下会退化成单叉树,为了解决这个问题&#xff0c;保证二叉搜索树能在绝大多数情况下保持高速搜索&#xff0c;G.M. Adelson-Velsky和E.M. Landis这两位俄国数学家提出了AVL树的概念&#xff0c;也就是高度平衡的搜索二叉树。 AVL树平衡大体逻辑&…

ACM - 数据结构 - 基础(数组模拟链表 / 栈 / 队列 + 字典树 + 并查集 + 堆 + 哈希)

数据结构 一、线性表1、单链表模板题&#xff1a;AcWing 826. 单链表 2、双链表模板题 AcWing 827. 双链表 3、栈数组模拟栈模板 AcWing 828. 模拟栈逆波兰简版模板例题1、逆波兰表达式&#xff1a;HDU 1237 简单计算器&#xff08;写得有点复杂&#xff09; 4、队列数组模拟队…

接口自动化测试可以使用的几个常用的框架

接口自动化测试可以使用以下几个常用的框架&#xff1a; 1、pytest pytest是一个用于Python编写单元测试和功能测试的框架。它提供了简洁的语法、灵活的扩展性和丰富的插件&#xff0c;可以帮助开发人员高效地编写测试用例&#xff0c;并快速定位和解决问题。 以下是pytest的…

数据结构刷题(三十一):1049. 最后一块石头的重量 II、完全背包理论、518零钱兑换II

一、1049. 最后一块石头的重量 II 1.思路&#xff1a;01背包问题&#xff0c;其中dp[j]表示容量为j的背包&#xff0c;最多可以背最大重量为dp[j]。 2.注意&#xff1a;递推公式dp[j] max(dp[j], dp[j - stones[i]] stones[i]);本题中的重量就是价值&#xff0c;所以第二个…

边缘计算盒子适合用于哪些场景?

边缘计算盒子适用于在智慧工地、智慧工厂、智慧园区和智慧城管等场景中可以实现多种算法功能&#xff0c;以下是一些应用和实现算法功能&#xff1a; 智慧工地&#xff1a;实时视频监控与分析&#xff1a;边缘计算盒子可以处理实时监控视频流&#xff0c;进行人员和车辆识别、…

OpenPCDet系列 | 5.PointPillars模型前向传播完整流程

文章目录 前向传播流程1. 模型初始化2. 模型训练前向传播前向传播流程 这里以PointPillars模型为例,在PointPillars模型中主要划分了以下4个主要的模块,以下某块首先会在build_network中进行初始化,然后在具体前向传播时通过forward函数进行。下面进行区分。 PointPillars…

新颖拓扑指纹助力虚拟筛选:ToDD革新计算机辅助药物发现之路

编译 | 于洲 今天我们介绍由Novartis集团的Novartis与德克萨斯大学达拉斯分校的Baris Coskunuzer为第一作者发表在NeurIPS 2022会议上的工作&#xff0c;文章介绍了一种新的虚拟筛选方法——ToDD模型&#xff0c;该方法使用了多参数持久性同调&#xff08;MP&#xff09;来生成…

wx.request get请求重定向问题

微信小程序wx.request请求&#xff0c;重定向问题。 背景 在开发微信小程序项目的时候&#xff0c;使用wx.request请求一个公共接口&#xff0c;结果请求被重定向多次之后&#xff0c;返回失败&#xff0c;而且没有 code 码&#xff0c;只有一个 errMsg: request:fail。 Netw…

OpenShift - 使用 Ansible Automation Platform 纳管 OpenShift Virtualization 虚机

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证 本文所用到的运行环境和配置方法请先参照以下 blog 准备&#xff1a; 《OpenShift 4 - 安装部署 Ansible Automation Platform 4.x 控制台》《OpenShift …

React 组件

文章目录 React 组件复合组件 React 组件 本节将讨论如何使用组件使得我们的应用更容易来管理。 接下来我们封装一个输出 “Hello World&#xff01;” 的组件&#xff0c;组件名为 HelloMessage&#xff1a; React 实例 <!DOCTYPE html> <html> <head> &…

css中的grid高频布局

1.需求 1.一个父级容器内有n个子元素; 2.每个子元素最小宽度是100px&#xff1b; 3.每个子元素最大宽度根据屏幕宽度自适应&#xff1b; 4.每个子元素的宽度保持同宽&#xff1b; 5.每个元素之间有间隔&#xff0c;每一行的两边不留间隙&#xff0c;每一列的上下不留间隙&…

2.V853支持WIFI和有线网卡

100ASK-V853-PRO开发板支持WIFI和有线网卡 0.前言 ​ 通过上一章节&#xff0c;我们已经成功下载Tina SDK包&#xff0c;完成编译并烧写Tina Linux系统&#xff0c;接下来展示100ASK_V853-PRO开发部如何通过WIFI和有线网卡进行上网。 全志Linux Tina-SDK开发完全手册&#x…

02-mysql升级篇(rpm方式+压缩包升级)

文章目录 升级方式一、二进制方式安装1、下载mysql-5.7.42安装包&#xff08;mysql-5.7.37升级mysql-5.7.42&#xff09;2、备份数据库、my.cnf文件&#xff0c;停止mysql服务&#xff08;重要&#xff09;3、查看当前数据库版本3、上传 mysql-5.7.42-1.el7.x86_64.rpm-bundle.…

SpringMVC 详解

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…