]> git.proxmox.com Git - grub2.git/blame - acinclude.m4
2010-03-06 Vladimir Serbinenko <phcoder@gmail.com>
[grub2.git] / acinclude.m4
CommitLineData
63f745e8 1dnl Redefine AC_LANG_PROGRAM with a "-Wstrict-prototypes -Werror"-friendly
2dnl version. Patch submitted to bug-autoconf in 2009-09-16.
3m4_define([AC_LANG_PROGRAM(C)],
4[$1
5int
6main (void)
7{
8dnl Do *not* indent the following line: there may be CPP directives.
9dnl Don't move the `;' right after for the same reason.
10$2
11 ;
12 return 0;
13}])
14
15
f6130a12 16dnl Check whether target compiler is working
fc9e5810 17AC_DEFUN([grub_PROG_TARGET_CC],
f6130a12 18[AC_MSG_CHECKING([whether target compiler is working])
19AC_CACHE_VAL(grub_cv_prog_target_cc,
26586d98 20[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
b2cab848 21asm (".globl start; start:");
26586d98 22int main (void);
23]], [[]])],
eb73121d 24 [grub_cv_prog_target_cc=yes],
25 [grub_cv_prog_target_cc=no])
f6130a12 26])
27AC_MSG_RESULT([$grub_cv_prog_target_cc])
28
29if test "x$grub_cv_prog_target_cc" = xno; then
30 AC_MSG_ERROR([cannot compile for the target])
31fi
32])
33
34
4b13b216 35dnl grub_ASM_USCORE checks if C symbols get an underscore after
6a161fa9 36dnl compiling to assembler.
37dnl Written by Pavel Roskin. Based on grub_ASM_EXT_C written by
38dnl Erich Boleyn and modified by Yoshinori K. Okuji.
fc9e5810 39AC_DEFUN([grub_ASM_USCORE],
6a161fa9 40[AC_REQUIRE([AC_PROG_CC])
41AC_MSG_CHECKING([if C symbols get an underscore after compilation])
4b13b216 42AC_CACHE_VAL(grub_cv_asm_uscore,
6a161fa9 43[cat > conftest.c <<\EOF
63f745e8 44int func (int *);
6a161fa9 45int
46func (int *list)
47{
48 *list = 0;
49 return *list;
50}
51EOF
52
53if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
54 true
55else
56 AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
57fi
58
59if grep _func conftest.s >/dev/null 2>&1; then
4b13b216 60 grub_cv_asm_uscore=yes
6a161fa9 61else
4b13b216 62 grub_cv_asm_uscore=no
6a161fa9 63fi
64
65rm -f conftest*])
66
4b13b216 67if test "x$grub_cv_asm_uscore" = xyes; then
68 AC_DEFINE_UNQUOTED([HAVE_ASM_USCORE], $grub_cv_asm_uscore,
6a161fa9 69 [Define if C symbols get an underscore after compilation])
70fi
71
4b13b216 72AC_MSG_RESULT([$grub_cv_asm_uscore])
6a161fa9 73])
74
75
76dnl Some versions of `objcopy -O binary' vary their output depending
77dnl on the link address.
fc9e5810 78AC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE],
6a161fa9 79[AC_MSG_CHECKING([whether ${OBJCOPY} works for absolute addresses])
4b13b216 80AC_CACHE_VAL(grub_cv_prog_objcopy_absolute,
6a161fa9 81[cat > conftest.c <<\EOF
63f745e8 82void cmain (void);
6a161fa9 83void
84cmain (void)
85{
86 *((int *) 0x1000) = 2;
87}
88EOF
89
90if AC_TRY_EVAL(ac_compile) && test -s conftest.o; then :
91else
92 AC_MSG_ERROR([${CC-cc} cannot compile C source code])
93fi
4b13b216 94grub_cv_prog_objcopy_absolute=yes
c926e1d5 95for link_addr in 0x2000 0x8000 0x7C00; do
2a8a80e4 96 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec]); then :
6a161fa9 97 else
98 AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
99 fi
1977517d 100 if AC_TRY_COMMAND([${OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then :
6a161fa9 101 else
102 AC_MSG_ERROR([${OBJCOPY-objcopy} cannot create binary files])
103 fi
104 if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then
105 mv -f conftest conftest.old
106 else
4b13b216 107 grub_cv_prog_objcopy_absolute=no
6a161fa9 108 break
109 fi
110done
111rm -f conftest*])
4b13b216 112AC_MSG_RESULT([$grub_cv_prog_objcopy_absolute])
6a161fa9 113
4b13b216 114if test "x$grub_cv_prog_objcopy_absolute" = xno; then
115 AC_MSG_ERROR([GRUB requires a working absolute objcopy; upgrade your binutils])
6a161fa9 116fi
117])
118
119
cb71ba20 120dnl Supply --build-id=none to ld if building modules.
121dnl This suppresses warnings from ld on some systems
fc9e5810 122AC_DEFUN([grub_PROG_LD_BUILD_ID_NONE],
cb71ba20 123[AC_MSG_CHECKING([whether linker accepts --build-id=none])
124AC_CACHE_VAL(grub_cv_prog_ld_build_id_none,
125[save_LDFLAGS="$LDFLAGS"
126LDFLAGS="$LDFLAGS -Wl,--build-id=none"
eb73121d 127AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
128 [grub_cv_prog_ld_build_id_none=yes],
129 [grub_cv_prog_ld_build_id_none=no])
cb71ba20 130LDFLAGS="$save_LDFLAGS"
131])
132AC_MSG_RESULT([$grub_cv_prog_ld_build_id_none])
133
134if test "x$grub_cv_prog_ld_build_id_none" = xyes; then
5ec9740b 135 TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,--build-id=none"
cb71ba20 136fi
137])
138
139
6a161fa9 140dnl Mass confusion!
141dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
142dnl instructions, but implicitly insert addr32 and data32 bytes so
143dnl that the code works in real mode''.
144dnl
145dnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit
146dnl instructions,'' which seems right. This requires the programmer
147dnl to explicitly insert addr32 and data32 instructions when they want
148dnl them.
149dnl
150dnl We only support the newer versions, because the old versions cause
151dnl major pain, by requiring manual assembly to get 16-bit instructions into
152dnl asm files.
fc9e5810 153AC_DEFUN([grub_I386_ASM_ADDR32],
6a161fa9 154[AC_REQUIRE([AC_PROG_CC])
4b13b216 155AC_REQUIRE([grub_I386_ASM_PREFIX_REQUIREMENT])
6a161fa9 156AC_MSG_CHECKING([for .code16 addr32 assembler support])
4b13b216 157AC_CACHE_VAL(grub_cv_i386_asm_addr32,
6a161fa9 158[cat > conftest.s.in <<\EOF
159 .code16
160l1: @ADDR32@ movb %al, l1
161EOF
162
4b13b216 163if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
6a161fa9 164 sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s
165else
166 sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
167fi
168
169if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
4b13b216 170 grub_cv_i386_asm_addr32=yes
6a161fa9 171else
4b13b216 172 grub_cv_i386_asm_addr32=no
6a161fa9 173fi
174
175rm -f conftest*])
176
4b13b216 177AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
6a161fa9 178
2b167a72 179dnl check if our compiler is apple cc
180dnl because it requires numerous workarounds
fc9e5810 181AC_DEFUN([grub_apple_cc],
2b167a72 182[AC_REQUIRE([AC_PROG_CC])
183AC_MSG_CHECKING([whether our compiler is apple cc])
184AC_CACHE_VAL(grub_cv_apple_cc,
185[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
186 grub_cv_apple_cc=yes
187else
188 grub_cv_apple_cc=no
189fi
190])
191
192AC_MSG_RESULT([$grub_cv_apple_cc])])
193
194dnl check if our target compiler is apple cc
195dnl because it requires numerous workarounds
fc9e5810 196AC_DEFUN([grub_apple_target_cc],
2b167a72 197[AC_REQUIRE([AC_PROG_CC])
198AC_MSG_CHECKING([whether our target compiler is apple cc])
199AC_CACHE_VAL(grub_cv_apple_target_cc,
200[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
201 grub_cv_apple_target_cc=yes
202else
203 grub_cv_apple_target_cc=no
204fi
205])
206
207AC_MSG_RESULT([$grub_cv_apple_target_cc])])
208
6a161fa9 209
210dnl Later versions of GAS requires that addr32 and data32 prefixes
211dnl appear in the same lines as the instructions they modify, while
212dnl earlier versions requires that they appear in separate lines.
fc9e5810 213AC_DEFUN([grub_I386_ASM_PREFIX_REQUIREMENT],
6a161fa9 214[AC_REQUIRE([AC_PROG_CC])
215AC_MSG_CHECKING(dnl
216[whether addr32 must be in the same line as the instruction])
4b13b216 217AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
6a161fa9 218[cat > conftest.s <<\EOF
219 .code16
220l1: addr32 movb %al, l1
221EOF
222
223if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
4b13b216 224 grub_cv_i386_asm_prefix_requirement=yes
6a161fa9 225else
4b13b216 226 grub_cv_i386_asm_prefix_requirement=no
6a161fa9 227fi
228
229rm -f conftest*])
230
4b13b216 231if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
232 grub_tmp_addr32="addr32"
233 grub_tmp_data32="data32"
6a161fa9 234else
4b13b216 235 grub_tmp_addr32="addr32;"
236 grub_tmp_data32="data32;"
6a161fa9 237fi
238
4b13b216 239AC_DEFINE_UNQUOTED([ADDR32], $grub_tmp_addr32,
6a161fa9 240 [Define it to \"addr32\" or \"addr32;\" to make GAS happy])
4b13b216 241AC_DEFINE_UNQUOTED([DATA32], $grub_tmp_data32,
6a161fa9 242 [Define it to \"data32\" or \"data32;\" to make GAS happy])
243
4b13b216 244AC_MSG_RESULT([$grub_cv_i386_asm_prefix_requirement])])
6a161fa9 245
246
247dnl Older versions of GAS require that absolute indirect calls/jumps are
248dnl not prefixed with `*', while later versions warn if not prefixed.
fc9e5810 249AC_DEFUN([grub_I386_ASM_ABSOLUTE_WITHOUT_ASTERISK],
6a161fa9 250[AC_REQUIRE([AC_PROG_CC])
251AC_MSG_CHECKING(dnl
252[whether an absolute indirect call/jump must not be prefixed with an asterisk])
4b13b216 253AC_CACHE_VAL(grub_cv_i386_asm_absolute_without_asterisk,
6a161fa9 254[cat > conftest.s <<\EOF
b39f9d20 255 lcall *(offset)
6a161fa9 256offset:
257 .long 0
258 .word 0
259EOF
260
261if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
4b13b216 262 grub_cv_i386_asm_absolute_without_asterisk=no
6a161fa9 263else
4b13b216 264 grub_cv_i386_asm_absolute_without_asterisk=yes
6a161fa9 265fi
266
267rm -f conftest*])
268
4b13b216 269if test "x$grub_cv_i386_asm_absolute_without_asterisk" = xyes; then
6a161fa9 270 AC_DEFINE([ABSOLUTE_WITHOUT_ASTERISK], 1,
271 [Define it if GAS requires that absolute indirect calls/jumps are not prefixed with an asterisk])
272fi
273
4b13b216 274AC_MSG_RESULT([$grub_cv_i386_asm_absolute_without_asterisk])])
6a161fa9 275
276
6a161fa9 277dnl Check what symbol is defined as a bss start symbol.
278dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
fc9e5810 279AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
6a161fa9 280[AC_REQUIRE([AC_PROG_CC])
281AC_MSG_CHECKING([if __bss_start is defined by the compiler])
4b13b216 282AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
eb73121d 283[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
284 [[asm ("incl __bss_start")]])],
285 [grub_cv_check_uscore_uscore_bss_start_symbol=yes],
286 [grub_cv_check_uscore_uscore_bss_start_symbol=no])])
6a161fa9 287
4b13b216 288AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
6a161fa9 289
290AC_MSG_CHECKING([if edata is defined by the compiler])
4b13b216 291AC_CACHE_VAL(grub_cv_check_edata_symbol,
eb73121d 292[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
293 [[asm ("incl edata")]])],
294 [grub_cv_check_edata_symbol=yes],
295 [grub_cv_check_edata_symbol=no])])
6a161fa9 296
4b13b216 297AC_MSG_RESULT([$grub_cv_check_edata_symbol])
6a161fa9 298
299AC_MSG_CHECKING([if _edata is defined by the compiler])
4b13b216 300AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
eb73121d 301[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
302 [[asm ("incl _edata")]])],
303 [grub_cv_check_uscore_edata_symbol=yes],
304 [grub_cv_check_uscore_edata_symbol=no])])
6a161fa9 305
4b13b216 306AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
6a161fa9 307
308AH_TEMPLATE([BSS_START_SYMBOL], [Define it to one of __bss_start, edata and _edata])
309
4b13b216 310if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
6a161fa9 311 AC_DEFINE([BSS_START_SYMBOL], [__bss_start])
4b13b216 312elif test "x$grub_cv_check_edata_symbol" = xyes; then
6a161fa9 313 AC_DEFINE([BSS_START_SYMBOL], [edata])
4b13b216 314elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
6a161fa9 315 AC_DEFINE([BSS_START_SYMBOL], [_edata])
316else
317 AC_MSG_ERROR([none of __bss_start, edata or _edata is defined])
318fi
319])
320
321dnl Check what symbol is defined as an end symbol.
322dnl Written by Yoshinori K. Okuji.
fc9e5810 323AC_DEFUN([grub_CHECK_END_SYMBOL],
6a161fa9 324[AC_REQUIRE([AC_PROG_CC])
325AC_MSG_CHECKING([if end is defined by the compiler])
4b13b216 326AC_CACHE_VAL(grub_cv_check_end_symbol,
eb73121d 327[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
328 [[asm ("incl end")]])],
329 [grub_cv_check_end_symbol=yes],
330 [grub_cv_check_end_symbol=no])])
6a161fa9 331
4b13b216 332AC_MSG_RESULT([$grub_cv_check_end_symbol])
6a161fa9 333
334AC_MSG_CHECKING([if _end is defined by the compiler])
4b13b216 335AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
eb73121d 336[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
337 [[asm ("incl _end")]])],
338 [grub_cv_check_uscore_end_symbol=yes],
339 [grub_cv_check_uscore_end_symbol=no])])
6a161fa9 340
4b13b216 341AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
6a161fa9 342
343AH_TEMPLATE([END_SYMBOL], [Define it to either end or _end])
344
4b13b216 345if test "x$grub_cv_check_end_symbol" = xyes; then
6a161fa9 346 AC_DEFINE([END_SYMBOL], [end])
4b13b216 347elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
6a161fa9 348 AC_DEFINE([END_SYMBOL], [_end])
349else
350 AC_MSG_ERROR([neither end nor _end is defined])
351fi
352])
5aded270 353
9035dce4 354dnl Check if the C compiler generates calls to `__enable_execute_stack()'.
fc9e5810 355AC_DEFUN([grub_CHECK_ENABLE_EXECUTE_STACK],[
9035dce4 356AC_MSG_CHECKING([whether `$CC' generates calls to `__enable_execute_stack()'])
357AC_LANG_CONFTEST([[
358void f (int (*p) (void));
359void g (int i)
360{
361 int nestedfunc (void) { return i; }
362 f (nestedfunc);
363}
364]])
365if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
366 true
367else
368 AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
369fi
370if grep __enable_execute_stack conftest.s >/dev/null 2>&1; then
371 AC_DEFINE([NEED_ENABLE_EXECUTE_STACK], 1,
372 [Define to 1 if GCC generates calls to __enable_execute_stack()])
373 AC_MSG_RESULT([yes])
374else
375 AC_MSG_RESULT([no])
376fi
377rm -f conftest*
378])
379
baa2a121 380\f
381dnl Check if the C compiler supports `-fstack-protector'.
fc9e5810 382AC_DEFUN([grub_CHECK_STACK_PROTECTOR],[
baa2a121 383[# Smashing stack protector.
384ssp_possible=yes]
385AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector'])
386# Is this a reliable test case?
387AC_LANG_CONFTEST([[void foo (void) { volatile char a[8]; a[3]; }]])
388[# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
389# `ac_compile' like this correct, after all?
390if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then]
391 AC_MSG_RESULT([yes])
392 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
393 rm -f conftest.s
394else
395 ssp_possible=no]
396 AC_MSG_RESULT([no])
397[fi]
398])
2a8a80e4 399
400dnl Check if the C compiler supports `-mstack-arg-probe' (Cygwin).
fc9e5810 401AC_DEFUN([grub_CHECK_STACK_ARG_PROBE],[
2a8a80e4 402[# Smashing stack arg probe.
403sap_possible=yes]
404AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
405AC_LANG_CONFTEST([[void foo (void) { volatile char a[8]; a[3]; }]])
406[if eval "$ac_compile -S -mstack-arg-probe -o conftest.s" 2> /dev/null; then]
407 AC_MSG_RESULT([yes])
408 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
409 rm -f conftest.s
410else
411 sap_possible=no]
412 AC_MSG_RESULT([no])
413[fi]
414])
1f4147aa 415
416dnl Check if ln can handle directories properly (mingw).
fc9e5810 417AC_DEFUN([grub_CHECK_LINK_DIR],[
1f4147aa 418AC_MSG_CHECKING([whether ln can handle directories properly])
419[mkdir testdir 2>/dev/null
420case $srcdir in
421[\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
422 *) reldir=../$srcdir/include/grub/util ;;
423esac
424if ln -s $reldir testdir/util 2>/dev/null ; then]
425 AC_MSG_RESULT([yes])
426 [link_dir=yes
427else
428 link_dir=no]
429 AC_MSG_RESULT([no])
430[fi
431rm -rf testdir]
432])
93a81088 433
434dnl Check if the C compiler supports `-fPIE'.
fc9e5810 435AC_DEFUN([grub_CHECK_PIE],[
93a81088 436[# Position independent executable.
437pie_possible=yes]
438AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default])
439# Is this a reliable test case?
440AC_LANG_CONFTEST([[
441#ifdef __PIE__
442int main() {
443 return 0;
444}
445#else
446#error NO __PIE__ DEFINED
447#endif
448]])
449
450[# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
451# `ac_compile' like this correct, after all?
452if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
453 AC_MSG_RESULT([yes])
454 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
455 rm -f conftest.s
456else
457 pie_possible=no]
458 AC_MSG_RESULT([no])
459[fi]
460])