一、 概述
為了更好的制作configure與Makefile,我先把制作流程給寫在這里,好讓大伙都有個(gè)心理準(zhǔn)備。這里只說流程,不做解釋。(附圖供參考)
1、autosan命令生成configure.scan文件,這只是個(gè)模板,我們重新編輯這個(gè)文件,并把它保存為configure.in文件。
2、aclocal命令生成aclocal.m4文件。
3、autoheader命令生成config.h.in。前提是aclocal.m4和configure.in必須生成。
4、autoconf命令生成configure文件(這個(gè)文件都很熟悉吧,嘎嘎)。
5、創(chuàng)建并編輯Makefile.am,這個(gè)文件在根目錄與子目錄都應(yīng)該有的。
6、automake命令生成Makefile.in。
7、./configure命令,根據(jù)Makefile.in生成Makefile文件,這個(gè)再熟悉不過了吧。
相關(guān)閱讀: 詳解Linux下auto工具制作Makefile源碼包(工具安裝篇)http://www.linuxidc.com/Linux/2011-05/36616.htm
二、 制作
巧婦難做無米之炊,要想完成這次體驗(yàn),我們還得按規(guī)矩一步一步來,源文件得有。首先建個(gè)目錄Family用來放我們的東西,它下面的東西就多了。源代碼什么阿c,阿h啊,都放在src下面,src這個(gè)文件夾命名一般都是約定俗成的,我們也不破壞。當(dāng)然你也可以起其他名字,別搞忘就好。
<Family>
|-configure.in
|-Makefile.am
|-<src>
|-wife.c
|-daughter.c |-main.c
|-wife.h |-daughter.h
|-Makefile.am
※說明:
1. configure.in 這是最重要的文檔,整個(gè)安裝過程都靠它來主導(dǎo)。
2. Makefile.am automake會根據(jù)它來生成Makefile.in,再由./configure Makefile.in變成最終的Makefile,一般來說在頂級目錄和各個(gè)子目錄都應(yīng)該有一個(gè)Makefile.am
3. wife.c daughter.c main.c wife.h daughter.h 這是我們的源程序。
不用細(xì)看,這些文件除了configure.in是用模板創(chuàng)建手動編輯外,其他都是手動創(chuàng)建并編輯的,如果你還木有,動手吧。其實(shí)這里邊有個(gè)小小的經(jīng)驗(yàn),也不一定是對的,只是個(gè)人的經(jīng)驗(yàn),也就是后綴名為in的文件是生成的模板。
$ mkdir –p Family/src
$ touch Makefile.am
$ cd src
$ touch wife.c daughter.c main.c wife.h daughter.h Makefile.am
$ cd .. 進(jìn)入剛創(chuàng)建的Family目錄
$ autoscan 該命令產(chǎn)生 configure.scan 和 configure.log兩個(gè)文件,然后
$ mv configure.scan configure.i n這樣configure.in就創(chuàng)建成了。
※源代碼內(nèi)容:
main.c:
#include <stdio.h>
#include "wife.h"
#include "daughter.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
int main(void)
{
printf( "These are my girls\n");
daughter_say();
wife_say();
return 0;
}
daughter.c
#include <stdio.h>
#include "daughter.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
void daughter_say(void)
{
printf("My Dad ,are you call me ?\n");
}
daughter.h
#ifndef _DAUGHTER_
#define _DAUGHTER_
void daughter_say(void);
#endif
wife.c
#include <stdio.h>
#include "wife.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
void wife_say(void)
{
printf("My darling ,are you call me ?\n");
}
wife.h
#ifndef _WIFE_
#define _WIFE_
void wife_say(void);
#endif
※制作流程:
第1步:編輯configure.in文件。
上面用autoscan生成的scan后綴的文件改名而成的configure.in文件,我的用autoconf版本是2.66,貌似autoscan自動生成的模板2.61之前與之后的不大一樣,這點(diǎn)可以自己參照自己的版本修改,2.61以后的版本這個(gè)文件更簡單了。
打開看看: # -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.66])
AC_INIT([family], [1.0], [804927399@qq.com])
AM_INIT_AUTOMAKE(family,1.0)
AC_CONFIG_SRCDIR([src/wife.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
src/Makefile])
AC_OUTPUT
configure.in 未修改版,簡單對上面進(jìn)行說明:
AC_PREREQ([2.66])這個(gè)宏是用來檢測autoconf的版本的。
AC_INIT()是個(gè)初始化宏,括號中內(nèi)容分別為:要生成的軟件名稱,版本號,bug報(bào)告郵箱
AM_INIT_AUTOMAKE(family,1.0)這個(gè)宏是新添加的,不過好像1.8的automake不用添加這個(gè)也可以,但是我沒有添加的時(shí)候在后面make的時(shí)候會有“Makefile:15: *** 遺漏分隔符 。 停止。”的問題,而加上則有警告。現(xiàn)在還真有點(diǎn)暈呼呼滴。
AC_CONFIG_SRCDIR([src/wife.c])這個(gè)宏是用來檢測源碼目錄的有效性,srcdir就可以看出來,括號里邊的文件不一定非得是wife.c,也可以改成其他的。
AC_CONFIG_HEADERS([config.h])這個(gè)宏用來生成標(biāo)準(zhǔn)的config.h文件。
接下來的內(nèi)容就是眾多的check了
AC_PROG_CC這個(gè)是檢測編譯器的宏。
我們用的版本不用AC_OUTPUT輸出了,還是比較省力的。
第2步:aclocal命令生成aclocal.m4文件
不知為何,我直接用命令:
$aclocal 命令總是出錯:aclocal
aclocal: couldn't open directory `/usr/local/share/aclocal-': 沒有那個(gè)文件或目錄。
最后還是加上絕對路徑/usr/bin/aclocal總算是沒這個(gè)錯誤,生成aclocal.m4了。
第3步:autoconf命令生成 configure文件
這一步?jīng)]什么難度,輸入命令:
$ autoconf 就ok了,autoconf可以根據(jù)configure.in和aclocal.m4生成大名鼎鼎的configure,這時(shí)候已經(jīng)可以運(yùn)行它了,但是會報(bào)錯,因?yàn)镸akefile.in還沒出現(xiàn)。
那么何為M4呢,M4的名稱取自Macro(M后面跟4個(gè)字母…)。它和C預(yù)處理器里的宏是一個(gè)概念(其實(shí),M4和C預(yù)處理器都K&R操刀設(shè)計(jì)的!!),用來處理文本替換。也就是說,M4是bash里的預(yù)處理器。
第4步:autoheader命令生成config.h.in
$ autoheader通過autoheader命令,我們就可以得到config.h.in這個(gè)東東了。有了它,./configure才會生成config.h這個(gè)東東,所以不可大意。
autoheader這個(gè)工具通常會從“acconfig.h”文件中復(fù)制用戶附加的符號定義,因此此處沒有附加符號定義,所以不需要創(chuàng)建“acconfig.h”文件。
第5步:編輯Makefile.am文件
我們再編譯安裝源碼包的時(shí)候都知道./configure可以生成Makefile,殊不知要生成Makefile還全仰仗Makefile.in這個(gè)老東西,而這個(gè)東西是以in結(jié)尾的 ,也是個(gè)模板,是由Makefile.am生成的,好了,知道這個(gè)來龍去脈了,就著手編寫Makefile.am,我們這里Family頂級目錄與子目錄各有一個(gè),如果還有其他的子目錄,理論上也是需要Makefile.am的。我們這就來編輯它:
Family/Makefile.am內(nèi)容如下:
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src
Family/src/Makefile.am內(nèi)容如下:
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = family
family_SOURCES = main.c wife.c daughter.c wife.h daughter.h
其中的AUTOMAKE_OPTIONS為設(shè)置automake的選項(xiàng)。由于GNU對自己發(fā)布的軟件有嚴(yán)格的規(guī)范,比如必須附帶許可證聲明文件COPYING等,否則automake執(zhí)行時(shí)會報(bào)錯。automake提供了三種軟件等級:foreign、gnu和gnits,讓用 戶選擇采用,默認(rèn)等級為gnu。在本例使用foreign等級,它只檢測必須的文件,而不用檢查README啊什么的。
bin_PROGRAMS定義要產(chǎn)生的執(zhí)行文件名。如果要產(chǎn)生多個(gè)執(zhí)行文件,每個(gè)文件名用空格隔開。
family_SOURCES定義“family”這個(gè)執(zhí)行程序所需要的原始文件。如果”family”這個(gè)程序是由多個(gè)原始文件所產(chǎn)生的,則必須把它所用到的所有原 始文件都列出來,并用空格隔開。如果源文件名字太長,可以加上”\”行連接符換行書寫。
第6步:automake --add-missing命令生成config.h.in
$ automake –a或者 automake -–add-missing,大功告成!
注意運(yùn)行automake命令時(shí)一定要加參數(shù),否則不會自動生成install.sh,missing等腳本,這樣會出亂子滴。
這樣,源碼安裝包就制作成了,用tar打包就可以了,使用的時(shí)候用三部曲./configure,make , make install安裝即可,帥吧!