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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

makefile寫法

2019-11-17 05:27:24
字體:
供稿:網(wǎng)友

  Abstract:

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

本文將介紹如何利用 GNU Autoconf 及 Automake 這兩套軟體來協(xié)助我們『自動』產(chǎn)生 Makefile 檔,并且讓開發(fā)出來的軟體可以像 Apache, MySQL 和常見的 GNU 軟體一樣,只要會 ``./configure'', ``make'', ``make install'' 就可以把程式安裝到系統(tǒng)中。假如您有
心開發(fā) Open Source 的軟體,或只是想在 Unix 系統(tǒng)下寫寫程式。希望這份介紹文件能幫助您輕松地進入 Unix PRogramming 的殿堂。

1. 簡介

Makefile 基本上就是『目標(biāo)』(target), 『關(guān)連』(dependencies) 和『動作』三者所組成的一連串規(guī)則。而 make 就會根據(jù) Makefile 的規(guī)則來決定如何編譯 (compile) 和連結(jié) (link) 程式。實際上,make 可做的不只是編譯和連結(jié)程式,例如 FreeBSD 的 port collect
ion 中, Makefile 還可以做到自動下載原始程式套件,解壓縮 (extract) ,修補 (patch),設(shè)定,然後編譯,安裝至系統(tǒng)中。

Makefile 基本構(gòu)造雖然簡單,但是妥善運用這些規(guī)則就也可以變出許多不同的花招。卻也因此,許多剛開始學(xué)習(xí)寫 Makefile 時會感到?jīng)]有規(guī)范可循,每個人寫出來的 Makefile 長得都不太一樣,不知道從何下手,而且經(jīng)常會受限於自己的開發(fā)環(huán)境,只要環(huán)境變數(shù)不同或路
徑改一下,可能Makefile 就得跟著修改。雖然有 GNU Makefile Conventions (GNU Makefile 慣例) 訂出一些使用 GNU 程式設(shè)計時撰寫 Makefile 的一些標(biāo)準(zhǔn)和規(guī)范,但是內(nèi)容很長而且很復(fù)雜, 并且經(jīng)常做些調(diào)整,為了減輕程式設(shè)計師維護 Makefile 的負(fù)擔(dān),因此有了Automake。

程式設(shè)計師只需寫一些預(yù)先定義好的巨集 (macro),交給 Automake 處理後會產(chǎn)生一個可供Autoconf 使用的 Makefile.in 檔。再配合利用Autoconf 產(chǎn)生的自動設(shè)定檔 configure即可產(chǎn)生一份符合 GNU Makefile慣例的 Makeifle 了。

2. 上路之前

在開始試著用 Automake 之前,請先確認(rèn)你的系統(tǒng)已經(jīng)安裝以下的軟體:
1. GNU Automake
2. GNU Autoconf
3. GNU m4
4. perl
5. GNU LiBTool (假如你需要產(chǎn)生 shared library)

我會建議你最好也使用 GNU C/C++ 編譯器 、GNU Make 以及其它 GNU 的工具程式來做為開發(fā)的環(huán)境,這些工具都是屬於 Open Source Software不僅免費而且功能強大。假如你是使用Red Hat linux 可以找到所有上述軟體的 rpm 檔,F(xiàn)reeBSD 也有現(xiàn)成的 package 可以直
接安裝,或著你也可以自行下載這些軟體的原始檔回來 DIY。以下的范例是在 Red Hat linux 5.2 + CLE2 的環(huán)境下所完成的。

3. 一個簡單的例子

Automake 所產(chǎn)生的 Makefile 除了可以做到程式的編譯和連結(jié),也已經(jīng)把如何產(chǎn)生程式文件(如 manual page, info 檔及 dvi 檔) 的動作,還有把原始程式包裝起來以供散 的動作都考慮進去了,所以原始程式所存放的目錄架構(gòu)最好符合 GNU 的標(biāo)準(zhǔn)慣例,接下來我拿hello.c 來做為例子。

