1. 程式人生 > >.PHONY makefile中的偽目標

.PHONY makefile中的偽目標

我的理解:

  拿clean舉例,如果make完成後,自己另外定義一個名叫clean的檔案,再執行make clean時,將不會執行rm命令。 

  為了避免出現這個問題,需要.PHONY: clean

=======================================================================================

所謂偽目標就是這樣一個目標,它不代表一個真正的檔名,在執行make時可以指定這個目標來執行其所在規則定義的命令,有時我們將一個偽目標成為標籤。

那麼到底什麼是偽目標呢?可能作為初學者還不會在乎這個問題,下面我們來看下我們將在什麼時候需要它。

首先來看下面一個例子:

當前目錄下只有一個myls1.c,於是為了讓程式讓makefile來管理,寫了一個如下的簡單的makefile。

執行:

大家會發現,真的可以利用這個makefile管理當前的工程,也能如期按照我們的要求生成執行檔案myls。

執行make clean,這樣就可以刪除可執行程式。

接著我做了個手腳,在當前目錄下建立一個叫clean的檔案,那麼這樣執行的效果是如何?

那麼這個時候為什麼又不能執行了?在我的makefile中其實並沒有修改任何東西,為什麼這個時候已經能管理工程的makefile又不能來管理檔案了。

那要解決這個問題就是新增兩行,修改後的makefile如下:

再次返回執行:

這樣就解決了問題,那具體的原因是什麼?

在makefile中我們使用偽目標就可以解決上述的問題,那為什麼要使用偽目標,一種就是如例題,為了避免在makefile中定義的只執行命令的目標和工作目錄下的實際檔案出現名字衝突,另一種是提交執行makefile時的效率。

第一種情況:

如果我們需要書寫這樣的一個規則:規則所定義的命令不是去建立目標檔案,而是通過make命令列明確指定它來執行一些特點的命令,就像例題中的clean。當資料夾中沒有clean這個檔案的時候,我們輸入“make clean”能按照初衷執行,但是一旦資料夾中出現clean檔案,我們再次輸入“make clean”,由於這個規則沒有任何依賴檔案,所以目標被認為是最新的而不去執行規則所定義的命令。所以rm命令不會被執行。為了解決問題,我們將目標clean定義成偽目標。

也就是新增:

.PHONY:clean

那麼目錄中不論是否有clean檔案,只要輸入“make clean”就能執行rm命令了。

當一個目標被宣告為偽目標後,make在執行規則時不會去試圖去查詢隱含規則來建立它。這樣就提高了make的執行效率,也不用擔心由於目標和檔名重名了。

第二種情況:

偽目標的另一種使用場合時在make的並行和遞迴執行過程中。

給了例子:

SUBDIRS=foo bar baz
        Subdirs:
                for dir in $(SUBDIRS)
                do
                $(MAKE) –C $$dir
                done

如果這樣寫,會出現幾個問題:

1、 當子目錄執行make出現錯誤,make不會退出;

2、 使用這種shell的迴圈方式時,沒有用到make對目錄的並行處理功能。

有了偽目標就可以解決上面的兩個問題。

SUBDIRS=foo bar baz
        .PHONY:subdirs $(SUBDIRS)
        subdirs: $(SUBDIRS)
        $(SUBDIRS):
                $(MAKE) –C [email protected]

一般情況下,一個偽目標不作為另一個目標的依賴。當一個偽目標沒有作為任何目標的依賴時,我們只能通過make命令來明確指定它為make的終極目標,來執行它所在規則所定義的命令。

還有一個特別的偽目標——all,如果我們在一個目錄下建立多個可執行程式,我們可以將所有程式的重建規則在一個makefile中描述。

all: p1 p2 p3
        p1:p1.c
        p2:p2.c
        p3:p3.c

相關推薦

.PHONY makefile目標

我的理解:   拿clean舉例,如果make完成後,自己另外定義一個名叫clean的檔案,再執行make clean時,將不會執行rm命令。    為了避免出現這個問題,需要.PHONY: clean ===================================================

makefile目標的依賴該怎麼寫?

注意,這篇博文 並不是makefile的教程! 並不是makefile的教程! 並不是makefile的教程! 僅僅是在學習makefile過程中關於如何寫依賴的一個感悟。 makefile的學習文件可參考: http://download.csdn.net/detail/

Makefile目標和變數定義格式

本節我們討論一個Makefile中的一個重要的特殊目標:偽目標。 偽目標是這樣一個目標:它不代表一個真正的檔名,在執行make時可以指定這個目標來執行其所在規則定義的命令,有時我們也可以將一個偽目標稱為標籤。使用偽目標有兩點原因:1. 避免在我們的Makefile中定義的

Makefile 目標.PHONY

在接觸Makefile的時候,我們經常會看到.PHONY標記,它就是偽目標,所謂偽目標,就是指沒有真正的檔案和它對應,只是一個標識而已。make程式看到.PHONY後面的目標後就會去執行對應的命令。例如

Makefile目標

而是 一次 我們 避免 並行 重名 理解 目標 完整   本節我們討論一個Makefile中的一個重要的特殊目標:偽目標。 偽目標是這樣一個目標:它不代表一個真正的文件名,在執行make時可以指定這個目標來執行其所在規則定義的命令,有時我們也可以將一個偽目標稱為標簽。使用

makefile學習之路——目標

偽目標 makefile 由於在makefile中,make在默認情況下將目標當作是一個文件來處理,所以這裏就會出現一個情況,如果makefile中的目標是實際已經存在的文件,那麽,我們在使用makefile的時候,就會報錯。為了避免這種情況的出現,就引入了偽目標的概念。 引

makefile學習記錄3】目標的引入

通過前兩課的學習,我們知道makefile中的基本組成的元素是規則。那麼makefile中的目標究竟是什麼呢? 在預設情況下: make認為目標對應著一個檔案; make比較目標檔案和依賴檔案的新舊關係,決定是否執行命令; make以檔案處理作為第一優先順序。 make的

Makefile.PHONY的作用

一.例項 拿clean舉例,如果make完成後,自己另外定義一個名叫clean的檔案,再執行make clean時,將不會執行rm命令。   為了避免出現這個問題,需要.PHONY: c

【轉】MAKEFILE.PHONY的作用

連結如下:: https://blog.csdn.net/climbe/article/details/54925739   精華提取: 1.如果希望將生成的過程檔案刪掉,根據前面再增加一個目標clean: 2. 但是當我們make之後main2.o仍然存在,怎麼回

makefile目標理解

makefile偽目標控制子makefile執行 下面的makefile耽誤了我半天時間,我要紀念下 程式碼塊 程式碼塊語法遵循標準markdown程式碼,例如: SUBDIRS =bin

淺談MAKEFILE認識,尤其對目標的認識,歡迎糾正

        以後因為要真的好好搞linux程式設計,不得不開始學習寫makefile,於是乎在邊看手頭工程別人寫的MAKEFILE,一邊看一些網上的參考資料,尤其上來就接觸到了偽目標這個東西,所以一直雲裡霧裡。好多人推薦的陳皓寫的一個關於如何寫MAKEFILE的資料,我

makefile的為目標如何理解

使用makefile編譯C或者C++專案,經常會有 make all ,make clean,make install等命令,後面的all,clean install 都成為偽目標。 那麼相對於偽目標

uboot makefile裡面的兩個all:作用(目標,空命令)

uboot的makefile裡面有兩個all: 第一個all:沒有依賴,也沒有命令。後面接的是兩條include sinclude $(obj)include/autoconf.mk.dep sinclude $(obj)include/autoconf.mk 另外一個

Makefile使用 for 控制結構編譯多個目標檔案

假如,有很多檔案,每個檔案都要變成一個單獨的目標檔案,如果使用makefile的話,最好能用一個 for 迴圈來做。 makefile是支援使用 for的。 先假定有下面幾個檔案: a.h b.h test1.cpp test2.cpp $ cat a.h #if

Makefile目標詳解

本節我們討論一個Makefile中的一個重要的特殊目標:偽目標。 偽目標是這樣一個目標:它不代表一個真正的檔名,在執行make時可以指定這個目標來執行其所在規則定義的命令,有時我們也可以將一個偽目標稱為標籤。使用偽目標有兩點原因:1. 避免在我們的Makefile中定義的

makefile 筆記]之一--Make的工作方式、命令執行、目標與冒號

GNU的make工作時的執行步驟入下:(想來其它的make也是類似)      1、讀入所有的Makefile。      2、讀入被include的其它Makefile。      3、初始化檔案中的變數。      4、推導隱晦規則,並分析所有規則。      5、為所有的目標檔案建立依賴關係鏈

makefile的一點知識

color 一點 pan col get ack 是什麽 makefile track makefile文件裏以下這一部分展開是什麽樣的呢?。。。mytarget=foo $(mytarget): $(mytarget).c gcc -o $(mytarge

Makefile怎樣調用python和perl文件為自己提供須要的數據

print erl col shel ria 實例代碼 space shell eight Makefile中怎樣調用python和perl文件為自己提供須要的數據,利用print函數對外輸出數據 實例代碼例如以下 perl.pl #!/usr/bin/per

Makefileexport分析

platform 打出 ont style focus false pla ext make 在分析內核啟動過程的./arch/arm/Makefile文件裏碰到了這樣字段 162 export TEXT_OFFSET GZFLAGS MMUEXT   然後在子目錄a

通用 Makefile(及makefile的notdir,wildcard和patsubst)

and har alt table free modify sources follow rul notdir,wildcard和patsubst是makefile中幾個有用的函數,以前沒留意過makefile中函數的用法,今天稍微看看~ 1、makefile裏的函數