使用autotools自動生成Makefile並在此之上使用dh-make生成可發布的deb程序包(詳解)
本文將介紹如何使用autotools生成一個Makefile文件,並在此基礎上使用dh-make和debuild生成一個可發布的deb程序包,這也是我們在Linux下開發應用程序以及想要發布應用程序需要做的。
無論是在Linux還是在Unix環境中,make都是一個非常重要的編譯命令。不管是自己進行項目開發還是安裝應用軟件,我們都經常要用到make或 make install。利用make工具,我們可以將大型的開發項目分解成為多個更易於管理的模塊,對於一個包括幾百個源文件的應用程序,使用make和 Makefile工具就可以輕而易舉的理順各個源文件之間紛繁復雜的相互關系。其中 Makefile 文件是用於自動編譯和鏈接的,一個工程有很多文件組成,每一個文件的改變都會導致工程的重新鏈接,但是不是所有的文件都需要重新編譯,Makefile中紀錄有文件的信息,在make時會決定在鏈接的時候需要重新編譯哪些文件。
Makefile的基本結構不是很復雜,但當一個程序開發人員開始寫Makefile時,經常會懷疑自己寫的是否符合慣例,而且自己寫的Makefile經常和自己的開發環境相關聯,當系統環境變量或路徑發生了變化後,Makefile可能還要跟著修改。所以手動編寫Makefile,對任何程序員都是一場挑戰。幸而有GNU 提供的Autoconf及Automake這兩套工具可以然我們自動生成Makefile。
使用automake,程序開發人員只需要寫一些簡單的含有預定義宏的文件,由autoconf根據這個宏文件生成configure,由automake根據另一個宏文件生成Makefile.in,再使用configure依據Makefile.in來生成一個符合慣例的Makefile。本文將介紹如何利用 GNU Autotools工具來協助我們自動產生 Makefile文件,生成Makefile文件後,我們將接著介紹如何使用dh-make和debuild創建一個Debian的安裝包文件(deb)。這個deb文件可以拷貝到別的電腦上使用dpkg安裝使用(如果足夠好,可以發布!)。
這是使用autotools生成Makefile文件的大體步驟。
我使用的是Ubuntu 13.04(32bit),使用apt-get 安裝以下工具: automake,dh-make ,devscripts。
使用apt-get install automake 將安裝 autoconf{a} automake autotools-dev{a} 三個包。
使用apt-get install dh-make 將安裝 debhelper dh-make html2text三個包。
使用apt-get install devscripts ,這個是使用debuild所需要的。
在當前目錄下創建一個名為hello的子目錄。進入文件夾並新建一個標准的Hello World的C代碼hello.c
#include <stdio.h>
int main(int argc, char ** argv){
printf("hello,world\n");
return 0;
}
此時,文件夾下只有一個hello.c文件,
automake根據configure.in中的宏並在perl的幫助下把Makefile.am轉成Makefile.in文件。Makefile.am 文件定義所要產生的目標。我們要填寫的 Makefile.am 內容為以下兩句:
bin_PROGRAMS=beep // bin_PROGRAMS:定義要產生的可執行程序的文件名
beep_SOURCES=hello.c // beep_SOURCES:定義“beep”這個可執行程序所需要的原始文件。如果“beep”這個程序是由多個原始文件產生的,必須把它所用到的所有原始文件都列出來,並以空白符隔開。假設“beep”還需要“hello.c”、“main.c”、“hello.h”3個文件,則定義beep_SOURCES= hello.c main.c hello.h。如果定義多個可執行文件,則對每個可執行程序都要定義相應的filename_SOURCES,其中filename為要生成的可執行程序的文件名。
所以,beep 可以替換為你想要生成的二進制可執行文件名(後面生成deb文件也是一樣的名稱),如果我最終我們生成的應用名為long.deb,上面兩句就寫成:
bin_PROGRAMS=long
long_SOURCES=hello.c
當前我們目錄下只有:hello.c Makefile.am 兩個文件
zhouyl@zhouyl:/tmp/hello$ vim Makefile.am
zhouyl@zhouyl:/tmp/hello$ ls
hello.c Makefile.am
執行autoscan命令,會生成一個configure.scan文件,將configure.scan改名為configure.in
zhouyl@zhouyl:/tmp/hello$ autoscan
zhouyl@zhouyl:/tmp/hello$ ls
autoscan.log configure.scan hello.c Makefile.am
zhouyl@zhouyl:/tmp/hello$ mv configure.scan configure.in
zhouyl@zhouyl:/tmp/hello$ ls
autoscan.log configure.in hello.c Makefile.am
configure.in 文件的內容是一系列GNU m4 的宏,這些宏經autoconf處理後會變成檢查系統特性的Shell腳本。configure.in文件中宏的順序並沒有特別的規定,但是每一個configure.in 文件必須以宏AC_INIT開頭,以宏AC_OUTPUT結束。
打開configure.in文件我們會看到自動生成的configure.in(scan)包括以下內容:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69]) // 此行是描述需要的工具兼容性,如我們使用的是autotools工具版本是2.69,這個自動生成不要修改!
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) // 此行是描述我們要生成的應用的信息,包括:應用名,版本號以及維護人郵箱(直譯為反饋bug地址)。比如我們需要將此行修改成 AC_INIT([beep], [0.1], [[email protected]])
//下面兩行形容的是軟件包的地址和名稱,以便autotools開始工作
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
// 在這我們需要加入一行“ AM_INIT_AUTOMAKE ”,如果沒有此行,在部分系統生成Makefile時會報錯而且生成不了Makefile文件。
# Checks for programs.
AC_PROG_CC//這句高速autotools使用默認的編譯器和binutils,當然你也可以傳入類似於“ AC_PROG_CC([gcc gcc-4.7]) ”的參數,我們不傳參,使用默認即可
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
// 下面不變
AC_CONFIG_FILES([Makefile])// 設置configure命令所要產生的文件。我們最終期望產生Makefile
AC_OUTPUT
所以,經過修改後,我們的configure.in文件是:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([beep], [0.1], [[email protected]])
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE
# 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])
AC_OUTPUT
更多詳情請繼續閱讀第2頁的內容:http://www.linuxidc.com/Linux/2013-10/91412p2.htm