博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第7课 - 变量的高级主题(下)
阅读量:6428 次
发布时间:2019-06-23

本文共 3135 字,大约阅读时间需要 10 分钟。

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 path10   11  # 例212  test :13      @echo "PATH => $(PATH)"14  15  # 输出结果 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games16  17  # 例318  PATH := my path19  20  test :21      @echo "PATH => $(PATH)"22  23  # 执行 make 时添加 -e 选项24  # 输出结果:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

(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 home22 var => swj23 make another file ...24 make[1]: 正在进入目录 `/home/swj/12-plan/makefile/lesson-7'25 HOME => my home26 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 home23 var => swj24 make another file ...25 make[1]: 正在进入目录 `/home/swj/12-plan/makefile/lesson-7'26 HOME => my home27 var => swj28 new => 29 make[1]:正在离开目录 `/home/swj/12-plan/makefile/lesson-7'30 make[1]: 正在进入目录 `/home/swj/12-plan/makefile/lesson-7'31 HOME => my home32 var => swj33 new => cool34 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 := swj4 test : var := test-var5 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-var14 var => swj 

 

3. makefile中的变量类型

(1)全局变量:makefile 外部定义的环境变量

(2)文件变量makefile 中定义的变量

(3)局部变量指定目标的变量

 

转载于:https://www.cnblogs.com/hoiday/p/9265701.html

你可能感兴趣的文章
Java Hibernate 之 CRUD 操作
查看>>
mysql 主从复制相关的日志文件
查看>>
Exchange Management Shell高效命令汇总
查看>>
九:Cocos2d-x的CCNode
查看>>
服务器的定义及分类
查看>>
JS CSS 批量压缩工具,直接支持对项目操作
查看>>
删除文件名为乱码的文件
查看>>
DB2联邦重点
查看>>
学会休息 学会工作 学会学习
查看>>
whoami命令使用方法
查看>>
android SQL 理解
查看>>
杂七杂八荟萃
查看>>
项目中使用mybatis,日志不输出问题
查看>>
Linux Tar Split压缩解压缩分片压缩解压缩
查看>>
Quartz2D
查看>>
jQuery温度计,支持摄氏度华氏度同时展示
查看>>
Cloudstack+Glusterfs+Kvm 集群(笔记)
查看>>
Dubbo与Zookeeper、SpringMVC整合和使用
查看>>
Python中set 和dict 的总结
查看>>
mysql 相关
查看>>