昨晚在編configure.ac 設定檔時,
用到sed 指令,
sed 在批次指令更新檔案時,是很好用的工具,而且有很長歷史的編輯小工具。
原來檔案是這樣:
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
經過sed指令更換及加一行
sed -e 's/FULL-PACKAGE-NAME/hello/' \
-e 's/VERSION/1/'
\
-e 's|BUG-REPORT-ADDRESS|/dev/null|' \
-e '10i\
AM_INIT_AUTOMAKE' \
< configure.scan > configure.ac
結果變成
AC_PREREQ([2.69])
AC_INIT([hello], [1], [/dev/null])
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE
AC_PROG_CC
10i , 是在第10列,insert 1列文字。
將源碼打包,make distcheck,
會產生一個hello-1.tar.gz。
而這個源碼包,就可以發布給其他人用三步驟來安裝了。
經過前人不斷的簡化再簡化,只要編2個設定檔,下4個指令,就可以產生跨平台的源碼包,簡直是自動化編程的一個很高的境界。
這類程式產生的makefile,比寫程式複雜多了。
對程式可以跨平台,起了很大的作用。
automake 設定檔的內容
小寫_大寫的規則,
bin_PROGRAMS ,變成執行檔的程式名
check_PROGRAMS, 要檢查的程式
include_HEADERS, 安裝在系統的include 目錄的標頭檔
lib_LTLIBRARIES , 利用Libtool產生的動態庫
noinst_LIBRARIES, 靜態庫
.................................
一個複雜點的例子,加上測試
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