summaryrefslogtreecommitdiff
path: root/m4/ansi-c++.m4
blob: ea49b446a0b19b00e7de0591c161891286910cb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# ansi-c++.m4 serial 12
dnl Copyright (C) 2002-2003, 2005, 2010-2023 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.

dnl From Bruno Haible.

# Sets CXX_CHOICE to 'yes' or 'no', depending on the preferred use of C++.
# The default is 'yes'. If the configure.ac contains a definition of the
# macro gl_CXX_CHOICE_DEFAULT_NO, then the default is 'no'. In both cases,
# the user can change the value by passing the option --disable-cxx or
# --enable-cxx, respectively.

AC_DEFUN([gl_CXX_CHOICE],
[
  AC_MSG_CHECKING([whether to use C++])
  dnl Plus signs are supported in AC_ARG_ENABLE starting with autoconf-2.66.
  m4_version_prereq([2.66],
    [m4_ifdef([gl_CXX_CHOICE_DEFAULT_NO],
       [AC_ARG_ENABLE([c++],
          [  --enable-c++            also build C++ sources],
          [CXX_CHOICE="$enableval"],
          [CXX_CHOICE=no])],
       [AC_ARG_ENABLE([c++],
          [  --disable-c++           do not build C++ sources],
          [CXX_CHOICE="$enableval"],
          [CXX_CHOICE=yes])])],
    [m4_ifdef([gl_CXX_CHOICE_DEFAULT_NO],
       [AC_ARG_ENABLE([cxx],
          [  --enable-cxx            also build C++ sources],
          [CXX_CHOICE="$enableval"],
          [CXX_CHOICE=no])],
       [AC_ARG_ENABLE([cxx],
          [  --disable-cxx           do not build C++ sources],
          [CXX_CHOICE="$enableval"],
          [CXX_CHOICE=yes])])])
  AC_MSG_RESULT([$CXX_CHOICE])
  AC_SUBST([CXX_CHOICE])
])

# gl_PROG_ANSI_CXX([ANSICXX_VARIABLE], [ANSICXX_CONDITIONAL])
# Sets ANSICXX_VARIABLE to the name of a sufficiently ANSI C++ compliant
# compiler, or to "no" if none is found.
# Defines the Automake condition ANSICXX_CONDITIONAL to true if such a compiler
# was found, or to false if not.

AC_DEFUN([gl_PROG_ANSI_CXX],
[
  AC_REQUIRE([gl_CXX_CHOICE])
  m4_if([$1], [CXX], [],
    [gl_save_CXX="$CXX"])
  if test "$CXX_CHOICE" = no; then
    CXX=no
  fi
  if test -z "$CXX"; then
    if test -n "$CCC"; then
      CXX="$CCC"
    else
      AC_CHECK_TOOLS([CXX],
                     [g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC],
                     [:])
    fi
  fi
  if test "$CXX" != no; then
    dnl Use a modified version of AC_PROG_CXX_WORKS that does not exit
    dnl upon failure.
    AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works])
    AC_LANG_PUSH([C++])
    AC_ARG_VAR([CXX], [C++ compiler command])
    AC_ARG_VAR([CXXFLAGS], [C++ compiler flags])
    echo 'int main () { return 0; }' > conftest.$ac_ext
    if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
      gl_cv_prog_ansicxx_works=yes
      if (./conftest; exit) 2>/dev/null; then
        gl_cv_prog_ansicxx_cross=no
      else
        gl_cv_prog_ansicxx_cross=yes
      fi
    else
      gl_cv_prog_ansicxx_works=no
    fi
    rm -fr conftest*
    AC_LANG_POP([C++])
    AC_MSG_RESULT([$gl_cv_prog_ansicxx_works])
    if test $gl_cv_prog_ansicxx_works = no; then
      CXX=no
    else
      dnl Test for namespaces.
      dnl We don't bother supporting pre-ANSI-C++ compilers.
      AC_MSG_CHECKING([whether the C++ compiler supports namespaces])
      AC_LANG_PUSH([C++])
      cat <<EOF > conftest.$ac_ext
#include <iostream>
namespace test { using namespace std; }
std::ostream* ptr;
int main () { return 0; }
EOF
      if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
        gl_cv_prog_ansicxx_namespaces=yes
      else
        gl_cv_prog_ansicxx_namespaces=no
      fi
      rm -fr conftest*
      AC_LANG_POP([C++])
      AC_MSG_RESULT([$gl_cv_prog_ansicxx_namespaces])
      if test $gl_cv_prog_ansicxx_namespaces = no; then
        CXX=no
      fi
    fi
  fi
  m4_if([$1], [CXX], [],
    [$1="$CXX"
     CXX="$gl_save_CXX"])
  AC_SUBST([$1])

  AM_CONDITIONAL([$2], [test "$$1" != no])

  if test "$$1" != no; then
    dnl This macro invocation resolves an automake error:
    dnl /usr/local/share/automake-1.11/am/depend2.am: am__fastdepCXX does not appear in AM_CONDITIONAL
    dnl /usr/local/share/automake-1.11/am/depend2.am:   The usual way to define 'am__fastdepCXX' is to add 'AC_PROG_CXX'
    dnl /usr/local/share/automake-1.11/am/depend2.am:   to 'configure.ac' and run 'aclocal' and 'autoconf' again.
    _AM_DEPENDENCIES([CXX])
    dnl Determine a good default for the CXXFLAGS variable.
    AC_LANG_PUSH([C++])
    _AC_LANG_COMPILER_GNU
    if test $ac_compiler_gnu = yes; then
      GXX=yes
    else
      GXX=
    fi
    _AC_PROG_CXX_G
    AC_LANG_POP([C++])
  else
    AM_CONDITIONAL([am__fastdepCXX], [false])
  fi
])

# gl_ANSI_CXX
# Sets CXX to the name of a sufficiently ANSI C++ compliant compiler, or to
# "no" if none is found.
# Defines the Automake condition ANSICXX to true if such a compiler was found,
# or to false if not.
AC_DEFUN([gl_ANSI_CXX],
[
  gl_PROG_ANSI_CXX([CXX], [ANSICXX])
  dnl This line is needed in order to avoid trouble with Autoconf.  It makes
  dnl sure that Autoconf does not insert expansions of AC_PROG_CXX at random
  dnl places.  See <https://savannah.gnu.org/support/?110294>.
  m4_provide([AC_PROG_CXX])
])