dnl Redefine AC_LANG_PROGRAM with a "-Wstrict-prototypes -Werror"-friendly dnl version. Patch submitted to bug-autoconf in 2009-09-16. m4_define([AC_LANG_PROGRAM(C)], [$1 int main (void) { dnl Do *not* indent the following line: there may be CPP directives. dnl Don't move the `;' right after for the same reason. $2 ; return 0; }]) dnl Check whether target compiler is working AC_DEFUN([grub_PROG_TARGET_CC], [AC_MSG_CHECKING([whether target compiler is working]) AC_CACHE_VAL(grub_cv_prog_target_cc, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); ]], [[]])], [grub_cv_prog_target_cc=yes], [grub_cv_prog_target_cc=no]) ]) AC_MSG_RESULT([$grub_cv_prog_target_cc]) if test "x$grub_cv_prog_target_cc" = xno; then AC_MSG_ERROR([cannot compile for the target]) fi ]) dnl grub_ASM_USCORE checks if C symbols get an underscore after dnl compiling to assembler. dnl Written by Pavel Roskin. Based on grub_ASM_EXT_C written by dnl Erich Boleyn and modified by Yoshinori K. Okuji. AC_DEFUN([grub_ASM_USCORE], [AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_PROG_EGREP]) AC_MSG_CHECKING([if C symbols get an underscore after compilation]) AC_CACHE_VAL(grub_cv_asm_uscore, [cat > conftest.c <<\EOF int func (int *); int func (int *list) { *list = 0; return *list; } EOF if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then true else AC_MSG_ERROR([${CC-cc} failed to produce assembly code]) fi if $EGREP '(^|[^_[:alnum]])_func' conftest.s >/dev/null 2>&1; then HAVE_ASM_USCORE=1 grub_cv_asm_uscore=yes else HAVE_ASM_USCORE=0 grub_cv_asm_uscore=no fi rm -f conftest*]) AC_MSG_RESULT([$grub_cv_asm_uscore]) ]) dnl Some versions of `objcopy -O binary' vary their output depending dnl on the link address. AC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE], [AC_MSG_CHECKING([whether ${TARGET_OBJCOPY} works for absolute addresses]) AC_CACHE_VAL(grub_cv_prog_objcopy_absolute, [cat > conftest.c <<\EOF void cmain (void); void cmain (void) { *((int *) 0x1000) = 2; } EOF if AC_TRY_EVAL(ac_compile) && test -s conftest.o; then : else AC_MSG_ERROR([${CC-cc} cannot compile C source code]) fi grub_cv_prog_objcopy_absolute=yes for link_addr in 0x2000 0x8000 0x7C00; do 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 : else AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr]) fi if AC_TRY_COMMAND([${TARGET_OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then : else AC_MSG_ERROR([${TARGET_OBJCOPY-objcopy} cannot create binary files]) fi if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then mv -f conftest conftest.old else grub_cv_prog_objcopy_absolute=no break fi done rm -f conftest*]) AC_MSG_RESULT([$grub_cv_prog_objcopy_absolute]) if test "x$grub_cv_prog_objcopy_absolute" = xno; then AC_MSG_ERROR([GRUB requires a working absolute objcopy; upgrade your binutils]) fi ]) dnl Supply --build-id=none to ld if building modules. dnl This suppresses warnings from ld on some systems AC_DEFUN([grub_PROG_LD_BUILD_ID_NONE], [AC_MSG_CHECKING([whether linker accepts --build-id=none]) AC_CACHE_VAL(grub_cv_prog_ld_build_id_none, [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -Wl,--build-id=none" AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_prog_ld_build_id_none=yes], [grub_cv_prog_ld_build_id_none=no]) LDFLAGS="$save_LDFLAGS" ]) AC_MSG_RESULT([$grub_cv_prog_ld_build_id_none]) if test "x$grub_cv_prog_ld_build_id_none" = xyes; then TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,--build-id=none" fi ]) dnl Check nm AC_DEFUN([grub_PROG_NM_WORKS], [AC_MSG_CHECKING([whether nm works]) AC_CACHE_VAL(grub_cv_prog_nm_works, [ nm_works_tmp_dir="$(mktemp -d "./confXXXXXX")" AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])]) $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_works_tmp_dir/ef" if $TARGET_NM "$nm_works_tmp_dir/ef" > /dev/null; then grub_cv_prog_nm_works=yes else grub_cv_prog_nm_minus_p=no fi rm "$nm_works_tmp_dir/ef" rmdir "$nm_works_tmp_dir" ]) AC_MSG_RESULT([$grub_cv_prog_nm_works]) if test "x$grub_cv_prog_nm_works" != xyes; then AC_MSG_ERROR([nm does not work]) fi ]) dnl Supply -P to nm AC_DEFUN([grub_PROG_NM_MINUS_P], [AC_MSG_CHECKING([whether nm accepts -P]) AC_CACHE_VAL(grub_cv_prog_nm_minus_p, [ nm_minus_p_tmp_dir="$(mktemp -d "./confXXXXXX")" AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])]) $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_minus_p_tmp_dir/ef" if $TARGET_NM -P "$nm_minus_p_tmp_dir/ef" 2>&1 > /dev/null; then grub_cv_prog_nm_minus_p=yes else grub_cv_prog_nm_minus_p=no fi rm "$nm_minus_p_tmp_dir/ef" rmdir "$nm_minus_p_tmp_dir" ]) AC_MSG_RESULT([$grub_cv_prog_nm_minus_p]) if test "x$grub_cv_prog_nm_minus_p" = xyes; then TARGET_NMFLAGS_MINUS_P="-P" else TARGET_NMFLAGS_MINUS_P= fi ]) dnl Supply --defined-only to nm AC_DEFUN([grub_PROG_NM_DEFINED_ONLY], [AC_MSG_CHECKING([whether nm accepts --defined-only]) AC_CACHE_VAL(grub_cv_prog_nm_defined_only, [ nm_defined_only_tmp_dir="$(mktemp -d "./confXXXXXX")" AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])]) $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_defined_only_tmp_dir/ef" if $TARGET_NM --defined-only "$nm_defined_only_tmp_dir/ef" 2>&1 > /dev/null; then grub_cv_prog_nm_defined_only=yes else grub_cv_prog_nm_defined_only=no fi rm "$nm_defined_only_tmp_dir/ef" rmdir "$nm_defined_only_tmp_dir" ]) AC_MSG_RESULT([$grub_cv_prog_nm_defined_only]) if test "x$grub_cv_prog_nm_defined_only" = xyes; then TARGET_NMFLAGS_DEFINED_ONLY=--defined-only else TARGET_NMFLAGS_DEFINED_ONLY= fi ]) dnl Check what symbol is defined as a bss start symbol. dnl Written by Michael Hohmoth and Yoshinori K. Okuji. AC_DEFUN([grub_CHECK_BSS_START_SYMBOL], [AC_REQUIRE([AC_PROG_CC]) AC_MSG_CHECKING([if __bss_start is defined by the compiler]) AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); ]], [[asm ("incl __bss_start")]])], [grub_cv_check_uscore_uscore_bss_start_symbol=yes], [grub_cv_check_uscore_uscore_bss_start_symbol=no])]) AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol]) AC_MSG_CHECKING([if edata is defined by the compiler]) AC_CACHE_VAL(grub_cv_check_edata_symbol, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void);]], [[asm ("incl edata")]])], [grub_cv_check_edata_symbol=yes], [grub_cv_check_edata_symbol=no])]) AC_MSG_RESULT([$grub_cv_check_edata_symbol]) AC_MSG_CHECKING([if _edata is defined by the compiler]) AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void);]], [[asm ("incl _edata")]])], [grub_cv_check_uscore_edata_symbol=yes], [grub_cv_check_uscore_edata_symbol=no])]) AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol]) if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then BSS_START_SYMBOL=__bss_start elif test "x$grub_cv_check_edata_symbol" = xyes; then BSS_START_SYMBOL=edata elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then BSS_START_SYMBOL=_edata else AC_MSG_ERROR([none of __bss_start, edata or _edata is defined]) fi ]) dnl Check what symbol is defined as an end symbol. dnl Written by Yoshinori K. Okuji. AC_DEFUN([grub_CHECK_END_SYMBOL], [AC_REQUIRE([AC_PROG_CC]) AC_MSG_CHECKING([if end is defined by the compiler]) AC_CACHE_VAL(grub_cv_check_end_symbol, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void);]], [[asm ("incl end")]])], [grub_cv_check_end_symbol=yes], [grub_cv_check_end_symbol=no])]) AC_MSG_RESULT([$grub_cv_check_end_symbol]) AC_MSG_CHECKING([if _end is defined by the compiler]) AC_CACHE_VAL(grub_cv_check_uscore_end_symbol, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void);]], [[asm ("incl _end")]])], [grub_cv_check_uscore_end_symbol=yes], [grub_cv_check_uscore_end_symbol=no])]) AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol]) if test "x$grub_cv_check_end_symbol" = xyes; then END_SYMBOL=end elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then END_SYMBOL=_end else AC_MSG_ERROR([neither end nor _end is defined]) fi ]) dnl Check if the C compiler supports `-fstack-protector'. AC_DEFUN([grub_CHECK_STACK_PROTECTOR],[ [# Smashing stack protector. ssp_possible=yes] AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector']) # Is this a reliable test case? AC_LANG_CONFTEST([AC_LANG_SOURCE([[ void foo (void) { volatile char a[8]; a[3]; } ]])]) [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling # `ac_compile' like this correct, after all? if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then] AC_MSG_RESULT([yes]) [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.s else ssp_possible=no] AC_MSG_RESULT([no]) [fi] ]) dnl Check if the C compiler supports `-mstack-arg-probe' (Cygwin). AC_DEFUN([grub_CHECK_STACK_ARG_PROBE],[ [# Smashing stack arg probe. sap_possible=yes] AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe']) AC_LANG_CONFTEST([AC_LANG_SOURCE([[ void foo (void) { volatile char a[8]; a[3]; } ]])]) [if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then] AC_MSG_RESULT([yes]) [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.s else sap_possible=no] AC_MSG_RESULT([no]) [fi] ]) dnl Check if ln -s can handle directories properly (mingw). AC_DEFUN([grub_CHECK_LINK_DIR],[ AC_MSG_CHECKING([whether ln -s can handle directories properly]) [mkdir testdir 2>/dev/null case $srcdir in [\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;; *) reldir=../$srcdir/include/grub/util ;; esac if ln -s $reldir testdir/util 2>/dev/null && rm -f testdir/util 2>/dev/null ; then] AC_MSG_RESULT([yes]) [link_dir=yes else link_dir=no] AC_MSG_RESULT([no]) [fi rm -rf testdir] ]) dnl Check if the C compiler supports `-fPIE'. AC_DEFUN([grub_CHECK_PIE],[ [# Position independent executable. pie_possible=yes] AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default]) # Is this a reliable test case? AC_LANG_CONFTEST([AC_LANG_SOURCE([[ #ifdef __PIE__ int main() { return 0; } #else #error NO __PIE__ DEFINED #endif ]])]) [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling # `ac_compile' like this correct, after all? if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then] AC_MSG_RESULT([yes]) [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.s else pie_possible=no] AC_MSG_RESULT([no]) [fi] ]) AC_DEFUN([grub_CHECK_LINK_PIE],[ [# Position independent executable. link_nopie_needed=no] AC_MSG_CHECKING([whether linker needs disabling of PIE to work]) AC_LANG_CONFTEST([AC_LANG_SOURCE([[]])]) [if eval "$ac_compile -Wl,-r,-d -nostdlib -Werror -o conftest.o" 2> /dev/null; then] AC_MSG_RESULT([no]) [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.o else link_nopie_needed=yes] AC_MSG_RESULT([yes]) [fi] ]) dnl Check if the Linker supports `-no-pie'. AC_DEFUN([grub_CHECK_NO_PIE], [AC_MSG_CHECKING([whether linker accepts -no-pie]) AC_CACHE_VAL(grub_cv_cc_ld_no_pie, [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -no-pie -nostdlib -Werror" AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_ld_no_pie=yes], [grub_cv_cc_ld_no_pie=no]) LDFLAGS="$save_LDFLAGS" ]) AC_MSG_RESULT([$grub_cv_cc_ld_no_pie]) nopie_possible=no if test "x$grub_cv_cc_ld_no_pie" = xyes ; then nopie_possible=yes fi ]) AC_DEFUN([grub_CHECK_NO_PIE_ONEWORD], [AC_MSG_CHECKING([whether linker accepts -nopie]) AC_CACHE_VAL(grub_cv_cc_ld_no_pie_oneword, [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -nopie -nostdlib -Werror" AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_ld_no_pie_oneword=yes], [grub_cv_cc_ld_no_pie_oneword=no]) LDFLAGS="$save_LDFLAGS" ]) AC_MSG_RESULT([$grub_cv_cc_ld_no_pie_oneword]) nopie_oneword_possible=no if test "x$grub_cv_cc_ld_no_pie_oneword" = xyes ; then nopie_oneword_possible=yes fi ]) dnl Check if the C compiler supports `-fPIC'. AC_DEFUN([grub_CHECK_PIC],[ [# Position independent executable. pic_possible=yes] AC_MSG_CHECKING([whether `$CC' has `-fPIC' as default]) # Is this a reliable test case? AC_LANG_CONFTEST([AC_LANG_SOURCE([[ #ifdef __PIC__ int main() { return 0; } #else #error NO __PIC__ DEFINED #endif ]])]) [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling # `ac_compile' like this correct, after all? if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then] AC_MSG_RESULT([yes]) [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.s else pic_possible=no] AC_MSG_RESULT([no]) [fi] ]) dnl Create an output variable with the transformed name of a GRUB utility dnl program. AC_DEFUN([grub_TRANSFORM],[dnl AC_SUBST(AS_TR_SH([$1]), [`AS_ECHO([$1]) | sed "$program_transform_name"`])dnl ])