一般在真實情況下,撰寫程式,當然不會只有一個**.c** 源碼檔,常常會有多個**.c, .h** 源碼檔.
或是一個函式庫,
較複雜的例子,源碼有:
$ ls
dict_use.c dict.c dict.h dict_test.c keyval.h keyval.c
然後自己編一個Automake.am
AM_CFLAGS=pkg-config --cflags glib-2.0
-O3 -Wall
lib_LTLIBRARIES=libdict.la
libdict_la_SOURCES=dict.c keyval.c
include_HEADERS=keyval.h dict.h
bin_PROGRAMS=dict_use
dict_use_SOURCES=dict_use.c
dict_use_LDADD=libdict.la
TESTS=$(check_PROGRAMS)
check_PROGRAMS=dict_test
dict_test_LDADD=libdict.la
經過autoscan 指令,產生 configure.scan 檔,
和昨晚的極簡單一個源碼檔(hello.c),掃描出了一些不一樣的巨集。
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([keyval.h])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
AC_CHECK_HEADERS([stdlib.h strings.h])
# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_CHECK_FUNCS([strcasecmp])
AC_CONFIG_FILES([makefile])
AC_OUTPUT
這有點人工智慧在裏面,因為你指定了程式碼有那些? 這個autoscan指令會去讀源碼裏的引用庫,
自動會多產生一些相對應的檢查,例如上面的粗黑字部分的**# Checks for library functions.**
及**# Checks for header files.** 看起來是把源碼中的引用庫抄來這裏,
這裏介紹一下
AC_XXXXX 這些m4語言的巨集。
AC_INIT() ,這裏放3個參數,第一個是套件的全名,第二個是版本號,第三個是臭蟲報告地址。
昨晚提到的AM_INIT_AUTOMAKE,是讓automake產生makefile, 如果沒有加上去,就不會產生makefile. 預設狀態下不產生。
LT_INIT 設定Libtool, 目前還沒用到,這和共用函式庫有關。
AC_CONFIG_FILES(makefile , 子目錄中的makefile),
AC_OUTPUT 產出結果。
AC_PROG_CC,AC_PROG_CC_C99 , 看得出是符合C99的標準。
如果要多檢查一些函式庫,可以用
AC_CHECK_LIB([glib-2.0],[g_free])
自動工具會雞婆的幫你加上額外的兩個檔,
Makefile.am: installing './INSTALL'
Makefile.am: installing './COPYING' using GNU General Public License v3 file
Makefile.am: Consider adding the COPYING file to the version control system
Makefile.am: for your code, to avoid questions about which license your project uses
一個是GPL v3 的授權檔:COPYING。一個是INSTALL(原來是程式auto tool產生的啊!!)
自己編makefile, 還是用auto tools來編呢?
兩者都有優點!!