• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            makefile

            Posted on 2009-06-01 11:12 Prayer 閱讀(240) 評論(0)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX
            一、Makefile里有什么?

            Makefile里主要包含了五個東西:顯式規(guī)則、隱晦規(guī)則、變量定義、文件指示和注釋。

            1、顯式規(guī)則。顯式規(guī)則說明了,如何生成一個或多的的目標(biāo)文件。這是由Makefile的書寫者明顯指出,要生成的文件,文件的依賴文件,生成的命令。

            2、隱晦規(guī)則。由于我們的make有自動推導(dǎo)的功能,所以隱晦的規(guī)則可以讓我們比較粗糙地簡略地書寫Makefile,這是由make所支持的。

            3、變量的定義。在Makefile中我們要定義一系列的變量,變量一般都是字符串,這個有點你C語言中的宏,當(dāng)Makefile被執(zhí)行時,其中的變量都會被擴展到相應(yīng)的引用位置上。

            4、文件指示。其包括了三個部分,一個是在一個Makefile中引用另一個Makefile,就像C語言中的include一樣;另一個是指根據(jù)某些情況指定Makefile中的有效部分,就像C語言中的預(yù)編譯#if一樣;還有就是定義一個多行的命令。有關(guān)這一部分的內(nèi)容,我會在后續(xù)的部分中講述。

            5、注釋。Makefile中只有行注釋,和UNIX的Shell腳本一樣,其注釋是用“#”字符,這個就像C/C++中的“//”一樣。如果你要在你的Makefile中使用“#”字符,可以用反斜框進行轉(zhuǎn)義,如:“\#”。

            最后,還值得一提的是,在Makefile中的命令,必須要以[Tab]鍵開始。


            二、Makefile的文件名

            默認(rèn)的情況下,make命令會在當(dāng)前目錄下按順序找尋文件名為“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解釋這個文件。在這三個文件名中,最好使用“Makefile”這個文件名,因為,這個文件名第一個字符為大寫,這樣有一種顯目的感覺。最好不要用“GNUmakefile”,這個文件是GNU的make識別的。有另外一些make只對全小寫的“makefile”文件名敏感,但是基本上來說,大多數(shù)的make都支持“makefile”和“Makefile”這兩種默認(rèn)文件名。

            當(dāng)然,你可以使用別的文件名來書寫Makefile,比如:“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定特定的Makefile,你可以使用make的“-f”和“--file”參數(shù),如:make -f Make.Linux或make --file Make.AIX。


            三、引用其它的Makefile

            在Makefile使用include關(guān)鍵字可以把別的Makefile包含進來,這很像C語言的#include,被包含的文件會原模原樣的放在當(dāng)前文件的包含位置。include的語法是:

                include <filename>;

                filename可以是當(dāng)前操作系統(tǒng)Shell的文件模式(可以保含路徑和通配符)

            在include前面可以有一些空字符,但是絕不能是[Tab]鍵開始。include和<filename>;可以用一個或多個空格隔開。舉個例子,你有這樣幾個Makefile:a.mk、b.mk、c.mk,還有一個文件叫foo.make,以及一個變量$(bar),其包含了e.mk和f.mk,那么,下面的語句:

                include foo.make *.mk $(bar)

                等價于:

                include foo.make a.mk b.mk c.mk e.mk f.mk

            make命令開始時,會把找尋include所指出的其它Makefile,并把其內(nèi)容安置在當(dāng)前的位置。就好像C/C++的#include指令一樣。如果文件都沒有指定絕對路徑或是相對路徑的話,make會在當(dāng)前目錄下首先尋找,如果當(dāng)前目錄下沒有找到,那么,make還會在下面的幾個目錄下找:

                1、如果make執(zhí)行時,有“-I”或“--include-dir”參數(shù),那么make就會在這個參數(shù)所指定的目錄下去尋找。
                2、如果目錄<prefix>;/include(一般是:/usr/local/bin或/usr/include)存在的話,make也會去找。

            如果有文件沒有找到的話,make會生成一條警告信息,但不會馬上出現(xiàn)致命錯誤。它會繼續(xù)載入其它的文件,一旦完成makefile的讀取,make會再重試這些沒有找到,或是不能讀取的文件,如果還是不行,make才會出現(xiàn)一條致命信息。如果你想讓make不理那些無法讀取的文件,而繼續(xù)執(zhí)行,你可以在include前加一個減號“-”。如:

                -include <filename>;
                其表示,無論include過程中出現(xiàn)什么錯誤,都不要報錯繼續(xù)執(zhí)行。和其它版本make兼容的相關(guān)命令是sinclude,其作用和這一個是一樣的。


            四、環(huán)境變量 MAKEFILES 

            如果你的當(dāng)前環(huán)境中定義了環(huán)境變量MAKEFILES,那么,make會把這個變量中的值做一個類似于include的動作。這個變量中的值是其它的Makefile,用空格分隔。只是,它和include不同的是,從這個環(huán)境變中引入的Makefile的“目標(biāo)”不會起作用,如果環(huán)境變量中定義的文件發(fā)現(xiàn)錯誤,make也會不理。

            但是在這里我還是建議不要使用這個環(huán)境變量,因為只要這個變量一被定義,那么當(dāng)你使用make時,所有的Makefile都會受到它的影響,這絕不是你想看到的。在這里提這個事,只是為了告訴大家,也許有時候你的Makefile出現(xiàn)了怪事,那么你可以看看當(dāng)前環(huán)境中有沒有定義這個變量。


            五、make的工作方式

            GNU的make工作時的執(zhí)行步驟入下:(想來其它的make也是類似)

                1、讀入所有的Makefile。
                2、讀入被include的其它Makefile。
                3、初始化文件中的變量。
                4、推導(dǎo)隱晦規(guī)則,并分析所有規(guī)則。
                5、為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈。
                6、根據(jù)依賴關(guān)系,決定哪些目標(biāo)要重新生成。
                7、執(zhí)行生成命令。

            1-5步為第一個階段,6-7為第二個階段。第一個階段中,如果定義的變量被使用了,那么,make會把其展開在使用的位置。但make并不會完全馬上展開,make使用的是拖延戰(zhàn)術(shù),如果變量出現(xiàn)在依賴關(guān)系的規(guī)則中,那么僅當(dāng)這條依賴被決定要使用了,變量才會在其內(nèi)部展開。

            當(dāng)然,這個工作方式你不一定要清楚,但是知道這個方式你也會對make更為熟悉。有了這個基礎(chǔ),后續(xù)部分也就容易看懂了。
            日产精品久久久久久久性色| 久久亚洲av无码精品浪潮| 伊人色综合久久天天人手人婷| 久久精品国产亚洲AV影院 | 日本道色综合久久影院| 日韩精品国产自在久久现线拍| 国产精品gz久久久| 国产69精品久久久久APP下载 | 久久久久亚洲AV无码观看| 人妻无码αv中文字幕久久| 国产69精品久久久久9999| 精品国产乱码久久久久久人妻 | 久久久久AV综合网成人| 久久午夜无码鲁丝片午夜精品| 嫩草伊人久久精品少妇AV| 狠狠人妻久久久久久综合| 久久精品国产亚洲AV影院| 国产精品内射久久久久欢欢| 亚洲国产精品无码久久98| 久久精品国产精品亚洲人人| 人妻丰满AV无码久久不卡| 老司机午夜网站国内精品久久久久久久久| 久久亚洲精品中文字幕| 久久久久久久久66精品片| 伊人久久精品线影院| 久久超乳爆乳中文字幕| 尹人香蕉久久99天天拍| 久久久受www免费人成| 国产成人综合久久久久久| 国产精品久久影院| 久久青青草原精品国产| 国产成人精品三上悠亚久久| 亚洲国产小视频精品久久久三级| 国产精品久久久久一区二区三区| 漂亮人妻被黑人久久精品| 亚洲第一极品精品无码久久| 一本色道久久综合| 国产毛片欧美毛片久久久| 精品无码久久久久国产动漫3d| 中文字幕久久波多野结衣av| 综合久久国产九一剧情麻豆|