影响 Makefile 中变量值的方式

影响 Makefile 中变量值的方式

1,直接赋值

变量的赋值方式
Makefile 中变量的赋值方式影响着变量的覆盖和更新。主要有以下几种赋值方式:
简单赋值 (=): 变量在被赋值时展开,如果变量之前被赋值过,可以被后续的赋值覆盖。
递归赋值 (:=): 变量在被赋值时立即展开,之后的赋值不会影响已经赋值的变量。
条件赋值 (?= ): 只有在变量之前没有被赋值时,才会对变量进行赋值。
追加赋值 (+=): 将值追加到变量的当前值之后。


2,包含其他makefile文件

在 Makefile 中,变量的跨文件传递主要依赖于 Makefile 的包含机制和变量的赋值方式。
Makefile 允许一个文件包含另一个文件,这使得在多个文件之间共享变量成为可能。以下是一些关键点和规则,用于理解和实现 Makefile 变量的跨文件传递:
包含其他 Makefile
使用 include 指令可以将一个 Makefile 的内容包含到另一个 Makefile 中。例如:

include cpp_src.mk
-include cu_src.mk

则 cpp_src.mk 中定义的变量会包含进来。

注意事项
当使用 include 包含其他 Makefile 时,被包含的 Makefile 中的变量和规则就好像是直接写在主 Makefile 中一样。
如果在多个被包含的 Makefile 中定义了相同的变量,那么变量的最终值将取决于赋值方式和包含的顺序。
使用条件赋值可以避免在不同文件中对同一个变量的重复赋值。


3,导出为环境变量

可以在调用子 Makefile 前,将需要传递的变量导出为环境变量。在子 Makefile 中,这些环境变量就可以像普通的 Makefile 变量一样被访问。
例如:
 

export VAR_NAME=value
all:make -C subdir

4,通过命令行传递变量


另一种方法是在 make -C dir 命令中直接指定变量的值,这样在子 Makefile 中就可以访问这些变量了。

例如:
 

all:make -C subdir VAR_NAME="value"


5,使用 make 的 -e 选项


使用 -e 选项,可以让环境中的变量覆盖 Makefile 中的同名变量。
这意味着如果你在父 Makefile 中导出了一个环境变量,然后使用 -e 选项调用 make -C dir,子 Makefile 中的同名变量将会被环境变量的值覆盖。
例如:
 

export VAR_NAME=value
all:make -e -C subdir

注意
使用环境变量的方法可能会受到操作系统对环境变量长度和数量的限制。
通过命令行传递变量是显式的,容易理解和维护,但可能会使命令行变得很长。
使用 -e 选项可以方便地覆盖子 Makefile 中的变量,但可能会导致预期之外的行为,因为它会使所有的环境变量都能覆盖 Makefile 中的同名变量。

6,优先级


 6.1 命令行定义的变量(最高优先级)


 当你在命令行中直接为 make 命令指定变量时,这些变量的值具有最高优先级。例如:
           

 make -C subdir VAR="value"


 这里,VAR 的值在子 Makefile 的执行过程中将被设置为 "value",无论子 Makefile 内部如何定义 VAR。
 
 


 6.2 环境变量(受 -e 选项影响)


 默认情况下,Makefile 中定义的变量会覆盖同名的环境变量。
 但是,如果使用了 make 的 -e 选项,环境变量将具有更高的优先级,能够覆盖 Makefile 中的同名变量定义。
 这适用于从父 Makefile 传递到子 Makefile 的环境变量:

export VAR="value from environment"


如果在父 Makefile 中这样导出变量,并在调用子 Makefile 时使用 -e 选项,那么环境变量将覆盖子 Makefile 中的同名变量。


 6.3 子 Makefile 中的变量定义


 子 Makefile 中直接定义的变量(不考虑通过命令行或环境变量传递的情况)。这些定义根据赋值方式(=、:=、?=、+=)有不同的行为。
 
 


 6.4 父 Makefile 中通过 export 导出的变量


 父 Makefile 可以通过 export 关键字导出变量,使其成为环境变量,这些环境变量在子 Makefile 中可用,除非被命令行变量或 -e 选项影响的环境变量覆盖。
 


 6.5 包含的 Makefile 中的变量


 当一个 Makefile 使用 include 指令包含另一个 Makefile 时,被包含 Makefile 中的变量定义会影响到当前 Makefile。
 这种情况下,被包含 Makefile 中的变量定义相当于直接写在包含它的 Makefile 中。
 

 6.6 默认变量


