其实这里谈区别不太对, 应为makefile 语法中就包含shell 语法,比如 Makefile 的$(shell ) 函数 就是shell 语句。 而在makefile 中能用到shell 的地方就两处 1, $(shell ) 函数,2, target 语句。 Makefile 语法其实就是Makefile + shell 来实现编译控制的。
他们的语法也有一些不一样的地方:
1)通配符不一样
shell:*
Makefile:%
2)引用变量不一样
shell:$var 或者${var}
Makefile:$(var) 或者${var}
3) 变量赋值
shell: var=a 等号两边不能有空格
makefile: var = a 允许有空格
4)Makefile的每一行都是开辟一个进程来执行,所有要执行多个shell用\,来认为一行,所以多行设定变量时,里面无法传递变量
5) Makefile为了避免和shell的变量冲突,shell的变量以$$开头
PROJECT_ROOT_DIR = $(shell pwd | awk -F'/application|/base_class' '{print $$1}')
6)
条件判断if
shell:
if [ $NOW_VAR == 1 ];then
echo "var is 1"
elif [ $NOW_VAR == 2 ];then
echo "var is 2"
else
echo "var is not 1"
fi
Makefile:
NOW_DIR=$(shell pwd)
ifeq ($(NOW_VAR), 1)
NOW_DIR="in 1"
else ifeq ($(NOW_VAR), 2)
NOW_DIR="in 2"
else
NOW_DIR="in not 1 or 2"
endif
all:
echo $(NOW_DIR)
ifneq ($(NOW_VAR), 1)
endif
ifdef V
endif
ifndef V
endif
for循环
shell:
for pid in ${pids};
do
xxxxx
done
while循环
shell:
while true
do
xxxx
done
Makefile中的for循环,采用shell的for循环
file=1 2 3 4 5
all:
for name in $(file); \
do \
echo $$name; \
done