一、变量的定义可能出现的地方只有两种
1、makefile全局变量:一定在target外部
2、出现在target内的shell内部的变量
3、target内部:
3.1:如果是makefile中的关键字语法,前面一定不能出现tab,否则会当成命令处理。
3.2:target内部若用的时shell的语法命令,必然会以tab开始。
举例:
all:
@if [ "debug" = "debug" ];
then
TV3=test3_yes;
echo $$TV3;
else
TV3=test3_no;
fi
TV3=MYTV
all:
@if [ "debug" = "debug" ];
then
TV3=test3_yes;
echo $$TV3;
echo $(TV3); #引用的是makefile中的变量
else
TV3=test3_no;
fi
all:
@for i in 1 2 3;
do
echo "building " $$i;
done
@echo "finall"
知识点1:
makefile会将上述内嵌的shell脚本当作一个独立的单元,它们在单独的进程中运行。里边定义的变量,只能在这个shell单独进程进行局部使用。
知识点2:
Shell进程使用自己的变量,应该以$$开头,且自己的变量是不需要括号。
shell进程内也可以引用全局的makefile变量。
知识点3:
Shell脚本在target里才有效,其它地方都被忽略掉了。target外可以用$(shell 语句)方式 ,如:$(PWD)
//makefile中语法关键字+tab(make时直接报错,语法错误)
all:
ifeq (1,1)
@echo "123"
endif
//不加空格(make时不会报错,但不会识别出这是一个shell脚本执行命令(也可以叫执行程序),将不会开启一个shll进程去执行程序,所以什么事情都不会做)
all:
@if [ "debug" = "debug" ];
then
TV3=test3_yes;
echo $$TV3;
else
TV3=test3_no;
fi
//每一条shell脚本都是一个独立的进程,进程间变量不共享
all:
@if [ "debug" = "debug" ];
then
TV3=test3_yes;
echo $$TV3;
else
TV3=test3_no;
fi
echo $$TV3
重点解析:echo $$TV3
执行结果:echo $TV3 + 换行
makefile执行顺序:
1、先将$$TV3 执行一次扩展,第一个$指的时引用变量,后面的$TV3指的是变量,此时回输出:echo $TV3
2、扩展后得到的echo $TV3又被shell解析,此时由于V3在makefile中并没有定义此变量,所以会输出换行。
4、命令前@符号问题
如果不添加@,会将shell命令打印出来。
echo $(KVAL)
@echo $(LIBS) //不会把shell本身的命令echo打印出来。
if前已经有了@,及时内部的echo没有@打印时也不会将命令本身打印出来。
all:
@if [ "debug" = "debug" ];
then
TV3=test3_yes;
echo $$TV3;
else
TV3=test3_no;
fi
总结:
上述的shll命令体现了:if then 、 for i in、makefile语法则有ifeq
shll脚本单条语句有;号,以""进行连接。makefile自身语法执行上不加;号。