在工作目錄下建立一個新的子目錄 ``devel'',再在 devel 下建立一個``hello'' 的子目錄,這個目錄將作為我們存放 hello 這個程式及其相關(guān)檔案的地方:

% 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 來幫我們產(chǎn)生 Makefile 檔了,

1. 用 autoscan 產(chǎn)生一個 configure.in 的雛型,執(zhí)行 autoscan 後會產(chǎn)生一個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. 執(zhí)行 aclocal 和 autoconf ,分別會產(chǎn)生 aclocal.m4 及 configure 兩個檔案
% aclocal
% autoconf
% ls
aclocal.m4 configure configure.in hello.c

4. 編輯 Makefile.am 檔,內(nèi)容如下
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c

5. 執(zhí)行 automake --add-missing ,Automake 會根據(jù) Makefile.am 檔產(chǎn)生一些檔案,包含最重要的 Makefile.in
% automake --add-missing
automake: configure.in: installing `./install-sh'
automake: configure.in: installing `./mkinstalldirs'
automake: configure.in: installing `./missing'

6. 最後執(zhí)行 ./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

現(xiàn)在你的目錄下已經(jīng)產(chǎn)生了一個 Makefile 檔,下個 ``make'' 指令就可以開始編譯 hello.c 成執(zhí)行檔,執(zhí)行 ./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'' 看看會有什麼結(jié)果。你也可以把產(chǎn)生出來的 Makefile 秀給你的老板,讓他從此對你刮目相看 icon_smile.gif

4. 一探究竟

上述產(chǎn)生 Makefile 的過程和以往自行編寫的方式非常不一樣,舍棄傳統(tǒng)自行定義 make 的規(guī)則,使用 Automake 只需用到一些已經(jīng)定義好的巨集即可。我們把巨集及目標(biāo) (target)寫在 Makefile.am 檔內(nèi),Automake讀入 Makefile.am 檔後會把這一串已經(jīng)定義好的巨集展
開并且產(chǎn)生對應(yīng)的Makefile.in 檔, 然後再由 configure 這個 shell script 根據(jù)Makefile.in 產(chǎn)生適合的 Makefile。
在此范例中可藉由 Autoconf 及 Automake 工具所產(chǎn)生的檔案有 configure.scan、aclocal.m4、configure、Makefile.in,需要我們加入設(shè)定者為 configure.in 及 Makefile.am。

4.1 編輯 configure.in 檔

Autoconf 是用來產(chǎn)生 'configure' 檔的工具。'configure' 是一個shell script,它可以自動設(shè)定原始程式以符合各種不同平臺上 Unix 系統(tǒng)的特性,并且根據(jù)系統(tǒng)叁數(shù)及環(huán)境產(chǎn)生合適的 Makefile 檔或是C 的標(biāo)頭檔 (header file),讓原始程式可以很方便地在這些不同

的平臺上被編譯出來。Autoconf 會讀取 configure.in 檔然後產(chǎn)生 'configure' 這個shell script。

configure.in 檔的內(nèi)容是一連串 GNU m4 的巨集,這些巨集經(jīng)過autoconf 處理後會變成檢查系統(tǒng)特徵的 shell script。configure.in 內(nèi)巨集的順序并沒有非凡的規(guī)定,但是每一個 configure.in 檔必須在所有巨集前加入 AC_INIT 巨集,然後在所有巨集的最後面加上 AC
_OUTPUT 巨集。我們可先用 autoscan 掃描原始檔以產(chǎn)生一個 configure.scan 檔,再對 configure.scan 做些修改成 configure.in 檔。在范例中所用到的巨集如下:

dnl
這個巨集後面的字不會被處理,可視為注解。

AC_INIT(FILE)
這個巨集用來檢查原始碼所在的路徑,autoscan 會自動產(chǎn)生,我們不必修改它。

AM_INIT_AUTOMAKE(PACKAGE,VERSION)
這是使用 Automake 所必備的巨集,PACKAGE 是我們所要產(chǎn)生軟體套件的名稱,VERSION 是版本編號。

AC_PROG_CC
檢查系統(tǒng)可用的 C 編譯器,假如原始程式是用 C 寫的就需要這個巨集。

AC_OUTPUT(FILE)
設(shè)定 configure 所要產(chǎn)生的檔案,假如是 Makefile 的話,configure 便會把它檢查出來的結(jié)果帶入 Makefile.in 檔然後產(chǎn)生
合適的 Makefile。

實際上,我們使用 Automake 時,還須要一些其它的巨集,這些額外的巨集我們用 aclocal來幫我們產(chǎn)生。執(zhí)行 aclocal 會產(chǎn)生 aclocal.m4檔,假如沒有非凡的用途,我們可以不必修改它,用 aclocal 所產(chǎn)生的巨集會告訴 Automake 怎麼做。

有了 configure.in 及 aclocal.m4 兩個檔案後,便可以執(zhí)行 autoconf來產(chǎn)生 configure檔了。

4.2 編輯 Makefile.am 檔

接下來我們要編輯 Makefile.am 檔,Automake 會根據(jù) configure.in 中的巨集把Makefile.am 轉(zhuǎn)成 Makefile.in 檔。Makefile.am 檔定義我們所要產(chǎn)的目標(biāo):

AUTOMAKE_OPTIONS
設(shè)定 automake 的選項。Automake 主要是幫助開發(fā) GNU 軟體的人員維護軟體套件,所以在執(zhí)行 automake 時,會檢查目錄下是否存在標(biāo)準(zhǔn) GNU 軟體套件中應(yīng)具備的文件檔案,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件檔。設(shè)成 foreign 時,automake 會改用一般軟
體套件的標(biāo)準(zhǔn)來檢查。

bin_PROGRAMS
定義我們所要產(chǎn)生的執(zhí)行檔檔名。假如要產(chǎn)生多個執(zhí)行檔,每個檔名用空白字元隔開。

hello_SOURCES
定義 'hello' 這個執(zhí)行檔所需要的原始檔。假如 'hello' 這個程式是由多個原始檔所產(chǎn)生,必須把它所用到的原始檔都列出來,以空白字元隔開。假設(shè) 'hello' 這個程式需要 'hello.c'、'main.c'、

'hello.h'
三個檔案的話,則定義
hello_SOURCES= hello.c main.c hello.h
假如我們定義多個執(zhí)行檔,則對每個執(zhí)行檔都要定義相對的filename_SOURCES。

編輯好 Makefile.am 檔,就可以用 automake --add-missing 來產(chǎn)生Makefile.in。加上 --add-missing 選項是告訴 automake 順便幫我們加入包裝一個軟體套件所必備的檔案。Automake 產(chǎn)生出來的 Makefile.in檔是完全符合 GNU Makefile 的慣例,我們只要執(zhí)行 confi
gure 這個shell script 便可以產(chǎn)生合適的 Makefile 檔了。

4.3 使用 Makefile

利用 configure 所產(chǎn)生的 Makefile 檔有幾個預(yù)設(shè)的目標(biāo)可供使用,我們只拿其中幾個簡述如下:

make all
產(chǎn)生我們設(shè)定的目標(biāo),即此范例中的執(zhí)行檔。只打 make 也可以,此時會開始編譯原始碼,然後連結(jié),并且產(chǎn)生執(zhí)行檔。

make clean
清除之前所編譯的執(zhí)行檔及目的檔 (object file, *.o)。

make distclean
除了清除執(zhí)行檔和目的檔外,也把 configure 所產(chǎn)生的 Makefile也清除掉。

make install
將程式安裝至系統(tǒng)中。假如原始碼編譯無誤,且執(zhí)行結(jié)果正確,便可以把程式安裝至系統(tǒng)預(yù)設(shè)的執(zhí)行檔存放路徑。假如我們用bin_PROGRAMS 巨集的話,程式會被安裝至 /usr/local/bin 這個目錄。

make dist
將程式和相關(guān)的檔案包裝成一個壓縮檔以供散播 (distribution) 。執(zhí)行完在目錄下會產(chǎn)生一個以 PACKAGE-VERSION.tar.gz 為名稱的檔案。PACKAGE 和 VERSION 這兩個變數(shù)是根據(jù) configure.in 檔中AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定義。在此范例中會產(chǎn)生
'hello-1.0.tar.gz' 的檔案。

make distcheck
和 make dist 類似,但是加入檢查包裝後的壓縮檔是否正常。這個目標(biāo)除了把程式和相關(guān)檔案包裝成 tar.gz 檔外,還會自動把這個壓
縮檔解開,執(zhí)行 configure,并且進行 make all 的動作,確認(rèn)編譯無誤後,會顯示這個 tar.gz 檔已經(jīng)預(yù)備好可供散播了。這個檢查非
常有用,檢查過關(guān)的套件,基本上可以給任何一個具備 GNU 發(fā)展境的人去重新編譯。就 hello-1.tar.gz 這個范例而言,除了在 Red

Hat linux 上,在 FreeBSD 2.2.x 版也可以正確地重新編譯。

要注重的是,利用 Autoconf 及 Automake 所產(chǎn)生出來的軟體套件是可以在沒有安裝 Autoconf 及 Automake 的環(huán)境上使用的,因為 configure 是一個 shell script,它己被設(shè)計可以在一般 Unix 的 sh 這個 shell 下執(zhí)行。但是假如要修改 configure.in 及 Makefile.a
m 檔再產(chǎn)生新的configure 及 Makefile.in 檔時就一定要有 Autoconf 及 Automake 了。

5. 相關(guān)訊息

Autoconf 和 Automake 功能十分強大,你可以從它們所附的 info 檔找到具體的用法。你也可以從許多現(xiàn)存的 GNU 軟體或 Open Source 軟體中找到相關(guān)的 configure.in 或 Makefile.am 檔,它們是學(xué)習(xí) Autoconf 及Automake 更多技巧的最佳范例。

這篇簡介只用到了 Autoconf 及 Automake 的皮毛罷了,假如你有心加入Open Source 軟體開發(fā)的行列,希望這篇文件能幫助你對產(chǎn)生 Makefile有個簡單的依據(jù)。其它有關(guān)開發(fā) GNU程式或 C 程式設(shè)計及 Makefile 的具體運用及技巧,我建議你從 GNU Coding Standards3
(GNU 編碼標(biāo)準(zhǔn)規(guī)定) 讀起,里面包含了 GNU Makefile 慣例,還有發(fā)展 GNU 軟體套件的標(biāo)準(zhǔn)程序和慣例。這些 GNU 軟體的線上說明文件可以在http://www.gnu.org/ 這個網(wǎng)站上找到。

6. 結(jié)語

經(jīng)由 Autoconf 及 Automake 的輔助,產(chǎn)生一個 Makefile 似乎不再像以前那麼困難了,而使用 Autoconf 也使得我們在不同平臺上或各家 Unix之間散播及編譯程式變得簡單,這對於在 Unix 系統(tǒng)上開發(fā)程式的人員來說減輕了許多負(fù)擔(dān)。妥善運用這些 GNU 的工具軟體,可
以幫助我們更輕易去發(fā)展程式,而且更輕易維護原始程式碼。

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

About this document ...

輕輕松松產(chǎn)生 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.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 芮城县| 呼玛县| 东至县| 夏津县| 保靖县| 安乡县| 资阳市| 阿城市| 都匀市| 宜阳县| 金湖县| 澳门| 临猗县| 新绛县| 十堰市| 万源市| 天祝| 商南县| 马关县| 江油市| 南充市| 建湖县| 安多县| 自治县| 筠连县| 临汾市| 高安市| 安新县| 玉门市| 呼和浩特市| 漳浦县| 横山县| 玛曲县| 新巴尔虎右旗| 伊春市| 昌江| 治县。| 峡江县| 通化市| 项城市| 张家口市|