您的位置:首页 > 运维架构 > Shell

Makefile和shell配合使用

2010-01-20 17:27 260 查看
Makefile



Shell


的问题



大概只要知道
Makefile

的人,都知道
Makefile

可以调用
Shell

脚本。但是在实际使用时,并不那么简单,一些模棱两可的地方可能会让你抓狂。你若不信,可以先看几个例子,想象一下这些这些例子会打印什么内容,记下你想象的结果,然后在计算机上运行这些例子,对照看一下。

示例一:

if [ "$(BUILD)" = "debug" ]; then
echo "build debug"; else echo "build release"; fi

all:

echo "done"

示例二:

all:

@CC=arm-linux-gcc

@echo $(CC)

示例三:

CC=arm-linux-gcc

all:

@echo $(CC)

示例四:

SUBDIR=src example

all:

@for subdir in $(SUBDIR); /

do/

echo "building " $(subdir); /

done

说明:



1.

Shell

脚本在
target

里才有效,其它地方都被忽略掉了。所以示例一中,
”build debug”

之类的字符串根本打印不出来。示例一的正确写法是:

示例一:

all:

if [ "$(BUILD)" = "debug" ]; then
echo "build debug"; else echo "build release"; fi

echo "done"

2.

make

把每一行
Shell

脚本当作一个独立的单元,它们在单独的进程中运行。示例二中,两行
Shell

脚本在两个莫不相干的进程里运行,第一个进程把
CC

设置为
arm-linux-gcc

,第二个进程是不知道的,所以打印的结果自然不是
arm-linux-gcc

了。示例二的正确写法是:

示例二:

all:

@CC=arm-linux-gcc; echo $(CC)

或者:

all:

@CC=arm-linux-gcc; /

echo $(CC)

3.

make

在调用
Shell

之前先进行预处理,即展开所有
Makefile

的变量和函数。这些变量和函数都以
$

开头。示例三中,
Shell

拿的脚本实际上是
echo arm-linux-gcc

,所以打印结果正确。

4.

make

预处理时,所有以
$

开头的,它都不会放过。要想引用
Shell

自己的变量,应该以
$$

开头。另外要注意,
Shell

自己的变量是不需要括号的。示例四的正确写法是:

示例四:

SUBDIR=src example

all:

@for subdir in $(SUBDIR); /

do/

echo "building " $$subdir; /

done

感谢,Thanks!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: