标签:
参考:http://blog.csdn.net/wanglang3081/article/details/49423105
(1)Makefile本质上来讲也是shell脚本,即每条command都是shell进程,运行完shell进程都会退出。
(2)shell代码行,如果有=的话,=两边不能有空格
(3)Makefile中的shell,每一行是一个进程,不同行之间变量值不能传递。所以,Makefile中的shell不管多长也要写在一行。可以用\来分行写,格式更清晰一点。
SUBDIR=src example all: @for subdir in $(SUBDIR); / // 这里往下是一行shell do/ echo "building " $$subdir; / done
(4) Makefile中的变量以$开头,使用$(VAR)或${VAR}来引用变量的定义。 所以,为了避免和shell的变量冲突,shell的变量以$$开头。
注意:Makefile中在对一些简单变量的引用,我们也可以不使用“()”和“{}”来标记变量名,而直接使用“$x”的格式来实现,此种用法仅限于变量名为单字符的情况。另外自动化变量也使用这种格 式。对于一般多字符变量的引用必须使用括号了标记,否则make将把变量名的首字母作为作为变量而不是整个字符串(“$PATH”在Makefile中实际上是“$(P)ATH”)。这一点和shell中变量的引用方式不同。shell中变量的引用可以是“${xx}”或者“$xx”格式。但在Makefile中多字符变量名的引用只能是“$(xx)”或者“${xx}”格式。
CU_PROJECT_NAME := $(shell pwd |awk -F "/" ‘{print $$NF}‘ )
(5)在Makefile中只能在target中调用Shell脚本,其他地方是不能输出的。比如如下代码就是没有任何输出。
VAR="Hello" echo "$(VAR)" all: .....
只要下面的才有输出
VAR="Hello" all: echo "$(VAR)" .....
(6)在Makefile中执行shell命令,一行创建一个进程来执行。这也是为什么很多Makefile中有很多行的末尾都是“; \”,以此来保证代码是一行而不是多行,这样Makefile可以在一个进程中执行。
for file in $(SRC_FILE); do gcov -b "$$file"; done
(7)Makefile中所有以$打头的单词都会被解释成Makefile中的变量。如果你需要调用shell中的变量(或者正则表达式中锚定句位$),都需要加两个$符号($$)。
PATH="/data/" all: echo ${PATH}/*Makefile中变量,即"/data"*/ echo $$PATH /*shell中的变量*/
标签:
原文地址:http://www.cnblogs.com/blue-sea-sky/p/5689181.html