最近在編譯yabasic時老在configure時老過不過去,很受打擊,於是決定學習下這個autoconf的過程,網上看了些資料,再找個simple代碼改下,在linux下編譯出來,有了初步的結果,現在連結這塊還有不少問題。
引子
無論是在Linux還是在Unix環境中,make都是一個非常重要的編譯命令。不管是自己進行項目開發還是安裝應用軟體,我們都經常要用到make或 make install。利用make工具,我們可以將大型的開發項目分解成為多個更易於管理的模組,對於一個包括幾百個源檔案的應用程式,使用make和 makefile工具就可以輕而易舉理順各個源檔案之間紛繁複雜的相互關係。
但是如果通過查閱make的協助文檔來手工編寫Makefile,對任何程式員都是一場挑戰。幸而有GNU 提供的Autoconf及Automake這兩套工具使得編寫makefile不再是一個難題。
我在這裡將介紹如何利用 GNU Autoconf 及 Automake 這兩套工具來協助我們自動產生 Makefile檔案,並且讓開發出來的軟體可以像大多數源碼包那樣,只需"./configure", "make","make install" 就可以把程式安裝到系統中。
類比代碼工程
我找的是4020的RTC的simple代碼,而且把一些啟動,彙編代碼都去掉了,這些不敢肯定會不會編譯過去,現在的目錄結構如所示:
整個工程所包含的檔案如下所示
|-- include
| |-- HA_typedef.h
| |-- HA_typedef.h~
| |-- intc.h
| |-- intc.h~
| `-- sep4020.h
|-- main
| |-- Makefile.am~
| |-- main.c
| `-- main.c~
|-- misc
| |-- Makefile.am~
| `-- int_vec_handler.c
`-- rtc
|-- Makefile.am~
|-- rtc.c
|-- rtc.h
`-- rtc.h~
我現在就是想把這些代碼在linux下交叉編譯出來。
工具簡介
所必須的軟體:autoconf/automake/m4/perl/libtool(其中libtool非必須)。
autoconf是一個用於產生可以自動地配置軟體源碼包,用以適應多種UNIX類系統的shell指令碼工具,其中autoconf需要用到 m4,便於產生指令碼。automake是一個從Makefile.am檔案自動產生Makefile.in的工具。為了產生Makefile.in,automake還需用到perl,由於automake建立的發布完全遵循GNU標準,所以在建立中不需要perl。libtool是一款方便產生各種程式庫的工具。
目前automake支援三種目錄層次:flat、shallow和deep。
1) flat指的是所有檔案都位於同一個目錄中。
就是所有源檔案、標頭檔以及其他庫檔案都位於目前的目錄中,且沒有子目錄。Termutils就是這一類。
2) shallow指的是主要的原始碼都儲存在頂層目錄,其他各個部分則儲存在子目錄中。
就是主要源檔案在目前的目錄中,而其它一些實現各部分功能的源檔案位於各自不同的目錄。automake本身就是這一類。
3) deep指的是所有原始碼都被儲存在子目錄中;頂層目錄主要包含配置資訊。
就是所有源檔案及自己寫的標頭檔位於目前的目錄的一個子目錄中,而目前的目錄裡沒有任何源檔案。 GNU cpio和GNU tar就是這一類。
flat類型是最簡單的,deep類型是最複雜的。不難看出,我們的類比需求正是基於第三類deep型,也就是說我們要做挑戰性的事情:)。註:我們的測試程式是基於多線程的簡單程式。
產生 Makefile 的來龍去脈
首先進入 project 目錄,在該目錄下運行一系列命令,建立和修改幾個檔案,就可以產生符合該平台的Makefile檔案,操作過程如下:
1) 運行autoscan命令
2) 將configure.scan 檔案重新命名為configure.in,並修改configure.in檔案,後面會介紹configure.in的修改方法。
3) 在project目錄下建立Makefile.am檔案,並在core和shell目錄下也建立makefile.am檔案
4) 在project目錄下建立NEWS、 README、 ChangeLog 、AUTHORS檔案
5) 將/usr/share/automake-1.X/目錄下的depcomp和complie檔案拷貝到本目錄下
6) 運行aclocal命令
7) 運行autoconf命令
8) 運行automake -a命令
9)運行autoheader產生config.h.in
10) 運行./confiugre指令碼
可以通過圖2看出產生Makefile的流程,:
圖 2產生Makefile流程圖
Configure.in的八股文
當我們利用autoscan工具產生confiugre.scan檔案時,我們需要將confiugre.scan重新命名為confiugre.in檔案。confiugre.in調用一系列autoconf宏來測試程式需要的或用到的特性是否存在,以及這些特性的功能。
下面我們就來目睹一下confiugre.scan的廬山真面目:
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([config.h.in])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# FIXME: Replace `main' with a function in `-lpthread':
AC_CHECK_LIB([pthread], [main])
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT