青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

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

make 的運行

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

一、make的退出碼

make命令執行后有三個退出碼:

    0 —— 表示成功執行。
    1 —— 如果make運行時出現任何錯誤,其返回1。
    2 —— 如果你使用了make的“-q”選項,并且make使得一些目標不需要更新,那么返回2。

Make的相關參數我們會在后續章節中講述。


二、指定Makefile

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

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

    make –f hchen.mk

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


三、指定目標

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

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

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

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

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

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

    .PHONY: all
    all: prog1 prog2 prog3 prog4

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

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

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

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


四、檢查規則

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

    “-n”
    “--just-print”
    “--dry-run”
    “--recon”
    不執行參數,這些參數只是打印命令,不管目標是否更新,把規則和連帶規則下的命令打印出來,但不執行,這些參數對于我們調試makefile很有用處。

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

    “-q”
    “--question”
    這個參數的行為是找目標的意思,也就是說,如果目標存在,那么其什么也不會輸出,當然也不會執行編譯,如果目標不存在,其會打印出一條出錯信息。

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

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


五、make的參數

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

“-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的信息。

“-d”
相當于“--debug=a”。

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

“-f=<file>;”
“--file=<file>;”
“--makefile=<file>;”
指定需要執行的makefile。

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

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

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

“-j [<jobsnum>;]”
“--jobs[=<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發現有未定義的變量,那么就輸出警告信息。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            99在线精品视频在线观看| 在线亚洲精品福利网址导航| 欧美肥婆在线| 欧美福利专区| 欧美二区乱c少妇| 欧美精品色一区二区三区| 欧美色欧美亚洲另类二区| 国产精品久久久久久亚洲毛片| 国产精品久久久久高潮| 国产欧美精品一区aⅴ影院| 国产一区深夜福利| 亚洲日本无吗高清不卡| 亚洲在线1234| 久久免费视频网| 亚洲精品在线观| 久久国产精品久久国产精品 | 亚洲视频网在线直播| 亚洲一二三四区| 久久综合色8888| 一区二区不卡在线视频 午夜欧美不卡'| 一区二区三区欧美在线观看| 久久久久久9999| 国产精品久久久久高潮| 在线成人小视频| 亚洲欧美文学| 亚洲国产婷婷综合在线精品| av不卡在线| 蜜桃av综合| 国产亚洲美州欧州综合国| 亚洲乱码国产乱码精品精可以看 | 欧美日韩午夜| 国产欧美一区二区色老头| 日韩天堂在线观看| 久久理论片午夜琪琪电影网| 亚洲免费观看视频| 免费日韩av片| 激情综合在线| 久久国产精品久久久久久| 99人久久精品视频最新地址| 毛片精品免费在线观看| 欧美丝袜第一区| 一本色道久久综合狠狠躁的推荐| 免播放器亚洲一区| 欧美一区二区三区四区在线| 国产模特精品视频久久久久 | 免费一级欧美片在线播放| 国产欧美精品一区aⅴ影院| 日韩视频免费看| 欧美成人精品三级在线观看| 欧美中在线观看| 国产区在线观看成人精品| 亚洲字幕一区二区| 亚洲人成网站精品片在线观看| 乱码第一页成人| 亚洲电影视频在线| 免费在线欧美黄色| 久久免费视频在线观看| 在线观看国产日韩| 两个人的视频www国产精品| 性欧美video另类hd性玩具| 国产日韩欧美二区| 久久久国产精品一区| 性欧美大战久久久久久久久| 国产欧美欧美| 久久久中精品2020中文| 久久国产精品一区二区三区四区| 国内综合精品午夜久久资源| 免费观看久久久4p| 麻豆91精品91久久久的内涵| 日韩一二三在线视频播| 夜夜嗨一区二区三区| 国产精品推荐精品| 久久裸体艺术| 欧美成人小视频| 亚洲一区在线观看免费观看电影高清| 亚洲精品一区二区三区婷婷月| 国产精品国产自产拍高清av| 午夜视频一区在线观看| 欧美一区在线直播| 亚洲高清三级视频| 日韩视频一区二区在线观看| 欧美午夜电影在线| 久久精品女人| 免费观看日韩av| 亚洲视频图片小说| 欧美在线观看视频一区二区三区 | 一本一道久久综合狠狠老精东影业 | 欧美色视频日本高清在线观看| 亚洲一区在线视频| 欧美一级在线亚洲天堂| 亚洲黄色大片| 亚洲永久免费观看| 亚洲破处大片| 亚洲欧美日韩国产综合在线| 亚洲国产高清一区二区三区| 亚洲电影免费在线 | 亚洲精品美女在线| 亚洲视屏一区| 在线观看国产日韩| 一区二区三区欧美亚洲| 极品中文字幕一区| 一区二区av在线| 亚洲第一毛片| 亚洲一区激情| 一本一本久久| 久久婷婷av| 欧美在线观看网址综合| 欧美精品18+| 老司机免费视频一区二区| 国产精品久久久久久户外露出| 欧美777四色影视在线| 国产精品亚洲精品| 亚洲精品久久嫩草网站秘色| 精品动漫3d一区二区三区免费版| 国产精品99久久久久久久女警 | 欧美亚洲在线播放| 欧美成人精品高清在线播放| 久久免费黄色| 国产日本欧美视频| 在线一区二区三区做爰视频网站| 亚洲大片精品永久免费| 羞羞漫画18久久大片| 中文在线不卡| 欧美日韩视频在线一区二区 | 亚洲激情视频网站| 久久久精品一区| 久久久久五月天| 国产一区二区三区在线观看视频| 国产精品99久久久久久宅男 | 猛男gaygay欧美视频| 国产精品一级| 亚洲欧美日韩在线一区| 欧美一区二区三区免费观看视频 | 国产伦精品一区二区三区照片91 | 欧美一级在线亚洲天堂| 国产精品久久久久影院色老大| 99视频精品在线| 亚洲视频高清| 国产精品毛片a∨一区二区三区|国 | 国产欧美韩国高清| 欧美亚洲一区在线| 老司机aⅴ在线精品导航| 一区国产精品| 你懂的视频欧美| 亚洲丰满在线| 一区二区三区 在线观看视| av成人免费在线观看| 亚洲午夜免费视频| 午夜欧美精品| 精品99视频| 免费成人小视频| 日韩视频中文| 亚洲免费在线电影| 国产精品亚洲人在线观看| 性久久久久久久| 免费亚洲一区二区| 中文精品99久久国产香蕉| 国产精品啊v在线| 午夜精品久久久久久久久久久久久| 久久婷婷久久一区二区三区| 一区视频在线播放| 欧美日韩hd| 欧美一区激情| 亚洲国产精品v| 亚洲一区二区av电影| 国产日韩欧美视频| 欧美成人午夜剧场免费观看| 一区二区三区国产盗摄| 久久99伊人| 亚洲日韩欧美视频一区| 欧美日韩中文字幕在线| 欧美中文在线观看国产| 亚洲国产精品成人综合色在线婷婷 | 欧美日韩999| 小黄鸭精品密入口导航| 欧美二区在线播放| 亚洲一区二区三区免费观看| 国精品一区二区三区| 欧美福利精品| 欧美在线播放| 亚洲日本电影在线| 久久久久久久久久久成人| 宅男精品视频| 影音先锋中文字幕一区二区| 欧美日韩精品综合在线| 久久久久久午夜| 亚洲一区尤物| 日韩午夜电影| 欧美成ee人免费视频| 欧美一区二区播放| 亚洲精品一二| 亚洲福利国产精品| 国产视频不卡| 国产精品国内视频| 欧美成人a视频| 老司机精品久久| 久久久久久久久蜜桃| 亚洲在线播放电影| 亚洲视频一二三| 亚洲免费播放|