我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节。让我们从一个简单的makefile来看看。
注意makefile中一定要有一个目标,且一定要有一个终极目标,若想要有多个目标应该设立一个伪目标。如下:all: hello hello2 hello3hello: hello.c gcc ....hello2: hello2.c gcc ...hello3: hello3.c gcc ...
- shell变量定义和使用:
NAME=hello #这里一定不要有空格 hello可以加上""或'' 若定义的值有空格 则要加上"" 或 ''echo $NAME #这里使用变量时 要加上$ 也可以${ NAME} 但是不能$()这个表示执行里面的命令
- makefile中的变量定义:
HHH=hello #方式一ZZZ = hello #方式二all: echo $HHH #这样输出并不能输出HHH的值 A echo $ZZZ #同上 echo $(HHH) # 输出hello B echo $(ZZZ) # 输出hello 这里可以看到有别与shell变量定义。 echo ${HHH} # 输出hello C echo ${ZZZ} # 输出hello echo $$HHH # 输出空 #$$这种方式是shell中使用makefile中定义的变量 这是一个command line。 D echo $$ZZZ # 输出空 if [ -n "${HHH}" ];then echo "OK";fi; #这里正确输出OK E if [ -n "${ZZZ}" ];then echo "OK";fi; # 正确输出OK if [ -n "$(HHH)" ];then echo "OK";fi; # 正确输出OK H if [ -n "$(ZZZ)" ];then echo "OK";fi; # 正确输出OK if [ -n "$HHH" ];then echo "OK";fi; # 变量名不正确 J if [ -n "$ZZZ" ];then echo "OK";fi; # 变量名不正确 if [ -n "$$ZZZ" ];then echo "OK";fi; #没有输出 K if [ -n "$$HHH" ];then echo "OK";fi;#没有输出 if [ -n $$ZZZ ];then echo "OK";fi; #输出OK L if [ -n $$HHH ];then echo "OK";fi;#输出OK
我认为makefile的变量定义使用就像是c/c++中的宏的使用方式 只是替换而已
1. 情况A中:echo $HHH
是优先于第一个字符结合去找$H
变量 但是这里没有H定义 所以A这种情况 就是 echo HH
会输出HH 2. 情况BC中:正确的使用方式 3. 情况D中:变量名变为$HHH
这样的变量名为空 4. EH 中: 正确 5. J中$HHH
变为 HH 6. K 因为没有定义$HHH
这个变量 7. L 正确方式 与D的差别就是这句是shell D是command 以上是结合实际情况的个人理解 总结就是 makefile变量定义可以有空格, 使用变量时用$() 若在shell中使用makefile中定义的变量时,要使用$$
并且一定不要使用“”和‘’。