1# config/programs.m4
2
3
4# PGAC_PATH_BISON
5# ---------------
6# Look for Bison, set the output variable BISON to its path if found.
7# Reject versions before 1.875 (they have bugs or capacity limits).
8# Note we do not accept other implementations of yacc.
9
10AC_DEFUN([PGAC_PATH_BISON],
11[# Let the user override the search
12if test -z "$BISON"; then
13  AC_PATH_PROGS(BISON, bison)
14fi
15
16if test "$BISON"; then
17  pgac_bison_version=`$BISON --version 2>/dev/null | sed q`
18  AC_MSG_NOTICE([using $pgac_bison_version])
19  if echo "$pgac_bison_version" | $AWK '{ if ([$]4 < 1.875) exit 0; else exit 1;}'
20  then
21    AC_MSG_WARN([
22*** The installed version of Bison, $BISON, is too old to use with PostgreSQL.
23*** Bison version 1.875 or later is required, but this is $pgac_bison_version.])
24    BISON=""
25  fi
26  # Bison >=3.0 issues warnings about %name-prefix="base_yy", instead
27  # of the now preferred %name-prefix "base_yy", but the latter
28  # doesn't work with Bison 2.3 or less.  So for now we silence the
29  # deprecation warnings.
30  if echo "$pgac_bison_version" | $AWK '{ if ([$]4 >= 3) exit 0; else exit 1;}'
31  then
32    BISONFLAGS="$BISONFLAGS -Wno-deprecated"
33  fi
34fi
35
36if test -z "$BISON"; then
37  AC_MSG_WARN([
38*** Without Bison you will not be able to build PostgreSQL from Git nor
39*** change any of the parser definition files.  You can obtain Bison from
40*** a GNU mirror site.  (If you are using the official distribution of
41*** PostgreSQL then you do not need to worry about this, because the Bison
42*** output is pre-generated.)])
43fi
44# We don't need AC_SUBST(BISON) because AC_PATH_PROG did it
45AC_SUBST(BISONFLAGS)
46])# PGAC_PATH_BISON
47
48
49
50# PGAC_PATH_FLEX
51# --------------
52# Look for Flex, set the output variable FLEX to its path if found.
53# Reject versions before 2.5.31, as we need a reasonably non-buggy reentrant
54# scanner.  (Note: the well-publicized security problem in 2.5.31 does not
55# affect Postgres, and there are still distros shipping patched 2.5.31,
56# so allow it.)  Also find Flex if its installed under `lex', but do not
57# accept other Lex programs.
58
59AC_DEFUN([PGAC_PATH_FLEX],
60[AC_CACHE_CHECK([for flex], pgac_cv_path_flex,
61[# Let the user override the test
62if test -n "$FLEX"; then
63  pgac_cv_path_flex=$FLEX
64else
65  pgac_save_IFS=$IFS
66  IFS=$PATH_SEPARATOR
67  for pgac_dir in $PATH; do
68    IFS=$pgac_save_IFS
69    if test -z "$pgac_dir" || test x"$pgac_dir" = x"."; then
70      pgac_dir=`pwd`
71    fi
72    for pgac_prog in flex lex; do
73      pgac_candidate="$pgac_dir/$pgac_prog"
74      if test -f "$pgac_candidate" \
75        && $pgac_candidate --version </dev/null >/dev/null 2>&1
76      then
77        echo '%%'  > conftest.l
78        if $pgac_candidate -t conftest.l 2>/dev/null | grep FLEX_SCANNER >/dev/null 2>&1; then
79          pgac_flex_version=`$pgac_candidate --version 2>/dev/null`
80          if echo "$pgac_flex_version" | sed ['s/[.a-z]/ /g'] | $AWK '{ if ([$]1 == 2 && ([$]2 > 5 || ([$]2 == 5 && [$]3 >= 31))) exit 0; else exit 1;}'
81          then
82            pgac_cv_path_flex=$pgac_candidate
83            break 2
84          else
85            AC_MSG_WARN([
86*** The installed version of Flex, $pgac_candidate, is too old to use with PostgreSQL.
87*** Flex version 2.5.31 or later is required, but this is $pgac_flex_version.])
88          fi
89        fi
90      fi
91    done
92  done
93  rm -f conftest.l lex.yy.c
94  : ${pgac_cv_path_flex=no}
95fi
96])[]dnl AC_CACHE_CHECK
97
98if test x"$pgac_cv_path_flex" = x"no"; then
99  AC_MSG_WARN([
100*** Without Flex you will not be able to build PostgreSQL from Git nor
101*** change any of the scanner definition files.  You can obtain Flex from
102*** a GNU mirror site.  (If you are using the official distribution of
103*** PostgreSQL then you do not need to worry about this because the Flex
104*** output is pre-generated.)])
105
106  FLEX=
107else
108  FLEX=$pgac_cv_path_flex
109  pgac_flex_version=`$FLEX --version 2>/dev/null`
110  AC_MSG_NOTICE([using $pgac_flex_version])
111fi
112
113AC_SUBST(FLEX)
114AC_SUBST(FLEXFLAGS)
115])# PGAC_PATH_FLEX
116
117
118
119# PGAC_LDAP_SAFE
120# --------------
121# PostgreSQL sometimes loads libldap_r and plain libldap into the same
122# process.  Check for OpenLDAP versions known not to tolerate doing so; assume
123# non-OpenLDAP implementations are safe.  The dblink test suite exercises the
124# hazardous interaction directly.
125
126AC_DEFUN([PGAC_LDAP_SAFE],
127[AC_CACHE_CHECK([for compatible LDAP implementation], [pgac_cv_ldap_safe],
128[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
129[#include <ldap.h>
130#if !defined(LDAP_VENDOR_VERSION) || \
131     (defined(LDAP_API_FEATURE_X_OPENLDAP) && \
132      LDAP_VENDOR_VERSION >= 20424 && LDAP_VENDOR_VERSION <= 20431)
133choke me
134#endif], [])],
135[pgac_cv_ldap_safe=yes],
136[pgac_cv_ldap_safe=no])])
137
138if test "$pgac_cv_ldap_safe" != yes; then
139  AC_MSG_WARN([
140*** With OpenLDAP versions 2.4.24 through 2.4.31, inclusive, each backend
141*** process that loads libpq (via WAL receiver, dblink, or postgres_fdw) and
142*** also uses LDAP will crash on exit.])
143fi])
144
145
146
147# PGAC_CHECK_READLINE
148# -------------------
149# Check for the readline library and dependent libraries, either
150# termcap or curses.  Also try libedit, since NetBSD's is compatible.
151# Add the required flags to LIBS, define HAVE_LIBREADLINE.
152
153AC_DEFUN([PGAC_CHECK_READLINE],
154[AC_REQUIRE([AC_CANONICAL_HOST])
155
156AC_CACHE_CHECK([for library containing readline], [pgac_cv_check_readline],
157[pgac_cv_check_readline=no
158pgac_save_LIBS=$LIBS
159if test x"$with_libedit_preferred" != x"yes"
160then	READLINE_ORDER="-lreadline -ledit"
161else	READLINE_ORDER="-ledit -lreadline"
162fi
163for pgac_rllib in $READLINE_ORDER ; do
164  for pgac_lib in "" " -ltermcap" " -lncurses" " -lcurses" ; do
165    LIBS="${pgac_rllib}${pgac_lib} $pgac_save_LIBS"
166    AC_TRY_LINK_FUNC([readline], [[
167      # Older NetBSD, OpenBSD, and Irix have a broken linker that does not
168      # recognize dependent libraries; assume curses is needed if we didn't
169      # find any dependency.
170      case $host_os in
171        netbsd* | openbsd* | irix*)
172          if test x"$pgac_lib" = x"" ; then
173            pgac_lib=" -lcurses"
174          fi ;;
175      esac
176
177      pgac_cv_check_readline="${pgac_rllib}${pgac_lib}"
178      break
179    ]])
180  done
181  if test "$pgac_cv_check_readline" != no ; then
182    break
183  fi
184done
185LIBS=$pgac_save_LIBS
186])[]dnl AC_CACHE_CHECK
187
188if test "$pgac_cv_check_readline" != no ; then
189  LIBS="$pgac_cv_check_readline $LIBS"
190  AC_DEFINE(HAVE_LIBREADLINE, 1, [Define if you have a function readline library])
191fi
192
193])# PGAC_CHECK_READLINE
194
195
196
197# PGAC_VAR_RL_COMPLETION_APPEND_CHARACTER
198# ---------------------------------------
199# Readline versions < 2.1 don't have rl_completion_append_character
200
201AC_DEFUN([PGAC_VAR_RL_COMPLETION_APPEND_CHARACTER],
202[AC_CACHE_CHECK([for rl_completion_append_character], pgac_cv_var_rl_completion_append_character,
203[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>
204#ifdef HAVE_READLINE_READLINE_H
205# include <readline/readline.h>
206#elif defined(HAVE_READLINE_H)
207# include <readline.h>
208#endif
209],
210[rl_completion_append_character = 'x';])],
211[pgac_cv_var_rl_completion_append_character=yes],
212[pgac_cv_var_rl_completion_append_character=no])])
213if test x"$pgac_cv_var_rl_completion_append_character" = x"yes"; then
214AC_DEFINE(HAVE_RL_COMPLETION_APPEND_CHARACTER, 1,
215          [Define to 1 if you have the global variable 'rl_completion_append_character'.])
216fi])# PGAC_VAR_RL_COMPLETION_APPEND_CHARACTER
217
218
219
220# PGAC_CHECK_GETTEXT
221# ------------------
222# We check for bind_textdomain_codeset() not just gettext().  GNU gettext
223# before 0.10.36 does not have that function, and is generally too incomplete
224# to be usable.
225
226AC_DEFUN([PGAC_CHECK_GETTEXT],
227[
228  AC_SEARCH_LIBS(bind_textdomain_codeset, intl, [],
229                 [AC_MSG_ERROR([a gettext implementation is required for NLS])])
230  AC_CHECK_HEADER([libintl.h], [],
231                  [AC_MSG_ERROR([header file <libintl.h> is required for NLS])])
232  AC_CHECK_PROGS(MSGFMT, msgfmt)
233  if test -z "$MSGFMT"; then
234    AC_MSG_ERROR([msgfmt is required for NLS])
235  fi
236  AC_CACHE_CHECK([for msgfmt flags], pgac_cv_msgfmt_flags,
237[if test x"$MSGFMT" != x"" && "$MSGFMT" --version 2>&1 | grep "GNU" >/dev/null; then
238    pgac_cv_msgfmt_flags=-c
239fi])
240  AC_SUBST(MSGFMT_FLAGS, $pgac_cv_msgfmt_flags)
241  AC_CHECK_PROGS(MSGMERGE, msgmerge)
242  AC_CHECK_PROGS(XGETTEXT, xgettext)
243])# PGAC_CHECK_GETTEXT
244
245
246
247# PGAC_CHECK_STRIP
248# ----------------
249# Check for a 'strip' program, and figure out if that program can
250# strip libraries.
251
252AC_DEFUN([PGAC_CHECK_STRIP],
253[
254  AC_CHECK_TOOL(STRIP, strip, :)
255
256  AC_MSG_CHECKING([whether it is possible to strip libraries])
257  if test x"$STRIP" != x"" && "$STRIP" -V 2>&1 | grep "GNU strip" >/dev/null; then
258    STRIP_STATIC_LIB="$STRIP -x"
259    STRIP_SHARED_LIB="$STRIP --strip-unneeded"
260    AC_MSG_RESULT(yes)
261  else
262    case $host_os in
263      darwin*)
264        STRIP="$STRIP -x"
265        STRIP_STATIC_LIB=$STRIP
266        STRIP_SHARED_LIB=$STRIP
267        AC_MSG_RESULT(yes)
268        ;;
269      *)
270        STRIP_STATIC_LIB=:
271        STRIP_SHARED_LIB=:
272        AC_MSG_RESULT(no)
273        ;;
274    esac
275  fi
276  AC_SUBST(STRIP_STATIC_LIB)
277  AC_SUBST(STRIP_SHARED_LIB)
278])# PGAC_CHECK_STRIP
279