Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit97b398e

Browse files
committed
Fix configure's AC_CHECK_DECLS tests to work correctly with clang.
The test case that Autoconf uses to discover whether a function hasbeen declared doesn't work reliably with clang, because clang reportsa warning not an error if the name is a known built-in function.On some platforms, this results in a lot of compile-time warnings aboutstrlcpy and related functions not having been declared.There is a fix for this (by Noah Misch) in the upstream Autoconf sources,but since they've not made a release in years and show no indication ofdoing so anytime soon, let's just absorb their fix directly. We canrevert this when and if we update to a newer Autoconf release.Back-patch to all supported branches.Discussion:https://postgr.es/m/26819.1542515567@sss.pgh.pa.us
1 parent85efd1a commit97b398e

File tree

4 files changed

+217
-5
lines changed

4 files changed

+217
-5
lines changed

‎aclocal.m4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ m4_include([config/ax_prog_perl_modules.m4])
44
m4_include([config/ax_pthread.m4])
55
m4_include([config/c-compiler.m4])
66
m4_include([config/c-library.m4])
7+
m4_include([config/check_decls.m4])
78
m4_include([config/docbook.m4])
89
m4_include([config/general.m4])
910
m4_include([config/libtool.m4])

‎config/check_decls.m4

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# config/check_decls.m4
2+
3+
# This file redefines the standard Autoconf macro _AC_CHECK_DECL_BODY,
4+
# and adds a supporting function _AC_UNDECLARED_WARNING, to make
5+
# AC_CHECK_DECLS behave correctly when checking for built-in library
6+
# functions with clang.
7+
8+
# This is based on commit 82ef7805faffa151e724aa76c245ec590d174580
9+
# in the Autoconf git repository. We can drop it if they ever get
10+
# around to releasing a new version of Autoconf. In the meantime,
11+
# it's distributed under Autoconf's license:
12+
13+
# This file is part of Autoconf. This program is free
14+
# software; you can redistribute it and/or modify it under the
15+
# terms of the GNU General Public License as published by the
16+
# Free Software Foundation, either version 3 of the License, or
17+
# (at your option) any later version.
18+
#
19+
# This program is distributed in the hope that it will be useful,
20+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
21+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22+
# GNU General Public License for more details.
23+
#
24+
# Under Section 7 of GPL version 3, you are granted additional
25+
# permissions described in the Autoconf Configure Script Exception,
26+
# version 3.0, as published by the Free Software Foundation.
27+
#
28+
# You should have received a copy of the GNU General Public License
29+
# and a copy of the Autoconf Configure Script Exception along with
30+
# this program; see the files COPYINGv3 and COPYING.EXCEPTION
31+
# respectively. If not, see <http://www.gnu.org/licenses/>.
32+
33+
# Written by David MacKenzie, with help from
34+
# Franc,ois Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor,
35+
# Roland McGrath, Noah Friedman, david d zuhn, and many others.
36+
37+
38+
# _AC_UNDECLARED_WARNING
39+
# ----------------------
40+
# Set ac_[]_AC_LANG_ABBREV[]_decl_warn_flag=yes if the compiler uses a warning,
41+
# not a more-customary error, to report some undeclared identifiers. Fail when
42+
# an affected compiler warns also on valid input. _AC_PROG_PREPROC_WORKS_IFELSE
43+
# solves a related problem.
44+
AC_DEFUN([_AC_UNDECLARED_WARNING],
45+
[# The Clang compiler raises a warning for an undeclared identifier that matches
46+
# a compiler builtin function. All extant Clang versions are affected, as of
47+
# Clang 3.6.0. Test a builtin known to every version. This problem affects the
48+
# C and Objective C languages, but Clang does report an error under C++ and
49+
# Objective C++.
50+
#
51+
# Passing -fno-builtin to the compiler would suppress this problem. That
52+
# strategy would have the advantage of being insensitive to stray warnings, but
53+
# it would make tests less realistic.
54+
AC_CACHE_CHECK([how $[]_AC_CC[] reports undeclared, standard C functions],
55+
[ac_cv_[]_AC_LANG_ABBREV[]_decl_report],
56+
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[(void) strchr;])],
57+
[AS_IF([test -s conftest.err],[dnl
58+
# For AC_CHECK_DECL to react to warnings, the compiler must be silent on
59+
# valid AC_CHECK_DECL input. No library function is consistently available
60+
# on freestanding implementations, so test against a dummy declaration.
61+
# Include always-available headers on the off chance that they somehow
62+
# elicit warnings.
63+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([dnl
64+
#include <float.h>
65+
#include <limits.h>
66+
#include <stdarg.h>
67+
#include <stddef.h>
68+
extern void ac_decl (int, char *);],
69+
[@%:@ifdef __cplusplus
70+
(void) ac_decl ((int) 0, (char *) 0);
71+
(void) ac_decl;
72+
@%:@else
73+
(void) ac_decl;
74+
@%:@endif
75+
])],
76+
[AS_IF([test -s conftest.err],
77+
[AC_MSG_FAILURE([cannot detect from compiler exit status or warnings])],
78+
[ac_cv_[]_AC_LANG_ABBREV[]_decl_report=warning])],
79+
[AC_MSG_FAILURE([cannot compile a simple declaration test])])],
80+
[AC_MSG_FAILURE([compiler does not report undeclared identifiers])])],
81+
[ac_cv_[]_AC_LANG_ABBREV[]_decl_report=error])])
82+
83+
case $ac_cv_[]_AC_LANG_ABBREV[]_decl_report in
84+
warning) ac_[]_AC_LANG_ABBREV[]_decl_warn_flag=yes ;;
85+
*) ac_[]_AC_LANG_ABBREV[]_decl_warn_flag= ;;
86+
esac
87+
])# _AC_UNDECLARED_WARNING
88+
89+
# _AC_CHECK_DECL_BODY
90+
# -------------------
91+
# Shell function body for AC_CHECK_DECL.
92+
m4_define([_AC_CHECK_DECL_BODY],
93+
[ AS_LINENO_PUSH([$[]1])
94+
# Initialize each $ac_[]_AC_LANG_ABBREV[]_decl_warn_flag once.
95+
AC_DEFUN([_AC_UNDECLARED_WARNING_]_AC_LANG_ABBREV,
96+
[_AC_UNDECLARED_WARNING])dnl
97+
AC_REQUIRE([_AC_UNDECLARED_WARNING_]_AC_LANG_ABBREV)dnl
98+
[as_decl_name=`echo $][2|sed 's/ *(.*//'`]
99+
[as_decl_use=`echo $][2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`]
100+
AC_CACHE_CHECK([whether $as_decl_name is declared],[$[]3],
101+
[ac_save_werror_flag=$ac_[]_AC_LANG_ABBREV[]_werror_flag
102+
ac_[]_AC_LANG_ABBREV[]_werror_flag="$ac_[]_AC_LANG_ABBREV[]_decl_warn_flag$ac_[]_AC_LANG_ABBREV[]_werror_flag"
103+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$[]4],
104+
[@%:@ifndef $[]as_decl_name
105+
@%:@ifdef __cplusplus
106+
(void) $[]as_decl_use;
107+
@%:@else
108+
(void) $[]as_decl_name;
109+
@%:@endif
110+
@%:@endif
111+
])],
112+
[AS_VAR_SET([$[]3],[yes])],
113+
[AS_VAR_SET([$[]3],[no])])
114+
ac_[]_AC_LANG_ABBREV[]_werror_flag=$ac_save_werror_flag])
115+
AS_LINENO_POP
116+
])# _AC_CHECK_DECL_BODY

