Makefile与Shell的问题
转自:http://blog.csdn.net/absurd/archive/2006/03/23/636418.aspx
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 |
转载于:https://www.cnblogs.com/itech/archive/2009/08/10/1542917.html
Makefile与Shell的问题相关推荐
- Makefile和shell脚本调用上的一些总结
大家都知道在Makefile可以调用shell脚本,但是Makefile和shell脚本是不同的.本文试着介绍一下Makefile和shell脚本的不同. 1.在Makefile中只能在target中 ...
- Makefile与shell脚本区别
在Makefile可以调用shell脚本,但是Makefile和shell脚本是不同的.本文试着归纳一下Makefile和shell脚本的不同. 1. shell中所有引用以$打头的变量其后要加{}, ...
- 【Makefile】Makefile与shell命令为何总是藕断丝连?
博主最近在项目实践过程中,需要深度定制项目的Makefile,其中有些复杂的流程必须得借助shell脚本才能高效地完成,为此博主特意深入学习了在Makefile种调用shell命令的方法. 大家都知道 ...
- Makefile和Shell学习笔记
Makefile makefile定义了一系列的规则来指定文件的编译过程和一些复杂的功能操作.makefile带来的好处就是--"自动化编译",通过make命令,整个工程完全自动编 ...
- makefile 和shell文件相互调用
shell 文件内调用makefile文件: #!/bin/bash cd ctemplate-2.1 ./configure sudo make -f install cd ../ cd Templ ...
- Makefile文件和shell脚本
1.在Makefile中只能在target中调用Shell脚本,其他地方是不能输出的.比如如下代码就是没有任何输出: VAR="Hello" echo "$VAR&quo ...
- makefile中的shell调用---注意事项
在之前一次编写makfile时候,有看到相关的makefile中使用$$来引用变量,而且尝试后发现$$使用居然和${}有类似的功能.当时也没具体追究相关的用法,当然刚才所说的都是错误的观念 $$:在m ...
- Linux Shell Tips小技巧
文章目录 sed 指定行 删除文本 替换文本 小技巧 查找N天内修改文件 Shell写R语言 makefile写shell bad interpreter错误 替换换行符为空格 压缩并打包目录 重定向 ...
- GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读
自己写的bootloader可以引导kernel了,我以为曾经神秘的u-boot代码将变得毫无挑战,然事实表明u-boot作为优秀的开源代码,阅读起来还是很有挑战的,值得一读! 阅读碰到的头等问题:M ...
最新文章
- Sun公司开源游戏服务器Project Darkstar Server——(Sun game server , 简称 sgs)学习笔记(一):sgs简介...
- 一个简单的apache cgi-bin
- 学妹靠这个学会硬件开发入职华为,今天搞到100个免费名额!
- Photoshop图像修饰工具
- IntelliJ IDEA——提交代码到GitHub远程库
- 探索WebKit内核(一)------ 菜鸟起步
- iOS开发模式MVVM 2分离业务逻辑
- tomcat日志按天分割
- 《Linux运维实战:免费md5解密工具》
- 彼得林奇——如何看待股市大跌
- 孩子成长-跟同学相处
- App内嵌H5活动页面携带用户token
- 论文投稿指南——中国(中文EI)期刊推荐(第2期)
- 推荐上百本优质大数据书籍,附必读清单(大数据宝藏)
- 系统测试常用测试方法
- ubuntu16.04无法联网
- mysql中高阶玩法系列(八)
- Linux—文件系统与磁盘管理(后)
- java jurisdiction_Java Region.setJurisdiction方法代码示例
- 按以下规律将电文变成密码,将字母A变成E,a变成e,即变成其后的第四个字母
热门文章
- WPF - 资源收集
- BWA SAM文件格式
- python操作mongo(2)
- #Hive报错 WritableStringObjectInspector cannot be cast to org.apache.hadoop.hive.serde2.objectinspect
- 学习python第四天内容回顾
- Exchange 2016异地容灾系列-Exchange部署(五)
- 【Android学习笔记】设置App启动页
- iOS各平台直播SDK收费明细
- 25.怎样在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块
- 网页魔法菜单(使用说明)