在linux環境下的工做,免不了須要常常編譯C/C++源代碼,因此make命令是咱們常常都會用到的。固然make工具不必定針對C代碼,它也能夠維護其餘各類代碼,詳見:man make
在列舉其詳細參數以前,我先介紹一下我曾經遇到和總結的兩點知識吧。
1.makefile尋找的順序(針對GNU make):GNUmakefile、makefile、Makefile 依次尋找;推薦使用Makefile這個文件(由於它一般離README等重要文件更近)。
2.-j參數,併發執行make的job數量,有-j參數但後面沒有跟job數量時,make不會限制同時運行make的job數(儘量多),特別是對 於多核多線程的CPU架構下進行make,-j參數能夠有明顯的編譯構建速度上的提高。下面是一個我作的實驗:make了qemu-kvm.git的最新 代碼。
2.1 CPU爲4核8線程:make 耗時82s, make -j 4 耗時31s, make -j 耗時27s.
2.2 CPU爲單核單線程:make 耗時353, make -j 2 耗時370, make -j 耗時396s。(單核單線程的CPU下用make時最好不用-j參數了,固然此次僅僅是一次測試,也不必定能反映各類真實場景)
linux
下面列舉了全部GNU make 3.80版的參數定義。其它版本和產商的make大同小異,不過其它產商的make的具體參數仍是請參考各自的產品文檔。git
「-b」
「-m」
這兩個參數的做用是忽略和其它版本make的兼容性。多線程
「-B」
「--always-make」
認爲全部的目標都須要更新(重編譯)。架構
「-C <dir>」
「--directory=<dir>」
指定讀取makefile的目錄。若是有多個「-C」參數,make的解釋是後面的路徑之前面的做爲相對路徑,並以最後的目錄做爲被指定目錄。如:「make –C ~hchen/test –C prog」等價於「make –C ~hchen/test/prog」。併發
「—debug[=<options>]」
輸出make的調試信息。它有幾種不一樣的級別可供選擇,若是沒有參數,那就是輸出最簡單的調試信息。下面是<options>的取值:
a —— 也就是all,輸出全部的調試信息。(會很是的多)
b —— 也就是basic,只輸出簡單的調試信息。即輸出不須要重編譯的目標。
v —— 也就是verbose,在b選項的級別之上。輸出的信息包括哪一個makefile被解析,不須要被重編譯的依賴文件(或是依賴目標)等。
i —— 也就是implicit,輸出因此的隱含規則。
j —— 也就是jobs,輸出執行規則中命令的詳細信息,如命令的PID、返回碼等。
m —— 也就是makefile,輸出make讀取makefile,更新makefile,執行makefile的信息。ide
「-d」
至關於「--debug=a」。工具
「-e」
「--environment-overrides」
指明環境變量的值覆蓋makefile中定義的變量的值。測試
「-f=<file>」
「--file=<file>」
「--makefile=<file>」
指定須要執行的makefile。ui
「-h」
「--help」
顯示幫助信息。spa
「-i」
「--ignore-errors」
在執行時忽略全部的錯誤。
「-I <dir>」
「--include-dir=<dir>」
指定一個被包含makefile的搜索目標。可使用多個「-I」參數來指定多個目錄。
「-j [<jobsnum>]」
「--jobs[=<jobsnum>]」
指同時運行命令的個數。若是-j後沒有這個jobsnum參數,make運行命令時能運行多少就運行多少。若是有一個以上的「-j」參數,那麼僅最後一個「-j」纔是有效的。(注意這個參數在MS-DOS中是無用的)
「-k」
「--keep-going」
出錯也不中止運行。若是生成一個目標失敗了,那麼依賴於其上的目標就不會被執行了。
「-l <load>」
「--load-average[=<load]」
「—max-load[=<load>]」
指定make運行命令的負載。
「-n」
「--just-print」
「--dry-run」
「--recon」
僅輸出執行過程當中的命令序列,但並不執行。
「-o <file>」
「--old-file=<file>」
「--assume-old=<file>」
不從新生成的指定的<file>,即便這個目標的依賴文件新於它。
「-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 <file>」
「--what-if=<file>」
「--new-file=<file>」
「--assume-file=<file>」
假定目標<file>須要更新,若是和「-n」選項使用,那麼這個參數會輸出該目標更新時的運行動做。若是沒有「-n」那麼就像運行UNIX的「touch」命令同樣,使得<file>的修改時間爲當前時間。
「--warn-undefined-variables」 只要make發現有未定義的變量,那麼就輸出警告信息