make工具概述
為了規範,通用與移植性,Makefile採用GNU的automake系列工具產生。除非實驗性質的項目, 一般來說,不建議自己書寫Makefile。
GNU的Makefile產生工具由,aclocal,autoconf,libtoolize, automake組成。
Aclocal產生m4指令碼。
Autoconf根據configure.ac(在早前版本稱為configure.in)產生configure。
libtoolize,產生動態庫所需要的指令碼。
automake,根據Makefile.am,產生Makefile.in。
configure,根據Makefile.in產生Makefile。
準備條件安裝
ubuntu 8.04
sudo apt-get install autoconfsudo apt-get install automakesudo apt-get install libtool
redhat 5.x
make tools的rpm包都位於安裝光碟片中,不同版本的rpm包,包名除了版本號碼外都一致。
rpm -ivh autoconf-xxx.rpm rpm -ivh automake-xxx.rpm rpm -ivh libtool-xxx.rpm
產生步驟
如,項目名為,myproject,目錄如下:
--myproject+ +--configure.ac +--Makefile.am +--src+ +Makefile.am +libmyproject.c +myprojectbin.c
產生步驟如下:
$ aclocal$ autoconf$ libtoolize -f -c$ automake -a$ touch NEWS$ touch README$ touch AUTHORS$ touch ChangeLogs$ automake$ ./configure$ make$ sudo make install
configure.ac
configure.ac的書寫原則。
- 所有需要用的第三方庫,都需要通過PKG_CHECK_MODULES之類的函數來檢測。這類指令碼除了可以在編譯前檢測是否存在需要的庫,最大的 優點是可以自動在Makefile中加入xxx_LDADD這類參數,保證了Makefile.am的簡潔。另外,有些庫的標頭檔與庫檔案比較多,很難用 簡單的一句話書寫。
- 代碼中需要的宏,都在configure.ac中定義。
- 自訂的configure參數,應當在configure.ac中實現。 以下是範例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_CONFIG_SRCDIR([src/myprojectbin.c])AM_INIT_AUTOMAKE()# Checks for programs.AC_PROG_CXXAC_PROG_CCAC_PROG_LIBTOOL# Checks for libraries.PKG_CHECK_MODULES([libmyproject_la], [glib-2.0], [], [ AC_MSG_ERROR(["Error! You need to have libglib2.0 installed."]) ])PKG_CHECK_EXISTS([cppunit], [], [ AC_MSG_ERROR(["Error! You need to have libcppunit-dev installed. Try sudo apt-get install libcppunit-dev."]) ])# Checks for header files.AC_CHECK_HEADERS([stdlib.h stdio.h])# Checks for typedefs, structures, and compiler characteristics.AC_HEADER_STDBOOLAC_TYPE_SIZE_TAC_ARG_WITH(debug, [AS_HELP_STRING([--with-debug], [enable debugging output])], [ if test $withval != "no"; then AC_SUBST(AM_CFLAGS, ["-g3 -O0 -Wall"]) AC_SUBST(AM_CXXFLAGS, ["-g3 -O0 -Wall"]) AC_DEFINE([WITH_DEBUG],1) fi ])#cppunit_cflags=`pkg-config --cflags cppunit`#cppunit_libs=`pkg-config --libs cppunit`#AM_CPPFLAGS="$cppunit_cflags"#AM_LDFLAGS="$cppunit_libs"#AC_SUBST(AM_CPPFLAGS)#AC_SUBST(AM_LDFLAGS)# Checks for library functions.AC_FUNC_MALLOCAC_CHECK_FUNCS([memset])AC_DEFINE(_LARGEFILE64_SOURCE)AC_DEFINE(_XOPEN_SOURCE, [500])AC_DEFINE(_FILE_OFFSET_BITS, [64])AC_DEFINE(_GNU_SOURCE)AC_CONFIG_FILES([Makefile src/Makefile])AC_OUTPUT
Makefile.am
Makefile.am的書寫原則是: