Linux Makefile与Shell的问题

大概只要知道Makefile的人,都知道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

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

一、查看启动你php的进程的用户是谁。 可以通过在命令行执行:ps -ef | grep php来看。或者在php中执行 echo exec(whoami) 来查看。centos下默认会是nobody。 nobody默认没有任何权限。 此时先自己添加一个用户和组。 /usr/sbin/groupadd xxxx/usr/sbin/user
Windows2003服务器安装及设置教程 组件安全篇,删除网页木马常用的组件,提高网站安全。
教你删除网站最新NB挂马最近发现 很多网站被挂了木马,会在页面中生成如下代码。
我们知道,匿名访问web使用系统中的“IUSR_主机名”这个用户,只要限制了这个用户的读取权限,即能限制访问者遍历服务器目录,保护服务器数据不被非法访问
nginx虚拟主机防webshell完美版,使用nginx的朋友可以参考下。
这篇文章主要介绍了linux下统计appche站点IP访问量的几种shell脚本以及执行结果