[mk] 喝一杯咖啡, 写一写 Makefile
Makefile 是 Linux 下组织程序的一个工具,它的命令是 make。
(首字母M/m都可以)
【Makefile】
Makefile 编写的主旋律:
target: [dependency]
(TAB)[command]
【make】
了解支持的功能和选项:
$ man make # 查看完整手册
$ make --help # 快速查看格式和选项
用法示例:
# 指定 target 是 all; 指定 Makefile 文件为 build.mk; -s 表示不输出任何系统提示.
$ make all -f build.mk -s $ make [target] # 默认就是读取 Makefile,默认 target 是文件内首个 target
【流程】
make 命令读取 Makefile 和 target;
检查 target 的依赖是否有更新,有就执行 command,没有就提示目标文件已是最新。
一个统计 controbuter 的 Makefile:
usage = "\
Usage: make <option> authors" default:
@echo $(usage) authors:
@git log --format='%aN <%aE>' | sort -u > $@
@ 不在终端显示执行的命令,等同于 make 加 -s 选项。
$@ 等同于当前 target。
$^ 当前 target 的所有依赖。
$< 当前 target 依赖中的第一个。
| shell 的管道符。
> shell 的覆盖写入标记。
【变量使用】
引用式(=),相互影响:
jack = $(mike)
mike = $(lucy)
lucy = default:
@echo $(jack) #
@echo $(mike) #
@echo $(lucy) #
除了赋值之外,特性跟 shell 完全不一样;shell 的等号两边是不允许空格的,且不是引用式的。
展开式(:=),只取前面变量的值:
jack := $(mike)
mike := $(lucy)
lucy = 18
lucy ?= 19
bob = 20
bob += 16
default:
@echo $(jack) # 空
@echo $(mike) # 空
@echo $(lucy) # 18
@echo $(bob) # 20 16
变量为空时才进行赋值(?=).
值追加到变量末尾(+=).
【伪目标】
hello:
touch hellomake
#.PHONY: hellomake hellomake:
echo "this is hellomake target." clean:
rm -f hellomake
分析一下上面的文件:
make hello 或 make;不指定 target 默认是 hello,执行 `touch hellomake`.
make hellomake;提示 make: `hellomake' is up to date.
显然,因为存在 hellomake 这个文件的存在,make hellomake 得到了非预期效果,为了避免这类冲突,需要排除此 target 成为目标文件;
打开注释 .PHONY: hellomake 用来标示伪目标,然后再执行上面命令就是执行`rm -f hellomake`.
注意当 hellomake 文件不存在时,make hellomake 是可以执行它下面的命令的。
【补充】
Link : http://www.cnblogs.com/farwish/p/6148023.html
[mk] 喝一杯咖啡, 写一写 Makefile的更多相关文章
- [GNU] 喝一杯咖啡, 写一写 Makefile
Makefile 是 Linux 下组织程序的一个工具,它的命令是 make. (首字母M/m都可以) [Makefile] Makefile 编写的主旋律: target: [dependency] ...
- 西方教育骗局,终于明白精英和普通人的残酷差别!(该校流传着一个数字——4。即“4小时睡眠、4杯咖啡、GPA4.0”——要想获得满分为4分的成绩,每天只睡4个小时,困了就喝4大杯咖啡)
2018-02-14 00:00英国/私立学校 你不知道的是:西方教育通过一个宽松的过程,偷偷完成了社会分层. 1 “中国学生真是太苦了!”我的同学李女士总是发出这样的感慨. 李女士是我中学同学,在一 ...
- 如何获取(GET)一杯咖啡——星巴克REST案例分析
英文原文:How to GET a Cup of Coffee 我们已习惯于在大型中间件平台(比如那些实现CORBA.Web服务协议栈和J2EE的平台)之上构建分布式系统了.在这篇文章里,我们将采取另 ...
- 来杯咖啡-装饰者模式(Decorator)
前言 上篇[观察者模式]发布已经近一个月了,个人感觉反应并不太理想,因为大家响应都不是很积极,不知是文章那里写得有问题,而且也没有人提出过有价值的改进建议,多少感觉有些失望L!因为工作繁忙,所以不可能 ...
- 不管你以后写不写JS,都应该学会这种思考方式
昨天在网上看到了一篇文章说程序员写不过35这种说法,但事实上,确实并不能每个人都像我一样,在写JS中找到乐趣,就乐意写这东西直到50岁眼瞎为止. 那肯定有人要问,也许我不仅写JS写不到35,可能我连3 ...
- 开发(ASP.NET程序)把写代码写至最有面向对象味道
前几天,搬房子时又拿起<重构----改善既有代码的设计>这本书来随便翻来看下,重构Refactoring在开发时,是时常也经常会使用得到. 她确实教我们怎样把写程序写简洁,清楚 好明白,好 ...
- 我写了一起 Makefile(一)
我写了一起 Makefile 陈皓 概述—— 什么是makefile?也许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作.但我认为要作一个好的和pro ...
- Swift 函数调用到底写不写参数名
最近真正开始学 Swift,在调用函数的时候遇到一个问题:到底写不写函数名? 我们来看两个个例子: // 1 func test(a: Int, b: Int) ->Int { return a ...
- 回写盘写速度被限速为10M左右
问题现像如下图所示: 用hd-speed等测试虚拟盘速度都能达到90M/s左右,但复制文件到虚拟盘速度最高只有10M/s 原因:由于客户机开机加载这个随机驱动和随机进程后,会对磁盘启动进程等有扫描检查 ...
随机推荐
- JS,复习
按钮,倒数五秒操作练习 <input type="button" id="btn1" value="按钮(5)" disable=&q ...
- SpringMVC学习笔记(四)
一.Controller接受网页参数. 1.使用方法的形参来接受 //使用基本类型和字符串来接受 @RequestMapping(value="/param2.do") publi ...
- SQL、Linq、lamda表达式 同一功能不同写法
一.SQL.Linq.lamda表达式 同一功能不同写法 SQL LINQ Lambda SELECT * FROM HumanResources.Employee from e in Employe ...
- 转:python中对list去重的多种方法
对一个list中的新闻id进行去重,去重之后要保证顺序不变. 直观方法 最简单的思路就是: ids = [1,2,3,3,4,2,3,4,5,6,1] news_ids = [] for id in ...
- vim使用命令
* 向前搜索当前单词 # 向后搜索当前单词 n 和 shift n(N) 向后向前跳到所匹配的单词处 C-f page down; C-b page up C-o 回到上次位置 C-i &qu ...
- 9.Mybatis一级缓存和二级缓存
所谓的缓存呢?其实原理很简单,就是在保证你查询的数据是正确的情况下,没有去查数据库,而是直接查找的内存,这样做有利于缓解数据库的压力,提高数据库的性能,Mybatis中有提供一级缓存和二级缓存. 学习 ...
- Linux 常用命令 :cd命令
ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linu ...
- 转 Microsoft's Objective-C tech started on BlackBerryOS, Tizen
今天看到了这个 Microsoft's Objective-C tech started on BlackBerryOS, Tizen 见原文 http://www.osnews.com/story ...
- iOS中UITableView使用总结
链接:http://www.open-open.com/lib/view/open1430008922468.html
- linux grep -I 属性
忽略大小写的查找: grep -i 'address' test.log --> address ADDRESS