xref: /Universal-ctags/m4/00gnulib.m4 (revision 820c1a8d46849a90376d8eb15b319ac05439f656)
1*820c1a8dSHiroo HAYASHI# 00gnulib.m4 serial 8
2*820c1a8dSHiroo HAYASHIdnl Copyright (C) 2009-2021 Free Software Foundation, Inc.
3*820c1a8dSHiroo HAYASHIdnl This file is free software; the Free Software Foundation
4*820c1a8dSHiroo HAYASHIdnl gives unlimited permission to copy and/or distribute it,
5*820c1a8dSHiroo HAYASHIdnl with or without modifications, as long as this notice is preserved.
6*820c1a8dSHiroo HAYASHI
7*820c1a8dSHiroo HAYASHIdnl This file must be named something that sorts before all other
8*820c1a8dSHiroo HAYASHIdnl gnulib-provided .m4 files.  It is needed until the clang fix has
9*820c1a8dSHiroo HAYASHIdnl been included in Autoconf.
10*820c1a8dSHiroo HAYASHI
11*820c1a8dSHiroo HAYASHI# The following definitions arrange to use a compiler option
12*820c1a8dSHiroo HAYASHI# -Werror=implicit-function-declaration in AC_CHECK_DECL, when the
13*820c1a8dSHiroo HAYASHI# compiler is clang.  Without it, clang implicitly declares "known"
14*820c1a8dSHiroo HAYASHI# library functions in C mode, but not in C++ mode, which would cause
15*820c1a8dSHiroo HAYASHI# Gnulib to omit a declaration and thus later produce an error in C++
16*820c1a8dSHiroo HAYASHI# mode.  As of clang 9.0, these "known" functions are identified through
17*820c1a8dSHiroo HAYASHI# LIBBUILTIN invocations in the LLVM source file
18*820c1a8dSHiroo HAYASHI# llvm/tools/clang/include/clang/Basic/Builtins.def.
19*820c1a8dSHiroo HAYASHI# It's not possible to AC_REQUIRE the extra tests from AC_CHECK_DECL,
20*820c1a8dSHiroo HAYASHI# because AC_CHECK_DECL, like other Autoconf built-ins, is not supposed
21*820c1a8dSHiroo HAYASHI# to AC_REQUIRE anything: some configure.ac files have their first
22*820c1a8dSHiroo HAYASHI# AC_CHECK_DECL executed conditionally.  Therefore append the extra tests
23*820c1a8dSHiroo HAYASHI# to AC_PROG_CC.
24*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_COMPILER_CLANG],
25*820c1a8dSHiroo HAYASHI[
26*820c1a8dSHiroo HAYASHIdnl AC_REQUIRE([AC_PROG_CC])
27*820c1a8dSHiroo HAYASHI  AC_CACHE_CHECK([whether the compiler is clang],
28*820c1a8dSHiroo HAYASHI    [gl_cv_compiler_clang],
29*820c1a8dSHiroo HAYASHI    [dnl Use _AC_COMPILE_IFELSE instead of AC_EGREP_CPP, to avoid error
30*820c1a8dSHiroo HAYASHI     dnl "circular dependency of AC_LANG_COMPILER(C)" if AC_PROG_CC has
31*820c1a8dSHiroo HAYASHI     dnl not yet been invoked.
32*820c1a8dSHiroo HAYASHI     _AC_COMPILE_IFELSE(
33*820c1a8dSHiroo HAYASHI        [AC_LANG_PROGRAM([[
34*820c1a8dSHiroo HAYASHI           #ifdef __clang__
35*820c1a8dSHiroo HAYASHI           barfbarf
36*820c1a8dSHiroo HAYASHI           #endif
37*820c1a8dSHiroo HAYASHI           ]],[[]])
38*820c1a8dSHiroo HAYASHI        ],
39*820c1a8dSHiroo HAYASHI        [gl_cv_compiler_clang=no],
40*820c1a8dSHiroo HAYASHI        [gl_cv_compiler_clang=yes])
41*820c1a8dSHiroo HAYASHI    ])
42*820c1a8dSHiroo HAYASHI])
43*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_COMPILER_PREPARE_CHECK_DECL],
44*820c1a8dSHiroo HAYASHI[
45*820c1a8dSHiroo HAYASHIdnl AC_REQUIRE([AC_PROG_CC])
46*820c1a8dSHiroo HAYASHIdnl AC_REQUIRE([gl_COMPILER_CLANG])
47*820c1a8dSHiroo HAYASHI  AC_CACHE_CHECK([for compiler option needed when checking for declarations],
48*820c1a8dSHiroo HAYASHI    [gl_cv_compiler_check_decl_option],
49*820c1a8dSHiroo HAYASHI    [if test $gl_cv_compiler_clang = yes; then
50*820c1a8dSHiroo HAYASHI       dnl Test whether the compiler supports the option
51*820c1a8dSHiroo HAYASHI       dnl '-Werror=implicit-function-declaration'.
52*820c1a8dSHiroo HAYASHI       save_ac_compile="$ac_compile"
53*820c1a8dSHiroo HAYASHI       ac_compile="$ac_compile -Werror=implicit-function-declaration"
54*820c1a8dSHiroo HAYASHI       dnl Use _AC_COMPILE_IFELSE instead of AC_COMPILE_IFELSE, to avoid a
55*820c1a8dSHiroo HAYASHI       dnl warning "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS".
56*820c1a8dSHiroo HAYASHI       _AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
57*820c1a8dSHiroo HAYASHI         [gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'],
58*820c1a8dSHiroo HAYASHI         [gl_cv_compiler_check_decl_option=none])
59*820c1a8dSHiroo HAYASHI       ac_compile="$save_ac_compile"
60*820c1a8dSHiroo HAYASHI     else
61*820c1a8dSHiroo HAYASHI       gl_cv_compiler_check_decl_option=none
62*820c1a8dSHiroo HAYASHI     fi
63*820c1a8dSHiroo HAYASHI    ])
64*820c1a8dSHiroo HAYASHI  if test "x$gl_cv_compiler_check_decl_option" != xnone; then
65*820c1a8dSHiroo HAYASHI    ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option"
66*820c1a8dSHiroo HAYASHI  else
67*820c1a8dSHiroo HAYASHI    ac_compile_for_check_decl="$ac_compile"
68*820c1a8dSHiroo HAYASHI  fi
69*820c1a8dSHiroo HAYASHI])
70*820c1a8dSHiroo HAYASHIdnl Redefine _AC_CHECK_DECL_BODY so that it references ac_compile_for_check_decl
71*820c1a8dSHiroo HAYASHIdnl instead of ac_compile.  If, for whatever reason, the override of AC_PROG_CC
72*820c1a8dSHiroo HAYASHIdnl in zzgnulib.m4 is inactive, use the original ac_compile.
73*820c1a8dSHiroo HAYASHIm4_define([_AC_CHECK_DECL_BODY],
74*820c1a8dSHiroo HAYASHI[  ac_save_ac_compile="$ac_compile"
75*820c1a8dSHiroo HAYASHI  if test -n "$ac_compile_for_check_decl"; then
76*820c1a8dSHiroo HAYASHI    ac_compile="$ac_compile_for_check_decl"
77*820c1a8dSHiroo HAYASHI  fi]
78*820c1a8dSHiroo HAYASHIm4_defn([_AC_CHECK_DECL_BODY])[  ac_compile="$ac_save_ac_compile"
79*820c1a8dSHiroo HAYASHI])
80*820c1a8dSHiroo HAYASHI
81*820c1a8dSHiroo HAYASHI# gl_00GNULIB
82*820c1a8dSHiroo HAYASHI# -----------
83*820c1a8dSHiroo HAYASHI# Witness macro that this file has been included.  Needed to force
84*820c1a8dSHiroo HAYASHI# Automake to include this file prior to all other gnulib .m4 files.
85*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_00GNULIB])
86