Avoid expanding two macros in the wrong order.
[gnulib.git] / m4 / libunistring-base.m4
1 # libunistring-base.m4 serial 3
2 dnl Copyright (C) 2010 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 dnl From Paolo Bonzini and Bruno Haible.
8
9 dnl gl_LIBUNISTRING_LIBSOURCE([VERSION], [SourceFile])
10 dnl Declares that SourceFile should be compiled, unless we are linking
11 dnl with libunistring and its version is >= the given VERSION.
12 dnl SourceFile should be relative to the lib directory and end in '.c'.
13 dnl This macro is to be used for public libunistring API, not for
14 dnl undocumented API.
15 dnl
16 dnl You have to bump the VERSION argument to the next projected version
17 dnl number each time you make a change that affects the behaviour of the
18 dnl functions defined in SourceFile (even if SourceFile itself does not
19 dnl change).
20
21 AC_DEFUN([gl_LIBUNISTRING_LIBSOURCE],
22 [
23   AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE])
24   dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from
25   dnl gl_LIBUNISTRING_CORE if that macro has been run.
26   if gl_LIBUNISTRING_VERSION_CMP([$1])
27   then
28     m4_foreach_w([gl_source_file], [$2],
29       [AC_LIBOBJ(m4_bpatsubst(m4_defn([gl_source_file]), [\.c$], []))
30       ])
31   fi
32 ])
33
34 dnl gl_LIBUNISTRING_LIBHEADER([VERSION], [HeaderFile])
35 dnl Declares that HeaderFile should be created, unless we are linking
36 dnl with libunistring and its version is >= the given VERSION.
37 dnl HeaderFile should be relative to the lib directory and end in '.h'.
38 dnl Prepares for substituting LIBUNISTRING_HEADERFILE (to HeaderFile or empty).
39 dnl
40 dnl When we are linking with the already installed libunistring and its version
41 dnl is < VERSION, we create HeaderFile here, because we may compile functions
42 dnl (via gl_LIBUNISTRING_LIBSOURCE above) that are not contained in the
43 dnl installed version.
44 dnl When we are linking with the already installed libunistring and its version
45 dnl is > VERSION, we don't create HeaderFile here: it could cause compilation
46 dnl errors in other libunistring header files if some types are missing.
47 dnl
48 dnl You have to bump the VERSION argument to the next projected version
49 dnl number each time you make a non-comment change to the HeaderFile.
50
51 AC_DEFUN([gl_LIBUNISTRING_LIBHEADER],
52 [
53   AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE])
54   dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from
55   dnl gl_LIBUNISTRING_CORE if that macro has been run.
56   if gl_LIBUNISTRING_VERSION_CMP([$1])
57   then
58     LIBUNISTRING_[]AS_TR_CPP([$2])='$2'
59   else
60     LIBUNISTRING_[]AS_TR_CPP([$2])=
61   fi
62   AC_SUBST([LIBUNISTRING_]AS_TR_CPP([$2]))
63 ])
64
65 dnl Miscellaneous preparations/initializations.
66
67 AC_DEFUN([gl_LIBUNISTRING_LIB_PREPARE],
68 [
69   dnl Ensure that HAVE_LIBUNISTRING is fully determined at this point.
70   m4_ifdef([gl_LIBUNISTRING], [AC_REQUIRE([gl_LIBUNISTRING])])
71
72   AC_REQUIRE([AC_PROG_AWK])
73
74 dnl Sed expressions to extract the parts of a version number.
75 changequote(,)
76 gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;}
77 i\
78 0
79 q
80 '
81 gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;}
82 i\
83 0
84 q
85 '
86 gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;}
87 i\
88 0
89 q
90 '
91 changequote([,])
92
93   if test "$HAVE_LIBUNISTRING" = yes; then
94     LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"`
95     LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"`
96     LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"`
97   fi
98 ])
99
100 dnl gl_LIBUNISTRING_VERSION_CMP([VERSION])
101 dnl Expands to a shell statement that evaluates to true if LIBUNISTRING_VERSION
102 dnl is less than the VERSION argument.
103 AC_DEFUN([gl_LIBUNISTRING_VERSION_CMP],
104 [ { test "$HAVE_LIBUNISTRING" != yes \
105     || {
106          dnl AS_LITERAL_IF exists and works fine since autoconf-2.59 at least.
107          AS_LITERAL_IF([$1],
108            [dnl This is the optimized variant, that assumes the argument is a literal:
109             m4_pushdef([requested_version_major],
110               [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^\([0-9]*\).*], [\1]), [])])
111             m4_pushdef([requested_version_minor],
112               [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.]\([0-9]*\).*], [\1]), [$1])])
113             m4_pushdef([requested_version_subminor],
114               [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.][0-9]*[.]\([0-9]*\).*], [\1]), [$1])])
115             test $LIBUNISTRING_VERSION_MAJOR -lt requested_version_major \
116             || { test $LIBUNISTRING_VERSION_MAJOR -eq requested_version_major \
117                  && { test $LIBUNISTRING_VERSION_MINOR -lt requested_version_minor \
118                       || { test $LIBUNISTRING_VERSION_MINOR -eq requested_version_minor \
119                            && test $LIBUNISTRING_VERSION_SUBMINOR -lt requested_version_subminor
120                          }
121                     }
122                }
123             m4_popdef([requested_version_subminor])
124             m4_popdef([requested_version_minor])
125             m4_popdef([requested_version_major])
126            ],
127            [dnl This is the unoptimized variant:
128             requested_version_major=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_major"`
129             requested_version_minor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_minor"`
130             requested_version_subminor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_subminor"`
131             test $LIBUNISTRING_VERSION_MAJOR -lt $requested_version_major \
132             || { test $LIBUNISTRING_VERSION_MAJOR -eq $requested_version_major \
133                  && { test $LIBUNISTRING_VERSION_MINOR -lt $requested_version_minor \
134                       || { test $LIBUNISTRING_VERSION_MINOR -eq $requested_version_minor \
135                            && test $LIBUNISTRING_VERSION_SUBMINOR -lt $requested_version_subminor
136                          }
137                     }
138                }
139            ])
140        }
141   }
142 ])
143
144 dnl gl_LIBUNISTRING_ARG_OR_ZERO([ARG], [ORIG]) expands to ARG if it is not the
145 dnl same as ORIG, otherwise to 0.
146 m4_define([gl_LIBUNISTRING_ARG_OR_ZERO], [m4_if([$1], [$2], [0], [$1])])