1
##### http://websvn.freedesktop.org/uim/branches/r5rs/sigscheme/m4/ax_feature_configurator.m4
5
# AX_FEATURE_CONFIGURATOR
9
# A dependency-based feature configurator.
11
# This macro suite is still under development. See
12
# http://websvn.freedesktop.org/uim/branches/r5rs/sigscheme/configure.in
13
# as a working example.
21
# Copyright (c) 2006 YAMAMOTO Kengo <yamaken AT bp.iij4u.or.jp>
23
# Copying and distribution of this file, with or without
24
# modification, are permitted in any medium without royalty provided
25
# the copyright notice and this notice are preserved.
27
# AX_FEATURE_CONFIGURATOR([SH_VAR_PREFIX], [AC_DEF_PREFIX], [AM_COND_PREFIX])
28
AC_DEFUN([AX_FEATURE_CONFIGURATOR], [
31
if test "x$_cv_gnu_make_command" != x; then
32
GMAKE=$_cv_gnu_make_command
34
AC_MSG_ERROR([GNU make is currently required to run ax_feature_configurator.m4])
37
m4_define([AX_FEATURE_PREFIX_VAR], m4_default([$1], [use_]))
38
m4_define([AX_FEATURE_PREFIX_DEF], m4_default([$2], [USE_]))
39
m4_define([AX_FEATURE_PREFIX_COND], m4_default([$3], [USE_]))
41
ax_feature_state='init'
42
ax_feature_list_all=''
43
ax_feature_list_explicit=''
44
ax_feature_list_implicit=''
47
# AX_FEATURE_VAR_Y(FEATURE, [DESC])
48
AC_DEFUN([AX_FEATURE_VAR_Y], [
49
AX_FEATURE_VAR_X([$1], m4_default([$2], [$1]), [yes], [^yes$])
52
# AX_FEATURE_VAR_N(FEATURE, [DESC])
53
AC_DEFUN([AX_FEATURE_VAR_N], [
54
AX_FEATURE_VAR_X([$1], m4_default([$2], [$1]), [no], [^no$])
57
# AX_FEATURE_VAR_X(FEATURE, DESC, DEFAULT-VAL, VAL-REGEXP)
58
AC_DEFUN([AX_FEATURE_VAR_X], [
59
m4_define(AX_FEATURE_DESC_[]AS_TR_CPP([$1]), [$2])
61
case $ax_feature_state in
63
ax_feature_state='seed'
66
AC_MSG_ERROR([invalid macros layout for ax_feature_configurator.m4])
70
if echo "[$3]" | $EGREP -q "AS_ESCAPE([$4])"; then
71
_ax_feature_id=AS_TR_SH([$1])
72
_ax_feature_val=AS_VAR_GET(AX_FEATURE_PREFIX_VAR[]$_ax_feature_id)
73
if test -z "$_ax_feature_val"; then
74
_ax_feature_val=AS_TR_SH([$3])
76
_ax_feature_id_val="${_ax_feature_id}_${_ax_feature_val}"
77
ax_feature_list_all="$ax_feature_list_all $_ax_feature_id"
79
AS_VAR_SET(AX_FEATURE_PREFIX_VAR[]$_ax_feature_id, $_ax_feature_val)
80
AS_VAR_SET(AX_FEATURE_PREFIX_VAR[]$_ax_feature_id_val, [yes])
81
if test "x$_ax_feature_val" != xno; then
82
ax_feature_list_explicit="$ax_feature_list_explicit $_ax_feature_id"
83
if test "x$_ax_feature_val" != xyes; then
84
ax_feature_list_explicit="$ax_feature_list_explicit $_ax_feature_id_val"
86
ax_feature_list_implicit="$ax_feature_list_explicit"
89
AC_MSG_ERROR("invalid value --enable-[$1]=[$3]")
93
# AX_FEATURE_ARG_Y(FEATURE, [DESC])
94
AC_DEFUN([AX_FEATURE_ARG_Y], [
95
AX_FEATURE_ARG_X([$1], m4_default([$2], [$1]), [yes], [^(yes|no)$])
98
# AX_FEATURE_ARG_N(FEATURE, [DESC])
99
AC_DEFUN([AX_FEATURE_ARG_N], [
100
AX_FEATURE_ARG_X([$1], m4_default([$2], [$1]), [no], [^(yes|no)$])
103
# AX_FEATURE_ARG_X(FEATURE, DESC, DEFAULT-VAL, VAL-REGEXP, [ACTION])
104
AC_DEFUN([AX_FEATURE_ARG_X], [
106
AS_HELP_STRING(m4_bmatch([$3],
107
[^yes$], [--disable-[$1]],
108
[^no$], [--enable-[$1]],
109
[--enable-[$1]=m4_toupper([$1])]),
115
# clear the predefined variable set by conf=CONF
116
AX_FEATURE_PREFIX_VAR[]AS_TR_SH([$1])=""
119
[enable_]AS_TR_SH([$1])='AS_TR_SH([$3])'
121
AX_FEATURE_VAR_X([$1], [$2], [${enable_]AS_TR_SH([$1])[}], [$4])
125
# AX_FEATURE_DEFINE(FEATURE, [AC_DEF_SYM], [AM_COND_SYM], [DESC])
126
AC_DEFUN([AX_FEATURE_DEFINE], [
127
case $ax_feature_state in
128
seed|dep_resolv|weakdep_resolv|conflict_resolv|define)
129
ax_feature_state='define'
132
AC_MSG_ERROR([invalid macros layout for ax_feature_configurator.m4])
136
m4_define_default(AX_FEATURE_DESC_[]AS_TR_CPP([$1]),
138
if test "x${AX_FEATURE_PREFIX_VAR[][$1]:=no}" != xno; then
139
AC_DEFINE(m4_default([$2], AX_FEATURE_PREFIX_DEF[]m4_toupper([$1])), 1,
140
m4_default([$4], AX_FEATURE_DESC_[]AS_TR_CPP([$1])))
142
AM_CONDITIONAL(m4_default([$3], AX_FEATURE_PREFIX_COND[]m4_toupper([$1])),
143
test "x${AX_FEATURE_PREFIX_VAR[$1]}" != xno)
146
# _AX_FEATURE_OVERRIDE_VALS(DEPENDENT-VAL, FEATURE-LIST)
147
AC_DEFUN([_AX_FEATURE_OVERRIDE_VALS], [
148
for feature in [$2]; do
149
_ax_feature_var="AX_FEATURE_PREFIX_VAR[]$feature"
150
_ax_feature_val=AS_VAR_GET([$_ax_feature_var])
152
if test -z "$_ax_feature_val"; then
153
ax_feature_list_all="$ax_feature_list_all $feature"
155
if test -z "$_ax_feature_val" -o "x$_ax_feature_val" = xno; then
156
AS_VAR_SET([${_ax_feature_var}], [$1])
157
AS_VAR_SET([${_ax_feature_var}_][$1], [yes])
158
AS_VAR_SET([${_ax_feature_var}_no], [""])
159
ax_feature_list_implicit="$ax_feature_list_implicit $feature"
164
# AX_FEATURE_RESOLVE_DEPENDENCIES(GROUP, RULESET, [DEPENDENT-VAL])
165
AC_DEFUN([AX_FEATURE_RESOLVE_DEPENDENCIES], [
166
case $ax_feature_state in
168
ax_feature_state='dep_resolv'
171
AC_MSG_ERROR([invalid macros layout for ax_feature_configurator.m4])
175
AC_MSG_CHECKING([$1][ dependencies of features])
176
_ax_feature_resolve_deps () {
177
# FIXME: improper temporary directory handlings
180
# FIXME: GNU make dependency
181
$GMAKE -s -C confdeps -f - @S|@@ __deps <<'EOT'
192
_ax_feature_list=`_ax_feature_resolve_deps $ax_feature_list_explicit`
193
_AX_FEATURE_OVERRIDE_VALS(m4_default([$3], [yes]), [$_ax_feature_list])
194
AC_MSG_RESULT([resolved])
197
# AX_FEATURE_RESOLVE_WEAK_DEPENDENCIES(RULESET)
198
AC_DEFUN([AX_FEATURE_RESOLVE_WEAK_DEPENDENCIES], [
199
case $ax_feature_state in
200
seed|dep_resolv|weakdep_resolv)
201
ax_feature_state='weakdep_resolv'
204
AC_MSG_ERROR([invalid macros layout for ax_feature_configurator.m4])
208
AX_FEATURE_RESOLVE_DEPENDENCIES([weak], [$1], [weakyes])
211
# FIXME: support weak dependency
212
# FIXME: support IF-CONFLICT handling
213
# AX_FEATURE_DETECT_CONFLICTS(RULESET, [IF-CONFLICT])
214
AC_DEFUN([AX_FEATURE_DETECT_CONFLICTS], [
215
case $ax_feature_state in
216
seed|dep_resolv|weakdep_resolv|conflict_resolv)
217
ax_feature_state='conflict_resolv'
220
AC_MSG_ERROR([invalid macros layout for ax_feature_configurator.m4])
224
AC_MSG_CHECKING([conflicts between features])
225
_ax_feature_list_expanded=''
226
for feature in $ax_feature_list_all; do
227
_ax_feature_val=AS_VAR_GET(AX_FEATURE_PREFIX_VAR[]$feature)
228
_ax_feature_val=${_ax_feature_val:no}
229
if test "x$_ax_feature_val" != xno; then
230
_ax_feature_list_expanded="$_ax_feature_list_expanded $feature"
232
_ax_feature_list_expanded="$_ax_feature_list_expanded ${feature}_${_ax_feature_val}"
235
_ax_feature_per_line_expanded () {
236
for feature in $_ax_feature_list_expanded; do
241
_ax_feature_conflict_regexps () {
242
cat <<'EOT' | sed 's/ /|/g' | while read mutexes; do test -n "$mutexes" && echo "\\\\b(${mutexes})\\\\b"; done
247
_ax_feature_check_conflict () {
248
local err err_re conflicts
252
if test 1 -lt `_ax_feature_per_line_expanded | $EGREP -c "$re"`; then
253
err_re=`echo $re | sed 's/\\\\b//g'`
254
conflicts=`_ax_feature_per_line_expanded | $EGREP "$re" | xargs echo`
256
if test $err -eq 0; then
257
AC_MSG_RESULT([detected])
259
# Since this code is being executed in a piped subprocess,
260
# AC_MSG_ERROR() does not terminate the configure process.
261
AC_MSG_WARN([these features must exclusively be chosen from ][${err_re}: ${conflicts}])
267
if (_ax_feature_conflict_regexps | _ax_feature_check_conflict); then
270
AC_MSG_ERROR([feature conflict(s) between mutually exclusive ones have been detected])