gnu中的make相關知識

來源:互聯網
上載者:User

參考文章出處:http://www.ha97.com/961.html

“-b”
“-m” 忽略和其它版本make的相容性。

“-B”
“-always-make” 認為所有的目標都需要更新(重編譯)。

“-C”
“–directory=”
指定讀取makefile的目錄。如果有多個“-C”參數,make的解釋是後面的路徑以前面的作為相對路徑,並以最後的目錄作為被指定目錄。如:“make –C ~hchen/test –C prog”等價於“make –C ~hchen/test/prog”。

“—debug[=]”輸出make的調試資訊。它有幾種不同的層級可供選擇,如果沒有參數,那就是輸出最簡單的調試資訊。下面是的取值:

a —— 也就是all,輸出所有的調試資訊。(會非常的多)

b —— 也就是basic,只輸出簡單的調試資訊。即輸出不需要重編譯的目標。

v —— 也就是verbose,在b選項的層級之上。輸出的資訊包括哪個makefile被解析,不需要被重編譯的依賴檔案(或是依賴目標)等。

i —— 也就是implicit,輸出所以的隱含規則。

j —— 也就是jobs,輸出執行規則中命令的詳細資料,如命令的PID、返回碼等。

m —— 也就是makefile,輸出make讀取makefile,更新makefile,執行makefile的資訊。

“-d” 相當於“–debug=a”。

“-e”
“–environment-overrides” 指明環境變數的值覆蓋makefile中定義的變數的值。

“-f=”
“–file=”“–makefile=”指定需要執行的makefile。

“-h”
“–help” 顯示協助資訊。

“-i”
“–ignore-errors” 在執行時忽略所有的錯誤。

“-I”
“–include-dir=”指定一個被包含makefile的搜尋目標。可以使用多個“-I”參數來指定多個目錄。

“-j []”“–jobs[=]”
指同時運行命令的個數。如果沒有這個參數,make運行命令時能運行多少就運行多少。如果有一個以上的“-j”參數,那麼僅最後一個“-j”才是有效。(注意這個參數在MS-DOS中是無用的)

“-k”
“–keep-going” 出錯也不停止運行。如果產生一個目標失敗了,那麼依賴於其上的目標就不會被執行了。

“-l ”
“–load-average[=]” “—max-load[=]”指定make運行命令的負載。

“-n”
“–just-print” “–dry-run”“–recon”
僅輸出執行過程中的命令序列,但並不執行。

“-o ”
“–old-file=” “–assume-old=”不重建的指定的,即使這個目標的依賴檔案新於它。

“-p”
“–print-data-base”

輸出makefile中的所有資料,包括所有的規則和變數。這個參數會讓一個簡單的makefile都會輸出一堆資訊。如果你只是想輸出資訊而不想執行makefile,你可以使用“make -qp”命令。如果你想查看執行makefile前的預設變數和規則,你可以使用“make –p –f /dev/null”。這個參數輸出的資訊會包含著你的makefile檔案的檔案名稱和行號,所以,用這個參數來調試你的makefile會是很有用的,特別是當你的環境變數很複雜的時候。

“-q”
“–question” 不運行命令,也不輸出。僅僅是檢查所指定的目標是否需要更新。如果是0則說明要更新,如果是2則說明有錯誤發生。

“-r”
“–no-builtin-rules” 禁止make使用任何隱含規則。

“-R”
“–no-builtin-variabes” 禁止make使用任何作用於變數上的隱含規則。

“-s”
“–silent” “–quiet”在命令運行時不輸出命令的輸出。

“-S”
“–no-keep-going” “–stop”取消“-k”選項的作用。因為有些時候,make的選項是從環境變數“MAKEFLAGS”中繼承下來的。所以你可以在命令列中使用這個參數來讓環境變數中的“-k”選項失效。

“-t”
“–touch” 相當於UNIX的touch命令,只是把目標的修改日期變成最新的,也就是阻止產生目標的命令運行。

“-v”
“–version” 輸出make程式的版本、著作權等關於make的資訊。

“-w”
“–print-directory” 輸出運行makefile之前和之後的資訊。這個參數對於跟蹤嵌套式調用make時很有用。

“–no-print-directory”禁止“-w”選項。

“-W ”
“–what-if=” “–new-file=”“–assume-file=”
假定目標需要更新,如果和“-n”選項使用,那麼這個參數會輸出該目標更新時的運行動作。如果沒有“-n”那麼就像運行UNIX的“touch”命令一樣,使得的修改時間為目前時間。

“–warn-undefined-variables”只要make發現有未定義的變數,那麼就輸出警告資訊


上面這麼多些命令,我用過的最多的也就是-C了,其他的接觸的比較少,先轉一個,方便以後查閱。

另外在記錄一下關於Makefile中的.PHONY的說明,以前看到的Makefile裡面大多數都有這個,但是不清楚是幹啥用的,今天查了一下相關的資料,終於大概搞明白了:

這稱之為假象目的(Phony Targets) 
假設你的一個項目最後需要產生兩個可執行檔。你的主要目標是產生兩個可執行檔,但這兩個檔案是相互獨立的——如果一個檔案需要重建,並不影響另一個。你可以使用“假象目的”來達到這種效果。一個假象目的跟一個正常的目的幾乎是一樣的,只是這個目的檔案是不存在的。因此,make總是會假設它需要被產生,當把它的依賴檔案更新後,就會執行它的規則裡的命令列。 
如果在我們的makefile開始處輸入 all:exec1 exec2 其中exec1和exec2是我們做為目的的兩個可執行檔。make把這個'all'做為它的主要目的,每次執行時都會嘗試把'all'更新。但既然這行規則裡沒有哪個命令來作用在一個叫'all'的實際檔案(事實上all並不會在磁碟上實際產生),所以這個規則並不真的改變'all'的狀態。可既然這個檔案並不存在,所以make會嘗試更新all規則,因此就檢查它的依靠exec1,exec2是否需要更新,如果需要,就把它們更新,從而達到我們的目的。
  
假象目的也可以用來描述一組非預設的動作。例如,你想把所有由make產生的檔案刪除,你可以在makefile裡設立這樣一個規則: 
veryclean: 
    rm   *.o 
    rm   myprog 
前提是沒有其它的規則依靠這個'veryclean'目的,它將永遠不會被執行。但是,如果你明確的使用命令'make   veryclean',make會把這個目的做為它的主要目標,執行那些rm命令。 
如果你的磁碟上存在一個叫veryclean檔案,會發生什麼事?這時因為在這個規則裡沒有任何依靠檔案,所以這個目的檔案一定是最新的了(所有的依靠檔案都已經是最新的了),所以既使使用者明確命令make重新產生它,也不會有任何事情發生。

解決方案是標明所有的假象目的(用.PHONY),這就告訴make不用檢查它們是否存在於磁碟上,也不用尋找任何隱含規則,直接假設指定的目的需要被更新。在makefile裡加入下面這行包含上面規則的規則:.PHONY:veryclean 就可以了。注意,這是一個特殊的make規則,make知道.PHONY是一個特殊目的,當然你可以在它的依靠裡加入你想用的任何假象目的,而make知道它們都是假象目的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.