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

Prayer

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

使用AutoMake輕松生成Makefile

Posted on 2010-01-22 15:02 Prayer 閱讀(477) 評論(0)  編輯 收藏 引用 所屬分類: makefile
在 Unix 上寫過程序的人一般都遇到過 Makefile,尤其是用 C 來開發程序的人。用 make 來開發和編譯程序的確很方便,可是要寫出一個MakeFile就不那么簡單了。偏偏介紹 Makefile 的文件不多,GNU Make 那份印出來要幾百頁的文件,光看完 Overview 自己就快要先Over了,難怪許多人聞 Unix色變。本文將介紹如何利用 GNU Autoconf 及 Automake 這兩套軟件來幫助『自動』產生 Makefile 文件,并且讓開發出來的的軟件可以象 Apache, MySQL 和常見的 GNU 軟件一樣,只要會 ``./configure', ``make', ``make install' 就可以把程序安裝到系統中。如果您有心開發 Open Source 的軟件,或只是想在 Unix 系統下寫寫程序。希望這份介紹文件能幫助您輕松的進入 Unix Programming 的殿堂。

 

 

1. 簡介
Makefile 基本上就是『目標』(target), 『關聯』(dependencies) 和『動作』三者所組成的一系列規則。而 make 就會根據 Makefile 的規則來決定如何編譯 (compile) 和連接 (link) 程式。實際上,make 可做的不只是編譯和連接程序,例如 FreeBSD 的 port collection 中,Makefile還可以做到自動下載遠程程序,解壓縮 (extract) , 打補丁 (patch),設定,然后編譯,安裝到系統中。

Makefile 基本結構雖然很簡單,但是妥善運用這些規則就可以變換出許多不同的花樣。卻也因為這樣,許多剛剛開始學習寫Makefile 時會覺得沒有規范可以遵循,每個人寫出來的Makefile都不大一樣,不知道從哪里下手,而且常常會受到自己的開發環境的限制,只要環境參數不同或者路徑更改,可能 Makefile 就得跟著修改修改。雖然有 GNU Makefile Conventions (GNU Makefile慣例例)訂出一些使用 GNU 程式設計時撰寫 Makefile 的一些標準和規范,但是內容很長而且很復雜,并且經常作一些調整,為了減輕程序開發人員維護Makefile 的負擔,因此出現了Automake。

程序設計者只需要寫一些預先定義好的宏 (macro),提交給Automake處理后會產生一個可以供 Autoconf 使用的 Makefile.in文件。再配合利用 Autoconf產生的自動培植設置文件 configure 即可產生一份符合符合 GNU Makefile 慣例的 Makeifle 了。

 

2. 上路之前
在開始使用 Automake 之前,首先確認你的系統安裝有如下軟件:

 

1.
GNU Automake
2.
GNU Autoconf
3.
GNU m4
4.
perl
5.
GNU Libtool (如果你需要產生 shared library)
建議最好也使用 GNU C/C 編譯器 、GNU Make 以及其它 GNU 的工具程序來作為開發的環境,這些工具都是屬于 Open Source Software 不但免費而且功能強大。如果你是使用 Red Hat Linux 可以找到所有上述軟件的 rpm 文件,FreeBSD 也有現成的 package 可以直接安裝,或也可以自行下載這些軟件的源代碼回來安裝。下面的示例是在Red Hat Linux 5.2 CLE2 的環境下所完成的。


 

3. 一個簡單的例子
Automake 所產生的 Makefile 除了可以做到程式的編譯和連接,也已經把如何產生程序文件 (如 manual page, info 文件及 dvi 文件) 的動作,還有把源碼文件包裝起來以供發布都考慮進去了,所以程序源代碼所存放的目錄結構最好符合GNU 的標準慣例,接下來就用一個hello.c 來做為例子。

在工作目錄下建立一個新的子目錄"devel"',再在 devel 下建立一個"hello"' 的子目錄,這個目錄將作為存放 hello這個程序及其相關文件的地方:

% mkdir devel
% cd devel
% mkdir hello
% cd hello
用編輯器寫一個hello.c文件,


#include
int main(int argc, char** argv) {
printf(``Hello, GNU!n');
return 0;
}
接下來就要用 Autoconf 及 Automake 來產生 Makefile 文件了,

1.
用 autoscan 產生一個 configure.in 的原型,執行autoscan 后會產生一個configure.scan 的文件,可以用它作為 configure.in文件的藍本。
 
% autoscan
% ls
configure.scan hello.c
2.
編輯 configure.scan文件,如下所示,並且改名為configure.in
dnl Process this file with autoconf to produce a configure script. AC_INIT(hello.c) AM_INIT_AUTOMAKE(hello, 1.0)
dnl Checks for programs.
AC_PROG_CC
dnl Checks for libraries.
dnl Checks for header files.
dnl Checks for typedefs, structures, and compiler characteristics.
dnl Checks for library functions.
AC_OUTPUT(Makefile)
3.
執行 aclocal 和 autoconf ,分別會產生 aclocal.m4 及 configure 兩個文件
% aclocal
% autoconf
% ls
aclocal.m4 configure configure.in hello.c
4.
編輯 Makefile.am 文件,內容如下
AUTOMAKE_OPTIONS= foreign

bin_PROGRAMS= hello
hello_SOURCES= hello.c
5.
執行 automake --add-missing ,Automake 會根據Makefile.am 文件產生一些文件,包含最重要的 Makefile.in
% automake --add-missing automake: configure.in: installing `./install-sh' automake: configure.in: installing `./mkinstalldirs' automake: configure.in: installing `./missing'
6.
最后執行 ./configure ,
% ./configure creating cache ./config.cache checking for a BSD compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking whether make sets ${MAKE}... yes checking for working aclocal... found checking for working autoconf... found checking for working automake... found checking for working autoheader... found checking for working makeinfo... found checking for gcc... gcc checking whether the C compiler (gcc ) works... yes checking whether the C compiler (gcc ) is a cross-compiler... no checking whether we are using GNU C... yes checking whether gcc accepts -g... yes updating cache ./config.cache creating ./config.status creating Makefile

軟件開發網


現在你的目錄下已經產生了一個 Makefile 檔,下個 ``make' 指令就可以開始編譯 hello.c 成執行檔,執行 ./hello 和 GNU 打聲招呼吧!

% make gcc -DPACKAGE="hello" -DVERSION="1.0" -I. -I. -g -O2 -c hello.c gcc -g -O2 -o hello hello.o % ./hello Hello! GNU!
你還可以試試 ``make clean','make install','make dist' 看看會有什麼結果。你也可以把產生出來的 Makefile 秀給你的老闆,讓他從此對你刮目相看 :-)

4. 追根問底
上述產生Makefile 的過程和以往自行編寫的方式非常不一樣,舍棄傳統自定義make 的規則,使用 Automake 只需用到一些已經定義好的宏就可以了。我們把宏及目標 (target)寫在Makefile.am 文件內,Automake 讀入 Makefile.am 文件后會把這一串已經定義好的宏展開并產生相對應的 Makefile.in 文件,然后再由 configure這個 shell script 根據 Makefile.in 產生合適的Makefile。


[Figure 1:利用 autoconf 及 automake產生Makefile 的流程]

上圖表示在上一范例中要使用的文件檔案及產生出來的文件,有星號 (*) 者代表可執行文件。在此示例中可由 Autoconf 及 Automake 工具所產生的額外文件有 configure.scan、aclocal.m4、configure、Makefile.in,需要自行加入設置的有configure.in 及 Makefile.am。

4.1 編輯 configure.in 文件
Autoconf 是用來產生 'configure'文件的工具。'configure' 是一個 shell script,它可以自動設定原始程序以符合各種不同平臺上Unix 系統的特性,并且根據系統參數及環境產生合適的Makefile文件或C 的頭文件(header file),讓原始程式可以很方便地在不同的平臺上進行編譯。Autoconf會讀取 configure.in 文件然后產生'configure' 這個 shell script。

configure.in 文件內容是一系列GNU m4 的宏,這些宏經autoconf處理后會變成檢查系統特性的shell scripts。 configure.in 內宏的順序并沒有特別的規定,但是每一個configure.in 文件必須在所有宏前加入 AC_INIT 宏,然后在所有宏的最后加上 AC_OUTPUT宏??上扔?autoscan 掃描原始文件以產生一個 configure.scan 文件,再對 configure.scan 做些修改成 configure.in 文件。在范例中所用到的宏如下:

dnl
這個宏后面的字不會被處理,可以視為注釋
AC_INIT(FILE)
該宏用來檢查源代碼所在路徑,autoscan 會自動產生,一般無須修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION)
這個是使用 Automake 所必備的宏,PACKAGE 是所要產生軟件套件的名稱,VERSION 是版本編號。
AC_PROG_CC
檢查系統可用的C編譯器,若源代碼是用C寫的就需要這個宏。
AC_OUTPUT(FILE)
設置 configure 所要產生的文件,若是Makefile ,configure 便會把它檢查出來的結果帶入 Makefile.in 文件后產生合適的 Makefile。
實際上,這里使用 Automake 時,還需要一些其他的宏,這些額外的宏我們用 aclocal來幫助產生。執行 aclocal會產生aclocal.m4 文件,如果無特別的用途,可以不需要修改它,用 aclocal 所產生的宏會告訴 Automake如何動作。

有了 configure.in 及 aclocal.m4兩個文件以后,便可以執行 autoconf來產生 configure 文件了。

4.2 編輯Makefile.am 文件
接下來要編輯Makefile.am 文件,Automake 會根據 configure.in 中的宏把Makefile.am 轉成 Makefile.in 文件。 Makefile.am 文件定義所要產生的目標:

AUTOMAKE_OPTIONS
設置 automake 的選項。Automake 主要是幫助開發 GNU 軟件的人員來維護軟件,所以在執行 automake 時,會檢查目錄下是否存在標準 GNU 軟件中應具備的文件,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件。設置 foreign 時,automake 會改用一般軟件的標準來檢查。
bin_PROGRAMS
定義要產生的執行文件名。如果要產生多個執行文件,每個文件名用空白符隔開。
hello_SOURCES
定義 'hello' 這個執行程序所需要的原始文件。如果 'hello'這個程序是由多個原始文件所產生,必須把它所用到的所有原始文件都列出來,以空白符隔開。假設 'hello' 還需要 'hello.c'、'main.c'、'hello.h' 三個文件的話,則定義
hello_SOURCES= hello.c main.c hello.h
如果定義多個執行文件,則對每個執行程序都要定義相對的filename_SOURCES。

編輯好 Makefile.am 文件,就可以用 automake --add-missing來產生 Makefile.in。加上 --add-missing 選項來告訴 automake順便假如包裝一個軟件所必須的文件。Automake產生生出來的 Makefile.in 文件是完全符合 GNU Makefile 的慣例,只要執行 configure這個shell script 便可以產生合適的 Makefile 文件了。

4.3 使用 Makefile
利用 configure 所產生的 Makefile文件有幾個預先設定的目標可供使用,這里只用幾個簡述如下:

make all
產生設定的目標,既次范例中的執行文件。只敲入make 也可以,此時會開始編譯源代碼,然后連接并產生執行文件。
make clean
清除之前所編譯的執行文件及目標文件(object file, *.o)。
make distclean
除了清除執行文件和目的文件以外,也把 configure 所產生的 Makefile 清除掉。

make install
將程序安裝到系統中,若源碼編譯成功,且執行結果正確,便可以把程序安裝到系統預先設定的執行文件存放路徑中,若用 bin_PROGRAMS 宏的話,程序會被安裝到 /usr/local/bin下。
make dist
將程序和相關的文檔包裝為一個壓縮文檔以供發布 (distribution) 。執行完在目錄下會產生一個以PACKAGE-VERSION.tar.gz 為名稱的文件。PACKAGE 和 VERSION 這兩個參數是根據 configure.in 文件中 AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定義。在此范例中會產生 'hello-1.0.tar.gz' 的文件。
make distcheck
和 make dist 類似,但是加入檢查包裝以后的壓縮文件是否正常,這個目標除了把程序和相關文檔包裝成 tar.gz 文件外,還會自動把這個壓縮文件解開,執行 configure,并執行 make all ,確認編譯無錯誤以后,戶顯示這個 tar.gz 文件已經準備好可以發布了。這個檢查非常有用,檢查過關的套件,基本上可以給任何具備 GNU 開發環境的人去重新編譯成功。就 hello-1.tar.gz 這個范例而言,除了在Red Hat Linux 上,在 FreeBSD 2.2.x 也可以正確編譯。
要注意的是,利用 Autoconf 及 Automake 所產生出來的軟件套件是可以在沒有安裝 Autoconf 及 Automake 的環境使用的,因為 configure 是一個 shell script,它己被設計為可以在一般 Unix 的 sh 這個 shell 下執行。但是如果要修改 configure.in 及 Makefile.am 文件再產生新的 configure 及 Makefile.in 文件時就一定要有 Autoconf 及 Automake 了。 軟件開發網

