Makefile学习之路——2
讓你的makefile更專業。
在上一個Makefile所在目錄下通過touch命令創建一個clean文件,執行make clean,將發現make總是提示clean文件是最新的,而不是按我們期望的那樣對項目文件進行清楚操作。make這樣的行為,是因為它將clean當做文件來處理,在當前目錄下找到了clean文件,而且clean目標沒有任何先決條件,所以當我們要求make構建clean目標時它會認為clean文件是最新的,從而拒絕我們真正的文件清除操作。出現這種情形,是因為我們對clean目標的定義與make所理解的有出入。目錄文件名與makefile的目標名重名在現實項目中是難免的,假目標(phony target)概念的提出正是為了解決這種問題的。
假目標采用 .PHONY關鍵字來定義,注意必須是大寫字母。運用假目標之后,更改makefile并運行如下:
?
1 .PHONY: clean 2 app:main.o foo.o 3 gcc -o app main.o foo.o 4 main.o:main.c 5 gcc -o main.o -c main.c 6 foo.o:foo.c 7 gcc -o foo.o -c foo.c 8 clean: 9 rm -rf app main.o foo.o?
?
采用.PHONY關鍵字聲明一個目標之后,make并不會將其當做一個文件來處理。可以想象,由于假目標并不與文件關聯,所以每次構建假目標時它所在規則中的命令一定會被執行。拿這里的clean目標做比方,即使多次執行make clean,make每次都會執行文件清楚操作。
?
運用變量提高可維護性:
編寫專業的makefile離不開變量,通過使用變量可以使得makefile更具可維護性。
運用變量改寫第一個makefiel。
1 .PHONY: clean 2 3 CC = gcc 4 RM = rm 5 6 EXE =simple 7 OBJS =main.o foo.o 8 9 $(EXE): $(OBJ) 10 $(CC) -o $(EXE) $(OBJS) 11 main.o:main.c 12 $(CC) -o main.o -c main.c 13 foo.o:foo.c 14 $(CC) -o foo.o -c foo.c 15 clean: 16 $(RM) -rf $(EXE) $(OBJS)?
定義變量時其值可以為空,即無右值。引用變量需要采用 $(變量名)或 ${變量名} 的形式。
引入變量之后,如果需要更改編譯器,只需要更改賦值變量的地方,其實相當于C語言宏定義的作用,便于更改移植。
上面的makefile,存在目標名和先決條件名在規則中重復出現,如果目標名或先決條件發生了改變,那么得在相應的命令中跟著更改這個很麻煩,為了省去這種麻煩,我們借助于如下一些自動變量:
除了這三個自動變量外,在makefile中還可以使用其他的自動變量,后面需要使用到的時候再提及。目前simple項目用這三個變量就足夠了。
用上面的變量測試上面的Makefile,再正式介紹之前,得先介紹另外一個知識點。
?
1 .PHONY: all 2 all:first second third 3 @echo "\$$@ = $@" 4 @echo "$$^ = $^" 5 @echo "$$< = $<" 6 first second third:?
?
在Makefile中,dollar符(這個字符博客老抽風) 具有特殊的意思,如果采用echo輸出dollar,則必須用兩個連著的dollar;
對于bash shell 也有著特殊的意思,需要在? 之前加一個反斜杠”\“。
最后一行是一個只有目標的規則,如果除去它會有什么問題呢?讀者可以自己試試。?
注釋(makefile中用#表示注釋,需要注釋多行,在注釋行的末尾加上反斜杠"\",下一行也會被注釋)最后一行之后報錯如上圖。顯示沒有規則創建上述目標。因為all的先決條件決定了構建all目標之前必須先構建first ,而first如果不存在,報錯也是應該的。
采用自動變量之后運行結果的Makefile如下所示:
1 .PHONY: clean 2 3 CC = gcc 4 RM = rm 5 6 EXE =simple 7 OBJS =main.o foo.o 8 9 $(EXE): $(OBJS) 10 $(CC) -o $@ $^ 11 main.o:main.c 12 $(CC) -o $@ -c $^ 13 foo.o:foo.c 14 $(CC) -o $@ -c $^ 15 clean: 16 $(RM) -rf $(EXE) $(OBJS)
?
轉載于:https://www.cnblogs.com/yangguang-it/p/6628937.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Makefile学习之路——2的全部內容,希望文章能夠幫你解決所遇到的問題。