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:");
24 [grub_cv_prog_target_cc=yes],
25 [grub_cv_prog_target_cc=no])
27 AC_MSG_RESULT([$grub_cv_prog_target_cc])
29 if test "x$grub_cv_prog_target_cc" = xno; then
30 AC_MSG_ERROR([cannot compile for the target])
35 dnl grub_ASM_USCORE checks if C symbols get an underscore after
36 dnl compiling to assembler.
37 dnl Written by Pavel Roskin. Based on grub_ASM_EXT_C written by
38 dnl Erich Boleyn and modified by Yoshinori K. Okuji.
39 AC_DEFUN([grub_ASM_USCORE],
40 [AC_REQUIRE([AC_PROG_CC])
41 AC_REQUIRE([AC_PROG_EGREP])
42 AC_MSG_CHECKING([if C symbols get an underscore after compilation])
43 AC_CACHE_VAL(grub_cv_asm_uscore,
44 [cat > conftest.c <<\EOF
54 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
57 AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
60 if $EGREP '(^|[^_[:alnum]])_func' conftest.s >/dev/null 2>&1; then
62 grub_cv_asm_uscore=yes
70 AC_MSG_RESULT([$grub_cv_asm_uscore])
74 dnl Some versions of `objcopy -O binary' vary their output depending
75 dnl on the link address.
76 AC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE],
77 [AC_MSG_CHECKING([whether ${TARGET_OBJCOPY} works for absolute addresses])
78 AC_CACHE_VAL(grub_cv_prog_objcopy_absolute,
79 [cat > conftest.c <<\EOF
84 *((int *) 0x1000) = 2;
88 if AC_TRY_EVAL(ac_compile) && test -s conftest.o; then :
90 AC_MSG_ERROR([${CC-cc} cannot compile C source code])
92 grub_cv_prog_objcopy_absolute=yes
93 for link_addr in 0x2000 0x8000 0x7C00; do
94 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},$link_addr conftest.o -o conftest.exec]); then :
96 AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
98 if AC_TRY_COMMAND([${TARGET_OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then :
100 AC_MSG_ERROR([${TARGET_OBJCOPY-objcopy} cannot create binary files])
102 if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then
103 mv -f conftest conftest.old
105 grub_cv_prog_objcopy_absolute=no
110 AC_MSG_RESULT([$grub_cv_prog_objcopy_absolute])
112 if test "x$grub_cv_prog_objcopy_absolute" = xno; then
113 AC_MSG_ERROR([GRUB requires a working absolute objcopy; upgrade your binutils])
118 dnl Supply --build-id=none to ld if building modules.
119 dnl This suppresses warnings from ld on some systems
120 AC_DEFUN([grub_PROG_LD_BUILD_ID_NONE],
121 [AC_MSG_CHECKING([whether linker accepts --build-id=none])
122 AC_CACHE_VAL(grub_cv_prog_ld_build_id_none,
123 [save_LDFLAGS="$LDFLAGS"
124 LDFLAGS="$LDFLAGS -Wl,--build-id=none"
125 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
126 [grub_cv_prog_ld_build_id_none=yes],
127 [grub_cv_prog_ld_build_id_none=no])
128 LDFLAGS="$save_LDFLAGS"
130 AC_MSG_RESULT([$grub_cv_prog_ld_build_id_none])
132 if test "x$grub_cv_prog_ld_build_id_none" = xyes; then
133 TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,--build-id=none"
138 AC_DEFUN([grub_PROG_NM_WORKS],
139 [AC_MSG_CHECKING([whether nm works])
140 AC_CACHE_VAL(grub_cv_prog_nm_works,
142 nm_works_tmp_dir="$(mktemp -d "./confXXXXXX")"
143 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
144 $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_works_tmp_dir/ef"
145 if $TARGET_NM "$nm_works_tmp_dir/ef" > /dev/null; then
146 grub_cv_prog_nm_works=yes
148 grub_cv_prog_nm_minus_p=no
150 rm "$nm_works_tmp_dir/ef"
151 rmdir "$nm_works_tmp_dir"
153 AC_MSG_RESULT([$grub_cv_prog_nm_works])
155 if test "x$grub_cv_prog_nm_works" != xyes; then
156 AC_MSG_ERROR([nm does not work])
161 AC_DEFUN([grub_PROG_NM_MINUS_P],
162 [AC_MSG_CHECKING([whether nm accepts -P])
163 AC_CACHE_VAL(grub_cv_prog_nm_minus_p,
165 nm_minus_p_tmp_dir="$(mktemp -d "./confXXXXXX")"
166 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
167 $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_minus_p_tmp_dir/ef"
168 if $TARGET_NM -P "$nm_minus_p_tmp_dir/ef" 2>&1 > /dev/null; then
169 grub_cv_prog_nm_minus_p=yes
171 grub_cv_prog_nm_minus_p=no
173 rm "$nm_minus_p_tmp_dir/ef"
174 rmdir "$nm_minus_p_tmp_dir"
176 AC_MSG_RESULT([$grub_cv_prog_nm_minus_p])
178 if test "x$grub_cv_prog_nm_minus_p" = xyes; then
179 TARGET_NMFLAGS_MINUS_P="-P"
181 TARGET_NMFLAGS_MINUS_P=
185 dnl Supply --defined-only to nm
186 AC_DEFUN([grub_PROG_NM_DEFINED_ONLY],
187 [AC_MSG_CHECKING([whether nm accepts --defined-only])
188 AC_CACHE_VAL(grub_cv_prog_nm_defined_only,
190 nm_defined_only_tmp_dir="$(mktemp -d "./confXXXXXX")"
191 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
192 $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_defined_only_tmp_dir/ef"
193 if $TARGET_NM --defined-only "$nm_defined_only_tmp_dir/ef" 2>&1 > /dev/null; then
194 grub_cv_prog_nm_defined_only=yes
196 grub_cv_prog_nm_defined_only=no
198 rm "$nm_defined_only_tmp_dir/ef"
199 rmdir "$nm_defined_only_tmp_dir"
201 AC_MSG_RESULT([$grub_cv_prog_nm_defined_only])
203 if test "x$grub_cv_prog_nm_defined_only" = xyes; then
204 TARGET_NMFLAGS_DEFINED_ONLY=--defined-only
206 TARGET_NMFLAGS_DEFINED_ONLY=
212 dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
213 dnl instructions, but implicitly insert addr32 and data32 bytes so
214 dnl that the code works in real mode''.
216 dnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit
217 dnl instructions,'' which seems right. This requires the programmer
218 dnl to explicitly insert addr32 and data32 instructions when they want
221 dnl We only support the newer versions, because the old versions cause
222 dnl major pain, by requiring manual assembly to get 16-bit instructions into
224 AC_DEFUN([grub_I386_ASM_ADDR32],
225 [AC_REQUIRE([AC_PROG_CC])
226 AC_REQUIRE([grub_I386_ASM_PREFIX_REQUIREMENT])
227 AC_MSG_CHECKING([for .code16 addr32 assembler support])
228 AC_CACHE_VAL(grub_cv_i386_asm_addr32,
229 [cat > conftest.s.in <<\EOF
231 l1: @ADDR32@ movb %al, l1
234 if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
235 sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s
237 sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
240 if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
241 grub_cv_i386_asm_addr32=yes
243 grub_cv_i386_asm_addr32=no
248 AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
250 dnl Later versions of GAS requires that addr32 and data32 prefixes
251 dnl appear in the same lines as the instructions they modify, while
252 dnl earlier versions requires that they appear in separate lines.
253 AC_DEFUN([grub_I386_ASM_PREFIX_REQUIREMENT],
254 [AC_REQUIRE([AC_PROG_CC])
256 [whether addr32 must be in the same line as the instruction])
257 AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
258 [cat > conftest.s <<\EOF
260 l1: addr32 movb %al, l1
263 if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
264 grub_cv_i386_asm_prefix_requirement=yes
266 grub_cv_i386_asm_prefix_requirement=no
271 if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
272 grub_tmp_addr32="addr32"
273 grub_tmp_data32="data32"
275 grub_tmp_addr32="addr32;"
276 grub_tmp_data32="data32;"
279 ADDR32=$grub_tmp_addr32
280 DATA32=$grub_tmp_data32
282 AC_MSG_RESULT([$grub_cv_i386_asm_prefix_requirement])])
285 dnl Check what symbol is defined as a bss start symbol.
286 dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
287 AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
288 [AC_REQUIRE([AC_PROG_CC])
289 AC_MSG_CHECKING([if __bss_start is defined by the compiler])
290 AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
291 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
292 [[asm ("incl __bss_start")]])],
293 [grub_cv_check_uscore_uscore_bss_start_symbol=yes],
294 [grub_cv_check_uscore_uscore_bss_start_symbol=no])])
296 AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
298 AC_MSG_CHECKING([if edata is defined by the compiler])
299 AC_CACHE_VAL(grub_cv_check_edata_symbol,
300 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
301 [[asm ("incl edata")]])],
302 [grub_cv_check_edata_symbol=yes],
303 [grub_cv_check_edata_symbol=no])])
305 AC_MSG_RESULT([$grub_cv_check_edata_symbol])
307 AC_MSG_CHECKING([if _edata is defined by the compiler])
308 AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
309 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
310 [[asm ("incl _edata")]])],
311 [grub_cv_check_uscore_edata_symbol=yes],
312 [grub_cv_check_uscore_edata_symbol=no])])
314 AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
316 if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
317 BSS_START_SYMBOL=__bss_start
318 elif test "x$grub_cv_check_edata_symbol" = xyes; then
319 BSS_START_SYMBOL=edata
320 elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
321 BSS_START_SYMBOL=_edata
323 AC_MSG_ERROR([none of __bss_start, edata or _edata is defined])
327 dnl Check what symbol is defined as an end symbol.
328 dnl Written by Yoshinori K. Okuji.
329 AC_DEFUN([grub_CHECK_END_SYMBOL],
330 [AC_REQUIRE([AC_PROG_CC])
331 AC_MSG_CHECKING([if end is defined by the compiler])
332 AC_CACHE_VAL(grub_cv_check_end_symbol,
333 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
334 [[asm ("incl end")]])],
335 [grub_cv_check_end_symbol=yes],
336 [grub_cv_check_end_symbol=no])])
338 AC_MSG_RESULT([$grub_cv_check_end_symbol])
340 AC_MSG_CHECKING([if _end is defined by the compiler])
341 AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
342 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
343 [[asm ("incl _end")]])],
344 [grub_cv_check_uscore_end_symbol=yes],
345 [grub_cv_check_uscore_end_symbol=no])])
347 AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
349 if test "x$grub_cv_check_end_symbol" = xyes; then
351 elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
354 AC_MSG_ERROR([neither end nor _end is defined])
359 dnl Check if the C compiler supports `-fstack-protector'.
360 AC_DEFUN([grub_CHECK_STACK_PROTECTOR],[
361 [# Smashing stack protector.
363 AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector'])
364 # Is this a reliable test case?
365 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
366 void foo (void) { volatile char a[8]; a[3]; }
368 [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
369 # `ac_compile' like this correct, after all?
370 if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then]
372 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
380 dnl Check if the C compiler supports `-mstack-arg-probe' (Cygwin).
381 AC_DEFUN([grub_CHECK_STACK_ARG_PROBE],[
382 [# Smashing stack arg probe.
384 AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
385 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
386 void foo (void) { volatile char a[8]; a[3]; }
388 [if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then]
390 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
398 dnl Check if ln can handle directories properly (mingw).
399 AC_DEFUN([grub_CHECK_LINK_DIR],[
400 AC_MSG_CHECKING([whether ln can handle directories properly])
401 [mkdir testdir 2>/dev/null
403 [\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
404 *) reldir=../$srcdir/include/grub/util ;;
406 if ln -s $reldir testdir/util 2>/dev/null ; then]
416 dnl Check if the C compiler supports `-fPIE'.
417 AC_DEFUN([grub_CHECK_PIE],[
418 [# Position independent executable.
420 AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default])
421 # Is this a reliable test case?
422 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
428 #error NO __PIE__ DEFINED
432 [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
433 # `ac_compile' like this correct, after all?
434 if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
436 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
444 dnl Check if the C compiler supports `-fPIC'.
445 AC_DEFUN([grub_CHECK_PIC],[
446 [# Position independent executable.
448 AC_MSG_CHECKING([whether `$CC' has `-fPIC' as default])
449 # Is this a reliable test case?
450 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
456 #error NO __PIC__ DEFINED
460 [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
461 # `ac_compile' like this correct, after all?
462 if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
464 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
472 dnl Create an output variable with the transformed name of a GRUB utility
474 AC_DEFUN([grub_TRANSFORM],[dnl
475 AC_SUBST(AS_TR_SH([$1]), [`AS_ECHO([$1]) | sed "$program_transform_name"`])dnl
478 dnl Check if the C compiler supports `-mno-unaligned-access'.
479 AC_DEFUN([grub_CHECK_NO_UNALIGNED_ACCESS],[
482 AC_MSG_CHECKING([whether `$CC' supports `-mno-unaligned-access'])
483 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
489 [if eval "$ac_compile -S -mno-unaligned-access -o conftest.s" 2> /dev/null; then]