Make 提供的默认变量(如 CC 默认为 cc)。如果在 Makefile 中没有显式定义这些变量,它们将使用默认值。

总结优先级
1. 命令行定义的变量(最高优先级)
2. 环境变量(受 -e 选项影响)
3. 子 Makefile 中的变量定义
4. 父 Makefile 中通过 export 导出的变量
5. 包含的 Makefile 中的变量
6. 默认变量


7, .EXPORT_ALL_VARIABLES


In Makefile, to ensure that all variables are automatically exported to child Makefiles or subprocesses,
you can use the `.EXPORT_ALL_VARIABLES` special variable.
This tells [make]  to export all variables to the environment of every shell command.
 It does not need to be assigned a value; its presence in the Makefile is sufficient.

8, 对 ?= 变量的影响方式

在 Makefile 中,`?=` 操作符用于条件赋值,即只有当变量之前未被定义(即未被赋值)时,才会对其进行赋值。这意味着,如果一个变量在子 Makefile 中使用 `?=` 被赋值,那么它只会在该变量在之前的环境中未被定义时接受这个赋值。

对于父 Makefile 和子 Makefile 的交互,以下是几种情况下父 Makefile 中的同名变量会改变子 Makefile 中变量的值:

8.1. 父 Makefile 中通过命令行传递变量

如果在调用子 Makefile 时,通过命令行传递了同名变量,那么这个变量的值会被传递给子 Makefile,即使子 Makefile 中使用了 `?=` 进行了条件赋值。命令行传递的变量具有最高优先级。

8.2. 父 Makefile 中导出变量

如果父 Makefile 中通过 `export` 明确导出了一个变量,那么这个变量会成为环境变量,子 Makefile 在执行时会继承这个环境变量。如果子 Makefile 中使用 `?=` 对同名变量进行了条件赋值,由于环境变量已经定义了该变量,子 Makefile 中的赋值将不会生效。

8.3. 使用 `.EXPORT_ALL_VARIABLES`

如果父 Makefile 中声明了 `.EXPORT_ALL_VARIABLES`,那么所有在父 Makefile 中定义的变量都会自动导出为环境变量。这意味着,如果子 Makefile 中使用 `?=` 对同名变量进行了条件赋值,这个赋值将不会生效,因为该变量已经通过父 Makefile 被定义了。

8.4 注意

- 如果子 Makefile 在使用 `?=` 赋值之前已经通过其他方式(如直接赋值或通过命令行参数)接收到了该变量的值,那么 `?=` 的赋值将不会生效,因为该变量已经被定义。
- `?=` 的赋值只有在变量之前未被定义时才会生效,这包括之前没有被赋值或者被赋予空值。

总的来说,父 Makefile 中的同名变量会通过命令行参数传递、环境变量(包括使用 `export` 或 `.EXPORT_ALL_VARIABLES`)影响子 Makefile 中使用 `?=` 定义的变量的值,前提是这些操作发生在子 Makefile 执行之前。

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

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

相关文章

Rust 命令行参数解析指南

0x00 前言 通过 Rust 的 Governance 可以看到 Rust 的通过三种方式管理社区: RFC processTeamsWorking Groups 在 Working Groups 中我发现竟然有一个叫 Command-line interfaces (CLI) working group 的工作组(简称 WG-CLI)。很明显,如果 Rust 对于 …

RAGFlow:安装与体验

服务器需要有docker,或者直接访问官方提供的demo: https://demo.ragflow.io/ docker-compose安装 需要确保 vm.max_map_count 不小于 262144 【更多】:sysctl -w vm.max_map_count=262144 克隆仓库:$ git clone https://github.com/infiniflow/ragflow.git 进入 doc…

【介绍下Unity编辑器扩展】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

【17】JAVASE-集合专题【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture:波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。…

【Java】java实现文件上传和下载(上传到指定路径/数据库/minio)

目录 上传到指定路径 一、代码层级结构 二、文件上传接口 三、使用postman进行测试; MultipartFile接收前端传递的文件:127.0.0.1:8082/path/uploadFile part接收前端传递的文件:127.0.0.1:8082/path/uploadFileByRequest 接收前端传递…

【webrtc】MessageHandler 2: 基于线程的消息处理:以PeerConnectionClient为例

PeerConnectionClient 前一篇 nullaudiopoller 并么有场景线程,而是就是在当前线程直接执行的, PeerConnectionClient 作为一个独立的客户端,默认的是主线程。 PeerConnectionClient 同时维护客户端的信令状态,并且通过OnMessage实现MessageHandler 消息处理。 目前只处理一…

