• <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>
            四、嵌套執(zhí)行make

            在一些大的工程中,我們會(huì)把我們不同模塊或是不同功能的源文件放在不同的目錄中,我們可以在每個(gè)目錄中都書寫一個(gè)該目錄的Makefile,這有利于讓我們的Makefile變得更加地簡(jiǎn)潔,而不至于把所有的東西全部寫在一個(gè)Makefile中,這樣會(huì)很難維護(hù)我們的Makefile,這個(gè)技術(shù)對(duì)于我們模塊編譯和分段編譯有著非常大的好處。

            例如,我們有一個(gè)子目錄叫subdir,這個(gè)目錄下有個(gè)Makefile文件,來(lái)指明了這個(gè)目錄下文件的編譯規(guī)則。那么我們總控的Makefile可以這樣書寫:

                subsystem:
                        cd subdir && $(MAKE)

            其等價(jià)于:

                subsystem:
                        $(MAKE) -C subdir

            定義$(MAKE)宏變量的意思是,也許我們的make需要一些參數(shù),所以定義成一個(gè)變量比較利于維護(hù)。這兩個(gè)例子的意思都是先進(jìn)入“subdir”目錄,然后執(zhí)行make命令。

            我們把這個(gè)Makefile叫做“總控Makefile”,總控Makefile的變量可以傳遞到下級(jí)的Makefile中(如果你顯示的聲明),但是不會(huì)覆蓋下層的Makefile中所定義的變量,除非指定了“-e”參數(shù)。

            如果你要傳遞變量到下級(jí)Makefile中,那么你可以使用這樣的聲明:

                export <variable ...>;

            如果你不想讓某些變量傳遞到下級(jí)Makefile中,那么你可以這樣聲明: 

                unexport <variable ...>;

            如:
                
                示例一:

                    export variable = value

                    其等價(jià)于:

                    variable = value
                    export variable

                    其等價(jià)于:

                    export variable := value

                    其等價(jià)于:

                    variable := value
                    export variable

                示例二:

                    export variable += value

                    其等價(jià)于:

                    variable += value
                    export variable

            如果你要傳遞所有的變量,那么,只要一個(gè)export就行了。后面什么也不用跟,表示傳遞所有的變量。

            需要注意的是,有兩個(gè)變量,一個(gè)是SHELL,一個(gè)是MAKEFLAGS,這兩個(gè)變量不管你是否export,其總是要傳遞到下層Makefile中,特別是MAKEFILES變量,其中包含了make的參數(shù)信息,如果我們執(zhí)行“總控Makefile”時(shí)有make參數(shù)或是在上層Makefile中定義了這個(gè)變量,那么MAKEFILES變量將會(huì)是這些參數(shù),并會(huì)傳遞到下層Makefile中,這是一個(gè)系統(tǒng)級(jí)的環(huán)境變量。

            但是make命令中的有幾個(gè)參數(shù)并不往下傳遞,它們是“-C”,“-f”,“-h”“-o”和“-W”(有關(guān)Makefile參數(shù)的細(xì)節(jié)將在后面說(shuō)明),如果你不想往下層傳遞參數(shù),那么,你可以這樣來(lái):

                subsystem:
                        cd subdir && $(MAKE) MAKEFLAGS=

            如果你定義了環(huán)境變量MAKEFLAGS,那么你得確信其中的選項(xiàng)是大家都會(huì)用到的,如果其中有“-t”,“-n”,和“-q”參數(shù),那么將會(huì)有讓你意想不到的結(jié)果,或許會(huì)讓你異常地恐慌。

            還有一個(gè)在“嵌套執(zhí)行”中比較有用的參數(shù),“-w”或是“--print-directory”會(huì)在make的過(guò)程中輸出一些信息,讓你看到目前的工作目錄。比如,如果我們的下級(jí)make目錄是“/home/hchen/gnu/make”,如果我們使用“make -w”來(lái)執(zhí)行,那么當(dāng)進(jìn)入該目錄時(shí),我們會(huì)看到:

                make: Entering directory `/home/hchen/gnu/make'.

            而在完成下層make后離開(kāi)目錄時(shí),我們會(huì)看到:

                make: Leaving directory `/home/hchen/gnu/make'

            當(dāng)你使用“-C”參數(shù)來(lái)指定make下層Makefile時(shí),“-w”會(huì)被自動(dòng)打開(kāi)的。如果參數(shù)中有“-s”(“--slient”)或是“--no-print-directory”,那么,“-w”總是失效的。

            五、定義命令包

            如果Makefile中出現(xiàn)一些相同命令序列,那么我們可以為這些相同的命令序列定義一個(gè)變量。定義這種命令序列的語(yǔ)法以“define”開(kāi)始,以“endef”結(jié)束,如:

                define run-yacc
                yacc $(firstword $^)
                mv y.tab.c $@
                endef

            這里,“run-yacc”是這個(gè)命令包的名字,其不要和Makefile中的變量重名。在“define”和“endef”中的兩行就是命令序列。這個(gè)命令包中的第一個(gè)命令是運(yùn)行Yacc程序,因?yàn)閅acc程序總是生成“y.tab.c”的文件,所以第二行的命令就是把這個(gè)文件改改名字。還是把這個(gè)命令包放到一個(gè)示例中來(lái)看看吧。

                foo.c : foo.y
                        $(run-yacc)

            我們可以看見(jiàn),要使用這個(gè)命令包,我們就好像使用變量一樣。在這個(gè)命令包的使用中,命令包“run-yacc”中的“$^”就是“foo.y”,“$@”就是“foo.c”(有關(guān)這種以“$”開(kāi)頭的特殊變量,我們會(huì)在后面介紹),make在執(zhí)行命令包時(shí),命令包中的每個(gè)命令會(huì)被依次獨(dú)立執(zhí)行。
            Posted on 2007-04-17 11:03 艾凡赫 閱讀(3780) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++
            www.久久热.com| 亚洲人成无码久久电影网站| 久久精品国产亚洲AV蜜臀色欲| 久久久久久A亚洲欧洲AV冫 | 97久久天天综合色天天综合色hd| 久久青青草原精品影院| 青青草原综合久久大伊人导航| 无码精品久久久久久人妻中字| 91精品无码久久久久久五月天| 久久亚洲精品无码VA大香大香| 久久精品国产亚洲欧美| 欧美精品国产综合久久| 国产精品午夜久久| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲国产精品人久久| 少妇精品久久久一区二区三区| 欧美久久久久久精选9999| www.久久热.com| 精品久久久久久国产| 人妻精品久久无码区| 久久精品国产亚洲AV影院| 四虎国产精品免费久久| 国产成人久久精品麻豆一区| 国内精品久久久久久久97牛牛| 亚洲国产成人精品91久久久 | 精品久久久久久亚洲精品| 久久午夜夜伦鲁鲁片免费无码影视| 国内精品久久久久久不卡影院| 久久国产欧美日韩精品| 久久亚洲精品成人av无码网站| 国产成人精品综合久久久久| 性做久久久久久久久久久| 久久精品这里只有精99品| 国产 亚洲 欧美 另类 久久| 国产产无码乱码精品久久鸭| 久久99亚洲网美利坚合众国| 人妻丰满AV无码久久不卡| 国内精品伊人久久久久av一坑| 亚洲午夜久久久久久噜噜噜| 日韩精品久久久久久久电影蜜臀| 精品久久久无码21p发布 |