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