autoconf 的使用詳解(1)

來源:互聯網
上載者:User

最近在編譯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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.