小知识:Linux Makefile与Shell的问题

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

示例一:
复制代码 代码如下:

if [ “$(BUILD)” = “debug” ]; then  echobuild 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
声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Linux telnet命令的使用

2023-5-7 8:17:31

建站知识

小知识:Linux使用shell脚本定时删除历史日志文件

2023-5-7 8:33:59

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索