《跟我一起寫Makefile》學習筆記(二)

2021-09-11 01:30:07 字數 3833 閱讀 3131

1.規則的語法

targets : prerequisites

command

...

targets : prerequisites ; command

command

...

兩者區別:第二種command和prerequisites在同一行且用;號隔開

2.在規則中使用萬用字元

make支援三個萬用字元:「*」,「?」和「~」

3.檔案搜尋

1).vpath

特殊變數,如果沒有指明這個變數,make只會在當前的目錄中去找尋依賴檔案和目標檔案。如果定義了這個變數,那麼,make就會在當前目錄找不到的情況下,到所指定的目錄中去找尋檔案了。

vpath = src:../headers
2).vpath

關鍵字(注意,它是全小寫的),這不是變數,這是乙個make的關鍵字,這和上面提到的那個vpath變數很類似,但是它更為靈活。它可以指定不同的檔案在不同的搜尋目錄中。這是乙個很靈活的功能。它的使用方法有三種:

a、vpath pattern directories

為符合模式pattern的檔案指定搜尋目錄directories。

b、vpath pattern

清除符合模式pattern的檔案的搜尋目錄。

c、vpath

清除所有已被設定好了的檔案搜尋目錄。

vpath使用方法中的pattern>要包含「%」字元。「%」的意思是匹配零或若干字元,舉例:

vpath %.h ../headers
vpath %.c foo

vpath %.c blish

vpath %.c bar

vpath %.c foo:bar

vpath %.c blish

4.偽目標

「偽目標」並不是乙個檔案,只是乙個標籤,由於「偽目標」不是檔案,所以make無法生成它的依賴關係和決定它是否要執行。我們只有通過顯式地指明這個「目標」才能讓其生效。當然,「偽目標」的取名不能和檔名重名,不然其就失去了「偽目標」的意義了。

當然,為了避免和檔案重名的這種情況,我們可以使用乙個特殊的標記「.phony」來顯式地指明乙個目標是「偽目標」,向make說明,不管是否有這個檔案,這個目標就是「偽目標」。

舉例:

.phony : clean

clean :

rm *.o temp

all : prog1 prog2 prog3

.phony : all

prog1 : prog1.o utils.o

cc -o prog1 prog1.o utils.o

prog2 : prog2.o

cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o

cc -o prog3 prog3.o sort.o utils.o

注:一次生成多個目標

.phony : cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff

rm program

cleanobj :

rm *.o

cleandiff :

rm *.diff

注:偽目標作為依賴

5.多目標

makefile的規則中的目標可以不止乙個,其支援多目標,有可能我們的多個目標同時依賴於乙個檔案,並且其生成的命令大體類似。於是我們就能把其合併起來

bigoutput littleoutput : text.g

generate text.g -$(subst output,,$@) > $@

其中,-(su

bsto

utpu

t,

,(subst output,,

(subst

outp

ut,,

@)中的「」表示

執行乙個

make

file

的函式,

函式名為

subs

t,後面

的為引數

。這裡的

這個函式

是替換字

符串的意

思,

「」表示執行乙個makefile的函式,函式名為subst,後面的為引數。這裡的這個函式是替換字串的意思,「

」表示執行一

個mak

efil

e的函式

,函式名

為sub

st,後

面的為參

數。這裡

的這個函

數是替換

字串的

意思,「

@」表示目標的集合,就像乙個陣列,「$@」依次取出目標,並執於命令。.

6.靜態模式

語法:

: : ...
舉例:

files = foo.elc bar.o lose.o

$(filter %.o,$(files)): %.o: %.c

$(cc) -c $(cflags) $< -o $@

$(filter %.elc,$(files)): %.elc: %.el

emacs -f batch-byte-compile $<

7.自動生成依賴性

gcc -m(或-mm) 自動找尋原始檔中包含的標頭檔案,並生成乙個依賴關係

我們可以寫出[.c]檔案和[.d]檔案的依賴關係,並讓make自動更新或自成[.d]檔案,並把其包含在我們的主makefile中,這樣,我們就可以自動化地生成每個檔案的依賴關係了。

%.d: %.c

@set -e; rm -f $@; \

$(cc) -m $(cppflags) $< > $@.$$$$; \

sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \

rm -f $@.$$$$

這個規則的意思是,所有的[.d]檔案依賴於[.c]檔案,「rm -f @」的

意思是刪

除所有的

目標,也

就是[.

d]檔案

,第二行

的意思是

,為每個

依賴檔案

「@」的意思是刪除所有的目標,也就是[.d]檔案,第二行的意思是,為每個依賴檔案「

@」的意思是

刪除所有

的目標,

也就是[

.d]文

件,第二

行的意思

是,為每

個依賴文

件「<」,也就是[.c]檔案生成依賴檔案,「@」表

示模式「

@」表示模式「%.d」檔案,如果有乙個c檔案是name.c,那麼「%」就是 「name」,「

@」表示模式

「$$$」意為乙個隨機編號,第二行生成的檔案有可能是「name.d.12345」,第三行使用sed命令做了乙個替換,關於sed命令的用法請參看相關的使用文件。第四行就是刪除臨時檔案。

接下來,我們就要把這些自動生成的規則放進我們的主makefile中。我們可以使用makefile的「include」命令,來引入別的makefile檔案

sources = foo.c bar.c

include $(sources:.c=.d)

跟我一起寫 Makefile

概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...

跟我一起寫 Makefile

概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...

跟我一起寫 Makefile

跟我一起寫 makefile 陳皓 概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果...