日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

GNU Make 簡介( 五 )



3.1 例子

foo.o : foo.c defs.h# module for twiddling the frobs
cc -c -g foo.c

它的目標是"foo.o",依賴于"foo.c"和"defs.h",有一個命令"cc -c -g foo.c" 。命令行以TAB 字符開始標識它是一個命令 。

這條規(guī)則說明兩件事:如何決定"foo.o"是舊的:如果它不存在,或者"foo.c"或者"defs.h"比它新 。如何更新"foo.o"文件:通過運行"cc"程序 。命令未提及"defs.h",但可以猜想"foo.c"包含了它,這是"defs.h"被置于依賴關(guān)系中的理由 。

3.2 規(guī)則的語法

語法如下:
TARGETS : DEPENDENCIES
COMMAND
...
或者
TARGETS : DEPENDENCIES ; COMMAND
COMMAND
...

TARGETS 是以空格隔開的文件名,統(tǒng)配符可以使用 。通常一個規(guī)則只有一個目標,偶爾也有多個 。命令行以TAB 鍵開始 。第一條命令可在依賴關(guān)系的下一行;或者在同一行,在分號后面;兩種方式效果相同 。

因為"$"符號被用做變量引用,如果要在規(guī)則中使用"$"符號,必須寫兩個:"$$" ??梢杂?"符號來分割一個長行,這不是必須的,因為make 對行的長度沒有限制 。

3.3 通配符

規(guī)則中的文件名可以包含統(tǒng)配符,如"*","?" 。文件名前的字符"~"有特殊的含義 。單獨使用,或跟隨一個"/",代表用戶的home 目錄,比如"~/bin"擴展為/home/you/bin";如果"~"跟隨一個單詞,表示單詞指示的那個用戶的home 目錄,如"~john/bin"擴展為"/home/john/bin" 。通配符在目標,依賴關(guān)系,命令中自動擴展,其它情況下,統(tǒng)配符的擴展除非顯式使用"wildcard"函數(shù) 。通配符的特殊意義可以使用""符號關(guān)閉 。

例子:
clean:
rm -f *.o

print: *.c
lpr -p $?
touch print

通配符在定義變量時并不擴展,例如:objects = *.o 則objects 的值是字符串"*.o";但是如果你將objects 用于目標,依賴或命令中,擴展會進行 。要將objects 設(shè)置成擴展過的內(nèi)容,使用:objects := $(wildcard *.o)

3.3.1 通配符的缺陷

這是一個使用通配符的例子,但結(jié)果不是你所期望的 。假設(shè)可執(zhí)行文件"foo" 是從當前目錄中的所有".o"文件生成的:

objects = *.o
foo : $(objects)
cc -o foo $(CFLAGS) $(objects)
objects 變量的值是字符串"*.o" 。通配符擴展在規(guī)則"foo"中進行,于是所有存在的".o"文件成為"foo"的依賴而且在需要時重新編譯 。

但如果刪除了所有的".o"文件呢?當通配符不匹配任何文件時,一切都保持原樣:則"foo"依賴于一個叫做"*.o"的文件;由于這個文件不大可能存在,"make"程序會報告一個無法生成"*.o"文件的錯誤,這不是期待的結(jié)果 。實際上可以用通配符獲得期望結(jié)果,但是需要復(fù)雜的技術(shù),包括"wildcard"函數(shù)和字符串替換函數(shù) 。

3.3.2wildcard 函數(shù)

通配符自動在規(guī)則中進行 。但是在變量賦值的和函數(shù)的參數(shù)中通配符不會擴展,如果在這些情況下需要通配符擴展,必須使用"wildcard"函數(shù) 。語法如下:

$(wildcard PATTERN...)

這個在makefile 任何地方出現(xiàn)的字符串,會被匹配任何一個文件名格式的以空格隔開的現(xiàn)有文件列表替換 。如果沒有任何文件匹配一個模式,這個模式從"wildcard"的輸出中忽略,注意,這和上述的通配符的處理是不一樣的 。"wildcard"函數(shù)的一個功能是找出目錄中所有的".c"文件:$(wildcard *.c),可以通過替換后綴".c"為".o"從C 文件列表得到目標文件的列表:

$(patsubst %.c,%.o,$(wildcard *.c))

這樣,上節(jié)中的makefile 改寫為:

objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)

這個makefile 利用了編譯C 程序的隱含規(guī)則,所以不需要對編譯寫出顯式的規(guī)則 。(":="是"="的一個變體)

推薦閱讀