第7课 - 变量的高级主题(下)

第7课 - 变量的高级主题(下)

1. makefile中的环境变量(全局变量)

  (1)makefile中使用系统环境变量

    makefile中可以直接使用系统中的环境变量(系统环境变量的本质就是全局的键值对)

    • 如果 makefile 中定义了同名变量,那么环境变量将会被覆盖
    • 运行 make 时指定 "-e" 选项,优先使用环境变量 
 1 # 测试makefile中环境变量的使用
 2
 3 # 例1
 4 PATH := my path
 5
 6 test :
 7     @echo "PATH => $(PATH)"
 8
 9 #输出结果: my path
10
11 # 例2
12 test :
13     @echo "PATH => $(PATH)"
14
15 # 输出结果 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
16
17 # 例3
18 test :
19     @echo "PATH => $(PATH)"
20
21 # 执行 make 时添加 -e 选项
22 # 输出结果:my path

  (2)为什么要在makefile中使用环境变量?

    — 优势:环境变量可以在所有 makefile 中使用

    — 劣势:过多的依赖于环境变量会导致移植性降低

  (3)变量在不同makefile之间的传递方式

    — 直接使用系统中的环境变量(不推荐,太依赖于系统)

    — 使用 export 定义环境变量进行传递(定义临时的环境变量)

    — 定义 make 命令行变量进行传递(推荐)

 1 # makefile 演示变量在不同 makefile 之间的传递方式
 2
 3 # makefile文件
 4
 5 HOME := my home
 6 var := swj
 7
 8 test :
 9     @echo "HOME => $(HOME)"
10     @echo "var => $(var)"
11     @echo "make another file ..."
12     @$(MAKE) -f makefile.1
13
14 # makefile.1文件
15
16 test :
17     @echo "HOME => $(HOME)"
18     @echo "var => $(var)"
19
20 # 输出结果:
21 HOME => my home
22 var => swj
23 make another file ...
24 make[1]: 正在进入目录 `/home/swj/12-plan/makefile/lesson-7‘
25 HOME => my home
26 var =>
27 make[1]:正在离开目录 `/home/swj/12-plan/makefile/lesson-7‘

    — 该例说明的问题:

      • makefile中定义环境变量会把系统中该环境变量的值覆盖
      • 在makefile中定义的变量只具有 "文件作用域" ,在makefile.1  中不能使用

    — 遇到的坑:由于我的ubuntu没有安装Java,没有使用JAVA_HOME这个环境变量,使用的是PATH环境变量,PATH := my path ,导致后面调用make出现错误。原因是由于make是一个进程,它会复制系统的一份环境变量来使用,复制的环境变量作用域是 "进程域", 上面 PATH := my path 就把该环境变量的值更改了,导致后面调用make时出现 "找不到命令" 的错误。环境变量之间的关系如下图所示。 

        

 1 # 演示 export 和 命令行传递变量给其它makefile
 2
 3 # makefile 文件
 4 HOME := my home
 5 export var := swj
 6 new := cool
 7
 8 test :
 9     @echo "HOME => $(HOME)"
10     @echo "var => $(var)"
11     @echo "make another file ..."
12     @$(MAKE) -f makefile.1
13     @$(MAKE) -f makefile.1 new:=$(new)
14
15 # makefile1 文件
16 test :
17     @echo "HOME => $(HOME)"
18     @echo "var => $(var)"
19     @echo "new => $(new)"
20
21 # 输出结果:
22 HOME => my home
23 var => swj
24 make another file ...
25 make[1]: 正在进入目录 `/home/swj/12-plan/makefile/lesson-7‘
26 HOME => my home
27 var => swj
28 new =>
29 make[1]:正在离开目录 `/home/swj/12-plan/makefile/lesson-7‘
30 make[1]: 正在进入目录 `/home/swj/12-plan/makefile/lesson-7‘
31 HOME => my home
32 var => swj
33 new => cool
34 make[1]:正在离开目录 `/home/swj/12-plan/makefile/lesson-7‘

2. makefile中的局部变量

  (1)目标变量

    — 作用域只在指定目标及连带规则中

      • target : name<assignment>value
      • target : override name<assignment>value
1 # 测试目标变量的使用
2
3 var := swj
4 test : var := test-var
5
6 test :
7     @echo "var => $(var)"
8
9 # 输出结果:var => test-var

  (2)模式变量

    — 模式变量是目标变量的扩展

    — 作用域只在符合模式的目标及连带规则中

      • pattern : name <assignment> value
      • pattern : override name <assignment> value 
 1 # 测试模式变量的使用
 2
 3 var := swj
 4 %t : var := test-var
 5
 6 test :
 7     @echo "var => $(var)"
 8
 9 another :
10     @echo "var => $(var)"
11
12 # 输出结果
13 var => test-var
14 var => swj 

