詳解linux下auto工具製做Makefile源碼包(製做篇)linux
水木楊bash
1、 概述工具
爲了更好的製做configure與Makefile,我先把製做流程給寫在這裏,好讓大夥都有個心理準備。這裏只說流程,不作解釋。(附圖供參考)this
1、autosan命令生成configure.scan文件,這只是個模板,咱們從新編輯這個文件,並把它保存爲configure.in文件。spa
2、aclocal命令生成aclocal.m4文件。設計
3、autoheader命令生成config.h.in。前提是aclocal.m4和configure.in必須生成。orm
4、autoconf命令生成configure文件(這個文件都很熟悉吧,嘎嘎)。ip
5、建立並編輯Makefile.am,這個文件在根目錄與子目錄都應該有的。ci
6、automake命令生成Makefile.in。文檔
7、./configure命令,根據Makefile.in生成Makefile文件,這個再熟悉不過了吧。
2、 製做
巧婦難作無米之炊,要想完成此次體驗,咱們還得按規矩一步一步來,源文件得有。首先建個目錄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安裝便可,帥吧!