本文抛开原理角度,仅在使用层面上介绍了makefile的特点和最基本的使用方法
基本规则
#++++++++++++++++++++Makefile++++++++++++++++++++#
规则X:规则A 规则B 规则C #这个规则可以是makefile内的一条make规则
命令1 #也可以是当前路径下 存在的同名文件
命令2 #只要符合这两个条件,make时就不会报错
规则A:
命令1
命令2
#++++++++++++++++++++++++++++++++++++++++++++#
#如果直接使用make而不指明规则时,Makefile会执行文件中的第一条规则
#当然,也会执行第一条规则的依赖规则
#++++++++++++++++++++++++++++++++++++++++++++#
连续执行shell命令
#++++++++++++++++++makefile的shell连续机制++++++++++++++++++++#
exec1:
cd /home/xiaotu
pwd #这样pwd打印出来的会是makefile的所在目录
exec2:
cd /home/xiaotu ; pwd #这样打印出来的才是xiaotu
#用分号把两条命令隔开是希望第二条命令能
#在第一条命令的基础下执行
#++++++++++++++++++++++++++++++++++++++++++++#
命令标志符“-”和“@”
#++++++++++++++++++命令标志++++++++++++++++++++#
exec3:
cd whatthefuck?
echo "do exec3"
exec4:
-cd whatthefuck? #在命令面前使用减号前缀,代表
echo "do exec3" #如果该条命令会执行出错,那么也
#不要在意这条错误,继续向下执行
execn:
@echo "do exec3" #makefile在执行shell时,会将shell打印出来
#在命令面前使用@号前缀,就不会打印。
#+++++++++++++++++++++++++++++++++++++++++++++++#
变量及变量的赋值方法
#+++++++++++++++++++++变量++++++++++++++++++++++#
#变量的普通赋值
obj = ${obj_are} you #用花括号和小括号引用变量都可以
obj_are = are
exec5:${obj}
are:
echo ${obj}
you:
echo $$ #两个$$就代表$字符本身
#切记注意,在makefile里玩shell的
#变量,不要忘记用两个$$
#变量的冒号赋值
#代表改行所引用的变量必须是上文中
#已经出现过的变量,如果上文中从未出现过,那么就视为空变量
a_obj := ${a_obj_are} you
a_obj_are := are
exec6:
echo ${a_obj}
#变量的问号赋值
#含义是:如果该变量在上文中没有被定义过,就执行该赋值语句
#如果被定义过,那么该行什么都不做
b_obj = hello
b_obj = hi
b_obj ?= thanks
exec7:
echo ${b_obj}
#变量的加号赋值
#加号赋值可以为变量追加值
#如果要追加值的变量,在上文中曾使用过冒号赋值,那么
#加号赋值也保留其冒号的属性
c_obj += a
c_obj += b
c_obj += c
exec8:
echo ${c_obj}
#+++++++++++++++++++++++++++++++++++++++++++++++#
内置条件判断语句
#++++++++++++++makefile内置条件判断语句+++++++++#
testname =
exec9:
ifeq (${testname},)
$(error plase input testname) #error是makefile的错误弹出语句
else
echo ${testname}
endif
#makefile也内置支持 ifneq ifdef ifndef
#+++++++++++++++++++++++++++++++++++++++++++++++#
符号变量
#++++++++++++++++++++++符号++++++++++++++++++++++#
#乘方变量\圈变量\小于号变量
exec10:exec11 exec12
echo "$^,$@" #^代表冒号右侧规则,@代表冒号左侧规则
echo "$<" #<代表冒号右侧规则的第一个规则
#百分号 和 星号变量
#测试时执行“make xx_abcd” 结果就是-> echo abcd
#测试时执行“make xx_efgh” 结果就是-> echo efgh
#百分号是个通配符
#星号也就指代百分号那一部分
xx_%:
echo $*
#+++++++++++++++++++++++++++++++++++++++++++++++#