configure.ac由一些宏組成(如果已經有源代碼,你可以運行autoscan來產生一個configure.scan文件,在此基礎修改成configure.ac將更加方便)
最基本的組成可以是下面的
AC_INIT([PACKAGE], [VERSION], [BUG-REPORT-ADDRESS]) # Checks for programs. # Checks for libraries. # Checks for header les. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. # Output les. AC_CONFIG_FILES([FILES]) AC_OUTPUT
基本含義已經在上篇文章中介紹了,這里不再敘述。
AC_INIT(PACKAGE, VERSION, BUG-REPORT-ADDRESS)
autoconf 強制性初始化。告訴autoconf包名稱,版本,一個bug報告emall。
例如:
AC_INIT([hello], [1.0], [bug-report@address])
並且這些名稱將出現在config.h,你可以在程序直接引用這些宏。
/* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "BUG-REPORT-ADDRESS" /* Define to the full name of this package. */ #define PACKAGE_NAME "FULL-PACKAGE-NAME" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "FULL-PACKAGE-NAME VERSION" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "full-package-name" /* Define to the version of this package. */ #define PACKAGE_VERSION "VERSION"
AC_PREREQ(VERSION)
需要的最低autoconf版本,如:AC_PREREQ([2.65])
AC_CONFIG_SRCDIR(FILE)
一個安全的檢查。FILE將是一個發布的源文件。這讓configure腳本確保自己運行在正確的目錄中。如:AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_AUX_DIR(DIRECTORY)
配置輔助腳本位置,如install-sh和depcomp等。如:AC_CONFIG_AUX_DIR([build-aux])
AC_PROG_CC, AC_PROG_CXX, AC_PROG_F77, …
編譯器檢測。
AC_PROG_SED, AC_PROG_YACC, AC_PROG_LEX, …
發現好的實現並且設置變量SED,YACC,$LEX等。
AC_CHECK_PROGS(VAR, PROGS, [VAL-IF-NOT-FOUND])
將VAR定義為第一個發現的程序,如果沒有發現就設置為VAL-IF-NOT-FOUND
AC_CHECK_PROGS([TAR], [tar gtar], [:]) if test "$TAR" = :; then AC_MSG_ERROR([This package needs tar.]) fi
如果發現tar,gtar,就設置到變量$TAR中,如果沒有發現就是設置為‘:’
AC_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS])
打印錯誤信息ERROR-DESCRIPTION並退出,EXIT-STATUS設置退出狀態。
AC_MSG_WARN(ERROR-DESCRIPTION)
打印但是不退出。
AC_DEFINE(VARIABLE, VALUE, DESCRIPTION)
輸出到configu.h中。
/* DESCRIPTION */ #define VARIABLE VALUE
AC_SUBST(VARIABLE, [VALUE])
定義變量$VARIABLE=VALUE,進入Makefile。
如:AC_SUBST([FOO],[foo])
等價於
FOO=foo
AC_SUBST([FOO])
或者
AC_SUBST([FOO])
FOO=foo
AC_CHECK_LIB(LIBRARY, FUNCT, [ACT-IF-FOUND], [ACT-IF-NOT])
檢查庫是否存在並且包括函數FUNCT。如果發現庫就執行ACT-IF-FOUND,否則執行ACT-IF-NOT。
例如:
AC_CHECK_LIB([efence], [malloc], [EFENCELIB=-lefence]) AC_SUBST([EFENCELIB])
稍后可以使用(EFENCELIB)在鏈接規則中。如果沒有使用ACT−IF−FOUND項,並且庫被發現存在。ACCHECKLIB將會做下面的操作,LIBS=”−lLIBRARYLIBS"和#dedefine HAVE_LIB{LIBRARY}。Autmake會在鏈接的時候使用$LIBS。
AC_CHECK_HEADERS(HEADERS…)
檢查頭HEADERS並且給每一個發現的頭文件定義#define HAVE_HEADER_H
例如:
AC_CHECK_HEADERS([sys/param.h unistd.h]) AC_CHECK_HEADERS([wchar.h])
檢查sys/param.h unistd.h如果存在定義定義#define HAVE_SYS_PARAM_H,HAVE_UNISTD_H。
注意:一般情況下不能轉換的符號都用‘_’代替。
你可以在你的頭文件這么使用
#if HAVE_UNISTD_H #include <unistd.h> #endif
AC_CHECK_HEADER(HEADER, [ACT-IF-FOUND], [ACT-IF-NOT])
檢查一個頭文件。
AC_CONFIG_HEADERS(HEADERS…)
創建頭文件的HEADER.in,HEADERS包含使用AC_DEFINE的定義。
例如:
AC_CONFIG_HEADERS([config.h])
將從config.h.in創建config.h。
AC_CONFIG_FILES([Makefile sub/Makefile script.sh:script.in])
Automake創建FILE.in從每一個有FILE.am的FILE。他也可以出來非Makefile。
script.in
#!/bin/sh SED='@SED@' TAR='@TAR@' d=$1; shift; mkdir "$d" for f; do "$SED" 's/#.*//' "$f" \ >"$d/$f" done "$TAR" cf "$d.tar" "$d"
.in是文件模板。@SED@、@TAR@將被AC_SUBST([SED]),AC_SUBST([TAR])替換。這樣你就可以將配置中的變量傳送到其他文件中去。
Makefile.in也使用@XYZ@作為替換部分,但是Automake已經做了將所有的XYZ=@XYZ@的定義,你只需要簡單使用$(XYZ)就可以了。
AM_INIT_AUTOMAKE([OPTIONS…])
檢查automake嘗試Makefile時的必要的工具。
例如:AM_INIT_AUTOMAKE([foreign -Wall -Werror])
一些可選的選項:
| 選項 | 解釋 |
|---|---|
| -Wall | 打開全部警告 |
| -Werror | 將警告當錯誤處理 |
| -foreign | 放寬一些GNU標准需求 |
| -1.11.1 | 需要automake的最低版本 |
| -dist-bzip2 | 在使用make dist和make distcheck期間同時創建tar.bz2存檔 |
| -tar-ustar | 使用ustar格式創建tar存檔 |
AC_CONFIG_FILES([Makefile sub/Makefile])
寫入Makefile.am和sub/Makefile.am文件
AM CONDITIONAL(NAME, CONDITION)
定義一個條件名NAME,CONDITION將由shell解釋執行,如果成功NAME將被打開。
舉例:configure.ac
AC_CHECK_HEADER([bar.h], [use_bar=yes]) AM_CONDITIONAL([WANT_BAR], [test "$use_bar" = yes])
僅當當前系統中存在bar.h文件時打開WANT_BAR。
具體細節可以參考
gnu automake
原文鏈接:http://blog.csdn.net/john_crash/article/details/49889949
