http://blog.csdn.net/coofucoo/archive/2009/12/31/5113460.aspx
一下摘录Makefile中调用shell的一段
install:
-if [ ! -e xxx ]; then sudo mkdir xxx; fi
注意,将上面的if语句写到一行的话,必须在fi前面加上分号,否则会出现下面错误
unexpected end of file
下面转一个相关文章
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!