1 dnl Redefine AC_LANG_PROGRAM with a "-Wstrict-prototypes -Werror"-friendly
2 dnl version. Patch submitted to bug-autoconf in 2009-09-16.
3 m4_define([AC_LANG_PROGRAM(C)],
8 dnl Do *not* indent the following line: there may be CPP directives.
9 dnl Don't move the `;' right after for the same reason.
16 dnl Check whether target compiler is working
17 AC_DEFUN([grub_PROG_TARGET_CC],
18 [AC_MSG_CHECKING([whether target compiler is working])
19 AC_CACHE_VAL(grub_cv_prog_target_cc,
20 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
21 asm (".globl start; start:");
26 [grub_cv_prog_target_cc=yes],
27 [grub_cv_prog_target_cc=no])
29 AC_MSG_RESULT([$grub_cv_prog_target_cc])
31 if test "x$grub_cv_prog_target_cc" = xno; then
32 AC_MSG_ERROR([cannot compile for the target])
37 dnl grub_ASM_USCORE checks if C symbols get an underscore after
38 dnl compiling to assembler.
39 dnl Written by Pavel Roskin. Based on grub_ASM_EXT_C written by
40 dnl Erich Boleyn and modified by Yoshinori K. Okuji.
41 AC_DEFUN([grub_ASM_USCORE],
42 [AC_REQUIRE([AC_PROG_CC])
43 AC_REQUIRE([AC_PROG_EGREP])
44 AC_MSG_CHECKING([if C symbols get an underscore after compilation])
45 AC_CACHE_VAL(grub_cv_asm_uscore,
46 [cat > conftest.c <<\EOF
56 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
59 AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
62 if $EGREP '(^|[^_[:alnum]])_func' conftest.s >/dev/null 2>&1; then
64 grub_cv_asm_uscore=yes
72 AC_MSG_RESULT([$grub_cv_asm_uscore])
76 dnl Some versions of `objcopy -O binary' vary their output depending
77 dnl on the link address.
78 AC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE],
79 [AC_MSG_CHECKING([whether ${TARGET_OBJCOPY} works for absolute addresses])
80 AC_CACHE_VAL(grub_cv_prog_objcopy_absolute,
81 [cat > conftest.c <<\EOF
86 *((int *) 0x1000) = 2;
90 if AC_TRY_EVAL(ac_compile) && test -s conftest.o; then :
92 AC_MSG_ERROR([${CC-cc} cannot compile C source code])
94 grub_cv_prog_objcopy_absolute=yes
95 for link_addr in 0x2000 0x8000 0x7C00; do
96 if AC_TRY_COMMAND([${CC-cc} ${TARGET_CFLAGS} ${TARGET_LDFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},$link_addr conftest.o -o conftest.exec]); then :
98 AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
100 if AC_TRY_COMMAND([${TARGET_OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then :
102 AC_MSG_ERROR([${TARGET_OBJCOPY-objcopy} cannot create binary files])
104 if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then
105 mv -f conftest conftest.old
107 grub_cv_prog_objcopy_absolute=no
112 AC_MSG_RESULT([$grub_cv_prog_objcopy_absolute])
114 if test "x$grub_cv_prog_objcopy_absolute" = xno; then
115 AC_MSG_ERROR([GRUB requires a working absolute objcopy; upgrade your binutils])
120 dnl Supply --build-id=none to ld if building modules.
121 dnl This suppresses warnings from ld on some systems
122 AC_DEFUN([grub_PROG_LD_BUILD_ID_NONE],
123 [AC_MSG_CHECKING([whether linker accepts --build-id=none])
124 AC_CACHE_VAL(grub_cv_prog_ld_build_id_none,
125 [save_LDFLAGS="$LDFLAGS"
126 LDFLAGS="$LDFLAGS -Wl,--build-id=none"
127 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
128 [grub_cv_prog_ld_build_id_none=yes],
129 [grub_cv_prog_ld_build_id_none=no])
130 LDFLAGS="$save_LDFLAGS"
132 AC_MSG_RESULT([$grub_cv_prog_ld_build_id_none])
134 if test "x$grub_cv_prog_ld_build_id_none" = xyes; then
135 TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,--build-id=none"
140 AC_DEFUN([grub_PROG_NM_WORKS],
141 [AC_MSG_CHECKING([whether nm works])
142 AC_CACHE_VAL(grub_cv_prog_nm_works,
144 nm_works_tmp_dir="$(mktemp -d "./confXXXXXX")"
145 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
146 $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_works_tmp_dir/ef"
147 if $TARGET_NM "$nm_works_tmp_dir/ef" > /dev/null; then
148 grub_cv_prog_nm_works=yes
150 grub_cv_prog_nm_minus_p=no
152 rm "$nm_works_tmp_dir/ef"
153 rmdir "$nm_works_tmp_dir"
155 AC_MSG_RESULT([$grub_cv_prog_nm_works])
157 if test "x$grub_cv_prog_nm_works" != xyes; then
158 AC_MSG_ERROR([nm does not work])
163 AC_DEFUN([grub_PROG_NM_MINUS_P],
164 [AC_MSG_CHECKING([whether nm accepts -P])
165 AC_CACHE_VAL(grub_cv_prog_nm_minus_p,
167 nm_minus_p_tmp_dir="$(mktemp -d "./confXXXXXX")"
168 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
169 $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_minus_p_tmp_dir/ef"
170 if $TARGET_NM -P "$nm_minus_p_tmp_dir/ef" 2>&1 > /dev/null; then
171 grub_cv_prog_nm_minus_p=yes
173 grub_cv_prog_nm_minus_p=no
175 rm "$nm_minus_p_tmp_dir/ef"
176 rmdir "$nm_minus_p_tmp_dir"
178 AC_MSG_RESULT([$grub_cv_prog_nm_minus_p])
180 if test "x$grub_cv_prog_nm_minus_p" = xyes; then
181 TARGET_NMFLAGS_MINUS_P="-P"
183 TARGET_NMFLAGS_MINUS_P=
187 dnl Supply --defined-only to nm
188 AC_DEFUN([grub_PROG_NM_DEFINED_ONLY],
189 [AC_MSG_CHECKING([whether nm accepts --defined-only])
190 AC_CACHE_VAL(grub_cv_prog_nm_defined_only,
192 nm_defined_only_tmp_dir="$(mktemp -d "./confXXXXXX")"
193 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
194 $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_defined_only_tmp_dir/ef"
195 if $TARGET_NM --defined-only "$nm_defined_only_tmp_dir/ef" 2>&1 > /dev/null; then
196 grub_cv_prog_nm_defined_only=yes
198 grub_cv_prog_nm_defined_only=no
200 rm "$nm_defined_only_tmp_dir/ef"
201 rmdir "$nm_defined_only_tmp_dir"
203 AC_MSG_RESULT([$grub_cv_prog_nm_defined_only])
205 if test "x$grub_cv_prog_nm_defined_only" = xyes; then
206 TARGET_NMFLAGS_DEFINED_ONLY=--defined-only
208 TARGET_NMFLAGS_DEFINED_ONLY=
213 dnl Check what symbol is defined as a bss start symbol.
214 dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
215 AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
216 [AC_REQUIRE([AC_PROG_CC])
217 AC_MSG_CHECKING([if __bss_start is defined by the compiler])
218 AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
219 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
220 asm (".globl start; start:");
222 void __main (void) {}
225 [[asm ("incl __bss_start")]])],
226 [grub_cv_check_uscore_uscore_bss_start_symbol=yes],
227 [grub_cv_check_uscore_uscore_bss_start_symbol=no])])
229 AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
231 AC_MSG_CHECKING([if edata is defined by the compiler])
232 AC_CACHE_VAL(grub_cv_check_edata_symbol,
233 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
234 asm (".globl start; start:");
236 void __main (void) {}
238 [[asm ("incl edata")]])],
239 [grub_cv_check_edata_symbol=yes],
240 [grub_cv_check_edata_symbol=no])])
242 AC_MSG_RESULT([$grub_cv_check_edata_symbol])
244 AC_MSG_CHECKING([if _edata is defined by the compiler])
245 AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
246 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
247 asm (".globl start; start:");
249 void __main (void) {}
251 [[asm ("incl _edata")]])],
252 [grub_cv_check_uscore_edata_symbol=yes],
253 [grub_cv_check_uscore_edata_symbol=no])])
255 AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
257 if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
258 BSS_START_SYMBOL=__bss_start
259 elif test "x$grub_cv_check_edata_symbol" = xyes; then
260 BSS_START_SYMBOL=edata
261 elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
262 BSS_START_SYMBOL=_edata
264 AC_MSG_ERROR([none of __bss_start, edata or _edata is defined])
268 dnl Check what symbol is defined as an end symbol.
269 dnl Written by Yoshinori K. Okuji.
270 AC_DEFUN([grub_CHECK_END_SYMBOL],
271 [AC_REQUIRE([AC_PROG_CC])
272 AC_MSG_CHECKING([if end is defined by the compiler])
273 AC_CACHE_VAL(grub_cv_check_end_symbol,
274 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
275 asm (".globl start; start:");
277 void __main (void) {}
279 [[asm ("incl end")]])],
280 [grub_cv_check_end_symbol=yes],
281 [grub_cv_check_end_symbol=no])])
283 AC_MSG_RESULT([$grub_cv_check_end_symbol])
285 AC_MSG_CHECKING([if _end is defined by the compiler])
286 AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
287 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
288 asm (".globl start; start:");
290 void __main (void) {}
292 [[asm ("incl _end")]])],
293 [grub_cv_check_uscore_end_symbol=yes],
294 [grub_cv_check_uscore_end_symbol=no])])
296 AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
298 if test "x$grub_cv_check_end_symbol" = xyes; then
300 elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
303 AC_MSG_ERROR([neither end nor _end is defined])
308 dnl Check if the C compiler supports `-fstack-protector'.
309 AC_DEFUN([grub_CHECK_STACK_PROTECTOR],[
310 [# Smashing stack protector.
312 AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector'])
313 # Is this a reliable test case?
314 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
315 void foo (void) { volatile char a[8]; a[3]; }
317 [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
318 # `ac_compile' like this correct, after all?
319 if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then]
321 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
329 dnl Check if the C compiler supports `-mstack-arg-probe' (Cygwin).
330 AC_DEFUN([grub_CHECK_STACK_ARG_PROBE],[
331 [# Smashing stack arg probe.
333 AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
334 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
335 void foo (void) { volatile char a[8]; a[3]; }
337 [if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then]
339 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
347 dnl Check if ln -s can handle directories properly (mingw).
348 AC_DEFUN([grub_CHECK_LINK_DIR],[
349 AC_MSG_CHECKING([whether ln -s can handle directories properly])
350 [mkdir testdir 2>/dev/null
352 [\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
353 *) reldir=../$srcdir/include/grub/util ;;
355 if ln -s $reldir testdir/util 2>/dev/null && rm -f testdir/util 2>/dev/null ; then]
365 dnl Check if the C compiler supports `-fPIE'.
366 AC_DEFUN([grub_CHECK_PIE],[
367 [# Position independent executable.
369 AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default])
370 # Is this a reliable test case?
371 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
377 #error NO __PIE__ DEFINED
381 [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
382 # `ac_compile' like this correct, after all?
383 if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
385 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
393 AC_DEFUN([grub_CHECK_LINK_PIE],[
394 [# Position independent executable.
395 link_nopie_needed=no]
396 AC_MSG_CHECKING([whether linker needs disabling of PIE to work])
397 AC_LANG_CONFTEST([AC_LANG_SOURCE([[]])])
399 [if eval "$ac_compile -Wl,-r,-d -nostdlib -Werror -o conftest.o" 2> /dev/null; then]
401 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
404 link_nopie_needed=yes]
410 dnl Check if the Linker supports `-no-pie'.
411 AC_DEFUN([grub_CHECK_NO_PIE],
412 [AC_MSG_CHECKING([whether linker accepts -no-pie])
413 AC_CACHE_VAL(grub_cv_cc_ld_no_pie,
414 [save_LDFLAGS="$LDFLAGS"
415 LDFLAGS="$LDFLAGS -no-pie -nostdlib -Werror"
416 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
417 [grub_cv_cc_ld_no_pie=yes],
418 [grub_cv_cc_ld_no_pie=no])
419 LDFLAGS="$save_LDFLAGS"
421 AC_MSG_RESULT([$grub_cv_cc_ld_no_pie])
423 if test "x$grub_cv_cc_ld_no_pie" = xyes ; then
428 AC_DEFUN([grub_CHECK_NO_PIE_ONEWORD],
429 [AC_MSG_CHECKING([whether linker accepts -nopie])
430 AC_CACHE_VAL(grub_cv_cc_ld_no_pie_oneword,
431 [save_LDFLAGS="$LDFLAGS"
432 LDFLAGS="$LDFLAGS -nopie -nostdlib -Werror"
433 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
434 [grub_cv_cc_ld_no_pie_oneword=yes],
435 [grub_cv_cc_ld_no_pie_oneword=no])
436 LDFLAGS="$save_LDFLAGS"
438 AC_MSG_RESULT([$grub_cv_cc_ld_no_pie_oneword])
439 nopie_oneword_possible=no
440 if test "x$grub_cv_cc_ld_no_pie_oneword" = xyes ; then
441 nopie_oneword_possible=yes
445 dnl Check if the C compiler supports `-fPIC'.
446 AC_DEFUN([grub_CHECK_PIC],[
447 [# Position independent executable.
449 AC_MSG_CHECKING([whether `$CC' has `-fPIC' as default])
450 # Is this a reliable test case?
451 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
457 #error NO __PIC__ DEFINED
461 [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
462 # `ac_compile' like this correct, after all?
463 if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
465 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
473 dnl Create an output variable with the transformed name of a GRUB utility
475 AC_DEFUN([grub_TRANSFORM],[dnl
476 AC_SUBST(AS_TR_SH([$1]), [`AS_ECHO([$1]) | sed "$program_transform_name"`])dnl