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