xref: /freebsd/contrib/ntp/sntp/m4/ntp_compiler.m4 (revision d37eb51047221dc3322b34db1038ff3aa533883f)
1dnl ######################################################################
2dnl Common m4sh code for compiler stuff
3AC_DEFUN([NTP_COMPILER], [
4AC_REQUIRE([AC_PROG_CC_STDC])
5
6AC_USE_SYSTEM_EXTENSIONS
7
8CC_NOFORMAT=
9CFLAGS_NTP=
10CPPFLAGS_NTP=
11LDADD_NTP=
12LDFLAGS_NTP=
13AC_SUBST([CC_NOFORMAT])
14AC_SUBST([CFLAGS_NTP])
15AC_SUBST([CPPFLAGS_NTP])
16AC_SUBST([LDADD_NTP])
17AC_SUBST([LDFLAGS_NTP])
18
19case "$ac_cv_prog_cc_c89" in
20 no)
21    AC_MSG_WARN([ANSI C89/ISO C90 is the minimum to compile NTP]
22		[ version 4.2.5 and higher.])
23    ;;
24esac
25
26AC_CACHE_CHECK(
27    [if $CC can handle @%:@warning],
28    [ntp_cv_cpp_warning],
29    [AC_COMPILE_IFELSE(
30	[AC_LANG_PROGRAM([[]], [[#warning foo]])],
31	[ntp_cv_cpp_warning=yes],
32	[ntp_cv_cpp_warning=no]
33    )]
34)
35case "$ntp_cv_cpp_warning" in
36 no)
37    AC_DEFINE([NO_OPTION_NAME_WARNINGS], [1],
38	[Should we avoid @%:@warning on option name collisions?])
39esac
40
41AC_CACHE_CHECK(
42    [if $CC supports __attribute__((...))],
43    [ntp_cv_cc_attribute],
44    [AC_COMPILE_IFELSE(
45	[AC_LANG_PROGRAM(
46	    [[]],
47	    [[void foo(void) __attribute__((__noreturn__));]]
48	    )],
49	[ntp_cv_cc_attribute=yes],
50	[ntp_cv_cc_attribute=no]
51    )]
52)
53case "$ntp_cv_cc_attribute" in
54 yes)
55    AC_DEFINE([HAVE___ATTRIBUTE__], [],
56	[defined if C compiler supports __attribute__((...))])
57esac
58AH_VERBATIM(
59    [HAVE___ATTRIBUTE___VERBATIM],
60    [
61	/* define away __attribute__() if unsupported */
62	#ifndef HAVE___ATTRIBUTE__
63	# define __attribute__(x) /* empty */
64	#endif
65	#define ISC_PLATFORM_NORETURN_PRE
66	#define ISC_PLATFORM_NORETURN_POST __attribute__((__noreturn__))
67    ]
68)
69
70case "$GCC" in
71 yes)
72    SAVED_CFLAGS="$CFLAGS"
73    CFLAGS="$SAVED_CFLAGS -Wstrict-overflow"
74    AC_CACHE_CHECK(
75	[if $CC can handle -Wstrict-overflow],
76	[ntp_cv_gcc_Wstrict_overflow],
77	[AC_COMPILE_IFELSE(
78	    [AC_LANG_PROGRAM([[]], [[]])],
79	    [ntp_cv_gcc_Wstrict_overflow=yes],
80	    [ntp_cv_gcc_Wstrict_overflow=no]
81	)	]
82    )
83    #
84    # $ntp_cv_gcc_Wstrict_overflow is tested later to add the
85    # flag to CFLAGS.
86    #
87    CFLAGS="$SAVED_CFLAGS -Winit-self"
88    AC_CACHE_CHECK(
89	[if $CC can handle -Winit-self],
90	[ntp_cv_gcc_Winit_self],
91	[
92	    AC_COMPILE_IFELSE(
93		[AC_LANG_PROGRAM([[]], [[]])],
94		[ntp_cv_gcc_Winit_self=yes],
95		[ntp_cv_gcc_Winit_self=no]
96	    )
97	]
98    )
99    #
100    # $ntp_cv_gcc_Winit_self is tested later to add the
101    # flag to CFLAGS_NTP.
102    #
103    # libopts specifically builds a string with embedded NULs.
104    # This causes a bunch of distracting warnings due to -Wformat.
105    #
106    CFLAGS="$SAVED_CFLAGS -Wno-format -Wno-format-security"
107    AC_CACHE_CHECK(
108	[if $CC can handle -Wno-format -Wno-format-security],
109	[ntp_cv_gcc_Wno_format],
110	[
111	    AC_COMPILE_IFELSE(
112		[AC_LANG_PROGRAM([[]], [[]])],
113		[ntp_cv_gcc_Wno_format=yes],
114		[ntp_cv_gcc_Wno_format=no]
115	    )
116	]
117    )
118    case "$ntp_cv_gcc_Wno_format" in
119      no) ntp_cv_gcc_Wno_format_truncation=no
120	  ;;
121     yes)
122	CC_NOFORMAT="-Wno-format -Wno-format-security"
123	CFLAGS="$SAVED_CFLAGS -Wformat -Wno-format-truncation -Werror"
124	AC_CACHE_CHECK(
125		[if $CC can handle -Wformat -Wno-format-truncation],
126		[ntp_cv_gcc_Wno_format_truncation],
127		[AC_COMPILE_IFELSE(
128		    [AC_LANG_PROGRAM([[]], [[]])],
129		    [ntp_cv_gcc_Wno_format_truncation=yes],
130		    [ntp_cv_gcc_Wno_format_truncation=no]
131		)	]
132	)
133	#
134	# $ntp_cv_gcc_Wno_format_truncation is tested later to add the
135	# flag to CFLAGS.
136	#
137    esac
138
139    CFLAGS="$SAVED_CFLAGS"
140    AS_UNSET([SAVED_CFLAGS])
141
142    AC_CACHE_CHECK(
143	[if linker supports omitting unused code and data],
144	[ntp_cv_gc_sections_runs],
145	[
146	    #  NetBSD will link but likely not run with --gc-sections
147	    #  http://bugs.ntp.org/1844
148	    #  http://gnats.netbsd.org/40401
149	    #  --gc-sections causes attempt to load as linux elf, with
150	    #  wrong syscalls in place.  Test a little gauntlet of
151	    #  simple stdio read code checking for errors, expecting
152	    #  enough syscall differences that the NetBSD code will
153	    #  fail even with Linux emulation working as designed.
154	    #  A shorter test could be refined by someone with access
155	    #  to a NetBSD host with Linux emulation working.
156	    origCFLAGS="$CFLAGS"
157	    CFLAGS="$CFLAGS -Wl,--gc-sections"
158	    AC_LINK_IFELSE(
159		[AC_LANG_PROGRAM(
160		    [[
161			#include <stdlib.h>
162			#include <stdio.h>
163		    ]],
164		    [[
165			FILE *	fpC;
166			char	buf[32];
167			size_t	cch;
168			int	read_success_once;
169
170			fpC = fopen("conftest.c", "r");
171			if (NULL == fpC)
172				exit(1);
173			do {
174				cch = fread(buf, sizeof(buf), 1, fpC);
175				read_success_once |= (0 != cch);
176			} while (0 != cch);
177			if (!read_success_once)
178				exit(2);
179			if (!feof(fpC))
180				exit(3);
181			if (0 != fclose(fpC))
182				exit(4);
183
184			exit(EXIT_SUCCESS);
185		    ]]
186		)],
187		[
188		    if test "X$cross_compiling" = "Xyes" || grep gc-sections conftest.err ; then
189			ntp_cv_gc_sections_runs=no
190		    else
191			ntp_cv_gc_sections_runs=no
192			./conftest >/dev/null 2>&1 && ntp_cv_gc_sections_runs=yes
193		    fi
194		],
195		[ntp_cv_gc_sections_runs=no]
196	    )
197	    CFLAGS="$origCFLAGS"
198	    AS_UNSET([origCFLAGS])
199	]
200    )
201    case "$ntp_cv_gc_sections_runs" in
202     yes)
203	LDADD_LIBNTP="-Wl,--gc-sections"
204	CFLAGS_NTP="$CFLAGS_NTP -ffunction-sections -fdata-sections"
205	;;
206     no)
207	LDADD_LIBNTP=
208	;;
209    esac
210    CFLAGS_NTP="$CFLAGS_NTP -Wall"
211    CFLAGS_NTP="$CFLAGS_NTP -Wcast-align"
212    CFLAGS_NTP="$CFLAGS_NTP -Wcast-qual"
213    # CFLAGS_NTP="$CFLAGS_NTP -Wconversion"
214    # CFLAGS_NTP="$CFLAGS_NTP -Werror"
215    # CFLAGS_NTP="$CFLAGS_NTP -Wextra"
216    # CFLAGS_NTP="$CFLAGS_NTP -Wfloat-equal"
217    CFLAGS_NTP="$CFLAGS_NTP -Wmissing-prototypes"
218    CFLAGS_NTP="$CFLAGS_NTP -Wpointer-arith"
219    CFLAGS_NTP="$CFLAGS_NTP -Wshadow"
220    # CFLAGS_NTP="$CFLAGS_NTP -Wtraditional"
221    # CFLAGS_NTP="$CFLAGS_NTP -Wwrite-strings"
222    case "$ntp_cv_gcc_Winit_self" in
223     yes)
224	CFLAGS_NTP="$CFLAGS_NTP -Winit-self"
225    esac
226    case "$ntp_cv_gcc_Wstrict_overflow" in
227     yes)
228	CFLAGS_NTP="$CFLAGS_NTP -Wstrict-overflow"
229    esac
230    case "$ntp_cv_gcc_Wno_format_truncation" in
231     yes)
232	CFLAGS_NTP="$CFLAGS_NTP -Wno-format-truncation"
233    esac
234    # -W[no-]strict-prototypes might be added by NTP_OPENSSL
235esac
236
237NTP_OS_CFLAGS
238
239AC_C_BIGENDIAN
240AC_C_VOLATILE
241AC_PROG_CPP
242
243])dnl
244dnl ======================================================================
245