1.Makefile解析

1.1Makefile规则:

目标(target)…: 依赖(prerequiries)…
<tab>命令(command)

  如果“依赖文件”比“目标文件”更加新,那么执行“命令”来重新生成“目标文件”。

  命令被执行的2个条件:依赖文件比目标文件新,或是 目标文件还没生成。

  $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。 

  执行make命令时,它会去当前目录下查找名为“Makefile”的文件,并根据它的指示去执行操作,生成第一个目标。

  我们可以使用“-f”选项指定文件,不再使用名为“Makefile”的文件,比如:  

make  -f  Makefile.build 

  我们可以使用“-C”选项指定目录,切换到其他目录里去,比如:

make -C  a/  -f  Makefile.build 

  

  我们可以指定目标,不再默认生成第一个目标:

make -C  a/  -f  Makefile.build   other_target

1.2即时变量、延时变量

变量的定义语法形式如下

A  =  xxx   // 延时变量
B  ?= xxx    // 延时变量,只有第一次定义时赋值才成功;如果曾定义过,此赋值无效
C  := xxx    // 立即变量
D  += yyy   // 如果D在前面是延时变量,那么现在它还是延时变量;
// 如果D在前面是立即变量,那么现在它还是立即变量

  在GNU make中对变量的赋值有两种方式:延时变量、立即变量

  makefile中以“$(objects)”的方式来使用这个变量了。

1.3 变量的导出(export)

  在编译程序时,我们会不断地使用“make -C dir”切换到其他目录,执行其他目录里的Makefile。如果想让某个变量的值在所有目录中都可见,要把它export出来。

  比如“CC        = $(CROSS_COMPILE)gcc”,这个CC变量表示编译器,在整个过程中都是一样的。定义它之后,要使用“export  CC”把它导出来。

1.4 Makefile中可以使用shell命令

TOPDIR := $(shell pwd)

  这是个立即变量,TOPDIR等于shell命令pwd的结果。

1.5在Makefile中怎么放置第1个目标

  执行make命令时如果不指定目标,那么它默认是去生成第1个目标。

  所以“第1个目标”,位置很重要。有时候不太方便把第1个目标完整地放在文件前面,这时可以在文件的前面直接放置目标,在后面再完善它的依赖与命令。比如:

First_target:   // 这句话放在前面
....        // 其他代码,比如include其他文件得到后面的xxx变量
First_target : $(xxx)   $(yyy)   // 在文件的后面再来完善
    command

1.6假想目标

clean:
    rm -f $(shell find -name "*.o")
    rm -f $(TARGET)

  如果当前目录下恰好有名为“clean”的文件,那么执行“make clean”时它就不会执行那些删除命令。

  这时我们需要把“clean”这个目标,设置为“假想目标”,这样可以确保执行“make clean”时那些删除命令肯定可以得到执行。  

  使用下面的语句把“clean”设置为假想目标:

.PHONY : clean
12-27 04:04