1dnl grub_ASM_USCORE checks if C symbols get an underscore after 2dnl compiling to assembler. 3dnl Written by Pavel Roskin. Based on grub_ASM_EXT_C written by 4dnl Erich Boleyn and modified by OKUJI Yoshinori 5AC_DEFUN([grub_ASM_USCORE], 6[AC_REQUIRE([AC_PROG_CC]) 7AC_MSG_CHECKING([if C symbols get an underscore after compilation]) 8AC_CACHE_VAL(grub_cv_asm_uscore, 9[cat > conftest.c <<\EOF 10int 11func (int *list) 12{ 13 *list = 0; 14 return *list; 15} 16EOF 17 18if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then 19 true 20else 21 AC_MSG_ERROR([${CC-cc} failed to produce assembly code]) 22fi 23 24if grep _func conftest.s >/dev/null 2>&1; then 25 grub_cv_asm_uscore=yes 26else 27 grub_cv_asm_uscore=no 28fi 29 30rm -f conftest*]) 31 32if test "x$grub_cv_asm_uscore" = xyes; then 33 AC_DEFINE_UNQUOTED([HAVE_ASM_USCORE], $grub_cv_asm_uscore, 34 [Define if C symbols get an underscore after compilation]) 35fi 36 37AC_MSG_RESULT([$grub_cv_asm_uscore]) 38]) 39 40 41dnl Some versions of `objcopy -O binary' vary their output depending 42dnl on the link address. 43AC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE], 44[AC_MSG_CHECKING([whether ${OBJCOPY} works for absolute addresses]) 45AC_CACHE_VAL(grub_cv_prog_objcopy_absolute, 46[cat > conftest.c <<\EOF 47void 48cmain (void) 49{ 50 *((int *) 0x1000) = 2; 51} 52EOF 53 54if AC_TRY_EVAL(ac_compile) && test -s conftest.o; then : 55else 56 AC_MSG_ERROR([${CC-cc} cannot compile C source code]) 57fi 58grub_cv_prog_objcopy_absolute=yes 59for link_addr in 2000 8000 7C00; do 60 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec]); then : 61 else 62 AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr]) 63 fi 64 if AC_TRY_COMMAND([${OBJCOPY-objcopy} -O binary conftest.exec conftest]); then : 65 else 66 AC_MSG_ERROR([${OBJCOPY-objcopy} cannot create binary files]) 67 fi 68 if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then 69 mv -f conftest conftest.old 70 else 71 grub_cv_prog_objcopy_absolute=no 72 break 73 fi 74done 75rm -f conftest*]) 76AC_MSG_RESULT([$grub_cv_prog_objcopy_absolute])]) 77 78dnl Mass confusion! 79dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit 80dnl instructions, but implicitly insert addr32 and data32 bytes so 81dnl that the code works in real mode''. 82dnl 83dnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit 84dnl instructions,'' which seems right. This requires the programmer 85dnl to explicitly insert addr32 and data32 instructions when they want 86dnl them. 87dnl 88dnl We only support the newer versions, because the old versions cause 89dnl major pain, by requiring manual assembly to get 16-bit instructions into 90dnl stage1/stage1.S. 91AC_DEFUN([grub_ASM_ADDR32], 92[AC_REQUIRE([AC_PROG_CC]) 93AC_REQUIRE([grub_ASM_PREFIX_REQUIREMENT]) 94AC_MSG_CHECKING([for .code16 addr32 assembler support]) 95AC_CACHE_VAL(grub_cv_asm_addr32, 96[cat > conftest.s.in <<\EOF 97 .code16 98l1: @ADDR32@ movb %al, l1 99EOF 100 101if test "x$grub_cv_asm_prefix_requirement" = xyes; then 102 sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s 103else 104 sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s 105fi 106 107if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then 108 grub_cv_asm_addr32=yes 109else 110 grub_cv_asm_addr32=no 111fi 112 113rm -f conftest*]) 114 115AC_MSG_RESULT([$grub_cv_asm_addr32])]) 116 117dnl 118dnl Later versions of GAS requires that addr32 and data32 prefixes 119dnl appear in the same lines as the instructions they modify, while 120dnl earlier versions requires that they appear in separate lines. 121AC_DEFUN([grub_ASM_PREFIX_REQUIREMENT], 122[AC_REQUIRE([AC_PROG_CC]) 123AC_MSG_CHECKING(dnl 124[whether addr32 must be in the same line as the instruction]) 125AC_CACHE_VAL(grub_cv_asm_prefix_requirement, 126[cat > conftest.s <<\EOF 127 .code16 128l1: addr32 movb %al, l1 129EOF 130 131if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then 132 grub_cv_asm_prefix_requirement=yes 133else 134 grub_cv_asm_prefix_requirement=no 135fi 136 137rm -f conftest*]) 138 139if test "x$grub_cv_asm_prefix_requirement" = xyes; then 140 grub_tmp_addr32="addr32" 141 grub_tmp_data32="data32" 142else 143 grub_tmp_addr32="addr32;" 144 grub_tmp_data32="data32;" 145fi 146 147AC_DEFINE_UNQUOTED([ADDR32], $grub_tmp_addr32, 148 [Define it to \"addr32\" or \"addr32;\" to make GAS happy]) 149AC_DEFINE_UNQUOTED([DATA32], $grub_tmp_data32, 150 [Define it to \"data32\" or \"data32;\" to make GAS happy]) 151 152AC_MSG_RESULT([$grub_cv_asm_prefix_requirement])]) 153 154dnl 155dnl Older versions of GAS require that absolute indirect calls/jumps are 156dnl not prefixed with `*', while later versions warn if not prefixed. 157AC_DEFUN([grub_ASM_ABSOLUTE_WITHOUT_ASTERISK], 158[AC_REQUIRE([AC_PROG_CC]) 159AC_MSG_CHECKING(dnl 160[whether an absolute indirect call/jump must not be prefixed with an asterisk]) 161AC_CACHE_VAL(grub_cv_asm_absolute_without_asterisk, 162[cat > conftest.s <<\EOF 163 lcall *(offset) 164offset: 165 .long 0 166 .word 0 167EOF 168 169if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then 170 grub_cv_asm_absolute_without_asterisk=no 171else 172 grub_cv_asm_absolute_without_asterisk=yes 173fi 174 175rm -f conftest*]) 176 177if test "x$grub_cv_asm_absolute_without_asterisk" = xyes; then 178 AC_DEFINE(ABSOLUTE_WITHOUT_ASTERISK, 1, [Define if an absolute indirect call/jump must NOT be prefixed with `*']) 179fi 180 181AC_MSG_RESULT([$grub_cv_asm_absolute_without_asterisk])]) 182 183dnl 184dnl grub_CHECK_START_SYMBOL checks if start is automatically defined by 185dnl the compiler. 186dnl Written by OKUJI Yoshinori 187AC_DEFUN([grub_CHECK_START_SYMBOL], 188[AC_REQUIRE([AC_PROG_CC]) 189AC_MSG_CHECKING([if start is defined by the compiler]) 190AC_CACHE_VAL(grub_cv_check_start_symbol, 191[AC_TRY_LINK([], [asm ("incl start")], 192 grub_cv_check_start_symbol=yes, 193 grub_cv_check_start_symbol=no)]) 194 195if test "x$grub_cv_check_start_symbol" = xyes; then 196 AC_DEFINE(HAVE_START_SYMBOL, 1, [Define if start is defined]) 197fi 198 199AC_MSG_RESULT([$grub_cv_check_start_symbol]) 200]) 201 202dnl 203dnl grub_CHECK_USCORE_START_SYMBOL checks if _start is automatically 204dnl defined by the compiler. 205dnl Written by OKUJI Yoshinori 206AC_DEFUN([grub_CHECK_USCORE_START_SYMBOL], 207[AC_REQUIRE([AC_PROG_CC]) 208AC_MSG_CHECKING([if _start is defined by the compiler]) 209AC_CACHE_VAL(grub_cv_check_uscore_start_symbol, 210[AC_TRY_LINK([], [asm ("incl _start")], 211 grub_cv_check_uscore_start_symbol=yes, 212 grub_cv_check_uscore_start_symbol=no)]) 213 214if test "x$grub_cv_check_uscore_start_symbol" = xyes; then 215 AC_DEFINE(HAVE_USCORE_START_SYMBOL, 1, [Define if _start is defined]) 216fi 217 218AC_MSG_RESULT([$grub_cv_check_uscore_start_symbol]) 219]) 220 221dnl 222dnl grub_CHECK_USCORE_USCORE_BSS_START_SYMBOL checks if __bss_start is 223dnl automatically defined by the compiler. 224dnl Written by Michael Hohmoth. 225AC_DEFUN([grub_CHECK_USCORE_USCORE_BSS_START_SYMBOL], 226[AC_REQUIRE([AC_PROG_CC]) 227AC_MSG_CHECKING([if __bss_start is defined by the compiler]) 228AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol, 229[AC_TRY_LINK([], [asm ("incl __bss_start")], 230 grub_cv_check_uscore_uscore_bss_start_symbol=yes, 231 grub_cv_check_uscore_uscore_bss_start_symbol=no)]) 232 233if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then 234 AC_DEFINE(HAVE_USCORE_USCORE_BSS_START_SYMBOL, 1, [Define if __bss_start is defined]) 235fi 236 237AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol]) 238]) 239 240dnl 241dnl grub_CHECK_EDATA_SYMBOL checks if edata is automatically defined by the 242dnl compiler. 243dnl Written by Michael Hohmuth. 244AC_DEFUN([grub_CHECK_EDATA_SYMBOL], 245[AC_REQUIRE([AC_PROG_CC]) 246AC_MSG_CHECKING([if edata is defined by the compiler]) 247AC_CACHE_VAL(grub_cv_check_edata_symbol, 248[AC_TRY_LINK([], [asm ("incl edata")], 249 grub_cv_check_edata_symbol=yes, 250 grub_cv_check_edata_symbol=no)]) 251 252if test "x$grub_cv_check_edata_symbol" = xyes; then 253 AC_DEFINE(HAVE_EDATA_SYMBOL, 1, [Define if edata is defined]) 254fi 255 256AC_MSG_RESULT([$grub_cv_check_edata_symbol]) 257]) 258 259dnl 260dnl grub_CHECK_USCORE_EDATA_SYMBOL checks if _edata is automatically 261dnl defined by the compiler. 262dnl Written by Michael Hohmuth. 263AC_DEFUN([grub_CHECK_USCORE_EDATA_SYMBOL], 264[AC_REQUIRE([AC_PROG_CC]) 265AC_MSG_CHECKING([if _edata is defined by the compiler]) 266AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol, 267[AC_TRY_LINK([], [asm ("incl _edata")], 268 grub_cv_check_uscore_edata_symbol=yes, 269 grub_cv_check_uscore_edata_symbol=no)]) 270 271if test "x$grub_cv_check_uscore_edata_symbol" = xyes; then 272 AC_DEFINE(HAVE_USCORE_EDATA_SYMBOL, 1, [Define if _edata is defined]) 273fi 274 275AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol]) 276]) 277 278dnl 279dnl grub_CHECK_END_SYMBOL checks if end is automatically defined by the 280dnl compiler. 281dnl Written by OKUJI Yoshinori 282AC_DEFUN([grub_CHECK_END_SYMBOL], 283[AC_REQUIRE([AC_PROG_CC]) 284AC_MSG_CHECKING([if end is defined by the compiler]) 285AC_CACHE_VAL(grub_cv_check_end_symbol, 286[AC_TRY_LINK([], [asm ("incl end")], 287 grub_cv_check_end_symbol=yes, 288 grub_cv_check_end_symbol=no)]) 289 290if test "x$grub_cv_check_end_symbol" = xyes; then 291 AC_DEFINE(HAVE_END_SYMBOL, 1, [Define if end is defined]) 292fi 293 294AC_MSG_RESULT([$grub_cv_check_end_symbol]) 295]) 296 297dnl 298dnl grub_CHECK_USCORE_END_SYMBOL checks if _end is automatically defined 299dnl by the compiler. 300dnl Written by OKUJI Yoshinori 301AC_DEFUN([grub_CHECK_USCORE_END_SYMBOL], 302[AC_REQUIRE([AC_PROG_CC]) 303AC_MSG_CHECKING([if _end is defined by the compiler]) 304AC_CACHE_VAL(grub_cv_check_uscore_end_symbol, 305[AC_TRY_LINK([], [asm ("incl _end")], 306 grub_cv_check_uscore_end_symbol=yes, 307 grub_cv_check_uscore_end_symbol=no)]) 308 309if test "x$grub_cv_check_uscore_end_symbol" = xyes; then 310 AC_DEFINE(HAVE_USCORE_END_SYMBOL, 1, [Define if end is defined]) 311fi 312 313AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol]) 314]) 315 316dnl grub_DEFINE_FILE(MACRO_NAME, FILE_NAME, DESCRIPTION) 317dnl grub_DEFINE_FILE defines a macro as the contents of a file safely. 318dnl Replace some escape sequences, because autoconf doesn't handle them 319dnl gracefully. 320dnl Written by OKUJI Yoshinori. 321AC_DEFUN([grub_DEFINE_FILE], 322[AC_REQUIRE([AC_PROG_CC]) 323# Because early versions of GNU sed 3.x are too buggy, use a C program 324# instead of shell commands. *sigh* 325cat >conftest.c <<\EOF 326#include <stdio.h> 327 328int 329main (void) 330{ 331 int c; 332 333 while ((c = getchar ()) != EOF) 334 { 335 switch (c) 336 { 337 case '\n': 338 fputs ("\\n", stdout); 339 break; 340 case '\r': 341 fputs ("\\r", stdout); 342 break; 343 case '\\': 344 fputs ("\\\\", stdout); 345 break; 346 case '"': 347 fputs ("\\\"", stdout); 348 break; 349 default: 350 putchar (c); 351 } 352 } 353 354 return 0; 355} 356EOF 357 358if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} conftest.c -o conftest]) && test -s conftest; then 359 grub_tmp_value=`./conftest < "[$2]"` 360else 361 AC_MSG_ERROR([${CC-cc} failed to produce an executable file]) 362fi 363 364AC_DEFINE_UNQUOTED([$1], "$grub_tmp_value", [$3]) 365rm -f conftest* 366]) 367