在makefile中执行shell

在makefile中执行shell需要注意


1 执行的时候一行就是一个shell。所以一个完整的shell命令必须在一行之内,因此要用\连接起来。

比如

if [ "$(obj)X" = "fsX" ]; then \
echo "ONE1 $(KBUILD_BUILTIN)"; \
echo "ONE2 $(builtin-target)"; \
echo "ONE3 $(lib-target)"; \
echo "ONE4 $(extra-y)"; \
echo "ONE5 $(subdir-ym)"; \
echo "ONE6 $(always)"; \
fi

在shell命令的一行末尾一般可以看到 ;\   

每一个完毕的shell之后最好用;结尾。不然容易出现各种问题


比较时不能用==,需要用= (这里还是有点疑问)


2由于shell命令一般有点长。最好采用命令定义和执行分开的形式。

比如

定义

shellcmd=if [ "$(obj)X" = "fsX" ]; then \

echo "ONE1 $(KBUILD_BUILTIN)"; \
echo "ONE2 $(builtin-target)"; \
echo "ONE3 $(lib-target)"; \
echo "ONE4 $(extra-y)"; \
echo "ONE5 $(subdir-ym)"; \
echo "ONE6 $(always)"; \
fi


执行

$(shellcmd)

这样比较清楚



3 shell传递变量。

如果是一个$符号,传递的是Makefile中的变量

如果是两个$。传递的是shell中的变量。

比如Makefile中有

data=1 (E)
all:
@echo ${data}; (A)
@data=2; (B)
@echo ${data}; (C)
@echo $${data}; (D)

(A)输出 1

(B)是一个单独的shell行,定义了data=1,不会影响到makefile中的data (E)的变量。

(C)输出1 ,因为B的修改是修改的shell里面的变量。不是makefile中的

(D)输出空行 Makefile中的echo $$data 等于shell里面执行 echo $data,由于这一行的shell data是没有定义的,所以输出空行,(B)的定义和(D)不是同一个shell。


可以用 \将不同行的连接为同一个shell


data=1 (E)
all:
@echo ${data}; (A)
@data=2; \ (B)
echo ${data}; \ (C)
echo $${data}; (D)

(A) 输出1,也即是(E)

(B) (C) (D)用\连接起来。所以属于同一个shell

(C)输出的还是1(E)。

(D)输出的是2.也就是(B),因为他们属于同一个shell。echo $${data} 交给shell解释的时候变成了 echo ${data}。此时${data}是B的2。






你可能感兴趣的:(GNU,MAKE)