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 是可以执行它下面的命令的。

【补充】

Makefile 隐含规则

A Simple Makefile Tutorial

GNU make

Autoconf

Link : http://www.cnblogs.com/farwish/p/6148023.html

[GNU] 喝一杯咖啡, 写一写 Makefile的更多相关文章

  1. [mk] 喝一杯咖啡, 写一写 Makefile

    Makefile 是 Linux 下组织程序的一个工具,它的命令是 make. (首字母M/m都可以) [Makefile] Makefile 编写的主旋律: target: [dependency] ...

  2. 西方教育骗局,终于明白精英和普通人的残酷差别!(该校流传着一个数字——4。即“4小时睡眠、4杯咖啡、GPA4.0”——要想获得满分为4分的成绩,每天只睡4个小时,困了就喝4大杯咖啡)

    2018-02-14 00:00英国/私立学校 你不知道的是:西方教育通过一个宽松的过程,偷偷完成了社会分层. 1 “中国学生真是太苦了!”我的同学李女士总是发出这样的感慨. 李女士是我中学同学,在一 ...

  3. GNU Make 学习系列一:怎样写一个简单的Makefile

    编程通常遵循一个相当简单的程序:编辑源文件,编译源代码成可执行的格式,调试结果.尽管将源代码翻译成可执行程序是常规的过程,如果做的不正确,程序员可能会浪费大量的时间去追踪问题.大多数的开发者都经历过这 ...

  4. 如何获取(GET)一杯咖啡——星巴克REST案例分析

    英文原文:How to GET a Cup of Coffee 我们已习惯于在大型中间件平台(比如那些实现CORBA.Web服务协议栈和J2EE的平台)之上构建分布式系统了.在这篇文章里,我们将采取另 ...

  5. 来杯咖啡-装饰者模式(Decorator)

    前言 上篇[观察者模式]发布已经近一个月了,个人感觉反应并不太理想,因为大家响应都不是很积极,不知是文章那里写得有问题,而且也没有人提出过有价值的改进建议,多少感觉有些失望L!因为工作繁忙,所以不可能 ...

  6. 我写了一起 Makefile(一)

    我写了一起 Makefile  陈皓 概述—— 什么是makefile?也许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作.但我认为要作一个好的和pro ...

  7. 不管你以后写不写JS,都应该学会这种思考方式

    昨天在网上看到了一篇文章说程序员写不过35这种说法,但事实上,确实并不能每个人都像我一样,在写JS中找到乐趣,就乐意写这东西直到50岁眼瞎为止. 那肯定有人要问,也许我不仅写JS写不到35,可能我连3 ...

  8. 开发(ASP.NET程序)把写代码写至最有面向对象味道

    前几天,搬房子时又拿起<重构----改善既有代码的设计>这本书来随便翻来看下,重构Refactoring在开发时,是时常也经常会使用得到. 她确实教我们怎样把写程序写简洁,清楚 好明白,好 ...

  9. Swift 函数调用到底写不写参数名

    最近真正开始学 Swift,在调用函数的时候遇到一个问题:到底写不写函数名? 我们来看两个个例子: // 1 func test(a: Int, b: Int) ->Int { return a ...

随机推荐

  1. 商品分类选择 Jquery插件

    如果想要用此插件,请加微信: DS-valeb   说 category 插件索取 效果如下: 注意,一次性加载所有数据, 只适用小量,如果量大,请根据你的可行性来决择! 数据表设计结构如下: 调用如 ...

  2. Hadoop 2.x 版本的单机模式安装

    Hadoop 2.x 版本比起之前的版本在Hadoop和MapReduce上做了许多变化,主要的变化之一,是JobTracker被ResourceManager和ApplicationManager所 ...

  3. 【申嵌视频】5-1 ubuntu下安装VMWare Tools工具

    [申嵌视频]5-1 ubuntu下安装VMWare Tools工具 适合搭建mini2440, Tiny6410, smart210,Tiny4412, NanoPC-T2, NanoPC-T3, N ...

  4. USD词汇表(USD Glossary)

    这篇文章是在学习USD的过程中龟速写成的,目的是将USD的核心设计.相关概念的说明.以及配套API整理出来,为后续进行的USD开发工作提供中文资料支持. 实际上也只有充分理解了USD设计中的每一个知识 ...

  5. Android USB ADB ATUH 验证包验证流程

    #define ADB_AUTH_TOKEN 1 #define ADB_AUTH_SIGNATURE 2 #define ADB_AUTH_RSAPUBLICKEY 3   1. 连接USB,手机发 ...

  6. HUE安装过程中的一些坑

    1. gcc: error: krb5-config:: No such file or directory 执行安装krb5-devel yum provides krb5-config 得到提示: ...

  7. 使用Microsoft.Office.Interop.Excel.dll 文件来生成excel 文件

    日常工作中经常需要将后台的数据导出成excel  格式,这里通过调用微软提供的类库来生成excel 文件. 具体是引用 了Microsoft.Office.Interop.Excel.dll 类库文件 ...

  8. python科学计算包numpy用法(一)

    numpy是python中一个用来做科学计算的包,用起来十分方便,下面是我总结的numpy的用法: 1.如何创建矩阵 创建矩阵有很多种方法,主要包括以下几种: 通过array函数创建 >> ...

  9. Linux通配符和关机命令

      通配符 | # 管道符,或者(正则) > # 输出重定向 >> # 输出追加重定向 < # 输入重定向 << # 追加输入重定向 ~ # 当前用户家目录 `` ...

  10. 傻瓜学编程之block_2

    block的实质 以一个简单的实现为列子: - (void)myBlcokTest{ void (^blk)()=^{ printf(@“beijinghuanyingni”); }; blk(); ...