天空部落|yam天空
推薦這個部落格: 336
登入 | 免費註冊 | 忘記密碼

ddy 狡兔三窟之一

技術、攝影、生活的記錄

備忘錄 |部落格 |影片 |RSS聯播 |好看的照片 |麻幾好友 |留言板 |Q me
【轉貼】如何開發 Linux Device Driver? | 主頁 | 摩爾斯碼記憶圖
March 17, 2005
【轉貼】makefile 寫法以文找文
ddy1280 在天空部落發表於17:48:00 | 程式技術
鼓勵此網誌:0 
加入書籤: HemiDemiGoogle BookmarksYahoo! My WebDel.icio.usfurltechnorati加入此網頁到:你推我報MyShareUDN共享書籤BlogLive

在 Unix 上寫程式的人大概都碰過 Makefile,尤其是用 C 來開發程式的人。用 make來開發和編譯程式的確很方便,可是要寫出一個 Makefile就不簡單了。偏偏介紹 Makefile 的文件不多,GNU Make 那份印出來要幾百頁的文件,光看完 Overview 就快陣亡了,難怪許多人聞 Unix 色變。

在 Unix 上寫程式的人大概都碰過 Makefile,尤其是用 C 來開發程式的人。用 make來開發和編譯程式的確很方便,可是要寫出一個 Makefile就不簡單了。偏偏介紹 Makefile 的文件不多,GNU Make 那份印出來要幾百頁的文件,光看完 Overview 就快陣亡了,難怪許多人聞 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 collect

ion 中, 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 可以直

接安裝,或著你也可以自行下載這些軟體的原始檔回來 DIY。以下的範例是在 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 stdio.h

int main(int argc, char** argv)

