柒- 变量的高级主题(下)

环境变量(全局变量)

  • makefile 中可能间接应用环境变量的值

    • 定义了同名变量,环境变量将被笼罩
    • 运行 make 时指定 '-e' 选项,优先应用环境变量

为什么要在 makefile 中应用环境变量

  • 劣势

    • 环境变量能够在所有 makfefile 中应用
  • 劣势

    • 过多的依赖于环境变量会导致移植性升高

变量在不同 makefile 之间的传递形式

不同 makefile 之间变量传递的三种形式!!!

  1. 间接在内部定义环境变量进行传递
  2. 应用export 定义变量进行传递(定义长期环境变量),因为它不会真正批改零碎变量的环境变量
  3. 定义 make 命令行变量进行传递(举荐)

编程试验1

JAVA_HOME := java home  test :    @echo "JAVA_HOME => $(JAVA_HOME)"

留神
makefile 规定定义的一个变量,这个名字和环境变量名字是一样的话,以以后makefile 定义变量为准,且默认的状况下笼罩环境变量(其余文件示意雷同的环境变量名也会笼罩) ,如果不须要这个变量代表环境变量,编译选项make -e ,就能够示意原本的环境变量

编程试验2.1

调用另外一个makefile 文件
$(MAKE) :以后 make 解释器的文件名,make 前面的文件 makefile.2

// 文件makefilevar := Kevin6666 test :     @echo "test => $(var)"    @echo "make another file ......"    @$(MAKE) -f makefile.2    //  文件makefile.2 test :     @echo "test => $(var)"    
// 输入后果  test => Kevin6666make another file ......make[1]: Entering directory '/mnt/hgfs/Fileshare_LinuxC'test => make[1]: Leaving directory '/mnt/hgfs/Fileshare_LinuxC'

具备文件作用域,且不是环境变量

编程试验2.2

// 文件makefileexport var := Kevin6666test :     @echo "test => $(var)"    @echo "make another file ......"    @$(MAKE) -f makefile.2//  文件makefile.2 test :     @echo "test => $(var)"
// 输入  test => Kevin6666make another file ......make[1]: Entering directory '/mnt/hgfs/Fileshare_LinuxC'test => Kevin6666make[1]: Leaving directory '/mnt/hgfs/Fileshare_LinuxC'

export 因为它不会真正批改零碎变量的环境变量,长期环境变量

编程试验3

// 文件makefile  var := Kevin6666test :     @echo "test => $(var)"    @echo "make another file ......"    @$(MAKE) -f makefile.2 var:=$(var)  //  文件makefile.2 test :     @echo "test => $(var)"
// 输入  test => Kevin6666make another file ......make[1]: Entering directory '/mnt/hgfs/Fileshare_LinuxC'test => Kevin6666make[1]: Leaving directory '/mnt/hgfs/Fileshare_LinuxC'

var:=$(var) 定义命令行环境变量传值

指标变量(局部变量)

指标变量相当于局部变量

  • 作用域只在指定指标及连带规定中

    • target : name<assignment>value
    • target :override name<assignment>value
var := D.T.Softwaretest : var : test-var  // test 这个指标,以及依赖定义一个 var 变量,这个变量的值是 test-var test :    @echo "test:"    @echo "var => $(var)"

编程试验4.1

var := Kevin666test : var := test-vartest :    @echo "test :"    @echo "var => $(var)"
// 输入 zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ maketest :var => test-var

编程试验4.2

var := Kevin666test : var := test-vartest : another    @echo "test :"    @echo "var => $(var)"    another :     @echo "another var => $(var)"
// 输入 another var => test-vartest :var => test-var

编程试验4.3

var := Kevin666test : var := test-vartest :     @echo "test :"    @echo "var => $(var)"    another :     @echo "another var => $(var)"
make test another// 输入 zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make test anothertest :var => test-varanother var => Kevin666

模式变量

  • 模式变量是指标变量的扩大
  • 作用域只在符号模式的指标及连带规定中

    • pattern : name<assignment>value
    • pattern :override name<assignment>value
new := Kevin%e : override new := test-new // 匹配以 e结尾的指标rule :    @echo "rule:"    @echo "new => $(new)"

编程试验5

var := D.T.Softwarenew := TDelphitest : var := test-var%e : override new := test-newtest : another    @echo "test :"    @echo "var => $(var)"    @echo "new => $(new)"    another :    @echo "another :"    @echo "var => $(var)"    @echo "new => $(new)"    rule :    @echo "rule :"    @echo "var => $(var)"    @echo "new => $(new)"
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make test rule another :  // 输入var => test-varnew => TDelphitest :var => test-varnew => TDelphirule :var => D.T.Softwarenew => test-new
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make test rule  new:=cmd_new  // 输入another :var => test-varnew => cmd_newtest :var => test-varnew => cmd_newrule :var => D.T.Softwarenew => test-new

小结

  • makefile 中的三种变量

    • 全局变量:makefile 内部定义的环境变量
    • 文件变量:makefile 中定义的变量
    • 局部变量:指定指标的变量