makefile中的shell编程注意点

参考:http://blog.csdn.net/wanglang3081/article/details/49423105正则表达式

(1)Makefile本质上来说也是shell脚本,即每条command都是shell进程,运行完shell进程都会退出。shell

 

(2)shell代码行,若是有=的话,=两边不能有空格ui

 

(3)Makefile中的shell,每一行是一个进程,不一样行之间变量值不能传递。因此,Makefile中的shell无论多长也要写在一行。能够用\来分行写,格式更清晰一点。spa

SUBDIR=src example

all:

    @for subdir in $(SUBDIR); /      // 这里往下是一行shell

    do/

        echo "building " $$subdir; /

    done

 

 

(4)    Makefile中的变量以$开头,使用$(VAR)或${VAR}来引用变量的定义。 因此,为了不和shell的变量冲突,shell的变量以$$开头。.net

          注意:Makefile中在对一些简单变量的引用,咱们也能够不使用“()”和“{}”来标记变量名,而直接使用“$x”的格式来实现,此种用法仅限于变量名为单字符的状况。另外自动化变量也使用这种格 式。对于通常多字符变量的引用必须使用括号了标记,不然make将把变量名的首字母做为做为变量而不是整个字符串(“$PATH”在Makefile中其实是“$(P)ATH”)。这一点和shell中变量的引用方式不一样。shell中变量的引用能够是“${xx}”或者“$xx”格式。但在Makefile中多字符变量名的引用只能是“$(xx)”或者“${xx}”格式。code

CU_PROJECT_NAME := $(shell pwd |awk -F "/" '{print $$NF}' )

 

(5)在Makefile中只能在target中调用Shell脚本,其余地方是不能输出的。好比以下代码就是没有任何输出。blog

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中的变量(或者正则表达式中锚定句位$),都须要加两个$符号($$)。get

PATH="/data/"

all:
    echo ${PATH}/*Makefile中变量,即"/data"*/
    echo $$PATH /*shell中的变量*/
例子中的第一个${PATH}引用的是Makefile中的变量,而不是shell中的PATH环境变量,后者引用的事Shell中的PATH环境变量。
相关文章
相关标签/搜索