{

printf(``Hello, GNU! '');

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 con figure 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 ch aracteristics.

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/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-co mpiler... 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 he llo.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。

在此範例中可藉由 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 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檔了。



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 的慣例,我們只要執行 confi

gure 這個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.a

m 檔再產生新的configure 及 Makefile.in 檔時就一定要有 Autoconf 及 Automake 了。



5. 相關訊息



Autoconf 和 Automake 功能十分強大,你可以從它們所附的 info 檔找到詳細的用法。你也可以從許多現存的 GNU 軟體或 Open Source 軟體中找到相關的 configure.in 或 Makefile.am 檔,它們是學習 Autoconf 及Automake 更多技巧的最佳範例。



這篇簡介只用到了 Autoconf 及 Automake 的皮毛罷了,如果你有心加入Open Source 軟體開發的行列,希望這篇文件能幫助你對產生 Makefile有個簡單的依據。其它有關開發 GNU程式或 C 程式設計及 Makefile 的詳細運用及技巧,我建議你從 GNU Coding Standards3

(GNU 編碼標準規定) 讀起,裡面包含了 GNU Makefile 慣例,還有發展 GNU 軟體套件的標準程序和慣例。這些 GNU 軟體的線上說明文件可以在http://www.gnu.org/ 這個網站上找到。



6. 結語



經由 Autoconf 及 Automake 的輔助,產生一個 Makefile 似乎不再像以前那麼困難了,而使用 Autoconf 也使得我們在不同平台上或各家 Unix之間散播及編譯程式變得簡單,這對於在 Unix 系統上開發程式的人員來說減輕了許多負擔。妥善運用這些 GNU 的工具軟體,可

以幫助我們更容易去發展程式,而且更容易維護原始程式碼。



一九九八年是 Open Source 運動風起雲湧的一年,許多 Open Source 的軟體普遍受到網路上大眾的歡迎和使用。感謝所有為 Open Source 奉獻的人們,也希望藉由本文能吸引更多的人加入『自由』、『開放』的 OpenSource 行列。



About this document ...



輕輕鬆鬆產生 Makefile1



This document was generated using the LaTeX2HTML translator Version 98.2 beta6 (August 14th, 1998) Copyright (C) 1993, 1994, 1995, 1996, Nikos Drakos, ComputerBased Learning Unit, University of Leeds.Copyright (C) 1997, 1998, Ross Moore, Mathematics Department,Macquarie University, Sydney.



The command line arguments were:

latex2html -split 0 -show_section_numbers automake.tex

The translation was initiated by on 1999-02-11



Footnotes

... itle1

本文件使用 ChiLaTeX 製作。

... CLE2

CLE (Chinese Linux Extension,Linux 中文延伸套件),

http://cle.linux.org.tw/



... Standards3

GNU Coding Standards, Richard Stallman.



藍森林 http://www.lslnet.com 2001年3月22日 08:44

作 者: 許明彥


 


 


 

留言 (2) | 引用 (0) | 人氣 () | 轉寄
此分類上一篇:【轉貼】如何開發 Linux Device Driver? | 主頁 |
相關閱讀
引用 (你可以針對此文寫一篇屬於自己的blog/想法,並給作者一個通告)
引用
留言 (2筆)
2.
我連皮毛都看不懂 XD
對了 stdio.h 是不是少了角括號(<stdio.h>)
板主回覆:
沒錯原文少了 <> 是為了避開html 將<stdio.h>視為HTML Tag

一般在windows 開發程式的人,Makefile 由VC都做好了,自然不會熟~
但在linux 下,寫makefile 是很基本的能力
所以囉,有環境的話自然就學得比較快了~~
t7yang 於 2008-07-16 01:03:03 留言 |

1.
感謝您的資訊,讓我在寫Makefile的時候,能夠迅速建立!^^
不過還是要學一些Makefile寫法比較好XD
板主回覆:
不客氣,我當初也只是想留著給自己方便找資料
基本上,Makefile 都還是自己純手工寫…這樣子能做的事比較多^^
allen501pc 於 2008-04-06 12:10:01 留言 |

發表你的留言 (字數限制 最多 2000 個中文字)
私密留言: 是 否
Name:





是 否
內容:
系統公告
  • 再也不怕文章消失!自動儲存功能9/24上線
個人檔案
個人圖檔
ID:ddy1280
暱稱:ddy
生日:1975/03/16
地區:桃園縣
  • 訂閱 |
    • 我要訂閱此部落格的
    • 日記
    • 網誌
    • 相簿
  • 好友 |
    • 好友功能
    • 加入好友
    • 觀看好友列表
    • 觀看人緣列表
  • 人氣 |
  • 簡介 

★快來看ddy的公告★
用Blog人氣換現金喔,係金A
只要用心經營Blog,不用四處拉人點廣告,詳請參考
使用BloggerAds 為Blog賺取實質收益 或點選
歡迎大家來關心社會上弱勢家庭的孩子,這裡有許多他們的創作與畫畫,請一起來關心這群孩子也鼓勵他們吧 強力推薦一個好站,希望森林,為您帶來人生的希望
聯絡我
點下去和我msn線上對談喔

最近文章發表
- 柯南的弟弟
- 【推薦】禱告盒子
- 超級猩光大道
- 民民的異性緣
- 兩個爸爸
- 【怒】台灣之恥
- 父親節禮物
- ddy 美食--涼拌珊瑚草
- 破10萬囉
- 好久不見
最新的回應
blanca0819:
謹民真的很可愛~~ ...
禎:
只能說養小孩會多了很多...
oumyfamily:
你好!謝謝你的設計,真...
withyou520:
私密留言
celia05168:
蝌蚪??民民才不要咧~~
niceboys:
ㄎㄎ ~ 可愛的柯南弟弟
tanna83:
哈哈~真好笑!
不好意思打擾了:
不知道為什麼 ...
celia05168:
變形金剛 ...
yen624:
真是一個有趣的串連~...
文章分類
技術(6)
電腦應用(7)
程式技術(22)
軟體相關(17)
硬體技術(3)
Linux 相關(30)
網路應用(20)
生活(10)
心情點滴(75)
生活資訊(16)
生活隨筆(14)
心得分享(14)
不平則鳴(10)
謹民學校生活(10)
生活雜記(2)
健康資訊(3)
童言童語(15)
謹民成長記錄(108)
小品(3)
好玩的(10)
小品文摘(8)
笑話(17)
攝影(1)
攝影心得(11)
憶當年(3)
電腦講古(0)
懷舊系列(2)
數饅頭的日子(5)
雜七雜八(1)
其它(12)
Tags Cloud
時光機器

謹民出生第 天

搜尋此頻道內容
搜尋:
人氣指數
當日人次:
累積人次:
誰來我家
ddy 有多少客人
online

我推薦誰
誰推薦我
著作權條款
Creative Commons License
本部落格採用創用CC 2.5 TW授權條款釋出.重製,散布,展示本站內容,請遵守 姓名標示-非商業性-禁止改作
公益串聯
到台湾玩不带走一张发票
用愛彌補~羅慧夫顱顏基金會
我的書籤(選單)
攝影相關
台灣攝影聯盟
數位影像坊
DCView 數位視野
數位蘋果網
DC543 數位攝影家族
formosa 山戀手記
桔子妹攝影作品
國攝天香
jimmy 攝影集
攝影家手扎
英語教學
楊官教英文
ETC 台灣英語網
詩聲樂園
中央大學英語學習資料庫
SINO
發音與拼音學習輔助區
LiveABC 圖解字典
Star fall 英文學習網站
小笨霖英語筆記本
英文學習咖啡小站
翻譯網
程式設計
Perl中文線上說明
Understand for C++(linux driver source code)
Delphi.KTOP
RFC Sourcebook
PHP5網管實驗室
SHELL SCRIPTING 教學與心得
Win32 Assembly
線上程式碼轉 html
Win32 Scripting
Perl 學習手扎
Perl 資源
Internet RFC/STD/FYI/BCP Archives
Linux commands source code
各類程式語言範例
Free Programming resources
Python 教學文件
OPEN SOURCE 共享資源
Internet FAQ Archives
Cobbler 全文檢索系統
雪龍KTOP 線上查詢
自動控制
PLC Flash動畫教學網站
OMRON各型PLC RS232C 接線圖
Linux 相關
摩托學園討論區
Ubuntu正體中文站
鳥哥的 Linux 私房菜
rpm find
Ubuntu正體中文站
Kurobox/Linkstation 資訊網
Steven's Linux Note
LOOP -- LinuxHall
永遠的UNIX
OpenBSD Taiwan
LINUX MAN PAGES ONLINE
Linux MAN Pages
weithenn 的BSD筆記
自由軟體
開放原碼軟體社群討論區
自由軟體鑄造場
sourceforge.net
中山大學FTP
SED 手冊
GnuWin32 Packages
生活相關
新式身份證申請相關
現代車網
摩比市場
Every8D簡訊
宗教教育
行政院消費者保護委員會
兒童醫學網
親親寶貝講故事
高速公路即時路況
AutoTH 汽車技術網
吃出好胃道
其它
Linkist 聯絡家
Mobile01
無蝦米web 版
每日天文網站
傷心咖啡店(考試討論)
findbook
站內推薦
謹民成長大記事
謹民成長記錄(網誌)
站外推薦
李維的Blog
fjumonkey的地盤
踢爆!女記者私密生活大公開
六年級大會堂
PythonTW::台灣Python 技術教學網站
好友部落格
帥氣飛行員濟群的blog
code6421 blog
餅老闆的人像館
企鵝寶寶--晴晴
Jimmy的部落格
宗民 Ming's Blog
水野靈--恩典歲月
怕失憶筆記 by bestlong
時鐘

每月文章彙集
.Sep 2008(1)
.Aug 2008(8)
.Jul 2008(10)
.Jun 2008(4)
.May 2008(6)
.Apr 2008(6)
.Mar 2008(9)
.Feb 2008(6)
.Jan 2008(11)
.Dec 2007(13)
.Nov 2007(16)
.Oct 2007(7)
.Sep 2007(1)
.Aug 2007(10)
.Jul 2007(5)
.May 2007(6)
.Apr 2007(13)
.Mar 2007(10)
.Feb 2007(2)
.Jan 2007(4)
.Dec 2006(14)
.Nov 2006(5)
.Oct 2006(11)
.Sep 2006(8)
.Aug 2006(10)
.Jul 2006(15)
.Jun 2006(16)
.May 2006(14)
.Apr 2006(15)
.Mar 2006(17)
.Feb 2006(9)
.Jan 2006(20)
.Dec 2005(18)
.Nov 2005(18)
.Oct 2005(30)
.Sep 2005(21)
.May 2005(5)
.Apr 2005(22)
.Mar 2005(17)
部落格廣告


強力推薦,讓Blog的人氣轉換成現金,鼓勵Blog創作最佳的回饋方式,詳請見使用BloggerAds 為Blog賺取實質收益或點選上方圖片加入喔

另一個Blog廣告的選擇BlogAD,欲加入請按這裡喔
基督徒串聯
隨機文章跑馬燈