国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

輕輕松松產生 Makefile

2024-07-21 02:35:58
字體:
來源:轉載
供稿:網友

  作者:許明彥
  
  在 Unix 上寫程式的人大概都碰過 Makefile,尤其是用 C 來開發程式的人。用 make 來開發和編譯程式的確很方便,可是要寫出一個 Makefile就不簡單了。 偏偏介紹 Makefile 的文件不多,GNU Make 那份印出來要幾百頁的文件,光看完 Overview 就快陣亡了,難怪許多人聞 Unix 色變。本文將介紹如何利用 GNU Autoconf 及 Automake 這兩套軟體來協助我們『自動』產生 Makefile 檔,并且讓開發出來的軟體可以像 Apache,MySQL 和常見的 GNU 軟體一樣,只要會 ``./configure'', ``make'',``make install'' 就可以把程式安裝到系統中。假如您有心開發 OpenSource 的軟體,或只是想在 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 (GNUMakefile 慣例) 訂出一些使用 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 可以直接安裝,或著你也可以自行下載這些軟體的原始檔回來 DIY。以下的范例是在 Red HatLinux 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.m4configureconfigure.inhello.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/in
  stall -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。
  
  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 script。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 檔了

上一篇:autoconf手冊(八)

下一篇:CVS使用探討

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苏州市| 武威市| 西乌| 旬邑县| 天水市| 五指山市| 乐至县| 宣城市| 清原| 富宁县| 贵南县| 新源县| 宁强县| 石渠县| 云阳县| 茂名市| 平度市| 房山区| 清远市| 上饶市| 白沙| 罗田县| 鄯善县| 海口市| 岫岩| 安新县| 万源市| 龙里县| 团风县| 兴化市| 敖汉旗| 苏尼特右旗| 永寿县| 元谋县| 紫金县| 台州市| 乐清市| 达拉特旗| 陕西省| 瓦房店市| 新蔡县|