5. 相關資料
Autoconf 和 Automake 功能十分強大,可以從它們附帶的 info 穩當4中找到詳細的使用方法說明。你也可以從許多現有的GNU 軟件或 Open Source 軟件中找到相關的 configure.in 或 Makefile.am 文件,他們是學習 Autoconf 及 Automake 更多技巧的最佳范例。

這個簡介只用到了 Autoconf 及 Automake 的皮毛罷了,如果你有心加入 Open Source 軟件開發的行列,希望這篇文章可以幫助你對產生 Makefile 有個簡單的了解。其它有關開發 GNU 程式或 C 程序設計及 Makefile 的詳細運用及技巧,建議從 GNU Coding Standards (GNU 編碼規定) 讀起,里面包含了 GNU Makefile 慣例,及開發 GNU 軟件的標準程序和慣例。這些 GNU 軟件的在線說明文件可以在 http://www.gnu.org/ 上找到。

6. 結束語
利用 Autoconf 及 Automake,產生一個 Makefile 似乎不再象以前那么困難了,而使用 Autoconf 也使得我們在不同平臺上或各家 Unix 之間發布及便宜程序變的簡單,這對于在Unix 系統上程序開發員來說減輕了許多負擔。妥善運用這些 GNU 的工具軟件,可以幫助我們更容易的去開發程序,而且更容易維護源代碼。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品国产自| 亚洲三级视频在线观看| 欧美在线3区| 亚洲天堂偷拍| 亚洲影院免费观看| 亚洲欧美日韩一区| 久久成人精品一区二区三区| 亚洲免费小视频| 欧美在线中文字幕| 美女精品在线观看| 亚洲欧美日韩国产综合在线| 亚洲一区在线播放| 亚洲免费婷婷| 香蕉亚洲视频| 欧美激情第4页| 欧美三级资源在线| 国产农村妇女精品一二区| 国产女精品视频网站免费| 国产欧美日韩视频| 一色屋精品视频在线看| 欧美精品电影在线| 欧美视频一区二区三区四区| 国产精品毛片一区二区三区| 国产精品亚洲一区| 国内精品免费午夜毛片| 亚洲精品1区2区| 一级日韩一区在线观看| 亚洲视频播放| 久久av一区二区三区漫画| 久久综合五月天婷婷伊人| 欧美成年人网| 99视频超级精品| 亚洲欧美久久久久一区二区三区| 亚洲欧美日韩综合| 麻豆成人综合网| 美女视频网站黄色亚洲| 免费亚洲网站| 欧美顶级艳妇交换群宴| 国产精品久久久久久久久借妻 | 亚洲电影免费观看高清完整版| 国产精品va| 韩国三级电影久久久久久| 亚洲人成亚洲人成在线观看| 亚洲一二三级电影| 另类激情亚洲| 亚洲国产精品第一区二区| 米奇777在线欧美播放| 亚洲欧洲免费视频| 欧美亚洲日本网站| 欧美在线综合视频| 久久九九国产精品| 国产精品日韩电影| 美女主播精品视频一二三四| 欧美日韩不卡视频| 国内偷自视频区视频综合| 一区二区国产精品| 欧美国产乱视频| 久热精品视频| 亚洲一区中文字幕在线观看| 欧美大片在线影院| 樱桃国产成人精品视频| 香蕉久久夜色精品国产| 亚洲国产人成综合网站| 久久精品国产精品| 国产嫩草一区二区三区在线观看| 亚洲美女区一区| 欧美激情亚洲另类| 久久久精品一区二区三区| 国产精品一二三四区| 亚洲图片自拍偷拍| 亚洲国产欧美在线| 久久久久久网| 狠狠入ady亚洲精品| 久久国产毛片| 香港久久久电影| 国产午夜精品麻豆| 欧美一级艳片视频免费观看| 一区二区三区精品视频| 欧美视频中文字幕| 国产精品久久激情| 亚洲一区二区三区在线观看视频| 亚洲欧洲一区二区三区久久| 欧美成人午夜激情| 99精品视频免费观看视频| 亚洲国产三级网| 欧美人与性动交α欧美精品济南到| 亚洲国产精品传媒在线观看 | 久热精品在线| 亚洲电影观看| 伊人久久综合97精品| 亚洲国产三级网| 亚洲国产欧美国产综合一区| 欧美精品成人在线| 亚洲欧美日本伦理| 亚洲欧美日韩另类| 影音欧美亚洲| 欧美高清在线观看| 久久精品亚洲乱码伦伦中文 | 亚洲视频网在线直播| 欧美日韩三区四区| 久久精品一区二区三区不卡| 欧美韩日一区二区三区| 欧美日韩精品一区| 亚洲欧洲综合另类| 亚洲图片你懂的| 亚洲第一在线综合在线| 日韩视频在线一区二区三区| 在线播放中文一区| aa亚洲婷婷| 久久久久一区二区三区| 亚洲视频网站在线观看| 亚洲国产精品999| 亚洲国产影院| 久久国产成人| 黄色成人在线免费| 午夜精品在线视频| 亚洲大胆av| 亚洲综合日韩| 韩国成人精品a∨在线观看| 在线观看三级视频欧美| 亚洲第一福利视频| 欧美日韩色婷婷| 久久一本综合频道| 欧美午夜www高清视频| 美女久久一区| 久久久午夜电影| 久久综合国产精品台湾中文娱乐网| 亚洲美女毛片| 久久久久网址| 欧美一区二区播放| 久久er99精品| 一本大道久久a久久综合婷婷 | 日韩亚洲欧美精品| 激情视频一区二区| 在线亚洲美日韩| 亚洲经典三级| 久久国产毛片| 香蕉久久夜色精品国产| 欧美日韩一区二区欧美激情| 免费成人av在线看| 国产一区日韩二区欧美三区| 一区二区三区国产在线观看| 亚洲欧洲精品一区二区| 一区二区三区黄色| 夜夜爽99久久国产综合精品女不卡| 久久久久网站| 亚洲综合视频一区| 欧美在线视频网站| 中日韩美女免费视频网址在线观看| 久久精品系列| 久久亚洲一区二区| 国产亚洲人成a一在线v站| 亚洲一区二区三区在线看| 久热re这里精品视频在线6| 久久精品一级爱片| 国产精品一卡二| 亚洲一区bb| 亚洲自拍电影| 国产精品免费在线| 亚洲一区激情| 欧美一级网站| 国产真实乱子伦精品视频| 欧美在线观看一区二区三区| 久久精品免费观看| 欧美日一区二区三区在线观看国产免| 亚洲香蕉视频| 欧美在线精品免播放器视频| 国产亚洲aⅴaaaaaa毛片| 欧美一区二区精品在线| 久久久久久久波多野高潮日日| 国产在线精品成人一区二区三区| 久久狠狠亚洲综合| 欧美激情一区二区三区 | 亚洲欧美国产精品va在线观看| 国产精品成人一区| 亚洲欧美成人网| 久久先锋影音| 日韩一级黄色av| 国产精品亚洲综合久久| 久久久亚洲精品一区二区三区 | 欧美国产一区二区三区激情无套| 91久久国产精品91久久性色| av不卡在线观看| 国产午夜精品理论片a级大结局 | 欧美精品成人在线| 国产精品久久久久久久9999| 国产欧美日韩精品在线| 亚洲国产视频直播| 午夜精品福利电影| 最新国产の精品合集bt伙计| 小黄鸭精品aⅴ导航网站入口| 一区二区精品| 欧美xart系列在线观看| 国产喷白浆一区二区三区| 亚洲精品午夜| 欧美高清视频在线播放| 久久精品一区二区国产| 国产精品亚洲综合一区在线观看| 亚洲黄色成人久久久| 欧美高清视频一区|