acinclude.m4 13.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
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;
}])


16
dnl Check whether target compiler is working
17
AC_DEFUN([grub_PROG_TARGET_CC],
18 19
[AC_MSG_CHECKING([whether target compiler is working])
AC_CACHE_VAL(grub_cv_prog_target_cc,
20
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
21
asm (".globl start; start:");
22 23
int main (void);
]], [[]])],
24 25
  		[grub_cv_prog_target_cc=yes],
		[grub_cv_prog_target_cc=no])
26 27 28 29 30 31 32 33 34
])
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
])


35
dnl grub_ASM_USCORE checks if C symbols get an underscore after
okuji's avatar
okuji committed
36 37 38
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.
39
AC_DEFUN([grub_ASM_USCORE],
okuji's avatar
okuji committed
40
[AC_REQUIRE([AC_PROG_CC])
41
AC_REQUIRE([AC_PROG_EGREP])
okuji's avatar
okuji committed
42
AC_MSG_CHECKING([if C symbols get an underscore after compilation])
43
AC_CACHE_VAL(grub_cv_asm_uscore,
okuji's avatar
okuji committed
44
[cat > conftest.c <<\EOF
45
int func (int *);
okuji's avatar
okuji committed
46 47 48 49 50 51 52 53 54 55 56 57 58 59
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

60
if $EGREP '(^|[^_[:alnum]])_func' conftest.s >/dev/null 2>&1; then
61
  HAVE_ASM_USCORE=1
62
  grub_cv_asm_uscore=yes
okuji's avatar
okuji committed
63
else
64
  HAVE_ASM_USCORE=0
65
  grub_cv_asm_uscore=no
okuji's avatar
okuji committed
66 67 68 69
fi

rm -f conftest*])

70
AC_MSG_RESULT([$grub_cv_asm_uscore])
okuji's avatar
okuji committed
71 72 73 74 75
])


