1.makefile文件的主要結構簡介:linux
makefile文件裏面主要有三種內容:shell
1.變量聲明:工具
變量聲明就是一種基本的嚴格字符替換的操做。ui
好比在前面聲明瞭:objects=program.o foo.o utils.o翻譯
那麼在後面出現的全部$(objects)或者${objects}都會被自動替換成上面的那個字符序列,並且是嚴格替換,即不帶空格的。blog
2.映射法則繼承
3.命令:get
映射法則和命令一般都是聯合起來組成這樣的結構形式:emacs
target... : prerequisites..it
command
能夠簡單地理解爲經過prerequisites,也就是先決的依賴文件,採起後面描述的相應的命令(這裏的命令都是linux裏的shell命令)command以後(通常是)生成了文件target。命令的前面都要按如下tab建留一段空白來表示它是命令。
有的target後面並無先決條件,也就是後面的命令是無條件執行的。
這個結構總的做用就是告訴make,target是否是out of date,具體視它的依賴文件而定,target不存在也視爲out of date。而後就是若是過時了,那麼更新,就是運行下面的命令來更新。
2.前面那篇文章emacs中咱們創建了兩個makefile文件,可是是空的,尚未任何內容。如今咱們填上以下內容:(這個是一個最簡單的例子,不過是一個不錯的入門。)
在/project/hello的主目錄下面的makefile文件的內容以下:
prefix = /usr/local
exec_prefix = $(prefix)
bindir = $(exec_prefix)/bin
export prefix
export exec_prefix
export bindir
all clean install uninstall :
cd src && $(MAKE) $@
.PHONY: all clean install uninstall
在/project/hello/src目錄下面的makefile文件內容以下:
all: hello
hello: main.c
$(CC) -o $@ main.c
clean:
rm hello
install:
install -d $(bindir)
install -m 0755 hello $(bindir)
uninstall:
rm $(bindir)/hello
.PHONY: all clean install uninstall
咱們等下詳細說明,先看下運行狀況:
如今makefile支持這四個命令:make,make install ,make clean和make uninstall。
咱們從上圖能夠看出能夠直接從終端調用咱們生成的程序hello,而後返回「hello,the world!」。
首先咱們看主目錄下的makefile文件,前面那部分是變量聲明,這個等下還會說到。而後是export 變量,這個就是主目錄下的主makefile文件可使用這個命令,意思是將變量和子一級目錄下的makefile共享。
而後咱們看到
all clean install uninstall :
cd src && $(MAKE) $@
.PHONY: all clean install uninstall
這其實是一個跳轉結構,首先介紹下.PHONY是個什麼意思,前面說了每個target默認都是一個待生成文件,可是.PHONY:後面跟着的target的意思是這些target不用生成文件。那麼總的來講這裏的all,clean,install,uninstall在這裏是些沒有依賴文件的不用生成最終target文件的執行命令了。這些執行命令就是前面說的make,make install ,make clean和make uninstall。make的意思實際上就是make all,這兩個命令是沒有區別的。
而後咱們看到命令,cd src這個很容易理解,就是跳轉到src目錄中去了。而後&&符號的意思是邏輯與,即前一命令執行完以後再執行後面的命令。然後面的$(MAKE)多是一個具備系統默認值的變量,在這裏應該就是make。而$@符號的意思則是指代當前的target。好比說我如今make clean ,那麼命令最終就成了這個樣子:
cd src &&make clean
而後下一個make clean的命令其實是對src子目錄下的makefile文件說的,咱們看到這裏簡單的:
clean:
rm hello
即把生成的可執行文件hello刪掉便可。
而後咱們再來看子目錄下那個makefile文件如何處理make all 命令:
all: hello
hello: main.c
$(CC) -o $@ main.c
咱們看到,這裏首先說明all依賴於hello,而後hello依賴於main.c,而要生成或者更新hello的話須要執行下面的命令:
cc -o hello main.c
上面的$(CC)也是具備系統默認值的變量,就是cc,不過在GNU/LINUX體系下可能調用的是gcc工具。後面的選項-o的意思是編譯鏈接而後生成後面的那個名字的文件。名字在這裏就是hello。
而後咱們再來看make install命令執行的狀況:
install:
install -d $(bindir)
install -m 0755 hello $(bindir)
前面說過了這個變量是繼承自主目錄makefile文件中的定義,而後翻譯出來$(bindir)就是/usr/local/bin。linux系統在終端能夠直接調用的命令存放點有兩個位置,另外的一個是/usr/bin。/usr/local文件夾內部的結構和/usr內部的結構很是類似。彷佛講起來/usr是供系統內部的軟件使用的空間,但這個規矩並非死的。
uninstall命令咱們看到就是一個刪除對應位置hello文件的操做。因此如今就把linux中的install命令講講就能夠了。
第一個install命令接着-d的選項的意思就是目錄確認,在這裏我以爲有點多餘。
第二個install命令接着-m的選項的意思就是把hello複製到指定的目錄中去,而後相應文件也就是hello文件的權限設置成爲0755.關於權限我以爲在這裏彷佛也沒有什麼好說的。在這裏用第二個install命令就能夠搞定了,過程是複製,加權限,更新時間戳。