general.m4 5.16 KB
Newer Older
1
# config/general.m4
2 3 4 5 6 7 8 9 10 11 12 13 14 15

# This file defines new macros to process configure command line
# arguments, to replace the brain-dead AC_ARG_WITH and AC_ARG_ENABLE.
# The flaw in these is particularly that they only differentiate
# between "given" and "not given" and do not provide enough help to
# process arguments that only accept "yes/no", that require an
# argument (other than "yes/no"), etc.
#
# The point of this implementation is to reduce code size and
# redundancy in configure.in and to improve robustness and consistency
# in the option evaluation code.


# Convert type and name to shell variable name (e.g., "enable_long_strings")
16 17
m4_define([pgac_arg_to_variable],
          [$1[]_[]patsubst($2, -, _)])
18 19


20
# PGAC_ARG(TYPE, NAME, HELP-STRING-LHS-EXTRA, HELP-STRING-RHS,
21 22
#          [ACTION-IF-YES], [ACTION-IF-NO], [ACTION-IF-ARG],
#          [ACTION-IF-OMITTED])
23
# ------------------------------------------------------------
24
# This is the base layer. TYPE is either "with" or "enable", depending
25 26 27 28 29 30 31 32
# on what you like.  NAME is the rest of the option name.
# HELP-STRING-LHS-EXTRA is a string to append to the option name on
# the left-hand side of the help output, e.g., an argument name.  If
# set to "-", append nothing, but let the option appear in the
# negative form (disable/without).  HELP-STRING-RHS is the option
# description, for the right-hand side of the help output.
# ACTION-IF-YES is executed if the option is given without an argument
# (or "yes", which is the same); similar for ACTION-IF-NO.
33 34

AC_DEFUN([PGAC_ARG],
35 36 37 38
[
m4_case([$1],

enable, [
39
AC_ARG_ENABLE([$2], [AS_HELP_STRING([--]m4_if($3, -, disable, enable)[-$2]m4_if($3, -, , $3), [$4])], [
40
  case [$]enableval in
41
    yes)
42
      m4_default([$5], :)
43 44
      ;;
    no)
45
      m4_default([$6], :)
46
      ;;
47
    *)
48
      $7
49
      ;;
50 51
  esac
],
52
[$8])[]dnl AC_ARG_ENABLE
53 54 55
],

with, [
56
AC_ARG_WITH([$2], [AS_HELP_STRING([--]m4_if($3, -, without, with)[-$2]m4_if($3, -, , $3), [$4])], [
57 58
  case [$]withval in
    yes)
59
      m4_default([$5], :)
60 61
      ;;
    no)
62
      m4_default([$6], :)
63 64
      ;;
    *)
65
      $7
66 67 68
      ;;
  esac
],
69
[$8])[]dnl AC_ARG_WITH
70 71 72 73
],

[m4_fatal([first argument of $0 must be 'enable' or 'with', not '$1'])]
)
74 75 76
])# PGAC_ARG


77
# PGAC_ARG_BOOL(TYPE, NAME, DEFAULT, HELP-STRING-RHS,
78
#               [ACTION-IF-YES], [ACTION-IF-NO])
79
# ---------------------------------------------------
80 81 82 83 84 85 86
# Accept a boolean option, that is, one that only takes yes or no.
# ("no" is equivalent to "disable" or "without"). DEFAULT is what
# should be done if the option is omitted; it should be "yes" or "no".
# (Consequently, one of ACTION-IF-YES and ACTION-IF-NO will always
# execute.)

AC_DEFUN([PGAC_ARG_BOOL],
87 88 89 90 91 92
[dnl The following hack is necessary because in a few instances this
dnl macro is called twice for the same option with different default
dnl values.  But we only want it to appear once in the help.  We achieve
dnl that by making the help string look the same, which is why we need to
dnl save the default that was passed in previously.
m4_define([_pgac_helpdefault], m4_ifdef([pgac_defined_$1_$2_bool], [m4_defn([pgac_defined_$1_$2_bool])], [$3]))dnl
93
PGAC_ARG([$1], [$2], [m4_if(_pgac_helpdefault, yes, -)], [$4], [$5], [$6],
94
          [AC_MSG_ERROR([no argument expected for --$1-$2 option])],
95 96
          [m4_case([$3],
                   yes, [pgac_arg_to_variable([$1], [$2])=yes
97
$5],
98
                   no,  [pgac_arg_to_variable([$1], [$2])=no
99
$6],
100
                   [m4_fatal([third argument of $0 must be 'yes' or 'no', not '$3'])])])[]dnl
101
m4_define([pgac_defined_$1_$2_bool], [$3])dnl
102 103 104
])# PGAC_ARG_BOOL


105 106 107
# PGAC_ARG_REQ(TYPE, NAME, HELP-ARGNAME, HELP-STRING-RHS,
#              [ACTION-IF-GIVEN], [ACTION-IF-NOT-GIVEN])
# -------------------------------------------------------
108
# This option will require an argument; "yes" or "no" will not be
109
# accepted.  HELP-ARGNAME is a name for the argument for the help output.
110 111

AC_DEFUN([PGAC_ARG_REQ],
112
[PGAC_ARG([$1], [$2], [=$3], [$4],
113 114
          [AC_MSG_ERROR([argument required for --$1-$2 option])],
          [AC_MSG_ERROR([argument required for --$1-$2 option])],
115 116
          [$5],
          [$6])])# PGAC_ARG_REQ
117 118


119 120
# PGAC_ARG_OPTARG(TYPE, NAME, HELP-ARGNAME, HELP-STRING-RHS,
#                 [DEFAULT-ACTION], [ARG-ACTION],
121
#                 [ACTION-ENABLED], [ACTION-DISABLED])
122
# ----------------------------------------------------------
123 124 125 126 127 128 129 130 131 132 133
# This will create an option that behaves as follows: If omitted, or
# called with "no", then set the enable_variable to "no" and do
# nothing else. If called with "yes", then execute DEFAULT-ACTION. If
# called with argument, set enable_variable to "yes" and execute
# ARG-ACTION. Additionally, execute ACTION-ENABLED if we ended up with
# "yes" either way, else ACTION-DISABLED.
#
# The intent is to allow enabling a feature, and optionally pass an
# additional piece of information.

AC_DEFUN([PGAC_ARG_OPTARG],
134
[PGAC_ARG([$1], [$2], [@<:@=$3@:>@], [$4], [$5], [],
135
          [pgac_arg_to_variable([$1], [$2])=yes
136
$6],
137 138
          [pgac_arg_to_variable([$1], [$2])=no])
dnl Add this code only if there's a ACTION-ENABLED or ACTION-DISABLED.
139
m4_ifval([$7[]$8],
140 141
[
if test "[$]pgac_arg_to_variable([$1], [$2])" = yes; then
142 143
  m4_default([$7], :)
m4_ifval([$8],
144
[else
145
  $8
146 147 148 149
])[]dnl
fi
])[]dnl
])# PGAC_ARG_OPTARG