makefile 变量的扩展

news2024/11/27 11:43:25

文章目录

  • 前言
  • 一、环境变量(全局变量)
  • 二、目标变量(局部变量)
  • 三、模式变量
  • 总结

前言


一、环境变量(全局变量)

  1. Makefile 中的环境变量,是指在执行 Makefile 时,从外部传入 Make 命令的环境变量

在这里插入图片描述

一些常用的 Makefile 环境变量:

  • MAKE:表示当前正在使用的 Make 工具的名称;
  • PWD:表示当前目录的绝对路径;
  • SHELL:表示当前 Shell 的名称。默认是 /bin/sh。可以通过定义 SHELL 变量来指定所使用的 Shell;
  • MAKEFLAGS:表示传递给 make 命令的所有参数。可以在 Makefile 中通过 $(MAKEFLAGS) 来引用它;
  • MAKELEVEL:表示 Make 命令嵌套的层数,从 0 开始计数。

环境变量可以在所有的 makefile 中使用。
但是,过多依赖于环境变量会导致代码移植性降低。

  1. 变量在不同的 makefile 之间进行传递:

(1). 直接在外部定义环境变量进行传递
(2). 使用 export 定义变量进行传递。(定义临时变量
(3). 定义 make 命令行变量进行传递

  1. 注意:
    如果 makefile 文件中 定义了同名变量,环境变量将会被覆盖
  • 运行 make 时,指定 " -e " 选项,优先使用环境变量。

示例:
makefile 文件:

export var := hello			# 使用 export 定义临时环境变量
new := world

test :
	@$(MAKE) -f makefile.1		 # 首次 进入 makefile.1 文件 执行命令
	@$(MAKE) -f makefile.1 new:=$(new)    # 再次 进入 makefile.1 文件,使用命令行进行变量传递。

makefile.1 文件:

test:
	@echo "var => $(var)"
	@echo "new => $(new)"

执行结果:
在这里插入图片描述
第一次进入 makefile.1 文件,只输出了 var 的值,而 new 为空。 因为 var 使用了 export 定义临时环境变量,则 可在 不同的 makefile 文件间传递。

第二次进入 makefile.1 文件,new 也输出了值,这次使用 命令行进行传递变量。

在 Makefile 中, $(MAKE) 是一个内置变量,它表示当前正在使用的 Make 命令的名称。这个变量可以保证在使用不同版本的 Make 工具或者在不同的操作系统中都能正确地工作。
如果在一个 Makefile 中调用另一个 Makefile,可以使用 -f 选项来指定目标 Makefile 文件的名称。

二、目标变量(局部变量)

在这里插入图片描述
作用域 只在 指定的目标连带规则 中。

示例:

var := hello				# 文件变量
test : var := world			# 定义目标变量 var 

test :	another				# 依赖于 another				
	@echo "test"
	@echo "var => $(var)"

another :
	@echo "another"
	@echo "var => $(var)"

在这里插入图片描述
test 目标 和其 another 依赖均打印出 world, 而不是 hello

文件变量在 makefile 中定义的变量,这个很好理解,即 作用域为 整个 makefile 文件。

三、模式变量

  • 模式变量 是 目标变量的扩展
  • 作用域只在 符合模式的目标及连带规则中
var := hello				

%e : override var := abc			# 定义模式变量

test :					 				
	@echo "test"
	@echo "var => $(var)"

rule :
	@echo "rule"
	@echo "var => $(var)"

在这里插入图片描述
%e 表示 目标结尾 是 e 的可以执行 %e : override var := abc
test 不是以 e 结尾,而 rule 是以 e 结尾,则打印出 abc


总结

下一篇介绍 makefile 中的 条件判断语句

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

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

相关文章

m4a音频怎么转换成mp3?

m4a音频怎么转换成mp3?如果你遇到了m4a音频格式的文件,但却无法在音频播放器中打开它,通常我们会将其转换成mp3格式。因为M4A属于苹果专用的音频格式,而MP3则是一种通用音频格式。M4A属于高品质压缩类型的音乐文件,而M…

Django框架之使用Session保持HTTP状态

HTTP协议是无状态的,每次请求都是新的请求; 客户端与服务器端的一次通信就是一次会话。 可使用cookie和session在客户端或者服务端存储有关会话的数据,来进行状态保持; cookie使用在上篇。本篇是使用session进行状态保持及使用Red…

外观数列----2023/5/11

外观数列----2023/5/11 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) “1”…

Omniverse Replicator环境配置和使用说明

Omniverse Replicator使用说明 本教程将介绍Omniverse Replicator的环境配置和使用说明, 参加Sky Hackathon的同学可以参考本教程来合成训练数据集. 文章目录 Omniverse Replicator使用说明1. Omniverse环境配置1.a.安装Omniverse Launcher1.a.1.在下面的地址下载Omniverse La…

案例分享:ChatGPT写python脚本,轻松文本处理

大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加:keeepdance,备注:chatgpt,拉你进群。 在工作中,需要对数据进行筛选、分割和整理,当你接受到一个长长…

浅谈Android PMS解析APP信息流程

前言 前面我们了解了Zygote的启动流程,知道AMS、PMS都是由SystemServer进程启动的,我们都知道PMS主要负责App管理工作,这里我们简单从源码角度分析下PMS是如何解析APP解析的; 源码分析(API 30为例) 我们还是从PackageManagerSe…

SpringBoot缓存技术详解

文章目录 一、 缓存技术介绍1. 缓存技术简介2. JSR107核心接口3. JSR107 图示3. SpringBoot缓存抽象4. 缓存常用注解和接口 一、 缓存技术实战1. Cacheable注解2. 缓存的工作原理4. Cacheable注解的工作流程 一、 缓存技术介绍 1. 缓存技术简介 缓存技术主要分为两大类缓存可…

6 进程的环境

6.1 main函数 C程序总是从main函数开始执行。main函数的原型是: int main(int argc, char *argv[]) 6.2 进程终止 有五种方式使进程终止: (1)正常终止: (a)从main返回。 (b&…

Pycharm十种不为人所知的技巧,不得不知道

Pycharm是Python语言开发中的一个非常强大的IDE工具,其高度的定制能力、日常开发中常用的工具和各种快捷键等功能,都能帮助Pycharm用户提高开发效率。但是,Pycharm中的许多功能并不为人所知。因此,以下是十种Pycharm技巧&#xff…

【MCS-51】51单片机指令系统大全

指令是指挥微型计算机工作的的计算机命令,对于51单片机来说,其主要使用的指令有两种形式:机器语言指令和汇编语言指令。 机器语言指令是指使用二进制代码表示的指令; 汇编语言指令是指使用容易我们记忆的缩写符号表示的机器语言…

YOLO入门指南:理解YOLO原理及构建第一个目标检测模型

YOLO(You Only Look Once)是一种快速且准确的目标检测算法,可以在图像或视频中检测出多个对象的位置和类别。在本篇文章中,我们将介绍YOLO的基本原理,并使用TensorFlow构建第一个目标检测模型。 YOLO的基本原理 YOLO的…

linux 安装jdk、tomcat

文章目录 前言一、Linux上安装jdk1、jdk安装与配置过程2、linux查看jdk安装路径 二、Linux上安装tomcat1、tomcat安装与配置过程2、对外开放访问的端口、重启防火墙、查看日志 三、在window系统中通过浏览器访问 前言 先检察是否安装jdk java -jar ## 查看是否安装jdk java -…

K8S—Helm

一、Helm介绍 helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。 Helm本质就是让k8s的应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成K8S资源清单文件&a…

文笔润色-文本校对改写工具

文段改写软件 写作是一项对于很多人来说都需要频繁进行的活动,无论是工作中的商业写作还是学术写作,在完成优质内容的同时也需要付出大量的时间和精力进行语言润色和修改。然而,现在有了147ChatGPT改写润色软件,该软件可以全自动…

近期分享学习心得

1、数据类型 原始类型undefined null number string boolean symbol bigint 引用类型 对象 2、大厂为什么不允许赋值undifined? 必须let avoid 0;效果一样 void是关键字,后面跟表达式,无论跟啥最终制造undefined,但是习惯写0。…

动态规划设计

文章目录 动态规划设计一、什么是最长递增子序列?[300. 最长递增子序列](https://leetcode.cn/problems/longest-increasing-subsequence/)注意子序列和子串的区别: 二、动态规划解法2.1什么是数学归纳法?2.2最长递增子序列中数学归纳的实际应…

simulink电力系统仿真(1):电力系统库+(电力系统基础知识)

文章目录 基础知识仿真库搭建一个简单的电路 基础知识 ★三相交流电:三相电是三组幅值相等、频率相等、相位互相差120的交流电,由有三个绕组的三相发电机产生,是工业上常用的电源,可提供超过数千瓦或以上功率的电力。★电力系统暂…

看一看吧,面试真的卷......

大家好,最近有不少小伙伴在后台留言,今年面试实在是太卷了,不知道从何下手! 不论是跳槽涨薪,还是学习提升!先给自己定一个小目标,然后再朝着目标去努力就完事儿了! 为了帮大家节约…

美术培训学校学生作品管理平台

本系统主要是为了美术培训学校和学生使用的,系统分为了前台和后台两部分,前台部分主要是展示美术培训学校的信息和让学生查看自己的课程信息服务的,后台主要是管理人员对系统进行管理使用的 前台部分功能 1. 网站首页,首页部分…

jar的反编译为java文件

目录 1、cfr工具下载 2、反编译指令 3、反编译说明 1、cfr工具下载 反编译插件工具比较多,但是我认为最后用的工具为cfr,基本能解决所有jar包,下载地址为:cfr官网 点击图中位置下载即可 2、反编译指令 来到你下载完成cfr目录下&…