3. makefile中的变量类型

  — 全局变量:makefile 外部定义的环境变量

  — 文件变量:makefile 中定义的变量

  — 局部变量:指定目标的变量

注:本文整理于《狄泰12月提升计划》课程内容

时间: 2024-08-03 17:42:16

第7课 - 变量的高级主题(下)的相关文章

变量的高级主题(六)

我们在前面学习了 makefile 中的相关知识,今天我们来看看在 makefile 中变量值的替换.它的替换是指使用指定字符(串)替换变量值中的后缀字符(串),语法格式为:$(var:a=b) 或 ${var:a=b}.注意:a> 替换表达式中不能有任何的空格:b> make 中支持使用 ${ } 对变量进行取值.格式如下 还有种便是变量的模式替换是指使用 % 保留变量值中的指定字符,替换其他字符.语法格式为:$(var:a%b=x%y) 或 ${var:a%b=x%y}.注意:a>

第19课 - 对象的构造(下)

第19课 - 对象的构造(下) 1. 特殊的构造函数 (1)无参构造函数 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空. (2)拷贝构造函数 当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制. 1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9 int getI() 10 { 11 return i; 12 } 13

android开发笔记之高级主题—传感器的简单介绍

今天我们开始进入讲解android中的一些高级主题的用法,比如传感器.GPS.NFC.语音和人脸识别等. 这次来对传感器的一个简单介绍: Android平台支持三大类的传感器: 位移传感器 这些传感器测量沿三个轴线测量加速度和旋转.这类包含加速度,重力传感器,陀螺仪,和矢量传感器. 环境传感器 这些传感器测量各种环境参数,例如周围的空气温度和压力,光线,和湿度.这类包含气压,光线,和温度传感器. 位置传感器 这些传感器测量设备的物理位置.这类包含方向和磁力传感器. 这些传感器的一些是基于硬件的,

第10课 - 变量与函数的综合示例

第10课 - 变量与函数的综合示例 1. 实战需求 (1)自动生成 target 文件夹存放可执行文件 (2)自动生成 objs 文件夹存放编译生成的目标文件(*.o) (3)支持调试版本的编译选项 (4)考虑代码的扩展性  --> 使用变量 2. 工具原料 - $(wildcard _pattern) 获取当前工作目录中满足_pattern的文件或目录列表 - $(addprefix _prefix, _names) 给名字列表_names中的每一个名字增加前缀_prefix 3. 关键技巧

JAVA设置环境变量和在DOS下运行java程序

在学校实训的这几天,老师带着我们开始深入的复习java.这是第一天的内容哦 对于“JAVA设置环境变量和在DOS下运行java程序”,许多初学者是陌生的,但了解这个却对后期的学习很重要. http://blog.sina.com.cn/s/blog_639403840100i5rt.html 下面先来了解一下什么是dos吧 dos 我们使用计算机接触最频繁的就是DOS.DOS是英文Disk Operating System的缩写,意思是“磁盘操作系统”,顾名思义,DOS主要是一种面向磁盘的系统软

Python——类的高级主题

介绍关于类的一些高级主题,这些是可选的,在Python应用程序中,不会常常遇到. ========================================================================== slots实例 将字符串属性名称顺序赋值给特殊的__slots__类属性.就能够限制类的实例将有的合法属性集. 这个特殊属性通常是在class语句顶层内将字符串名称顺序赋值给变量__slots__而设置:仅仅有__slots__列表内的这些变量名可赋值为实例属性.而实

学习python第一课 变量

Author:uljfangbr/>E-mail:[email protected]Mentor:Liu YouyuanTime:2018-3-24 message="Hello , Python World!" print("message") message="Hello, Python World! This language is Cool to learn well." print("message") run

Pacman主题下给Hexo增加简历类型

原文 http://blog.13kbook.com/2015/01/02/add-resume-type-to-hexo-under-pacman-theme/ 背景 虽然暂时不找工作,但是想着简历也是个向别人推销自己的好东西.然后也想着折腾点新的东西,如此,这般,便想着研究起写个简历了. 形式不限,但是必须是在线的,最好是很简洁的. 分析 既然是在线的,那就干脆直接用博客呗,直接放在上面. 写博客既然用Markdown,那简历也直接用Markdown,一个是可以在线渲染,另外一个是生成PDF

第九章 变量的高级用法

内部变量 1.BASH 记录了bash Shell的路径(通常为/bin/bash) [[email protected] tmp]# echo "$BASH" /bin/bash 2.BASH_VERSINFO 为一个数组,分别存储bash shell的主版本号,此版本号,补丁级别,编译版本,发行状态,硬件架构 [[email protected] tmp]# cat c.sh #! /bin/bash for n in 0 1 2 3 4 5 do echo "BASH_