常见公式的几何解释

本文旨在深入探讨常见数学公式的几何意义,通过直观的图形和解释,帮助读者更好地理解并掌握这些公式的本质。文章首先概述了公式与几何图形之间的紧密联系,然后选取了几个典型的数学公式,进行详细解析。每个公式都将配以相应的几何…

怎么做视频二维码更方便?在线一键生成视频活码二维码

现在经常会发现很多的二维码可以用来展示视频内容,通过这种方式来实现视频的快速分享与传播。二维码是一种成本低传播快的内容传播方式,很多的内容都可以通过生成二维码的方式来分享给其他人,可以同时扫描相同的二维码来获取内容,…

在线听歌播放器 梨花带雨网页音乐播放器 网页音乐在线听 源码

最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 下 载 地 址 : runruncode.com/php/19749.html 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容:修复播放器接口问题&am…

《半小时漫画论语》读书笔记

站在几年前看现在的我,感觉多了几分犹豫、内耗,少了几分勇敢。 今天重新读下论语,矫正一下人生态度。 一、论语是什么 论语,主要记载了孔子和他弟子们日常说的话、做的事。 孔子,读书人心中的圣人,中国历…

开关电源输入EMI滤波器设计与仿真

目录 开关电源输入EMI滤波器设计与仿真 摘要 1 .开关电源特点及噪声产生原因

气象数据nc数据矢量化处理解析及可视化

气象数据可视化是将气象学领域中复杂的数据集转化为图形或图像的过程,以直观展示天气现象、气候模式、趋势和预报结果。气象数据的可视化技术广泛应用于科学研究、气象预报、航空、航海、农业生产、灾害预警系统、城市规划、公众服务等领域。以下是一些关键的气象数…

SpringCloud 学习笔记 —— 一、背景

SpringCloud 学习笔记 —— 一、背景-CSDN博客 SpringCloud 学习笔记 —— 二、微服务与微服务架构-CSDN博客 SpringCloud 学习笔记 —— 三、SpringCloud 入门概述-CSDN博客 SpringCloud 学习笔记 —— 四、SpringCloud Rest 学习环境搭建:服务提供者-CSDN博客 …

C++证道之路第十五章友元、异常和其他

友元 友元函数: 友元函数不是类的成员函数,但能够访问类的私有(private)成员和保护(protected)成员。友元函数定义在类的外部,但在类的定义中通过friend关键字声明。友元函数可以是普通函数&a…

如何在Spring Boot中配置数据库密码加密

如何在Spring Boot中配置数据库密码加密? alibaba/druid Wiki GitHub 使用ConfigFilter alibaba/druid Wiki GitHub 巧用Druid数据源实现数据库连接密码的加密解密功能 import com.alibaba.druid.filter.config.ConfigTools;public class Testttt {public stat…

Android4.4真机移植过程笔记(二)

5、盘符挂载 先定义overlay机制路径,后面storage_list.xml要用到: 在路径: rk3188_android4.4.1/device/rockchip/OK1000/overlay/frameworks/base/core/res/res/xml/定义好,注意名字要和emmc的代码片段(往下面看&am…

maven 知识目录

maven 知识相关目录主要参考尚硅谷 赵伟风老师的视屏,参考链接为 http://www.atguigu.com/video/271/ 1、基础知识 maven入门和进阶 链接:https://blog.csdn.net/m0_59748326/article/details/138368887?spm1001.2014.3001.5501

Q1营收稳健增长,云从科技如何在“百模大战”的险中求稳?

自从迈入大模型时代,AI行业可谓“一天一个样”。越来越多的企业涌现,舆论热议从未断绝。 但就像所有技术必须经历的那些考验,在现实尺度下,AI顺利走进商业化世界,仍然是少部分玩家掌握的稀缺能力。个中原因不尽相同&a…

python 同一路径下把多个Excel文件合并成一个Excel文件的不同sheet表

import pandas as pd import os# 设定工作目录(如果所有Excel文件都在这个目录下) working_directory E:\\Program Files\\DM\\Chuwentaizahng\\合并# 获取工作目录下所有的Excel文件 excel_files [f for f in os.listdir(working_directory) if f.end…

Flutter笔记:Widgets Easier组件库(4)使用按钮组

Flutter笔记 Widgets Easier组件库(4):使用按钮组 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress…