7.3.2. Makefile与shell的区别
7.3.2.1. 变量引用
shell中所有引用要以$打头的变量其后要加{}, 而在Makefile中以$打头的后要加()如下
Makefile
PATH:=/opt/toolchain
SUBPATH:=$(PATH)
shell
PATH:=/opt/toolchain
SUBPATH:=${PATH}
Makefile中所有以$打头的单词都会被解释称Makefile中的变量 如果需要调用shell中的变量,都需要加上两个$符号($$),如下:
PATH=/opt/toolchain
all:
echo $(PATH) #引用的是Makefile中的变量
echo $$PATH #引用的是shell中的PATH环境变量
7.3.2.2. 通配符区别
shell中 *
表示所有字符,Makfile中 %
表示所有字符
7.3.2.3. 打印输出
在Makefile中只能在target中调用shell脚本,其他地方是不能输出的,比如如下代码没有任何输出
var="hello"
echo "$(var)"
all:
7.3.2.4. 代码片段
Makefile中执行shell,每一行都是一个进程,不同行之间变量不能传递,所以Makefile中shell不管多长也要写在一行
SUBDIR=src example
all:
@for subdir in $(SUBDIR); \
do \
echo "building "; \
done
7.3.2.5. makfile中的反引号``
反引号括起来的字符串被shell解释为命令行,执行时shell首先执行该命令行,并以它的标准输出结果取代整个反引号部分
PATH=`pwd`
TODAY=`date`
等同于
PATH=$(shell pwd)
TODAY=$(shell date)
7.3.2.6. makefile中嵌入脚本
env:
sh $(SRC_PATH)/scripts/connect.sh
find $(SRC_PATH) -name "sysinfo.cfg" | xargs rm -f
Makefile中使用shell的source命令
makefile中使用source,报错”source Command not found”
解决方法:
Makefile的默认shell是/bin/sh, 本身是不支持source的,可以将shell的默认执行程序修改为/bin/bash
SHELL:=/bin/bash