首页 > 代码库 > [mk] 喝一杯咖啡, 写一写 Makefile

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

 

Makefile 是 Linux 下组织程序的一个工具,它的命令是 make。

(首字母M/m都可以)

 

【Makefile】

Makefile 编写的主旋律:

target: [prerequisities]
(TAB)[command]

 

【make】

了解支持的功能和选项:

$ man make     # 查看完整手册
$ make --help  # 快速查看格式和选项

 

用法示例:

$ make -s -f build.mk all  # 指定 Makefile 文件为 build.mk,指定 target 是 all
$ make                     # 默认读取 Makefile,默认 target 是文件内首个 target

 

【流程】

make 命令读取 Makefile 和 target;

检查 target 的依赖是否有更新,有就执行 command,没有就提示目标文件已是最新。

 

一个统计 controbuter 的 Makefile:

# 原始代码:https://github.com/youzan/zan/blob/master/Makefile

usage = "\
Usage: make <option> authors"

default:
@echo $(usage)

authors:
@git log --format=%aN <%aE> | sort -u > $@

 

@    取消在终端展示命令。

$@  等价于当前 target。

$^   当前 target 的所有依赖。

$<   当前 target 依赖中的第一个。

 

【变量使用】

引用式(=),相互影响:

jack = $(mike)
mike = $(lucy)
lucy = 18

default:
    @echo $(jack) # 18
    @echo $(mike) # 18
    @echo $(lucy) # 18

 

展开式(:=),只取前面变量的值:

jack = $(mike)
mike = $(lucy)
lucy = 18

default:
    @echo $(jack) # 18
    @echo $(mike) # 18
    @echo $(lucy) # 18

 

【伪目标】

hellomake: 
    gcc -o hellomake hellomake.c func.c -I.

create:
    touch clean

#.PHONY: clean

clean:
    rm -f hellomake

分析一下上面的文件:

make,不指定 target 默认是 hellomake。

make create,执行命令 `touch clean`。

make clean,未检测到依赖变更,提示目标文件 clean 已是最新。

 

显然,make clean 得到了非预期效果,为了避免这类冲突,需要排除 target 成为目标文件;

打开注释 .PHONY: clean 用来标示伪目标 clean,请执行 clean 下面的命令。

 

【补充】

Makefile 隐含规则

A Simple Makefile Tutorial

 

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

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