,,,,,,,,我们之前说过makefile是一种脚本语言程序,那么程序便会有相应的语法。在makefile中支持条件判断语句,值。需要注意的是:。格式如下
,,,,,,,,条件判断语句的语法如下
,,,,,,,,那么在makefile中都有哪些的条件判断关键呢?
<强> 强> <强> 强> <强> 强> >强,相等为真的,否则为假<强> 强> >强,不相等为真的,否则为假
<强> 强> >强,有值为true,否则为假<强> 强> >强,没有值为true,否则为假
,,,,,,,,下来我们还是以代码为例来进行说明
.PHONY :测试 var1 :=, var2 :=, $ (var1) var3 :=时间:test ,,,ifeq ((var1),美元(var2)) ,,,,,,,@echo “var1 ==, var2" ,,, ,,,,,,,@echo “var1 !=, var2" ,,endif ,,,ifneq ($ (var2)) ,,,,,,,@echo “var2 is NOT empty" ,,, ,,,,,,,@echo “var2 is empty" ,,endif ,,,ifdef var2 ,,,,,,,@echo “var2 is NOT empty" ,,, ,,,,,,,@echo “var2 is empty" ,,endif ,,,ifndef var3 ,,,,,,,@echo “var3 is empty" ,,, ,,,,,,,@echo “var3 is NOT empty" ,,,endif
,,,,,,,,我们来看看编译结果
,,,,,,,,我们看到编译出错了,原因就是因为ifeq是规则而不是命令,所以它前面一定是空格而不是Tab键。下来我们换成空格来看看
,,,,,,,,我们看到编译已经通过了,而且也正常运行结束。变量var2就取的是变量var1的值,因此在第一个它们的比较相等时肯定会输出相等;第二个用var2和空字符进行比较,那么var2肯定不为空;第三个就直接用ifdef关键字来进行判断var2是否存在了;最后一个var3肯定为空了,根据一些前辈们的经验,总结以下的几条规则:
,,,,,,,,那么我们来看看下面的代码输出相同吗?
.PHONY : te var1 :=, var2 :=, $ (var1) 时间=var3 时间=var4 $ (var3) 时间:test ,,,ifdef var1 ,,,,,,,@echo “var1 is defined" ,,, ,,,,,,,@echo “var1 is NOT defined" ,,endif ,,,, ,,,ifdef var2 ,,,,,,,@echo “var2 is defined" ,,, ,,,,,,,@echo “var2 is NOT defined" ,,endif ,,,ifdef var3 ,,,,,,,@echo “var3 is defined" ,,, ,,,,,,,@echo “var3 is NOT defined" ,,endif ,,,, ,,,ifdef var4 ,,,,,,,@echo “var4 is defined" ,,, ,,,,,,,@echo “var4 is NOT defined" ,,,endif
,,,,,,,,我们看着两个没啥差别,结果应该是一样的,都是输出的是空的。我们来看看编译结果
,,,,,,,,那么我们看到前三个是空的,var4竟然不为空。我们来仔细看下,在var1和var2的定义中都是直接赋值(=);而var3和var4是递归赋值(=)。在编译器看来var4是有值的,只不过在编译阶段不确定它的值究竟是什么而已。我们在下面加上var3=A,给var3一个具体的值,试试看效果是不是一样的。
,,,,,,,,效果是一样的。因此我们在makefile中不推荐递归赋值的这种写法,容易造成误解。通过对条件判断语句的学习,总结如下: