DANCE WITH JAVA

          開發(fā)出高質(zhì)量的系統(tǒng)

          常用鏈接

          統(tǒng)計

          積分與排名

          好友之家

          最新評論

          (轉(zhuǎn))跟我一起寫 Makefile(十一)

          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2896
          make 的運(yùn)行
          ——————

          一般來說,最簡單的就是直接在命令行下輸入make命令,make命令會找當(dāng)前目錄的makefile來執(zhí)行,一切都是自動的。但也有時你也許只想讓make重編譯某些文件,而不是整個工程,而又有的時候你有幾套編譯規(guī)則,你想在不同的時候使用不同的編譯規(guī)則,等等。本章節(jié)就是講述如何使用make命令的。

          一、make的退出碼

          make命令執(zhí)行后有三個退出碼:

          ??? 0 —— 表示成功執(zhí)行。
          ??? 1 —— 如果make運(yùn)行時出現(xiàn)任何錯誤,其返回1。
          ??? 2 —— 如果你使用了make的“-q”選項,并且make使得一些目標(biāo)不需要更新,那么返回2。

          Make的相關(guān)參數(shù)我們會在后續(xù)章節(jié)中講述。


          二、指定Makefile

          前面我們說過,GNU make找尋默認(rèn)的Makefile的規(guī)則是在當(dāng)前目錄下依次找三個文件——“GNUmakefile”、“makefile”和“Makefile”。其按順序找這三個文件,一旦找到,就開始讀取這個文件并執(zhí)行。

          當(dāng)前,我們也可以給make命令指定一個特殊名字的Makefile。要達(dá)到這個功能,我們要使用make的“-f”或是“--file”參數(shù)(“--makefile”參數(shù)也行)。例如,我們有個makefile的名字是“hchen.mk”,那么,我們可以這樣來讓make來執(zhí)行這個文件:

          ??? make –f hchen.mk

          如果在make的命令行是,你不只一次地使用了“-f”參數(shù),那么,所有指定的makefile將會被連在一起傳遞給make執(zhí)行。


          三、指定目標(biāo)

          一般來說,make的最終目標(biāo)是makefile中的第一個目標(biāo),而其它目標(biāo)一般是由這個目標(biāo)連帶出來的。這是make的默認(rèn)行為。當(dāng)然,一般來說,你的makefile中的第一個目標(biāo)是由許多個目標(biāo)組成,你可以指示make,讓其完成你所指定的目標(biāo)。要達(dá)到這一目的很簡單,需在make命令后直接跟目標(biāo)的名字就可以完成(如前面提到的“make clean”形式)

          任何在makefile中的目標(biāo)都可以被指定成終極目標(biāo),但是除了以“-”打頭,或是包含了“=”的目標(biāo),因為有這些字符的目標(biāo),會被解析成命令行參數(shù)或是變量。甚至沒有被我們明確寫出來的目標(biāo)也可以成為make的終極目標(biāo),也就是說,只要make可以找到其隱含規(guī)則推導(dǎo)規(guī)則,那么這個隱含目標(biāo)同樣可以被指定成終極目標(biāo)。

          有一個make的環(huán)境變量叫“MAKECMDGOALS”,這個變量中會存放你所指定的終極目標(biāo)的列表,如果在命令行上,你沒有指定目標(biāo),那么,這個變量是空值。這個變量可以讓你使用在一些比較特殊的情形下。比如下面的例子:

          ??? sources = foo.c bar.c
          ??? ifneq ( $(MAKECMDGOALS),clean)
          ??? include $(sources:.c=.d)
          ??? endif

          基于上面的這個例子,只要我們輸入的命令不是“make clean”,那么makefile會自動包含“foo.d”和“bar.d”這兩個makefile。

          使用指定終極目標(biāo)的方法可以很方便地讓我們編譯我們的程序,例如下面這個例子:

          ??? .PHONY: all
          ??? all: prog1 prog2 prog3 prog4

          從這個例子中,我們可以看到,這個makefile中有四個需要編譯的程序——“prog1”, “prog2”, “prog3”和 “prog4”,我們可以使用“make all”命令來編譯所有的目標(biāo)(如果把a(bǔ)ll置成第一個目標(biāo),那么只需執(zhí)行“make”),我們也可以使用“make prog2”來單獨編譯目標(biāo)“prog2”。

          即然make可以指定所有makefile中的目標(biāo),那么也包括“偽目標(biāo)”,于是我們可以根據(jù)這種性質(zhì)來讓我們的makefile根據(jù)指定的不同的目標(biāo)來完成不同的事。在Unix世界中,軟件發(fā)布時,特別是GNU這種開源軟件的發(fā)布時,其makefile都包含了編譯、安裝、打包等功能。我們可以參照這種規(guī)則來書寫我們的makefile中的目標(biāo)。

          ???? “all”
          ??????? 這個偽目標(biāo)是所有目標(biāo)的目標(biāo),其功能一般是編譯所有的目標(biāo)。
          ???? “clean”
          ??????? 這個偽目標(biāo)功能是刪除所有被make創(chuàng)建的文件。
          ???? “install”
          ??????? 這個偽目標(biāo)功能是安裝已編譯好的程序,其實就是把目標(biāo)執(zhí)行文件拷貝到指定的目標(biāo)中去。
          ???? “print”
          ??????? 這個偽目標(biāo)的功能是例出改變過的源文件。
          ???? “tar”
          ??????? 這個偽目標(biāo)功能是把源程序打包備份。也就是一個tar文件。
          ???? “dist”
          ??????? 這個偽目標(biāo)功能是創(chuàng)建一個壓縮文件,一般是把tar文件壓成Z文件。或是gz文件。
          ???? “TAGS”
          ??????? 這個偽目標(biāo)功能是更新所有的目標(biāo),以備完整地重編譯使用。
          ???? “check”和“test”
          ??????? 這兩個偽目標(biāo)一般用來測試makefile的流程。

          當(dāng)然一個項目的makefile中也不一定要書寫這樣的目標(biāo),這些東西都是GNU的東西,但是我想,GNU搞出這些東西一定有其可取之處(等你的UNIX下的程序文件一多時你就會發(fā)現(xiàn)這些功能很有用了),這里只不過是說明了,如果你要書寫這種功能,最好使用這種名字命名你的目標(biāo),這樣規(guī)范一些,規(guī)范的好處就是——不用解釋,大家都明白。而且如果你的makefile中有這些功能,一是很實用,二是可以顯得你的makefile很專業(yè)(不是那種初學(xué)者的作品)。


          四、檢查規(guī)則

          有時候,我們不想讓我們的makefile中的規(guī)則執(zhí)行起來,我們只想檢查一下我們的命令,或是執(zhí)行的序列。于是我們可以使用make命令的下述參數(shù):

          ??? “-n”
          ??? “--just-print”
          ??? “--dry-run”
          ??? “--recon”
          ??? 不執(zhí)行參數(shù),這些參數(shù)只是打印命令,不管目標(biāo)是否更新,把規(guī)則和連帶規(guī)則下的命令打印出來,但不執(zhí)行,這些參數(shù)對于我們調(diào)試makefile很有用處。

          ??? “-t”
          ??? “--touch”
          ??? 這個參數(shù)的意思就是把目標(biāo)文件的時間更新,但不更改目標(biāo)文件。也就是說,make假裝編譯目標(biāo),但不是真正的編譯目標(biāo),只是把目標(biāo)變成已編譯過的狀態(tài)。

          ??? “-q”
          ??? “--question”
          ??? 這個參數(shù)的行為是找目標(biāo)的意思,也就是說,如果目標(biāo)存在,那么其什么也不會輸出,當(dāng)然也不會執(zhí)行編譯,如果目標(biāo)不存在,其會打印出一條出錯信息。

          ??? “-W <file>”
          ??? “--what-if=<file>”
          ??? “--assume-new=<file>”
          ??? “--new-file=<file>”
          ??? 這個參數(shù)需要指定一個文件。一般是是源文件(或依賴文件),Make會根據(jù)規(guī)則推導(dǎo)來運(yùn)行依賴于這個文件的命令,一般來說,可以和“-n”參數(shù)一同使用,來查看這個依賴文件所發(fā)生的規(guī)則命令。

          另外一個很有意思的用法是結(jié)合“-p”和“-v”來輸出makefile被執(zhí)行時的信息(這個將在后面講述)。


          五、make的參數(shù)

          下面列舉了所有GNU make 3.80版的參數(shù)定義。其它版本和產(chǎn)商的make大同小異,不過其它產(chǎn)商的make的具體參數(shù)還是請參考各自的產(chǎn)品文檔。

          “-b”
          “-m”
          這兩個參數(shù)的作用是忽略和其它版本make的兼容性。

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

          “-C <dir>”
          “--directory=<dir>”
          指定讀取makefile的目錄。如果有多個“-C”參數(shù),make的解釋是后面的路徑以前面的作為相對路徑,并以最后的目錄作為被指定目錄。如:“make –C ~hchen/test –C prog”等價于“make –C ~hchen/test/prog”。

          “—debug[=<options>]”
          輸出make的調(diào)試信息。它有幾種不同的級別可供選擇,如果沒有參數(shù),那就是輸出最簡單的調(diào)試信息。下面是<options>的取值:
          ??? a —— 也就是all,輸出所有的調(diào)試信息。(會非常的多)
          ??? b —— 也就是basic,只輸出簡單的調(diào)試信息。即輸出不需要重編譯的目標(biāo)。
          ??? v —— 也就是verbose,在b選項的級別之上。輸出的信息包括哪個makefile被解析,不需要被重編譯的依賴文件(或是依賴目標(biāo))等。
          ??? i —— 也就是implicit,輸出所以的隱含規(guī)則。
          ??? j —— 也就是jobs,輸出執(zhí)行規(guī)則中命令的詳細(xì)信息,如命令的PID、返回碼等。
          ??? m —— 也就是makefile,輸出make讀取makefile,更新makefile,執(zhí)行makefile的信息。

          “-d”
          相當(dāng)于“--debug=a”。

          “-e”
          “--environment-overrides”
          指明環(huán)境變量的值覆蓋makefile中定義的變量的值。

          “-f=<file>”
          “--file=<file>”
          “--makefile=<file>”
          指定需要執(zhí)行的makefile。

          “-h”
          “--help”
          顯示幫助信息。

          “-i”
          “--ignore-errors”
          在執(zhí)行時忽略所有的錯誤。

          “-I <dir>”
          “--include-dir=<dir>”
          指定一個被包含makefile的搜索目標(biāo)。可以使用多個“-I”參數(shù)來指定多個目錄。

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

          “-k”
          “--keep-going”
          出錯也不停止運(yùn)行。如果生成一個目標(biāo)失敗了,那么依賴于其上的目標(biāo)就不會被執(zhí)行了。

          “-l <load>”
          “--load-average[=<load]”
          “—max-load[=<load>]”
          指定make運(yùn)行命令的負(fù)載。

          “-n”
          “--just-print”
          “--dry-run”
          “--recon”
          僅輸出執(zhí)行過程中的命令序列,但并不執(zhí)行。

          “-o <file>”
          “--old-file=<file>”
          “--assume-old=<file>”
          不重新生成的指定的<file>,即使這個目標(biāo)的依賴文件新于它。

          “-p”
          “--print-data-base”
          輸出makefile中的所有數(shù)據(jù),包括所有的規(guī)則和變量。這個參數(shù)會讓一個簡單的makefile都會輸出一堆信息。如果你只是想輸出信息而不想執(zhí)行makefile,你可以使用“make -qp”命令。如果你想查看執(zhí)行makefile前的預(yù)設(shè)變量和規(guī)則,你可以使用“make –p –f /dev/null”。這個參數(shù)輸出的信息會包含著你的makefile文件的文件名和行號,所以,用這個參數(shù)來調(diào)試你的makefile會是很有用的,特別是當(dāng)你的環(huán)境變量很復(fù)雜的時候。

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

          “-r”
          “--no-builtin-rules”
          禁止make使用任何隱含規(guī)則。

          “-R”
          “--no-builtin-variabes”
          禁止make使用任何作用于變量上的隱含規(guī)則。

          “-s”
          “--silent”
          “--quiet”
          在命令運(yùn)行時不輸出命令的輸出。

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

          “-t”
          “--touch”
          相當(dāng)于UNIX的touch命令,只是把目標(biāo)的修改日期變成最新的,也就是阻止生成目標(biāo)的命令運(yùn)行。

          “-v”
          “--version”
          輸出make程序的版本、版權(quán)等關(guān)于make的信息。

          “-w”
          “--print-directory”
          輸出運(yùn)行makefile之前和之后的信息。這個參數(shù)對于跟蹤嵌套式調(diào)用make時很有用。

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

          “-W <file>”
          “--what-if=<file>”
          “--new-file=<file>”
          “--assume-file=<file>”
          假定目標(biāo)<file>需要更新,如果和“-n”選項使用,那么這個參數(shù)會輸出該目標(biāo)更新時的運(yùn)行動作。如果沒有“-n”那么就像運(yùn)行UNIX的“touch”命令一樣,使得<file>的修改時間為當(dāng)前時間。

          “--warn-undefined-variables”
          只要make發(fā)現(xiàn)有未定義的變量,那么就輸出警告信息。

          posted on 2006-09-23 00:32 dreamstone 閱讀(382) 評論(0)  編輯  收藏 所屬分類: 利器

          主站蜘蛛池模板: 文化| 曲沃县| 左云县| 阿坝县| 久治县| 桐庐县| 台安县| 沧州市| 东城区| 浦县| 潮安县| 兰溪市| 泽普县| 崇左市| 喀喇沁旗| 凤城市| 从江县| 兰坪| 宁德市| 德钦县| 鄂尔多斯市| 玉门市| 二手房| 霍州市| 新平| 台湾省| 高州市| 长顺县| 根河市| 菏泽市| 万州区| 正定县| 博客| 色达县| 宝鸡市| 汨罗市| 江陵县| 盘山县| 浮山县| 哈密市| 钟祥市|