‎configure

Lines changed: 97 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2304,13 +2304,16 @@ rm -f conftest.val
23042304
ac_fn_c_check_decl ()
23052305
{
23062306
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
2307-
as_decl_name=`echo$2|sed's/ *(.*//'`
2307+
# Initialize each $ac_[]_AC_LANG_ABBREV[]_decl_warn_flag once.
2308+
as_decl_name=`echo$2|sed's/ *(.*//'`
23082309
as_decl_use=`echo$2|sed -e's/(/((/' -e's/)/) 0&/' -e's/,/) 0& (/g'`
23092310
{$as_echo"$as_me:${as_lineno-$LINENO}: checking whether$as_decl_name is declared">&5
23102311
$as_echo_n"checking whether$as_decl_name is declared...">&6; }
23112312
ifeval\${$3+:}false;then:
23122313
$as_echo_n"(cached)">&6
23132314
else
2315+
ac_save_werror_flag=$ac_c_werror_flag
2316+
ac_c_werror_flag="$ac_c_decl_warn_flag$ac_c_werror_flag"
23142317
cat confdefs.h -<<_ACEOF >conftest.$ac_ext
23152318
/* end confdefs.h. */
23162319
$4
@@ -2335,6 +2338,7 @@ else
23352338
eval"$3=no"
23362339
fi
23372340
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
2341+
ac_c_werror_flag=$ac_save_werror_flag
23382342
fi
23392343
eval ac_res=\$$3
23402344
{$as_echo"$as_me:${as_lineno-$LINENO}: result:$ac_res">&5
@@ -13262,7 +13266,96 @@ esac
1326213266
# posix_fadvise() is a no-op on Solaris, so don't incur function overhead
1326313267
# by calling it, 2009-04-02
1326413268
# http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libc/port/gen/posix_fadvise.c
13265-
iftest"$PORTNAME"!="solaris";then
13269+
# The Clang compiler raises a warning for an undeclared identifier that matches
13270+
# a compiler builtin function. All extant Clang versions are affected, as of
13271+
# Clang 3.6.0. Test a builtin known to every version. This problem affects the
13272+
# C and Objective C languages, but Clang does report an error under C++ and
13273+
# Objective C++.
13274+
#
13275+
# Passing -fno-builtin to the compiler would suppress this problem. That
13276+
# strategy would have the advantage of being insensitive to stray warnings, but
13277+
# it would make tests less realistic.
13278+
{$as_echo"$as_me:${as_lineno-$LINENO}: checking how$CC reports undeclared, standard C functions">&5
13279+
$as_echo_n"checking how$CC reports undeclared, standard C functions...">&6; }
13280+
if${ac_cv_c_decl_report+:}false;then:
13281+
$as_echo_n"(cached)">&6
13282+
else
13283+
cat confdefs.h -<<_ACEOF >conftest.$ac_ext
13284+
/* end confdefs.h. */
13285+
13286+
int
13287+
main ()
13288+
{
13289+
(void) strchr;
13290+
;
13291+
return 0;
13292+
}
13293+
_ACEOF
13294+
if ac_fn_c_try_compile"$LINENO";then:
13295+
iftest -s conftest.err;then:
13296+
# For AC_CHECK_DECL to react to warnings, the compiler must be silent on
13297+
# valid AC_CHECK_DECL input. No library function is consistently available
13298+
# on freestanding implementations, so test against a dummy declaration.
13299+
# Include always-available headers on the off chance that they somehow
13300+
# elicit warnings.
13301+
cat confdefs.h -<<_ACEOF >conftest.$ac_ext
13302+
/* end confdefs.h. */
13303+
#include <float.h>
13304+
#include <limits.h>
13305+
#include <stdarg.h>
13306+
#include <stddef.h>
13307+
extern void ac_decl (int, char *);
13308+
int
13309+
main ()
13310+
{
13311+
#ifdef __cplusplus
13312+
(void) ac_decl ((int) 0, (char *) 0);
13313+
(void) ac_decl;
13314+
#else
13315+
(void) ac_decl;
13316+
#endif
13317+
13318+
;
13319+
return 0;
13320+
}
13321+
_ACEOF
13322+
if ac_fn_c_try_compile"$LINENO";then:
13323+
iftest -s conftest.err;then:
13324+
{ {$as_echo"$as_me:${as_lineno-$LINENO}: error: in\`$ac_pwd':">&5
13325+
$as_echo"$as_me: error: in\`$ac_pwd':">&2;}
13326+
as_fn_error$?"cannot detect from compiler exit status or warnings
13327+
See\`config.log' for more details""$LINENO" 5; }
13328+
else
13329+
ac_cv_c_decl_report=warning
13330+
fi
13331+
else
13332+
{ {$as_echo"$as_me:${as_lineno-$LINENO}: error: in\`$ac_pwd':">&5
13333+
$as_echo"$as_me: error: in\`$ac_pwd':">&2;}
13334+
as_fn_error$?"cannot compile a simple declaration test
13335+
See\`config.log' for more details""$LINENO" 5; }
13336+
fi
13337+
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
13338+
else
13339+
{ {$as_echo"$as_me:${as_lineno-$LINENO}: error: in\`$ac_pwd':">&5
13340+
$as_echo"$as_me: error: in\`$ac_pwd':">&2;}
13341+
as_fn_error$?"compiler does not report undeclared identifiers
13342+
See\`config.log' for more details""$LINENO" 5; }
13343+
fi
13344+
else
13345+
ac_cv_c_decl_report=error
13346+
fi
13347+
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
13348+
fi
13349+
{$as_echo"$as_me:${as_lineno-$LINENO}: result:$ac_cv_c_decl_report">&5
13350+
$as_echo"$ac_cv_c_decl_report">&6; }
13351+
13352+
case$ac_cv_c_decl_reportin
13353+
warning) ac_c_decl_warn_flag=yes ;;
13354+
*) ac_c_decl_warn_flag= ;;
13355+
esac
13356+
13357+
iftest"$PORTNAME"!="solaris";then:
13358+
1326613359
forac_funcin posix_fadvise
1326713360
do:
1326813361
ac_fn_c_check_func"$LINENO""posix_fadvise""ac_cv_func_posix_fadvise"
@@ -13286,7 +13379,8 @@ cat >>confdefs.h <<_ACEOF
1328613379
#define HAVE_DECL_POSIX_FADVISE$ac_have_decl
1328713380
_ACEOF
1328813381

13289-
fi
13382+
13383+
fi# fi
1329013384

1329113385
ac_fn_c_check_decl"$LINENO""fdatasync""ac_cv_have_decl_fdatasync""#include <unistd.h>
1329213386
"

‎configure.in

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1492,10 +1492,11 @@ esac
14921492
# posix_fadvise() is a no-op on Solaris, so don't incur function overhead
14931493
# by calling it, 2009-04-02
14941494
# http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libc/port/gen/posix_fadvise.c
1495-
if test "$PORTNAME" != "solaris"; then
1495+
dnl must use AS_IF here, else AC_REQUIRES inside AC_CHECK_DECLS malfunctions
1496+
AS_IF([test "$PORTNAME" != "solaris"], [
14961497
AC_CHECK_FUNCS(posix_fadvise)
14971498
AC_CHECK_DECLS(posix_fadvise, [], [], [#include <fcntl.h>])
1498-
fi
1499+
]) #fi
14991500

15001501
AC_CHECK_DECLS(fdatasync, [], [], [#include <unistd.h>])
15011502
AC_CHECK_DECLS([strlcat, strlcpy])

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp