~ubuntu-branches/ubuntu/hardy/sigscheme/hardy-proposed

« back to all changes in this revision

Viewing changes to m4/ax_feature_configurator.m4

  • Committer: Bazaar Package Importer
  • Author(s): NIIBE Yutaka
  • Date: 2007-01-29 15:31:24 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070129153124-j5fcqyrwcfbczma7
Tags: 0.7.4-1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
##### http://websvn.freedesktop.org/uim/branches/r5rs/sigscheme/m4/ax_feature_configurator.m4
 
2
#
 
3
# SYNOPSIS
 
4
#
 
5
#   AX_FEATURE_CONFIGURATOR
 
6
#
 
7
# DESCRIPTION
 
8
#
 
9
#   A dependency-based feature configurator.
 
10
#
 
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.
 
14
#
 
15
# LAST MODIFICATION
 
16
#
 
17
#   2006-12-18
 
18
#
 
19
# COPYLEFT
 
20
#
 
21
#   Copyright (c) 2006 YAMAMOTO Kengo <yamaken AT bp.iij4u.or.jp>
 
22
#
 
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.
 
26
 
 
27
# AX_FEATURE_CONFIGURATOR([SH_VAR_PREFIX], [AC_DEF_PREFIX], [AM_COND_PREFIX])
 
28
AC_DEFUN([AX_FEATURE_CONFIGURATOR], [
 
29
  AC_PROG_EGREP
 
30
  CHECK_GNU_MAKE
 
31
  if test "x$_cv_gnu_make_command" != x; then
 
32
    GMAKE=$_cv_gnu_make_command
 
33
  else
 
34
    AC_MSG_ERROR([GNU make is currently required to run ax_feature_configurator.m4])
 
35
  fi
 
36
 
 
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_]))
 
40
 
 
41
  ax_feature_state='init'
 
42
  ax_feature_list_all=''
 
43
  ax_feature_list_explicit=''
 
44
  ax_feature_list_implicit=''
 
45
])
 
46
 
 
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$])
 
50
])
 
51
 
 
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$])
 
55
])
 
56
 
 
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])
 
60
 
 
61
  case $ax_feature_state in
 
62
    init|seed)
 
63
      ax_feature_state='seed'
 
64
      ;;
 
65
    *)
 
66
      AC_MSG_ERROR([invalid macros layout for ax_feature_configurator.m4])
 
67
      ;;
 
68
  esac
 
69
 
 
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])
 
75
    fi
 
76
    _ax_feature_id_val="${_ax_feature_id}_${_ax_feature_val}"
 
77
    ax_feature_list_all="$ax_feature_list_all $_ax_feature_id"
 
78
 
 
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"
 
85
      fi
 
86
      ax_feature_list_implicit="$ax_feature_list_explicit"
 
87
    fi
 
88
  else
 
89
    AC_MSG_ERROR("invalid value --enable-[$1]=[$3]")
 
90
  fi
 
91
])
 
92
 
 
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)$])
 
96
])
 
97
 
 
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)$])
 
101
])
 
102
 
 
103
# AX_FEATURE_ARG_X(FEATURE, DESC, DEFAULT-VAL, VAL-REGEXP, [ACTION])
 
104
AC_DEFUN([AX_FEATURE_ARG_X], [
 
105
  AC_ARG_ENABLE([$1],
 
106
    AS_HELP_STRING(m4_bmatch([$3],
 
107
                             [^yes$], [--disable-[$1]],
 
108
                             [^no$],  [--enable-[$1]],
 
109
                             [--enable-[$1]=m4_toupper([$1])]),
 
110
                   m4_bmatch([$3],
 
111
                             [^yes$], [disable ],
 
112
                             [^no$],  [enable ],
 
113
                             [])[$2]),
 
114
    [
 
115
      # clear the predefined variable set by conf=CONF
 
116
      AX_FEATURE_PREFIX_VAR[]AS_TR_SH([$1])=""
 
117
    ],
 
118
    [
 
119
      [enable_]AS_TR_SH([$1])='AS_TR_SH([$3])'
 
120
    ])
 
121
  AX_FEATURE_VAR_X([$1], [$2], [${enable_]AS_TR_SH([$1])[}], [$4])
 
122
  [$5]
 
123
])
 
124
 
 
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'
 
130
      ;;
 
131
    *)
 
132
      AC_MSG_ERROR([invalid macros layout for ax_feature_configurator.m4])
 
133
      ;;
 
134
  esac
 
135
 
 
136
  m4_define_default(AX_FEATURE_DESC_[]AS_TR_CPP([$1]),
 
137
                    [$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])))
 
141
  fi
 
142
  AM_CONDITIONAL(m4_default([$3], AX_FEATURE_PREFIX_COND[]m4_toupper([$1])),
 
143
                 test "x${AX_FEATURE_PREFIX_VAR[$1]}" != xno)
 
144
])
 
145
 
 
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])
 
151
  
 
152
      if test -z "$_ax_feature_val"; then
 
153
        ax_feature_list_all="$ax_feature_list_all $feature"
 
154
      fi
 
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"
 
160
      fi
 
161
   done
 
162
])
 
163
 
 
164
# AX_FEATURE_RESOLVE_DEPENDENCIES(GROUP, RULESET, [DEPENDENT-VAL])
 
165
AC_DEFUN([AX_FEATURE_RESOLVE_DEPENDENCIES], [
 
166
  case $ax_feature_state in
 
167
    seed|dep_resolv)
 
168
      ax_feature_state='dep_resolv'
 
169
      ;;
 
170
    *)
 
171
      AC_MSG_ERROR([invalid macros layout for ax_feature_configurator.m4])
 
172
      ;;
 
173
  esac
 
174
 
 
175
  AC_MSG_CHECKING([$1][ dependencies of features])
 
176
  _ax_feature_resolve_deps () {
 
177
    # FIXME: improper temporary directory handlings
 
178
    rm -rf confdeps
 
179
    mkdir confdeps
 
180
    # FIXME: GNU make dependency
 
181
    $GMAKE -s -C confdeps -f - @S|@@ __deps <<'EOT'
 
182
[$2]
 
183
[
 
184
%::
 
185
        @touch @S|@@
 
186
.PHONY: __deps
 
187
__deps:
 
188
        @ls]
 
189
EOT
 
190
    rm -rf confdeps
 
191
  }
 
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])
 
195
])
 
196
 
 
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'
 
202
      ;;
 
203
    *)
 
204
      AC_MSG_ERROR([invalid macros layout for ax_feature_configurator.m4])
 
205
      ;;
 
206
  esac
 
207
 
 
208
  AX_FEATURE_RESOLVE_DEPENDENCIES([weak], [$1], [weakyes])
 
209
])
 
210
 
 
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'
 
218
      ;;
 
219
    *)
 
220
      AC_MSG_ERROR([invalid macros layout for ax_feature_configurator.m4])
 
221
      ;;
 
222
  esac
 
223
 
 
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"
 
231
    fi
 
232
   _ax_feature_list_expanded="$_ax_feature_list_expanded ${feature}_${_ax_feature_val}"
 
233
  done
 
234
 
 
235
  _ax_feature_per_line_expanded () {
 
236
    for feature in $_ax_feature_list_expanded; do
 
237
      echo $feature;
 
238
    done
 
239
  }
 
240
 
 
241
  _ax_feature_conflict_regexps () {
 
242
    cat <<'EOT' | sed 's/ /|/g' | while read mutexes; do test -n "$mutexes" && echo "\\\\b(${mutexes})\\\\b"; done
 
243
[$1]
 
244
EOT
 
245
  }
 
246
 
 
247
  _ax_feature_check_conflict () {
 
248
    local err err_re conflicts
 
249
 
 
250
    err=0
 
251
    while read re; do
 
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`
 
255
      
 
256
        if test $err -eq 0; then
 
257
          AC_MSG_RESULT([detected])
 
258
        fi
 
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}])
 
262
        err=1
 
263
      fi
 
264
    done
 
265
    return $err
 
266
  }
 
267
  if (_ax_feature_conflict_regexps | _ax_feature_check_conflict); then
 
268
    AC_MSG_RESULT([ok])
 
269
  else
 
270
    AC_MSG_ERROR([feature conflict(s) between mutually exclusive ones have been detected])
 
271
  fi
 
272
])