第5课

第5课 - 预定义变量的使用

1. makefile中的预定义变量

  (1)自动变量

    •  $@  @^  @<    

  (2)特殊变量

    • $(MAKE) , $(MAKECMDGOALS) , $(MAKEFILE_LIST) 
    • $(MAKE_VERSION) , $(CURDIR) , $(.VARIABLES) 
    • ......

2. 自动变量的使用

  (1)自动变量的意义

      $@   当前规则中触发命令被执行的目标

      $^  当前规则中所有的依赖

      $<  当前规则中的第一个依赖

  (2)自动变量的使用示例

    

         执行 make all 后程序的输出

     $@ => all

     $^ => first second third

     $< => first

  注意

    ⅰ. 在执行makefile脚本时,make首先会展开脚本中的变量等,相当于C中预处理过程。然后再将相应规则中的命令交给shell执行。

    ⅱ. "$" 对于makefile有特殊含义,输出时需要加上一个 "$" 进行转义。

    ⅲ. "$@" 对于Bash Shell 有特殊含义,输出时需要加上 "" 进行转义。 $@是shell输入的参数的个数。

 1 # 演示自动变量的使用
 2 
 3 CC := gcc
 4 TARGET := hello.out
 5 
 6 $(TARGET) : main.o func.o
 7     $(CC) -o $@ $^
 8 
 9 main.o : main.c
10     $(CC) -o  $@ -c $<
11 
12 func.o : func.c
13     $(CC) -o $@ -c $<
14     
15 .PHONY : rebuild all clean
16 
17 rebuild : clean all
18 
19 all : $(TARGET)
20 
21 clean : 
22     rm *o $(TARGETa)

3. 特殊变量的使用 

  (1)$(MAKE),当前make解释器的文件名

  (2)$(MAKECMDGOALS),命令行中指定的目标名(make的命令行参数 make xx , xx 即MAKECMDGOALS)

  (3)$(MAKEFILE_LIST)

    • make所需要处理的 makefile 文件列表
    • 当前 makefile 的文件名总是位于列表的最后
    • 文件名之间以空格进行分隔
 1 # 测试以上三个特殊变量的含义
 2 
 3 .PHONY : all out first second third test
 4 
 5 all out : 
 6     @echo "$(MAKE)"
 7     @echo "$(MAKECMDGOALS)"
 8     @echo "$(MAKEFILE_LIST)"
 9     
10 first :
11     @echo "first"
12     
13 second :
14     @echo "second"
15     
16 third :
17     @echo "third"
18     
19 test :
20     @$(MAKE) first
21     @$(MAKE) second
22     @$(MAKE) third

  (4)$(MAKE_VERSION),当前make解释器的版本

  (5)$(CURDIR),当前make解释器的工作目录

  (6)$(.VARIABLES),所有已经定义的变量名列表(自定义变量预定义变量自动变量、特殊变量))

 1 # 测试以上三个特殊变量的含义
 2 
 3 .PHONY : test1 test2
 4 
 5 TDelphi := Delphi Tang
 6 D.T.Software := D.T.
 7     
 8 test1 :
 9     @echo "$(MAKE_VERSION)"
10     @echo "$(CURDIR)"
11     @echo "$(.VARIABLES)"
12     
13 test2 :
14     @echo "$(RM)"

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

狄泰QQ群:199546072

原文地址:https://www.cnblogs.com/shiwenjie/p/6776437.html