• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            make 的運(yùn)行

            Posted on 2009-06-01 14:10 Prayer 閱讀(248) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++LINUX/UNIX/AIX
            一般來(lái)說(shuō),最簡(jiǎn)單的就是直接在命令行下輸入make命令,make命令會(huì)找當(dāng)前目錄的makefile來(lái)執(zhí)行,一切都是自動(dòng)的。但也有時(shí)你也許只想讓make重編譯某些文件,而不是整個(gè)工程,而又有的時(shí)候你有幾套編譯規(guī)則,你想在不同的時(shí)候使用不同的編譯規(guī)則,等等。本章節(jié)就是講述如何使用make命令的。

            一、make的退出碼

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

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

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


            二、指定Makefile

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

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

                make –f hchen.mk

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


            三、指定目標(biāo)

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

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

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

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

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

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

                .PHONY: all
                all: prog1 prog2 prog3 prog4

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

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

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

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


            四、檢查規(guī)則

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

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

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

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

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

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


            五、make的參數(shù)

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

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

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

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

            “—debug[=<options>;]”
            輸出make的調(diào)試信息。它有幾種不同的級(jí)別可供選擇,如果沒(méi)有參數(shù),那就是輸出最簡(jiǎn)單的調(diào)試信息。下面是<options>;的取值:
                a —— 也就是all,輸出所有的調(diào)試信息。(會(huì)非常的多)
                b —— 也就是basic,只輸出簡(jiǎn)單的調(diào)試信息。即輸出不需要重編譯的目標(biāo)。
                v —— 也就是verbose,在b選項(xiàng)的級(jí)別之上。輸出的信息包括哪個(gè)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í)行時(shí)忽略所有的錯(cuò)誤。

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

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

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

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

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

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

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

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

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

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

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

            “-S”
            “--no-keep-going”
            “--stop”
            取消“-k”選項(xiàng)的作用。因?yàn)橛行r(shí)候,make的選項(xiàng)是從環(huán)境變量“MAKEFLAGS”中繼承下來(lái)的。所以你可以在命令行中使用這個(gè)參數(shù)來(lái)讓環(huán)境變量中的“-k”選項(xiàng)失效。

            “-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之前和之后的信息。這個(gè)參數(shù)對(duì)于跟蹤嵌套式調(diào)用make時(shí)很有用。

            “--no-print-directory”
            禁止“-w”選項(xiàng)。

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

            “--warn-undefined-variables”
            只要make發(fā)現(xiàn)有未定義的變量,那么就輸出警告信息。
            久久无码AV一区二区三区| 国产91久久综合| 97久久国产亚洲精品超碰热| 久久免费大片| 老司机国内精品久久久久| 中文国产成人精品久久不卡| 精品国产婷婷久久久| 亚洲国产二区三区久久| 国产精品美女久久久久久2018| 狠狠色丁香久久婷婷综合蜜芽五月| 久久久国产打桩机| 中文字幕一区二区三区久久网站 | 无码8090精品久久一区| 久久99国产精品成人欧美| 人妻无码精品久久亚瑟影视 | 99国产欧美久久久精品蜜芽| 久久99精品久久久久久水蜜桃| 无码人妻久久一区二区三区免费 | 日韩电影久久久被窝网| 波多野结衣中文字幕久久| 青春久久| 国产69精品久久久久99尤物| 亚洲精品午夜国产VA久久成人| 91精品国产高清久久久久久91| 99久久精品国产一区二区 | 久久亚洲AV成人无码国产| 久久久久AV综合网成人| 国产精品久久久久影视不卡| 中文字幕精品久久久久人妻| 久久精品卫校国产小美女| 久久综合精品国产一区二区三区| 国产精品久久久福利| 久久久久亚洲AV无码永不| 性欧美丰满熟妇XXXX性久久久| 久久嫩草影院免费看夜色| 精品无码久久久久久久动漫| 91麻精品国产91久久久久| 国产精品成人精品久久久 | 久久国产亚洲高清观看| 人妻精品久久无码专区精东影业| 久久99久国产麻精品66|