学习自狄泰软件学院唐佐临老师Makefile课程,文章中图片取自老师的PPT,仅用于个人笔记。
实验1 :ifneq 比较两个变量是否相等,makefile 中 命令前可以用 Tab 键,但是条件判断语句前不允许用 Tab键!!!只能用空格键!!!!
.PHONY : test
var1 := A
var2 := $(var1)
# makefile 允许定义空值变量
var3 :=
test:
#注意 ifeq ($(var1),$(var2)) 不是命令,是条件判断语句,makefile 中 命令前可以用 Tab 键,但是条件判断语句前不允许用 Tab键!!!只能用空格!!!!
ifeq ($(var1),$(var2))
#可执行命令 前面可以用Tab键
@echo "var1 == var2"
else
@echo "var1 != var2"
endif
mhr@ubuntu:~/work/makefile1$
mhr@ubuntu:~/work/makefile1$ make
var1 == var2
mhr@ubuntu:~/work/makefile1$
实验2:ifneq 比较变量和一个空参数即常量空值,makefile 中 命令前可以用 Tab 键,但是条件判断语句前不允许用 Tab键!!!只能用空格键!!!!
.PHONY : test
var1 := A
var2 := $(var1)
var3 :=
test:
#比较变量和一个空参数即常量空值
ifneq ($(var2),)
@echo "var2 is NOT empty"
else
@echo "var2 is empty"
endif
mhr@ubuntu:~/work/makefile1$
mhr@ubuntu:~/work/makefile1$ make
var2 is NOT empty
mhr@ubuntu:~/work/makefile1$
实验3
ifdef 判断 变量是否有值
ifndef 判断 变量是否为空值
.PHONY : test
var1 := A
var2 := $(var1)
var3 :=
test:
#判断 var2是否定义了值
ifdef var2
@echo "var2 is NOT empty"
else
@echo "var2 is empty"
endif
#判断 var2是否定义了值
ifndef var3
@echo "var3 is empty"
else
@echo "var3 is NOT empty"
endif
mhr@ubuntu:~/work/makefile1$
mhr@ubuntu:~/work/makefile1$ make
var2 is NOT empty
var3 is empty
mhr@ubuntu:~/work/makefile1$
mhr@ubuntu:~/work/makefile1$
实验4
.PHONY : test
#变量的普通赋值
var1 :=
var2 := $(var1)
#变量的递归赋值,make解释器在预处理即加载makefile 的时候,
var3 =
var4 = $(var3)
#var3 = 3
test:
ifdef var1
@echo "var1 is defined"
else
@echo "var1 is NOT defined"
endif
ifdef var2
@echo "var2 is defined"
else
@echo "var2 is NOT defined"
endif
ifdef var3
@echo "var3 is defined"
else
@echo "var3 is NOT defined"
endif
ifdef var4
@echo "var4 is defined"
else
@echo "var4 is NOT defined"
endif
mhr@ubuntu:~/work/makefile1$ make
var1 is NOT defined
var2 is NOT defined
var3 is NOT defined
var4 is defined
mhr@ubuntu:~/work/makefile1$
打印结果很奇怪 var1 2 都正确的识别到了是空值 是未定义的,var3也是别到了是未定义的,但是 var4却没有被识别到时空值,明明是被 var3递归赋值的啊,应该和var3一样才对啊。答案是这样的,var3 var4采用的是递归赋值的方式,这意味着make解释器在加载makefile 的时候,根本就不能判断出 var4的值应该是什么,make 解释器只知道 var3是没有值的,但是他无法判断var4是不是有值的,要等到执行这个makefile的时候才知道,make解释器认为 在递归赋值的情况之下, var4 = $(var3) 这样写,var4是被定义了具体值的,