• <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>

            sunrise

            每天不斷學(xué)習(xí),才能不斷提升自己。

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              64 隨筆 :: 0 文章 :: 92 評(píng)論 :: 0 Trackbacks
            雖然很簡(jiǎn)單還是弄了一個(gè)小時(shí)才搞定,成就感啊。。
            轉(zhuǎn)自:http://blog.csdn.net/dybinx/article/details/6764874

            編寫 make 規(guī)則: 
            使用 gcc 的時(shí)候,用 -M 開關(guān),它會(huì)為每一個(gè)你給它的C文件輸出一個(gè)規(guī)則,把目標(biāo)文件 做為目的,而這個(gè)C文件和所有應(yīng)該被 #include 的 header 文 件將做為依靠文件。注意這個(gè)規(guī)則會(huì)加入所有 header 文件,包 括被角括號(hào)(`<', `>')和雙引號(hào)(`"')所包圍的文件。其實(shí)系統(tǒng) header 檔(比如 stdio.h, stdlib.h 等等一般不會(huì)被我們更改,如果用 -MM 來代替 -M 傳遞給 gcc,那些用角括號(hào)包圍的 header 檔將不會(huì)被包括。
            $@ 擴(kuò)展成當(dāng)前規(guī)則的目的文件名, $< 擴(kuò)展成依靠列表中的第 一個(gè)依靠文件,而 $^ 擴(kuò)展成整個(gè)依靠的列表。

            自動(dòng)生成Makefile文件的操作:


            1、首先,新建一個(gè)測(cè)試項(xiàng)目的目錄——hello:mkdir hello
            然后,cd hello;編輯一個(gè)hello.c的代碼文件:
            #include <stdio.h>
            int main()
            {
                 printf("hello automake!\n");
            }
            保存退出;

            2、執(zhí)行autoscan命令,在當(dāng)前路徑中生成了autoscan.log  configure.scan兩個(gè)新文件。其中configure.scan文件的內(nèi)容如下:
            AC_PREREQ(2.57)
            AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
            AC_CONFIG_SRCDIR([test.c])
            AC_CONFIG_HEADER([config.h])
            AC_PROG_CC
            AC_OUTPUT

            3、重命名configure.scan  為configure.in,編輯它的內(nèi)容,修改后的內(nèi)容為:
            AC_PREREQ(2.57)
            AC_INIT(hello)
            AC_CONFIG_SRCDIR([hello.c])
            #AC_CONFIG_HEADER([config.h])
            AM_INIT_AUTOMAKE(hello, 1.0)
            AC_PROG_CC
            AC_OUTPUT([Makefile])

            說明:Autoconf 是用來產(chǎn)生 'configure'文件的工具。'configure' 是一個(gè) shell script,它可以自動(dòng)設(shè)定符合各種不同平臺(tái)上Unix 系統(tǒng)的特性,并且根據(jù)系統(tǒng)參數(shù)及環(huán)境產(chǎn)生合適的Makefile文件或C 的頭文件(header file),讓原始程式可以很方便地在不同的平臺(tái)上進(jìn)行編譯。Autoconf會(huì)讀取 configure.in 文件然后產(chǎn)生'configure' 這個(gè) shell script。configure.in 文件內(nèi)容是一系列GNU m4 的宏,這些宏經(jīng)autoconf處理后會(huì)變成檢查系統(tǒng)特性的shell scripts。 configure.in 內(nèi)宏的順序并沒有特別的規(guī)定,但是每一個(gè)configure.in 文件必須在所有宏前加入 AC_INIT 宏,然后在所有宏的最后加上 AC_OUTPUT宏??上扔?autoscan 掃描原始文件以產(chǎn)生一個(gè) configure.scan 文件,再對(duì) configure.scan 做些修改成 configure.in 文件。
            AC_INIT(FILE) 
            該宏用來檢查源代碼所在路徑,autoscan 會(huì)自動(dòng)產(chǎn)生,一般無須修改它。
            AM_INIT_AUTOMAKE(PACKAGE,VERSION) 
            這個(gè)是使用 Automake 所必備的宏,PACKAGE 是所要產(chǎn)生軟件套件的名稱,VERSION 是版本編號(hào)。 
            AC_PROG_CC 
            檢查系統(tǒng)可用的C編譯器,若源代碼是用C寫的就需要這個(gè)宏。
            AC_OUTPUT(FILE) 
            設(shè)置 configure 所要產(chǎn)生的文件,若是Makefile ,configure 便會(huì)把它檢查出來的結(jié)果帶入 Makefile.in 文件后產(chǎn)生合適的 Makefile。 

            4、執(zhí)行aclocal命令,生成了aclocal.m4文件,一般無需修改這個(gè)文件。
            5、新建Makefile.am文件,編輯內(nèi)容如下:
                        bin_PROGRAMS=test   
                        test_SOURCES=test.c
            說明:
            Automake 會(huì)根據(jù) configure.in 中的宏把Makefile.am 轉(zhuǎn)成 Makefile.in 文件。 Makefile.am 文件定義所要產(chǎn)生的目標(biāo): 
            AUTOMAKE_OPTIONS
            設(shè)置 automake 的選項(xiàng)。Automake 主要是幫助開發(fā) GNU 軟件的人員來維護(hù)軟件,所以在執(zhí)行 automake 時(shí),會(huì)檢查目錄下是否存在標(biāo)準(zhǔn) GNU 軟件中應(yīng)具備的文件,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件。設(shè)置 foreign 時(shí),automake 會(huì)改用一般軟件的標(biāo)準(zhǔn)來檢查。 
            bin_PROGRAMS 
            定義要產(chǎn)生的執(zhí)行文件名。如果要產(chǎn)生多個(gè)執(zhí)行文件,每個(gè)文件名用空白符隔開
            hello_SOURCES 
            定義 'hello' 這個(gè)執(zhí)行程序所需要的原始文件。如果 'hello'這個(gè)程序是由多個(gè)原始文件所產(chǎn)生,必須把它所用到的所有原始文件都列出來,以空白符隔開。假設(shè) 'hello' 還需要 'hello.c'、'main.c'、'hello.h' 三個(gè)文件的話,則定義 
            hello_SOURCES= hello.c main.c hello.h 
            如果定義多個(gè)執(zhí)行文件,則對(duì)每個(gè)執(zhí)行程序都要定義相對(duì)的filename_SOURCES

            6、 執(zhí)行autoconf命令,生成autom4te.cache和configure文件;
            7、執(zhí)行automake -a命令,生成depcomp  ,install-sh,mkinstalldirs,COPYING,INSTALL, missing文件;
            說明:
            編輯好 Makefile.am 文件,就可以用 automake --add-missing來產(chǎn)生 Makefile.in。加上 --add-missing 選項(xiàng)來告訴 automake順便假如包裝一個(gè)軟件所必須的文件。Automake產(chǎn)生生出來的 Makefile.in 文件是完全符合 GNU Makefile 的慣例,只要執(zhí)行 configure這個(gè)shell script 便可以產(chǎn)生合適的 Makefile 文件了。 
            在執(zhí)行automake -a命令時(shí)可能會(huì)出現(xiàn)以下信息:
            Makefile.am: required file `./NEWS' not found
            Makefile.am: required file `./README' not found
            Makefile.am: required file `./AUTHORS' not found
            Makefile.am: required file `./ChangeLog' not found
            這些對(duì)結(jié)果影響不大,如果不想產(chǎn)生這些讓人誤解的信息,可以手動(dòng)建立這些文件:
            >NEWS   
            >README   
            >AUTHORS   
            >ChangeLog   

            8、執(zhí)行./configure,生成了Makefile文件
            9、執(zhí)行make,生成目標(biāo)文件。

            實(shí)戰(zhàn)Makefile.am

            Makefile.am是一種比Makefile更高層次的規(guī)則。只需指定要生成什么目標(biāo),它由什么源文件生成,要安裝到什么目錄等構(gòu)成。

            表一列出了可執(zhí)行文件、靜態(tài)庫(kù)、頭文件和數(shù)據(jù)文件,四種書寫Makefile.am文件個(gè)一般格式。


            表 1Makefile.am一般格式
            表 1Makefile.am一般格式 

            對(duì)于可執(zhí)行文件和靜態(tài)庫(kù)類型,如果只想編譯,不想安裝到系統(tǒng)中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。

            Makefile.am還提供了一些全局變量供所有的目標(biāo)體使用:


            表 2 Makefile.am中可用的全局變量
            表 2 Makefile.am中可用的全局變量 

            在Makefile.am中盡量使用相對(duì)路徑,系統(tǒng)預(yù)定義了兩個(gè)基本路徑:


            表 3Makefile.am中可用的路徑變量
            表 3Makefile.am中可用的路徑變量 

            在上文中我們提到過安裝路徑,automake設(shè)置了默認(rèn)的安裝路徑:

            1) 標(biāo)準(zhǔn)安裝路徑

            默認(rèn)安裝路徑為:$(prefix) = /usr/local,可以通過./configure --prefix=<new_path>的方法來覆蓋。

            其它的預(yù)定義目錄還包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。

            2) 定義一個(gè)新的安裝路徑

            比如test, 可定義testdir = $(prefix)/test, 然后test_DATA =test1 test2,則test1,test2會(huì)作為數(shù)據(jù)文件安裝到$(prefix)/ /test目錄下。

            我們首先需要在工程頂層目錄下(即project/)創(chuàng)建一個(gè)Makefile.am來指明包含的子目錄:


            SUBDIRS=src/lib src/ModuleA/apple/shell src/ModuleA/apple/core 
            CURRENTPATH=$(shell /bin/pwd)
            INCLUDES=-I$(CURRENTPATH)/src/include -I$(CURRENTPATH)/src/ModuleA/apple/include
            export INCLUDES

            由于每個(gè)源文件都會(huì)用到相同的頭文件,所以我們?cè)谧铐攲拥腗akefile.am中包含了編譯源文件時(shí)所用到的頭文件,并導(dǎo)出,見藍(lán)色部分代碼。

            我們將lib目錄下的swap.c文件編譯成libswap.a文件,被apple/shell/apple.c文件調(diào)用,那么lib目錄下的Makefile.am如下所示:


            noinst_LIBRARIES=libswap.a
            libswap_a_SOURCES=swap.c
            INCLUDES=-I$(top_srcdir)/src/includ

            細(xì)心的讀者可能就會(huì)問:怎么表1中給出的是bin_LIBRARIES,而這里是noinst_LIBRARIES?這是因?yàn)槿绻幌刖幾g,而不想 安裝到系統(tǒng)中,就用noinst_LIBRARIES代替bin_LIBRARIES,對(duì)于可執(zhí)行文件就用noinst_PROGRAMS代替 bin_PROGRAMS。對(duì)于安裝的情況,庫(kù)將會(huì)安裝到$(prefix)/lib目錄下,可執(zhí)行文件將會(huì)安裝到${prefix}/bin。如果想安 裝該庫(kù),則Makefile.am示例如下:


            bin_LIBRARIES=libswap.a
            libswap_a_SOURCES=swap.c
            INCLUDES=-I$(top_srcdir)/src/include
            swapincludedir=$(includedir)/swap
            swapinclude_HEADERS=$(top_srcdir)/src/include/swap.h

            最后兩行的意思是將swap.h安裝到${prefix}/include /swap目錄下。

            接下來,對(duì)于可執(zhí)行文件類型的情況,我們將討論如何寫Makefile.am?對(duì)于編譯apple/core目錄下的文件,我們寫成的Makefile.am如下所示:


            noinst_PROGRAMS=test
            test_SOURCES=test.c
            test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a
            test_LDFLAGS=-D_GNU_SOURCE
            DEFS+=-D_GNU_SOURCE
            #LIBS=-lpthread

            由于我們的test.c文件在鏈接時(shí),需要apple.o和 libswap.a文件,所以我們需要在test_LDADD中包含這兩個(gè)文件。對(duì)于Linux下的信號(hào)量/讀寫鎖文件進(jìn)行編譯,需要在編譯選項(xiàng)中指明 -D_GNU_SOURCE。所以在test_LDFLAGS中指明。而test_LDFLAGS只是鏈接時(shí)的選項(xiàng),編譯時(shí)同樣需要指明該選項(xiàng),所以需要 DEFS來指明編譯選項(xiàng),由于DEFS已經(jīng)有初始值,所以這里用+=的形式指明。從這里可以看出,Makefile.am中的語法與Makefile的語 法一致,也可以采用條件表達(dá)式。如果你的程序還包含其他的庫(kù),除了用AC_CHECK_LIB宏來指明外,還可以用LIBS來指明。

            如果你只想編譯某一個(gè)文件,那么Makefile.am如何寫呢?這個(gè)文件也很簡(jiǎn)單,寫法跟可執(zhí)行文件的差不多,如下例所示:

            noinst_PROGRAMS=apple
            apple_SOURCES=apple.c
            DEFS+=-D_GNU_SOURCE
            posted on 2012-06-27 10:13 SunRise_at 閱讀(2389) 評(píng)論(1)  編輯 收藏 引用 所屬分類: linux開發(fā)

            評(píng)論

            # re: Makefile自動(dòng)生成 2012-06-27 20:54 zgpxgame
            mark
              回復(fù)  更多評(píng)論
              

            久久久无码精品午夜| 亚洲乱亚洲乱淫久久| 色欲久久久天天天综合网精品| 三级三级久久三级久久| 久久精品99久久香蕉国产色戒| 精品久久久久久无码国产| 久久伊人精品一区二区三区| av午夜福利一片免费看久久| 天天久久狠狠色综合| 久久精品亚洲一区二区三区浴池| 九九久久自然熟的香蕉图片| 久久婷婷五月综合成人D啪| 亚洲精品乱码久久久久久中文字幕 | 亚洲一区二区三区日本久久九| 四虎国产精品成人免费久久| 2021精品国产综合久久| 一本一本久久a久久精品综合麻豆| 国内精品九九久久久精品| 中文成人无码精品久久久不卡| 久久婷婷久久一区二区三区| 久久SE精品一区二区| 久久亚洲欧洲国产综合| 狠狠色丁香久久婷婷综| 亚洲精品无码成人片久久| 亚洲精品乱码久久久久久不卡| 欧美亚洲国产精品久久蜜芽| 亚洲第一极品精品无码久久| 久久亚洲精品国产精品婷婷| 久久久精品国产Sm最大网站| 91精品国产91久久久久久青草| 久久久久高潮毛片免费全部播放| 亚洲精品国产第一综合99久久| 久久国产精品二国产精品| 久久99精品国产99久久| 国产欧美一区二区久久| AAA级久久久精品无码片| 欧洲人妻丰满av无码久久不卡| 久久久无码人妻精品无码| 国产精品对白刺激久久久| 久久免费高清视频| 久久精品国产99国产精品|