日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题

發(fā)布時(shí)間:2023/12/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

    • makefile寫(xiě)法
    • 1. 簡(jiǎn)介
    • 2. 上路之前
    • 3. 一個(gè)簡(jiǎn)單的例子
    • 4.說(shuō)明:
      • 4.1、autoscan
      • 4.2、 configure.scan
      • 4.3、aclocal
      • 4.4、autoconf
      • 4.5、Makefile.am
      • 4.6、 automake
      • 4.7、Makefile

makefile寫(xiě)法

在 Unix 上寫(xiě)程式的人大概都碰過(guò) Makefile,尤其是用 C 來(lái)開(kāi)發(fā)程式的人。用 make來(lái)開(kāi)發(fā)和編譯程式的確很方便,可是要寫(xiě)出一個(gè) Makefile就不簡(jiǎn)單了。偏偏介紹 Makefile 的文件不多,GNU Make 那份印出來(lái)要幾百頁(yè)的文件,光看完 Overview 就快陣亡了,難怪許多 人聞 Unix 色變。
本文將介紹如何利用 GNU Autoconf 及 Automake 這兩套軟體來(lái)協(xié)助我們『自動(dòng)』產(chǎn)生 Makefile 檔,并且讓開(kāi)發(fā)出來(lái)的軟體可以像 Apache, MySQL 和常見(jiàn)的 GNU 軟體一樣,只要會(huì) ./configure'',make’’, ``make install’’ 就可以把程式安裝到系統(tǒng)中。如果您有 心開(kāi)發(fā) Open Source 的軟體,或只是想在 Unix 系統(tǒng)下寫(xiě)寫(xiě)程式。希望這份介紹文件能幫助您輕松地進(jìn)入 Unix Programming 的殿堂。

1. 簡(jiǎn)介

Makefile 基本上就是『目標(biāo)』(target), 『關(guān)連』(dependencies) 和『動(dòng)作』三者所組成的一連串規(guī)則。而 make 就會(huì)根據(jù) Makefile 的規(guī)則來(lái)決定如何編譯 (compile) 和連結(jié) (link) 程式。實(shí)際上,make 可做的不只是編譯和連結(jié)程式,例如 FreeBSD 的 port collect ion 中, Makefile 還可以做到自動(dòng)下載原始程式套件,解壓縮 (extract) ,修補(bǔ) (patch),設(shè)定,然後編譯,安裝至系統(tǒng)中。
Makefile 基本構(gòu)造雖然簡(jiǎn)單,但是妥善運(yùn)用這些規(guī)則就也可以變出許多不同的花招。卻也因此,許多剛開(kāi)始學(xué)習(xí)寫(xiě) Makefile 時(shí)會(huì)感到?jīng)]有規(guī)范可循,每個(gè)人寫(xiě)出來(lái)的 Makefile 長(zhǎng)得都不太一樣,不知道從何下手,而且常常會(huì)受限於自己的開(kāi)發(fā)環(huán)境,只要環(huán)境變數(shù)不同或路 徑改一下,可能Makefile 就得跟著修改。雖然有 GNU Makefile Conventions (GNU Makefile 慣例) 訂出一些使用 GNU 程式設(shè)計(jì)時(shí)撰寫(xiě) Makefile 的一些標(biāo)準(zhǔn)和規(guī)范,但是內(nèi)容很長(zhǎng)而且很復(fù)雜, 并且經(jīng)常做些調(diào)整,為了減輕程式設(shè)計(jì)師維護(hù) Makefile 的負(fù)擔(dān),因此有了Automake。

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

2. 上路之前

在開(kāi)始試著用 Automake 之前,請(qǐng)先確認(rèn)你的系統(tǒng)已經(jīng)安裝以下的軟體: 1. GNU Automake 2. GNU Autoconf 3. GNU m4 4. perl 5. GNU Libtool (如果你需要產(chǎn)生 shared library)
我會(huì)建議你最好也使用 GNU C/C++ 編譯器 、GNU Make 以及其它 GNU 的工具程式來(lái)做為開(kāi)發(fā)的環(huán)境,這些工具都是屬於 Open Source Software不僅免費(fèi)而且功能強(qiáng)大。如果你是使用Red Hat Linux 可以找到所有上述軟體的 rpm 檔,FreeBSD 也有現(xiàn)成的 package 可以直 接安裝,或著你也可以自行下載這些軟體的原始檔回來(lái) DIY。以下的范例是在 Red Hat Linux 5.2 + CLE2 的環(huán)境下所完成的。

3. 一個(gè)簡(jiǎn)單的例子

Automake 所產(chǎn)生的 Makefile 除了可以做到程式的編譯和連結(jié),也已經(jīng)把如何產(chǎn)生程式文件(如 manual page, info 檔及 dvi 檔) 的動(dòng)作,還有把原始程式包裝起來(lái)以供散 的動(dòng)作都考慮進(jìn)去了,所以原始程式所存放的目錄架構(gòu)最好符合 GNU 的標(biāo)準(zhǔn)慣例,接下來(lái)我拿hello.c 來(lái)做為例子。
在工作目錄下建立一個(gè)新的子目錄 devel'',再在 devel 下建立一個(gè)hello’’ 的子目錄,這個(gè)目錄將作為我們存放 hello 這個(gè)程式及其相關(guān)檔案的地方:
% mkdir devel
% cd devel
% mkdir hello
% cd hello

