[GNU] 喝一杯咖啡, 寫一寫 Makefile

 

Makefile 是 Linux 下組織程序的一個工具,它的命令是 make。html

首字母M/m均可以git

 

【Makefile】github

Makefile 編寫的主旋律:shell

target: [dependency]
(TAB)[command]

 

【make】ubuntu

瞭解支持的功能和選項:工具

$ man make     # 查看完整手冊
$ make --help  # 快速查看格式和選項

 

用法示例:ui

# 指定 Makefile 文件爲 build.mk,指定 target 是 all; -s 表示不輸出任何系統提示.
$ make all -f build.mk -s

$
make [target] # 默認就是讀取 Makefile,默認 target 是文件內首個 target 

 

【流程】this

make 命令讀取 Makefile 和 target;spa

檢查 target 的依賴是否有更新,有就執行 command,沒有就提示目標文件已經是最新。code

 

一個統計 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 > $@

 

@    不在終端顯示執行的命令,等同於 make 加 -s 選項。

$@  等同於當前 target。

$^   當前 target 的全部依賴。

$<   當前 target 依賴中的第一個。

|      shell 的管道符。

>     shell 的覆蓋寫入標記。

 

【變量使用】

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

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

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

除了賦值以外,特性跟 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.

 

顯然,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

相關文章
相關標籤/搜索