Linux Makefile与Shell的问题
linux  /  管理员 发布于 6年前   139
大概只要知道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
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号