用編輯器寫(xiě)個(gè) hello.c 檔,

#include <stdio.h>

int main(int argc, char *argv[])
{
printf(“Hello GNU!\n”);
return 0;
}

接下來(lái)就要用 Autoconf 及 Automake 來(lái)幫我們產(chǎn)生 Makefile 檔了。

1、用 autoscan 產(chǎn)生一個(gè) configure.in 的雛型,執(zhí)行 autoscan 後會(huì)產(chǎn)生一個(gè)configure.scan 的檔案,我們可以用它做為configure.in檔的藍(lán)本。
.
2、 編輯 configure.scan 檔,如下所示,并且把它的檔名改成configure.in
autoconfig用戶參考手冊(cè) http://www.gnu.org/software/autoconf/manual/autoconf.html
automake用戶參考手冊(cè) http://www.gnu.org/software/automake/manual/automake.html
修改后的configure.in文件內(nèi)容如下:

.# -- Autoconf --
.# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])

.# Checks for programs.
AC_PROG_CC

.# Checks for libraries.

.# Checks for header files.

.# Checks for typedefs, structures, and compiler characteristics.

.# Checks for library functions.
AC_CONFIG_FILES(Makefile)
AC_OUTPUT

上面以AC開(kāi)頭的宏來(lái)自autoconf,以AM開(kāi)頭的宏來(lái)自automake。要從autoconf或 automake中尋求幫助,這一點(diǎn)很有用。以GNOME開(kāi)頭的宏來(lái)自于Gnomemacros目錄。這些宏都是用m4宏語(yǔ)言寫(xiě)的。如果將 autoconf和automake安裝在/usr目錄下,autoconf和automake中的標(biāo)準(zhǔn)宏一般放在/usr/share/aclocal 目錄下。

3、 執(zhí)行 aclocal 和 autoheader ,分別會(huì)產(chǎn)生 aclocal.m4 及 configure.h.in 兩個(gè)檔案
% aclocal
% autoheader
注意:要修改文件名

4、編輯 Makefile.am 檔,內(nèi)容如下 :

.# cat Makefile.am
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = hello
hello_SOURCES = hello.c
hello_CPPFLAGS = -I /usr/include/

5、 執(zhí)行 automake --add-missing ,Automake 會(huì)根據(jù) Makefile.am 檔產(chǎn)生一些檔案,包含最重要的 Makefile.in
% automake --add-missing

configure.ac:11: installing ‘./compile’
configure.ac:6: installing ‘./install-sh’
configure.ac:6: installing ‘./missing’
Makefile.am: installing ‘./depcomp’

6. 執(zhí)行 autoconf 得到 configure可執(zhí)行腳本文件

% autoconf

7. 執(zhí)行測(cè)試:

執(zhí)行./configure
執(zhí)行 make 此時(shí)應(yīng)該已經(jīng)生成可執(zhí)行文件,ls看一下
執(zhí)行 make install


8. 測(cè)試程序:#可執(zhí)行文件
make clean 清除編譯過(guò)程生成的文件
make uninstall 卸載

4.說(shuō)明:

4.1、autoscan

autoscan是 用來(lái)掃描源代碼目錄生成configure.scan文件的 .autoscan可以用目錄名做為參數(shù),但如果你不使用參數(shù)的 話,那么autoscan將認(rèn)為使用的是當(dāng)前目錄.autoscan將掃描你所指定目錄中的 源文件,并創(chuàng)建configure.scan文件。

4.2、 configure.scan

configure.scan包含了系統(tǒng)配置的 基本選項(xiàng),里面都是 一些宏定義.我們需要將它改名configure.in

4.3、aclocal

aclocal是 一個(gè)perl 腳本程序.aclocal根據(jù)configure.in文件的 內(nèi)容,自動(dòng)生成aclocal.m4件.aclocal的 定義是 :“aclocal - create aclocal.m4 by scanning configure.ac”.

4.4、autoconf

autoconf是 用來(lái)產(chǎn)生configure文件的 .configure是 一個(gè)腳本,它能設(shè)置源程序來(lái)適應(yīng)各種不同的操作系統(tǒng)平臺(tái),并且根據(jù)不同的 系統(tǒng)來(lái)產(chǎn)生合適的 Makefile,從而可以使你的源代碼能在不同的操作系統(tǒng)平臺(tái)上被編譯出來(lái).configure.in文件的 內(nèi)容是 一些宏,這些宏經(jīng)過(guò)autoconf 處理后會(huì)變成檢查系統(tǒng)
特性.環(huán)境變量.軟件必須的 參數(shù)的 shell腳本.configure.in文件中的 宏的 順序并沒(méi)有規(guī)定,但是 你必須在 所有宏的 最前面和最后面分別加上AC_INIT宏和AC_OUTPUT宏.
  在 configure.ini中:
  #號(hào)表示注釋,這個(gè)宏后面的 內(nèi)容將被忽略.
  
