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} ${CFLAGS} -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=
214 dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
215 dnl instructions, but implicitly insert addr32 and data32 bytes so
216 dnl that the code works in real mode''.
218 dnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit
219 dnl instructions,'' which seems right. This requires the programmer
220 dnl to explicitly insert addr32 and data32 instructions when they want
223 dnl We only support the newer versions, because the old versions cause
224 dnl major pain, by requiring manual assembly to get 16-bit instructions into
226 AC_DEFUN([grub_I386_ASM_ADDR32],
227 [AC_REQUIRE([AC_PROG_CC])
228 AC_REQUIRE([grub_I386_ASM_PREFIX_REQUIREMENT])
229 AC_MSG_CHECKING([for .code16 addr32 assembler support])
230 AC_CACHE_VAL(grub_cv_i386_asm_addr32,
231 [cat > conftest.s.in <<\EOF
233 l1: @ADDR32@ movb %al, l1
236 if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
237 sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s
239 sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
242 if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
243 grub_cv_i386_asm_addr32=yes
245 grub_cv_i386_asm_addr32=no
250 AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
252 dnl Later versions of GAS requires that addr32 and data32 prefixes
253 dnl appear in the same lines as the instructions they modify, while
254 dnl earlier versions requires that they appear in separate lines.
255 AC_DEFUN([grub_I386_ASM_PREFIX_REQUIREMENT],
256 [AC_REQUIRE([AC_PROG_CC])
258 [whether addr32 must be in the same line as the instruction])
259 AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
260 [cat > conftest.s <<\EOF
262 l1: addr32 movb %al, l1
265 if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
266 grub_cv_i386_asm_prefix_requirement=yes
268 grub_cv_i386_asm_prefix_requirement=no
273 if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
274 grub_tmp_addr32="addr32"
275 grub_tmp_data32="data32"
277 grub_tmp_addr32="addr32;"
278 grub_tmp_data32="data32;"
281 ADDR32=$grub_tmp_addr32
282 DATA32=$grub_tmp_data32
284 AC_MSG_RESULT([$grub_cv_i386_asm_prefix_requirement])])
287 dnl Check what symbol is defined as a bss start symbol.
288 dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
289 AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
290 [AC_REQUIRE([AC_PROG_CC])
291 AC_MSG_CHECKING([if __bss_start is defined by the compiler])
292 AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
293 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
294 asm (".globl start; start:");
296 void __main (void) {}
299 [[asm ("incl __bss_start")]])],
300 [grub_cv_check_uscore_uscore_bss_start_symbol=yes],
301 [grub_cv_check_uscore_uscore_bss_start_symbol=no])])
303 AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
305 AC_MSG_CHECKING([if edata is defined by the compiler])
306 AC_CACHE_VAL(grub_cv_check_edata_symbol,
307 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
308 asm (".globl start; start:");
310 void __main (void) {}
312 [[asm ("incl edata")]])],
313 [grub_cv_check_edata_symbol=yes],
314 [grub_cv_check_edata_symbol=no])])
316 AC_MSG_RESULT([$grub_cv_check_edata_symbol])
318 AC_MSG_CHECKING([if _edata is defined by the compiler])
319 AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
320 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
321 asm (".globl start; start:");
323 void __main (void) {}
325 [[asm ("incl _edata")]])],
326 [grub_cv_check_uscore_edata_symbol=yes],
327 [grub_cv_check_uscore_edata_symbol=no])])
329 AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
331 if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
332 BSS_START_SYMBOL=__bss_start
333 elif test "x$grub_cv_check_edata_symbol" = xyes; then
334 BSS_START_SYMBOL=edata
335 elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
336 BSS_START_SYMBOL=_edata
338 AC_MSG_ERROR([none of __bss_start, edata or _edata is defined])
342 dnl Check what symbol is defined as an end symbol.
343 dnl Written by Yoshinori K. Okuji.
344 AC_DEFUN([grub_CHECK_END_SYMBOL],
345 [AC_REQUIRE([AC_PROG_CC])
346 AC_MSG_CHECKING([if end is defined by the compiler])
347 AC_CACHE_VAL(grub_cv_check_end_symbol,
348 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
349 asm (".globl start; start:");
351 void __main (void) {}
353 [[asm ("incl end")]])],
354 [grub_cv_check_end_symbol=yes],
355 [grub_cv_check_end_symbol=no])])
357 AC_MSG_RESULT([$grub_cv_check_end_symbol])
359 AC_MSG_CHECKING([if _end is defined by the compiler])
360 AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
361 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
362 asm (".globl start; start:");
364 void __main (void) {}
366 [[asm ("incl _end")]])],
367 [grub_cv_check_uscore_end_symbol=yes],
368 [grub_cv_check_uscore_end_symbol=no])])
370 AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
372 if test "x$grub_cv_check_end_symbol" = xyes; then
374 elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
377 AC_MSG_ERROR([neither end nor _end is defined])
382 dnl Check if the C compiler supports `-fstack-protector'.
383 AC_DEFUN([grub_CHECK_STACK_PROTECTOR],[
384 [# Smashing stack protector.
386 AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector'])
387 # Is this a reliable test case?
388 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
389 void foo (void) { volatile char a[8]; a[3]; }
391 [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
392 # `ac_compile' like this correct, after all?
393 if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then]
395 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
403 dnl Check if the C compiler supports `-mstack-arg-probe' (Cygwin).
404 AC_DEFUN([grub_CHECK_STACK_ARG_PROBE],[
405 [# Smashing stack arg probe.
407 AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
408 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
409 void foo (void) { volatile char a[8]; a[3]; }
411 [if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then]
413 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
421 dnl Check if ln -s can handle directories properly (mingw).
422 AC_DEFUN([grub_CHECK_LINK_DIR],[
423 AC_MSG_CHECKING([whether ln -s can handle directories properly])
424 [mkdir testdir 2>/dev/null
426 [\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
427 *) reldir=../$srcdir/include/grub/util ;;
429 if ln -s $reldir testdir/util 2>/dev/null && rm -f testdir/util 2>/dev/null ; then]
439 dnl Check if the C compiler supports `-fPIE'.
440 AC_DEFUN([grub_CHECK_PIE],[
441 [# Position independent executable.
443 AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default])
444 # Is this a reliable test case?
445 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
451 #error NO __PIE__ DEFINED
455 [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
456 # `ac_compile' like this correct, after all?
457 if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
459 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
467 dnl Check if the C compiler supports `-fPIC'.
468 AC_DEFUN([grub_CHECK_PIC],[
469 [# Position independent executable.
471 AC_MSG_CHECKING([whether `$CC' has `-fPIC' as default])
472 # Is this a reliable test case?
473 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
479 #error NO __PIC__ DEFINED
483 [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
484 # `ac_compile' like this correct, after all?
485 if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
487 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
495 dnl Create an output variable with the transformed name of a GRUB utility
497 AC_DEFUN([grub_TRANSFORM],[dnl
498 AC_SUBST(AS_TR_SH([$1]), [`AS_ECHO([$1]) | sed "$program_transform_name"`])dnl