一、構建多個目標
有時候,我們想要在乙個makefile中生成多個單獨的目標檔案,或者將多個命令放在一起,比如,在下面的示例mymakefile3中我們將新增乙個clean 選項來清除不需要的目標檔案,然後用install選項將生成的應用程式移動到另乙個目錄中去。這個makefile跟前面的mymakefile較為相似,不同之處筆者用黑體加以標識:
all: main
# 使用的編譯器
cc = gcc
# 安裝位置
instdir = /usr/local/bin
# include檔案所在位置
include = .
# 開發過程中所用的選項
cflags = -g -wall –ansi
# 發行時用的選項
# cflags = -o -wall –ansi
main: main.o f1.o f2.o
$(cc) -o main main.o f1.o f2.o
main.o: main.c def1.h
$(cc) -i$(include) $(cflags) -c main.c
f1.o: f1.c def1.h def2.h
$(cc) -i$(include) $(cflags) -c f1.c
f2.o: f2.c def2.h def3.h
$(cc) -i$(include) $(cflags) -c f2.c
clean:
-rm main.o f1.o f2.o
install: main
@if [ -d $(instdir) ]; \
then \
cp main $(instdir);\
chmod a+x $(instdir)/main;\
chmod og-w $(instdir)/main;\
echo 「installed in $(instdir)「;\
else \
echo 「sorry, $(instdir) does not exist」;\
fi在這個makefile中需要注意的是,雖然這裡有乙個特殊的目標all,但是最終還是將main作為目標。因此,如果執行make命令時沒有在命令列中給出乙個特定目標的話,仍然會編譯連線main程式。
其次要注意後面的兩個目標:clean和install。目標clean沒有依賴模組,因為沒有時間標記可供比較,所以它總被執行;它的實際意圖是引出後面的rm命令來刪除某些目標檔案。我們看到rm命令以-開頭,這時即使表示make將忽略命令結果,所以即使沒有目標供rm命令刪除而返回錯誤時,make clean依然繼續向下執行。
接下來的目標install依賴於main,所以make知道必須在執行安裝命令前先建立main。用於安裝的指令由一些shell命令組成。
因為make呼叫shell來執行規則,並且為每條規則生成乙個新的shell,所以要用乙個shell來執行這些命令的話,必須新增反斜槓,以使所有命令位於同乙個邏輯行上。這條命令用@開頭,表示在執行規則前不會向標準輸出列印命令。
為了安裝應用程式,目標install會一條接一條地執行若干命令,並且執行下乙個之前,不會檢查上一條命令是否成功。若想只有當前面的命令取得成功時,隨後的命令才得以執行的話,可以在命令中加入&&,如下所示:
@if [ -d $(instdir) ]; \
then \
cp main $(instdir) &&\
chmod a+x $(instdir)/main && \
chmod og-w $(instdir/main && \
echo 「installed in $(instdir)「 ;\
else \
echo 「sorry, $(instdir) does not exist」 ; false ; \fi
這是shell的「與」指令,只有當在前的命令成功時隨後的命令才被執行。這裡不必關心前面命令是否取得成功,只需注意這種用法就可以了。
要想在/usr /local/bin目錄安裝新命令必須具有特權,所以呼叫make install命令之前,可以讓makefile使用乙個不同的安裝目錄,或者修改該目錄的許可權,或切換到root使用者。如下所示:
$ rm *.o main
$ make -f mymakefile3
gcc -i. -g -wall -ansi -c main.c
gcc -i. -g -wall -ansi -c f1.c
gcc -i. -g -wall -ansi -c f2.c
gcc -o main main.o f1.o f2.o
$ make -f mymakefile3
make: nothing to be done for 『all』.
$ rm main
$ make -f mymakefile3 install
gcc -o main main.o f1.o f2.o
installed in /usr/local/bin
$ make -f mymakefile3 clean
rm main.o f1.o f2.o
$讓我們對此作一簡單介紹,首先刪除main和所有目標檔案程式,由於將all作為目標,所以make命令會重新編譯main。當我們再次執行make命令時,由於main是最新的,所以make什麼也不做。之後,我們刪除main程式檔案,並執行make install,這會重新建立二進位制檔案main並將其複製到安裝目錄。最後,執行make clean命令,來刪去所有目標程式。
深入學習Make命令和Makefile(上)(1)
make是linux下的一款程式自動維護工具,配合makefile的使用,就能夠根據程式中模組的修改情況,自動判斷應該對那些模組重新編譯,從而保證軟體是由最新的模組構成。本文分為上下兩部分,我們將緊緊圍繞make在軟體開發中的應用展開詳細的介紹。深入學習make命令和makefile 下 一 都是原...
深入學習Make命令和Makefile(上) 3
五 makefile中的規則 除了指明目標和模組之間的依賴關係之外,makefile還要規定相應的規則來描述如何生成目標,或者說使用哪些命令來根據依賴模組產生目標。就上例而言,當make程式發現需要重新構建f1.o的時候,該使用哪些命令來完成呢?很遺憾,到目前為止,雖然make知道哪些檔案需要更新,...
深入學習Make命令和Makefile(下) 3
三 字尾規則 前面我們已經看到,有些內部規則會根據檔案的字尾 相當於windows系統中的副檔名 來採取相應的處理。換句話說,這樣當make見到帶有一種字尾的檔案時,就知道使用哪些規則來建立乙個帶有另外一種字尾的檔案,最常見的是用以.c結尾的檔案來建立以.o結尾的檔案,即把原始檔編譯成目標程式,但是...