閱讀71 返回首頁    go 阿裏雲 go 技術社區[雲棲]


如何自動生成Makefile

如何自動生成Makefile

如果隻是一個很小的程序,沒有幾個文件,那麼,我們手工書寫Makefile還是可以忍受的,如果是一個超大型的工程,誰能忍受的了,光一個Makefile文件就足以是Writer頭疼了,但也沒有人說一定要手工書寫makefile文件。linux中提供了自動生成Makefile的工具,而且通過,這些工具生成的makefile還很符合GNU的習慣的。而且功能也很齊全。

自動生成makefile需要些工具來支持:autoscan,aclocal,autoconf,automake如果需要生成動態庫還需要libtool。

舉例子來說,假如我有test.c,p1.c,p2.c,myheader.h這幾個文件,而且test.c需要調用在myheader.h中聲明過的p1,p2函數,他們分別有p1.c,p2.c來實現。

首先,進入上麵幾個文件的目錄,然後執行autoscan,autoscan用來掃描源代碼目錄並生成cinfigure.scan文件,和一個日誌文件,但對我們來說有用的是前者:
    $autoscan
之後就會生成autoscan.log  configure.scan這兩個文件,為了簡單,我將所有的注釋(以#開頭)都刪除了,打開configure.scan:
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([p1.c])
AC_CONFIG_HEADER([config.h])

AC_PROG_CC

AC_OUTPUT
然後修改該文件,為後來使用作準備:
AC_INIT(test.c)
AM_INIT_AUTOMAKE(test, 1.0)

AC_PROG_CC

AC_OUTPUT(Makefile)
後麵在解釋為什麼要這麼修改。做完上麵的工作之後,我們要將configure.scan改名為configure.in讓aclocal使用,他是一個perl腳本程序,他根據configure.in文件的內容生成aclocal.m4文件
    $aclocal
然後就是生成configure腳本文件,
    $autoconf
這樣ls後就會有一個configure的可執行的文件。當然,工作到這還沒有結束,我們還要寫一個Makefile.am文件,用來生成Makefile.in文件。
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= test
test_SOURCES= test.c p1.c p2.c myheader.h
這樣就生成一個Makefile.in的文件,此時運行一下configure腳本就會得到Makefile,打開之後會發現,太豐富了!make一下可執行的test被編譯好了。

上麵的工作可以用下麵的圖來表示:
autuscan -> (configure.scan) -> (configure.in) | ->                              autoconf ->(configure) -->(Makefile)
                                                                    |          | -> aclocal -> (aclocal.m4) -v
                                                                    ---------------------------------------v          
                                                                                (Makefile.am) -> automake-> (Makefile.in) -^
下麵來分別解釋一下上麵的文件和命令:
    autoscan :           用來掃描源代碼的目錄生成configure.scan,如果不指定掃描目錄,則他會掃描當前工作目錄,
    configure.scan : 包含了係統配置的基本選項,一般用來製作configure.in文件。
    configure.in :      該文件的內容都是一些宏,其中的順序沒有硬性的規定,不過建議的順序是:
                    AC_INIT
                        測試程序
                        測試函數
                        測試頭文件
                        測試類型定義
                        測試結構
                        測試編譯器
                        測試庫函數
                        測試係統調用
                    AC_OUTPOUT
                    更詳細的請參閱《GNU/Linux編程指南(第二版)》

    aclocal:             根據configure.in的內容自動生成aclocal.m4文件,其定義為:alocal : creat alocal.m4 by scanning configure.ac
    alocal.m4 :          在執行automake的時候還需要其他的一些宏,這就由alocal產生。當有了 configure.in和alocal.m4兩個宏文件後,就可以用automake來產生Makefile.in文件了。
    autoconf:          用來產生configure腳本程序。
    configure:         他能根據不同的係統,產生不同的Makefile,從而是我們的程序具有可移植性。他還有一些參數:
                    --cache-file=FILE                                            測試係統的特性,並將結果放到FILE中

                    --help                                                               輸出幫助信息

                    --no-create                                                      阻止其生成輸出文件

                    --quiet                                                               執行是不做輸出

                    --silent                                                              同上,若設置則不會有任何輸出到屏幕

                    --version                                                          輸出automake的版本號

                    --prefix=PEWFIX                                             安裝位置設置(常用)

                    --exec-prefix=EPREFIX                                  設置結構倚賴的文件的安裝位置

                    --bindir=DIR                                                指定可執行文件的安裝位置.

                    --sbindir=DIR                                                    指定超級用戶可執行的安裝位置.

                    --libexecdir=DIR                                              指定可執行支持文件的安裝位置.
                    --datadir=DIR                                              指定通用數據文件的安裝位置.

                    --sysconfdir=DIR                                        指定隻讀數據的安裝位置.

                    --sharedstatedir=DIR                                   指定共享的可寫數據的安裝位置.

                    --localstatedir=DIR                                     指定(非共享)可寫數據的安裝位置.

                    --libdir=DIR                                                 指定庫文件的安裝位置.

                    --includedir=DIR                                         指定C頭文件的安裝位置.

                    --oldincludedir=DIR                                   指定為除GCC外編譯器安裝的C頭文件的安裝位置.

                    --infodir=DIR                                               指定Info格式文檔的安裝位置.

                    --mandir=DIR                                               指定手冊頁的安裝位置.

                    --srcdir=DIR                                                源碼的位置

                    --program-prefix=PREFIX                         增加安裝程序名字前綴.

                    --program-suffix=SUFFIX                          增加安裝程序名字後綴.

                    --program-transform-name=PROGRAM  產生安裝名

                    --build=BUILD                                              指定軟件包安裝的係統平台.

                    --host=HOST                                                指定軟件運行的係統平台.
                    --target=GARGET                                        指定軟件麵向的係統平台

                    --disable-FEATURE                                     提供為大型選項的編譯時配置

                    --enable-FEATURE[=ARG]                           提供了一些默認被禁止的特性

                    --enable-FEATURE=no                                     同--disable-FEATURE

                    --with-PACKAGE[=ARG]                              使用已有軟件包和庫
                    --with-PACKAGE=no                                         --without-PACKAGE同義

                    --without-PACKAGE                                    禁止軟件包與係統已有的軟件包交互

                    --x-includes=DIR                                         --with-PACKAGE的一個特例

                    --x-libraries=DIR                                        向configure腳本指明包含X11庫的目錄
    makefile.am :      根據他生成makefile.in文件。
                    AUTOMAKE_OPTIONS = foreign                         設置automake的選項,設置成foreign表示按一般軟件處理。
                    bin_PROGRAMS = filename1 [...]       產生的可執行文件名
                    filename1_SOURCES = f1.c f2.c                       指明生成filename可執行文件的源碼                            
                    [...]
                    filename_LDADD =
                    filename_LDFLAGS =
                    filename_DEPENDENCIES =
                    靜態庫lib_LIBRARIES = libfilename.a
                    filename_a_SOURCES =
                    filename_a_LDADD =
                    filename_a_LIBADD =
                    filename_a_LDFALGS =
                    頭文件include_HEADERS = filename.h
                    數據文件data_DATA = data1 data2
                    (對於可執行文件和靜態庫類型如果隻想編譯,不想安裝到係統中,可以用:noinst_PROGRAMS代替bin_PROGRAMS
                    和noinst_LIBRARIES代替lib_LIBRARIES)
    automake :          使用automake --add-missing來生成Makefile.in文件,後麵的選項使我們製作出來的Makfile符合GNU的習慣,
    Makefile :             GNU的習慣:
                    make                     編譯,連接,生成可執行文件;
                    make clean          清除編譯產生的obj文件,以及可執行文件;
                    make install         安裝到係統中,一般是/usr/local/bin
                    make dist             將源碼打包,以便發布
                    make diskcheck 生成包,並對其進行檢查,以確保其正確性;

最後更新:2017-04-03 12:55:22

  上一篇:go Oracle 取出多個字段列中的最大值和最小值
  下一篇:go [C/C++基礎知識] main函數的參數argc和argv