dnl Some versions of `objcopy -O binary' vary their output depending
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,
okuji's avatar
okuji committed
79
[cat > conftest.c <<\EOF
80
void cmain (void);
okuji's avatar
okuji committed
81 82 83 84 85 86 87 88 89 90 91
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
92
grub_cv_prog_objcopy_absolute=yes
93
for link_addr in 0x2000 0x8000 0x7C00; do
BVK Chaitanya's avatar
BVK Chaitanya committed
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 :
okuji's avatar
okuji committed
95 96 97
  else
    AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
  fi
98
  if AC_TRY_COMMAND([${TARGET_OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then :
okuji's avatar
okuji committed
99
  else
100
    AC_MSG_ERROR([${TARGET_OBJCOPY-objcopy} cannot create binary files])
okuji's avatar
okuji committed
101 102 103 104
  fi
  if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then
    mv -f conftest conftest.old
  else
105
    grub_cv_prog_objcopy_absolute=no
okuji's avatar
okuji committed
106 107 108 109
    break
  fi
done
rm -f conftest*])
110
AC_MSG_RESULT([$grub_cv_prog_objcopy_absolute])
okuji's avatar
okuji committed
111

112 113
if test "x$grub_cv_prog_objcopy_absolute" = xno; then
  AC_MSG_ERROR([GRUB requires a working absolute objcopy; upgrade your binutils])
okuji's avatar
okuji committed
114 115 116 117
fi
])


118 119
dnl Supply --build-id=none to ld if building modules.
dnl This suppresses warnings from ld on some systems
120
AC_DEFUN([grub_PROG_LD_BUILD_ID_NONE],
121 122 123 124
[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"
125 126 127
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
	       [grub_cv_prog_ld_build_id_none=yes],
	       [grub_cv_prog_ld_build_id_none=no])
128 129 130 131 132
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
133
  TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,--build-id=none"
134 135 136
fi
])

137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
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 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"
])
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 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"
])
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
])

185

okuji's avatar
okuji committed
186 187 188 189 190 191 192 193 194 195 196 197 198
dnl Mass confusion!
dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
dnl instructions, but implicitly insert addr32 and data32 bytes so
dnl that the code works in real mode''.
dnl
dnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit
dnl instructions,'' which seems right.  This requires the programmer
dnl to explicitly insert addr32 and data32 instructions when they want
dnl them.
dnl
dnl We only support the newer versions, because the old versions cause
dnl major pain, by requiring manual assembly to get 16-bit instructions into
dnl asm files.
199
AC_DEFUN([grub_I386_ASM_ADDR32],
okuji's avatar
okuji committed
200
[AC_REQUIRE([AC_PROG_CC])
201
AC_REQUIRE([grub_I386_ASM_PREFIX_REQUIREMENT])
okuji's avatar
okuji committed
202
AC_MSG_CHECKING([for .code16 addr32 assembler support])
203
AC_CACHE_VAL(grub_cv_i386_asm_addr32,
okuji's avatar
okuji committed
204 205 206 207 208
[cat > conftest.s.in <<\EOF
	.code16
l1:	@ADDR32@	movb	%al, l1
EOF

209
if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
okuji's avatar
okuji committed
210 211 212 213 214
  sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s
else
  sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
fi

215
if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
216
  grub_cv_i386_asm_addr32=yes
okuji's avatar
okuji committed
217
else
218
  grub_cv_i386_asm_addr32=no
okuji's avatar
okuji committed
219 220 221 222
fi

rm -f conftest*])

223
AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
okuji's avatar
okuji committed
224

225 226
dnl check if our target compiler is apple cc
dnl because it requires numerous workarounds
227
AC_DEFUN([grub_apple_target_cc],
228 229 230 231 232 233 234 235 236 237 238 239
[AC_REQUIRE([AC_PROG_CC])
AC_MSG_CHECKING([whether our target compiler is apple cc])
AC_CACHE_VAL(grub_cv_apple_target_cc,
[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
  grub_cv_apple_target_cc=yes
else
  grub_cv_apple_target_cc=no
fi
])

AC_MSG_RESULT([$grub_cv_apple_target_cc])])

okuji's avatar
okuji committed
240 241 242 243

dnl Later versions of GAS requires that addr32 and data32 prefixes
dnl appear in the same lines as the instructions they modify, while
dnl earlier versions requires that they appear in separate lines.
244
AC_DEFUN([grub_I386_ASM_PREFIX_REQUIREMENT],
okuji's avatar
okuji committed
245 246 247
[AC_REQUIRE([AC_PROG_CC])
AC_MSG_CHECKING(dnl
[whether addr32 must be in the same line as the instruction])
248
AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
okuji's avatar
okuji committed
249 250 251 252 253
[cat > conftest.s <<\EOF
	.code16
l1:	addr32	movb	%al, l1
EOF

254
if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
255
  grub_cv_i386_asm_prefix_requirement=yes
okuji's avatar
okuji committed
256
else
257
  grub_cv_i386_asm_prefix_requirement=no
okuji's avatar
okuji committed
258 259 260 261
fi

rm -f conftest*])

262 263 264
if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
  grub_tmp_addr32="addr32"
  grub_tmp_data32="data32"
okuji's avatar
okuji committed
265
else
266 267
  grub_tmp_addr32="addr32;"
  grub_tmp_data32="data32;"
okuji's avatar
okuji committed
268 269
fi

270 271
ADDR32=$grub_tmp_addr32
DATA32=$grub_tmp_data32
okuji's avatar
okuji committed
272

273
AC_MSG_RESULT([$grub_cv_i386_asm_prefix_requirement])])
okuji's avatar
okuji committed
274 275 276 277


dnl Check what symbol is defined as a bss start symbol.
dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
278
AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
okuji's avatar
okuji committed
279 280
[AC_REQUIRE([AC_PROG_CC])
AC_MSG_CHECKING([if __bss_start is defined by the compiler])
281
AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
282 283 284 285
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
		[[asm ("incl __bss_start")]])],
		[grub_cv_check_uscore_uscore_bss_start_symbol=yes],
		[grub_cv_check_uscore_uscore_bss_start_symbol=no])])
okuji's avatar
okuji committed
286

287
AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
okuji's avatar
okuji committed
288 289

AC_MSG_CHECKING([if edata is defined by the compiler])
290
AC_CACHE_VAL(grub_cv_check_edata_symbol,
291 292 293 294
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
		[[asm ("incl edata")]])],
		[grub_cv_check_edata_symbol=yes],
		[grub_cv_check_edata_symbol=no])])
okuji's avatar
okuji committed
295

296
AC_MSG_RESULT([$grub_cv_check_edata_symbol])
okuji's avatar
okuji committed
297 298

AC_MSG_CHECKING([if _edata is defined by the compiler])
299
AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
300 301 302 303
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
		[[asm ("incl _edata")]])],
		[grub_cv_check_uscore_edata_symbol=yes],
		[grub_cv_check_uscore_edata_symbol=no])])
okuji's avatar
okuji committed
304

305
AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
okuji's avatar
okuji committed
306

307
if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
308
  BSS_START_SYMBOL=__bss_start
309
elif test "x$grub_cv_check_edata_symbol" = xyes; then
310
  BSS_START_SYMBOL=edata
311
elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
312
  BSS_START_SYMBOL=_edata
okuji's avatar
okuji committed
313 314 315 316 317 318 319
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.
320
AC_DEFUN([grub_CHECK_END_SYMBOL],
okuji's avatar
okuji committed
321 322
[AC_REQUIRE([AC_PROG_CC])
AC_MSG_CHECKING([if end is defined by the compiler])
323
AC_CACHE_VAL(grub_cv_check_end_symbol,
324 325 326 327
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
		[[asm ("incl end")]])],
		[grub_cv_check_end_symbol=yes],
		[grub_cv_check_end_symbol=no])])
okuji's avatar
okuji committed
328

329
AC_MSG_RESULT([$grub_cv_check_end_symbol])
okuji's avatar
okuji committed
330 331

AC_MSG_CHECKING([if _end is defined by the compiler])
332
AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
333 334 335 336
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
		[[asm ("incl _end")]])],
		[grub_cv_check_uscore_end_symbol=yes],
		[grub_cv_check_uscore_end_symbol=no])])
okuji's avatar
okuji committed
337

338
AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
okuji's avatar
okuji committed
339

340
if test "x$grub_cv_check_end_symbol" = xyes; then
341
  END_SYMBOL=end
342
elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
343
  END_SYMBOL=_end
okuji's avatar
okuji committed
344 345 346 347
else
  AC_MSG_ERROR([neither end nor _end is defined])
fi
])
348

349 350

dnl Check if the C compiler supports `-fstack-protector'.
351
AC_DEFUN([grub_CHECK_STACK_PROTECTOR],[
352 353 354 355
[# Smashing stack protector.
ssp_possible=yes]
AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector'])
# Is this a reliable test case?
356 357 358
AC_LANG_CONFTEST([AC_LANG_SOURCE([[
void foo (void) { volatile char a[8]; a[3]; }
]])])
359 360 361 362 363 364 365 366 367 368 369
[# `$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]
])
370 371

dnl Check if the C compiler supports `-mstack-arg-probe' (Cygwin).
372
AC_DEFUN([grub_CHECK_STACK_ARG_PROBE],[
373 374 375
[# Smashing stack arg probe.
sap_possible=yes]
AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
376 377 378
AC_LANG_CONFTEST([AC_LANG_SOURCE([[
void foo (void) { volatile char a[8]; a[3]; }
]])])
379
[if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then]
380 381 382 383 384 385 386 387
  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]
])
388 389

dnl Check if ln can handle directories properly (mingw).
390
AC_DEFUN([grub_CHECK_LINK_DIR],[
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
AC_MSG_CHECKING([whether ln 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 ; then]
  AC_MSG_RESULT([yes])
  [link_dir=yes
else
  link_dir=no]
  AC_MSG_RESULT([no])
[fi
rm -rf testdir]
])
406 407

dnl Check if the C compiler supports `-fPIE'.
408
AC_DEFUN([grub_CHECK_PIE],[
409 410 411 412
[# Position independent executable.
pie_possible=yes]
AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default])
# Is this a reliable test case?
413
AC_LANG_CONFTEST([AC_LANG_SOURCE([[
414 415 416 417 418 419 420
#ifdef __PIE__
int main() {
	return 0;
}
#else
#error NO __PIE__ DEFINED
#endif
421
]])])
422 423 424 425 426 427 428 429 430 431 432 433

[# `$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]
])
434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461

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]
])
462 463 464 465 466 467

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
])
Leif Lindholm's avatar
Leif Lindholm committed
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487

dnl Check if the C compiler supports `-mno-unaligned-access'.
AC_DEFUN([grub_CHECK_NO_UNALIGNED_ACCESS],[
[# foobar
nua_possible=yes]
AC_MSG_CHECKING([whether `$CC' supports `-mno-unaligned-access'])
AC_LANG_CONFTEST([AC_LANG_SOURCE([[
int main() {
	return 0;
}
]])])

[if eval "$ac_compile -S -mno-unaligned-access -o conftest.s" 2> /dev/null; then]
  AC_MSG_RESULT([yes])
  [rm -f conftest.s
else
  nua_possible=no]
  AC_MSG_RESULT([no])
[fi]
])