makefile 中支持這四個命令:make,make install ,make clean和make uninstall

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命令就能夠搞定了,過程是複製,加權限,更新時間戳。

相關文章
相關標籤/搜索