AC_INIT(FILE)
  這個(gè)宏用來(lái)檢查源代碼所在 的 路徑.
  
AM_INIT_AUTOMAKE(PACKAGE, VERSION)
   這個(gè)宏是 必須的 ,它描述了我們將要生成的 軟件包的 名字及其版本號(hào):PACKAGE是軟件包
的名字,VERSION是 版本號(hào).當(dāng)你使用make dist命令時(shí),它會(huì)給你生成一個(gè)類(lèi)似helloworld-1.0.tar.gz的 軟件發(fā)行包,其中就有對(duì)應(yīng)的 軟件包的 名字和版本號(hào).

AC_PROG_CC
  這個(gè)宏將檢查系統(tǒng)所用的 C編譯器.
  
AC_OUTPUT(FILE)
  這個(gè)宏是 我們要輸出的 Makefile的 名字.我們?cè)?使用automake時(shí),實(shí)際上還需要用到其他的 一些宏,但我們可以用aclocal 來(lái)幫我們自動(dòng)產(chǎn)生.執(zhí)行aclocal后我們會(huì)得到aclocal.m4文件.產(chǎn)生了configure.in和aclocal.m4 兩個(gè)宏文件后,我們就可以使用autoconf來(lái)產(chǎn)生configure文件了.

4.5、Makefile.am

Makefile.am是 用來(lái)生成Makefile.in的 ,需要你手工書(shū)寫(xiě).Makefile.am中定義了一些內(nèi)容:
AUTOMAKE_OPTIONS
  這個(gè)是 automake的 選項(xiàng).在 執(zhí)行automake時(shí),它會(huì)檢查目錄下是 否存在 標(biāo)準(zhǔn)
GNU軟件包中應(yīng)具備的各種文件,例如AUTHORS.ChangeLog.NEWS等文件.
我們將其設(shè)置成foreign時(shí),automake會(huì)改用一般軟件包的 標(biāo)準(zhǔn)來(lái)檢查.

bin_PROGRAMS
  這個(gè)是 指定我們所要產(chǎn)生的 可執(zhí)行文件的 文件名.如果你要產(chǎn)生多個(gè)可執(zhí)行文件,
那么在各個(gè)名字間用空格隔開(kāi).

helloworld_SOURCES
  這個(gè)是 指定產(chǎn)生"helloworld"時(shí)所需要的 源代碼.如果它用到了多個(gè)源文件,
那么請(qǐng)使用空格符號(hào)將它們隔開(kāi).比如需要helloworld.h,helloworld.c那么請(qǐng)寫(xiě)成:
helloworld_SOURCES= helloworld.h helloworld.c.
  如果你在 bin_PROGRAMS定義了多個(gè)可執(zhí)行文件,則對(duì)應(yīng)每個(gè)可執(zhí)行文件都要定義相對(duì)的filename_SOURCES.

4.6、 automake

我們使用automake --add-missing來(lái)產(chǎn)生Makefile.in.選項(xiàng)–add-missing的 定義是 “add missing standard files to package”,它會(huì)讓automake加入一個(gè)標(biāo)準(zhǔn)的 軟件包所必須的 一些文件.
  我們用automake產(chǎn)生出來(lái)的 Makefile.in文件是 符合GNU Makefile慣例的 ,接下來(lái)我們只要執(zhí)行configure這個(gè)shell 腳本就可以產(chǎn)生合適的 Makefile 文件了.

4.7、Makefile

在 符合GNU Makefiel慣例的 Makefile中,包含了一些基本的 預(yù)先定義的 操作:

make
  根據(jù)Makefile編譯源代碼,連接,生成目標(biāo)文件,可執(zhí)行文件.
  
make clean
  清除上次的 make命令所產(chǎn)生的 object文件(后綴為".o"的 文件)及可執(zhí)行文件.
  
make install
  將編譯成功的 可執(zhí)行文件安裝到系統(tǒng)目錄中,一般為/usr/local/bin目錄.
  
make dist
  產(chǎn)生發(fā)布軟件包文件(即distribution package).這個(gè)命令將會(huì)將可執(zhí)行文件及相關(guān)
文件打包成一個(gè)tar.gz壓縮的 文件用來(lái)作為發(fā)布軟件的 軟件包.它會(huì)在 當(dāng)前目錄下生成一個(gè)名字類(lèi)似"PACKAGE-VERSION.tar.gz"的 文件.PACKAGE和VERSION,是 我們?cè)?configure.in中定義的 AM_INIT_AUTOMAKE(PACKAGE, VERSION).

make distcheck
  生成發(fā)布軟件包并對(duì)其進(jìn)行測(cè)試檢查,以確定發(fā)布包的正確性.

總結(jié)

以上是生活随笔為你收集整理的关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。