作爲Linux下的程序開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程序確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟件慣例的Makefile就不那麼容易了。
在本文中,將給大家介紹如何使用 autoconf和automake兩個工具來幫助我們自動地生成符合自由軟件慣例的Makefile,這樣就可以象常見的GNU程序一樣,只要使用“./configure”,“make”,“make install”就可以把程序安裝到Linux系統中去了。這將特別適合想做開放源代碼軟件的程序開發人員,又或如果你只是自己寫些小的Toy程序,那麼這個文章對你也會有很大的幫助。
1.準備好程序 main.c
main.c
#include <stdio.h>
int main()
{
print("hello!");
return 0;
}
2.準備好腳本 autogen.sh
autogen.sh
#!/bin/sh
aclocal
autoheader
automake --add-missing
autoconf
3.運行autoscan 生成configure.scan
4.mv configure.scan configure.ac
5.在configure.ac 中修改
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
爲 AC_INIT(hello, 0.0.1,
[email protected])
並添加 AM_INIT_AUTOMAKE AC_CONFIG_FILES([Makefile])
configure.ac
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_INIT(hello, 0.0.1, [email protected])
AC_CONFIG_SRCDIR([main.c])
AM_CONFIG_HEADER([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_FUNC_MALLOC
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
6.準備好Makefile.am
Makefile.am
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = hello
hello_SOURCES = main.c
#noinst_HEADERS =
7.運行autogen.sh 哼哼, 自動生成了makefile !
以上文件放在同一目錄下, 運行./autogen.sh && ./configure && make && ./test
利用 configure 所產生的 Makefile文件有幾個預先設定的目標可供使用,這裏只用幾個簡述如下:
make all
產生設定的目標,既範例中的可執行文件。只敲入make 也可以,此時會開始編譯源代碼,然後連接併產生執行文件。
make clean
清除之前所編譯的可執行文件及目標文件(object file, *.o)。
make distclean
除了清除可執行文件和目標文件以外,也把 configure 所產生的 Makefile 清除掉。 通常在發佈軟件前執行該命令。
make install
將程序安裝到系統中,若源碼編譯成功,且執行結果正確,便可以把程序安裝到系統預先設定的執行文件存放路徑中,若用 bin_PROGRAMS 宏的話,程序會被安裝到 /usr/local/bin下。
make dist
將程序和相關的文檔包裝爲一個壓縮文檔以供發佈 (distribution) 。執行完在目錄下會產生一個以 PACKAGE-VERSION.tar.gz 爲名稱的文件!
make distcheck
和 make dist 類似,但是加入檢查包裝以後的壓縮文件是否正常,這個目標除了把程序和相關文檔包裝成 tar.gz 文件外,還會自動把這個壓縮文件解開,執行 configure,並執行 make all ,確認編譯無錯誤以後,方顯示這個 tar.gz 文件已經準備好並可以發佈了。