]> git.proxmox.com Git - grub2.git/blame - acinclude.m4
releasing package grub2 version 2.02~beta2-23
[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:");
37378f74
VS
22void __main (void);
23void __main (void) {}
26586d98 24int main (void);
25]], [[]])],
eb73121d 26 [grub_cv_prog_target_cc=yes],
27 [grub_cv_prog_target_cc=no])
f6130a12 28])
29AC_MSG_RESULT([$grub_cv_prog_target_cc])
30
31if test "x$grub_cv_prog_target_cc" = xno; then
32 AC_MSG_ERROR([cannot compile for the target])
33fi
34])
35
36
4b13b216 37dnl grub_ASM_USCORE checks if C symbols get an underscore after
6a161fa9 38dnl compiling to assembler.
39dnl Written by Pavel Roskin. Based on grub_ASM_EXT_C written by
40dnl Erich Boleyn and modified by Yoshinori K. Okuji.
fc9e5810 41AC_DEFUN([grub_ASM_USCORE],
6a161fa9 42[AC_REQUIRE([AC_PROG_CC])
9da94e05 43AC_REQUIRE([AC_PROG_EGREP])
6a161fa9 44AC_MSG_CHECKING([if C symbols get an underscore after compilation])
4b13b216 45AC_CACHE_VAL(grub_cv_asm_uscore,
6a161fa9 46[cat > conftest.c <<\EOF
63f745e8 47int func (int *);
6a161fa9 48int
49func (int *list)
50{
51 *list = 0;
52 return *list;
53}
54EOF
55
56if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
57 true
58else
59 AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
60fi
61
9da94e05 62if $EGREP '(^|[^_[:alnum]])_func' conftest.s >/dev/null 2>&1; then
742f9232 63 HAVE_ASM_USCORE=1
4b13b216 64 grub_cv_asm_uscore=yes
6a161fa9 65else
742f9232 66 HAVE_ASM_USCORE=0
4b13b216 67 grub_cv_asm_uscore=no
6a161fa9 68fi
69
70rm -f conftest*])
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],
fc97214f 79[AC_MSG_CHECKING([whether ${TARGET_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
2d465fb0 96 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 97 else
98 AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
99 fi
fc97214f 100 if AC_TRY_COMMAND([${TARGET_OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then :
6a161fa9 101 else
fc97214f 102 AC_MSG_ERROR([${TARGET_OBJCOPY-objcopy} cannot create binary files])
6a161fa9 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
20aea949
VS
139dnl Check nm
140AC_DEFUN([grub_PROG_NM_WORKS],
141[AC_MSG_CHECKING([whether nm works])
142AC_CACHE_VAL(grub_cv_prog_nm_works,
143[
144nm_works_tmp_dir="$(mktemp -d "./confXXXXXX")"
145AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
146$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_works_tmp_dir/ef"
5757a93e 147if $TARGET_NM "$nm_works_tmp_dir/ef" > /dev/null; then
20aea949
VS
148 grub_cv_prog_nm_works=yes
149else
150 grub_cv_prog_nm_minus_p=no
151fi
152rm "$nm_works_tmp_dir/ef"
153rmdir "$nm_works_tmp_dir"
154])
155AC_MSG_RESULT([$grub_cv_prog_nm_works])
156
157if test "x$grub_cv_prog_nm_works" != xyes; then
158 AC_MSG_ERROR([nm does not work])
159fi
160])
161
fc97214f
VS
162dnl Supply -P to nm
163AC_DEFUN([grub_PROG_NM_MINUS_P],
164[AC_MSG_CHECKING([whether nm accepts -P])
165AC_CACHE_VAL(grub_cv_prog_nm_minus_p,
166[
167nm_minus_p_tmp_dir="$(mktemp -d "./confXXXXXX")"
168AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
20aea949 169$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_minus_p_tmp_dir/ef"
fc97214f
VS
170if $TARGET_NM -P "$nm_minus_p_tmp_dir/ef" 2>&1 > /dev/null; then
171 grub_cv_prog_nm_minus_p=yes
172else
173 grub_cv_prog_nm_minus_p=no
174fi
175rm "$nm_minus_p_tmp_dir/ef"
20aea949 176rmdir "$nm_minus_p_tmp_dir"
fc97214f
VS
177])
178AC_MSG_RESULT([$grub_cv_prog_nm_minus_p])
179
180if test "x$grub_cv_prog_nm_minus_p" = xyes; then
181 TARGET_NMFLAGS_MINUS_P="-P"
182else
183 TARGET_NMFLAGS_MINUS_P=
184fi
185])
186
187dnl Supply --defined-only to nm
188AC_DEFUN([grub_PROG_NM_DEFINED_ONLY],
189[AC_MSG_CHECKING([whether nm accepts --defined-only])
190AC_CACHE_VAL(grub_cv_prog_nm_defined_only,
191[
192nm_defined_only_tmp_dir="$(mktemp -d "./confXXXXXX")"
193AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
20aea949 194$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_defined_only_tmp_dir/ef"
fc97214f
VS
195if $TARGET_NM --defined-only "$nm_defined_only_tmp_dir/ef" 2>&1 > /dev/null; then
196 grub_cv_prog_nm_defined_only=yes
197else
198 grub_cv_prog_nm_defined_only=no
199fi
200rm "$nm_defined_only_tmp_dir/ef"
20aea949 201rmdir "$nm_defined_only_tmp_dir"
fc97214f
VS
202])
203AC_MSG_RESULT([$grub_cv_prog_nm_defined_only])
204
205if test "x$grub_cv_prog_nm_defined_only" = xyes; then
206 TARGET_NMFLAGS_DEFINED_ONLY=--defined-only
207else
208 TARGET_NMFLAGS_DEFINED_ONLY=
209fi
210])
211
cb71ba20 212
6a161fa9 213dnl Mass confusion!
214dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
215dnl instructions, but implicitly insert addr32 and data32 bytes so
216dnl that the code works in real mode''.
217dnl
218dnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit
219dnl instructions,'' which seems right. This requires the programmer
220dnl to explicitly insert addr32 and data32 instructions when they want
221dnl them.
222dnl
223dnl We only support the newer versions, because the old versions cause
224dnl major pain, by requiring manual assembly to get 16-bit instructions into
225dnl asm files.
fc9e5810 226AC_DEFUN([grub_I386_ASM_ADDR32],
6a161fa9 227[AC_REQUIRE([AC_PROG_CC])
4b13b216 228AC_REQUIRE([grub_I386_ASM_PREFIX_REQUIREMENT])
6a161fa9 229AC_MSG_CHECKING([for .code16 addr32 assembler support])
4b13b216 230AC_CACHE_VAL(grub_cv_i386_asm_addr32,
6a161fa9 231[cat > conftest.s.in <<\EOF
232 .code16
233l1: @ADDR32@ movb %al, l1
234EOF
235
4b13b216 236if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
6a161fa9 237 sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s
238else
239 sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
240fi
241
05f3a0d7 242if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
4b13b216 243 grub_cv_i386_asm_addr32=yes
6a161fa9 244else
4b13b216 245 grub_cv_i386_asm_addr32=no
6a161fa9 246fi
247
248rm -f conftest*])
249
4b13b216 250AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
6a161fa9 251
6a161fa9 252dnl Later versions of GAS requires that addr32 and data32 prefixes
253dnl appear in the same lines as the instructions they modify, while
254dnl earlier versions requires that they appear in separate lines.
fc9e5810 255AC_DEFUN([grub_I386_ASM_PREFIX_REQUIREMENT],
6a161fa9 256[AC_REQUIRE([AC_PROG_CC])
257AC_MSG_CHECKING(dnl
258[whether addr32 must be in the same line as the instruction])
4b13b216 259AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
6a161fa9 260[cat > conftest.s <<\EOF
261 .code16
262l1: addr32 movb %al, l1
263EOF
264
05f3a0d7 265if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
4b13b216 266 grub_cv_i386_asm_prefix_requirement=yes
6a161fa9 267else
4b13b216 268 grub_cv_i386_asm_prefix_requirement=no
6a161fa9 269fi
270
271rm -f conftest*])
272
4b13b216 273if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
274 grub_tmp_addr32="addr32"
275 grub_tmp_data32="data32"
6a161fa9 276else
4b13b216 277 grub_tmp_addr32="addr32;"
278 grub_tmp_data32="data32;"
6a161fa9 279fi
280
742f9232
VS
281ADDR32=$grub_tmp_addr32
282DATA32=$grub_tmp_data32
6a161fa9 283
4b13b216 284AC_MSG_RESULT([$grub_cv_i386_asm_prefix_requirement])])
6a161fa9 285
286
6a161fa9 287dnl Check what symbol is defined as a bss start symbol.
288dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
fc9e5810 289AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
6a161fa9 290[AC_REQUIRE([AC_PROG_CC])
291AC_MSG_CHECKING([if __bss_start is defined by the compiler])
4b13b216 292AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
37378f74
VS
293[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
294asm (".globl start; start:");
295void __main (void);
296void __main (void) {}
297int main (void);
298]],
eb73121d 299 [[asm ("incl __bss_start")]])],
300 [grub_cv_check_uscore_uscore_bss_start_symbol=yes],
301 [grub_cv_check_uscore_uscore_bss_start_symbol=no])])
6a161fa9 302
4b13b216 303AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
6a161fa9 304
305AC_MSG_CHECKING([if edata is defined by the compiler])
4b13b216 306AC_CACHE_VAL(grub_cv_check_edata_symbol,
37378f74
VS
307[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
308asm (".globl start; start:");
309void __main (void);
310void __main (void) {}
311int main (void);]],
eb73121d 312 [[asm ("incl edata")]])],
313 [grub_cv_check_edata_symbol=yes],
314 [grub_cv_check_edata_symbol=no])])
6a161fa9 315
4b13b216 316AC_MSG_RESULT([$grub_cv_check_edata_symbol])
6a161fa9 317
318AC_MSG_CHECKING([if _edata is defined by the compiler])
4b13b216 319AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
37378f74
VS
320[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
321asm (".globl start; start:");
322void __main (void);
323void __main (void) {}
324int main (void);]],
eb73121d 325 [[asm ("incl _edata")]])],
326 [grub_cv_check_uscore_edata_symbol=yes],
327 [grub_cv_check_uscore_edata_symbol=no])])
6a161fa9 328
4b13b216 329AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
6a161fa9 330
4b13b216 331if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
742f9232 332 BSS_START_SYMBOL=__bss_start
4b13b216 333elif test "x$grub_cv_check_edata_symbol" = xyes; then
742f9232 334 BSS_START_SYMBOL=edata
4b13b216 335elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
742f9232 336 BSS_START_SYMBOL=_edata
6a161fa9 337else
338 AC_MSG_ERROR([none of __bss_start, edata or _edata is defined])
339fi
340])
341
342dnl Check what symbol is defined as an end symbol.
343dnl Written by Yoshinori K. Okuji.
fc9e5810 344AC_DEFUN([grub_CHECK_END_SYMBOL],
6a161fa9 345[AC_REQUIRE([AC_PROG_CC])
346AC_MSG_CHECKING([if end is defined by the compiler])
4b13b216 347AC_CACHE_VAL(grub_cv_check_end_symbol,
37378f74
VS
348[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
349asm (".globl start; start:");
350void __main (void);
351void __main (void) {}
352int main (void);]],
eb73121d 353 [[asm ("incl end")]])],
354 [grub_cv_check_end_symbol=yes],
355 [grub_cv_check_end_symbol=no])])
6a161fa9 356
4b13b216 357AC_MSG_RESULT([$grub_cv_check_end_symbol])
6a161fa9 358
359AC_MSG_CHECKING([if _end is defined by the compiler])
4b13b216 360AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
37378f74
VS
361[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
362asm (".globl start; start:");
363void __main (void);
364void __main (void) {}
365int main (void);]],
eb73121d 366 [[asm ("incl _end")]])],
367 [grub_cv_check_uscore_end_symbol=yes],
368 [grub_cv_check_uscore_end_symbol=no])])
6a161fa9 369
4b13b216 370AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
6a161fa9 371
4b13b216 372if test "x$grub_cv_check_end_symbol" = xyes; then
742f9232 373 END_SYMBOL=end
4b13b216 374elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
742f9232 375 END_SYMBOL=_end
6a161fa9 376else
377 AC_MSG_ERROR([neither end nor _end is defined])
378fi
379])
5aded270 380
baa2a121 381\f
382dnl Check if the C compiler supports `-fstack-protector'.
fc9e5810 383AC_DEFUN([grub_CHECK_STACK_PROTECTOR],[
baa2a121 384[# Smashing stack protector.
385ssp_possible=yes]
386AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector'])
387# Is this a reliable test case?
ab178c08
SJ
388AC_LANG_CONFTEST([AC_LANG_SOURCE([[
389void foo (void) { volatile char a[8]; a[3]; }
390]])])
baa2a121 391[# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
392# `ac_compile' like this correct, after all?
393if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then]
394 AC_MSG_RESULT([yes])
395 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
396 rm -f conftest.s
397else
398 ssp_possible=no]
399 AC_MSG_RESULT([no])
400[fi]
401])
2a8a80e4 402
403dnl Check if the C compiler supports `-mstack-arg-probe' (Cygwin).
fc9e5810 404AC_DEFUN([grub_CHECK_STACK_ARG_PROBE],[
2a8a80e4 405[# Smashing stack arg probe.
406sap_possible=yes]
407AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
ab178c08
SJ
408AC_LANG_CONFTEST([AC_LANG_SOURCE([[
409void foo (void) { volatile char a[8]; a[3]; }
410]])])
b35ec299 411[if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then]
2a8a80e4 412 AC_MSG_RESULT([yes])
413 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
414 rm -f conftest.s
415else
416 sap_possible=no]
417 AC_MSG_RESULT([no])
418[fi]
419])
1f4147aa 420
421dnl Check if ln can handle directories properly (mingw).
fc9e5810 422AC_DEFUN([grub_CHECK_LINK_DIR],[
1f4147aa 423AC_MSG_CHECKING([whether ln can handle directories properly])
424[mkdir testdir 2>/dev/null
425case $srcdir in
426[\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
427 *) reldir=../$srcdir/include/grub/util ;;
428esac
429if ln -s $reldir testdir/util 2>/dev/null ; then]
430 AC_MSG_RESULT([yes])
431 [link_dir=yes
432else
433 link_dir=no]
434 AC_MSG_RESULT([no])
435[fi
436rm -rf testdir]
437])
93a81088 438
439dnl Check if the C compiler supports `-fPIE'.
fc9e5810 440AC_DEFUN([grub_CHECK_PIE],[
93a81088 441[# Position independent executable.
442pie_possible=yes]
443AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default])
444# Is this a reliable test case?
ab178c08 445AC_LANG_CONFTEST([AC_LANG_SOURCE([[
93a81088 446#ifdef __PIE__
447int main() {
448 return 0;
449}
450#else
451#error NO __PIE__ DEFINED
452#endif
ab178c08 453]])])
93a81088 454
455[# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
456# `ac_compile' like this correct, after all?
457if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
458 AC_MSG_RESULT([yes])
459 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
460 rm -f conftest.s
461else
462 pie_possible=no]
463 AC_MSG_RESULT([no])
464[fi]
465])
7bd8b0c7
VS
466
467dnl Check if the C compiler supports `-fPIC'.
468AC_DEFUN([grub_CHECK_PIC],[
469[# Position independent executable.
470pic_possible=yes]
471AC_MSG_CHECKING([whether `$CC' has `-fPIC' as default])
472# Is this a reliable test case?
473AC_LANG_CONFTEST([AC_LANG_SOURCE([[
474#ifdef __PIC__
475int main() {
476 return 0;
477}
478#else
479#error NO __PIC__ DEFINED
480#endif
481]])])
482
483[# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
484# `ac_compile' like this correct, after all?
485if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
486 AC_MSG_RESULT([yes])
487 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
488 rm -f conftest.s
489else
490 pic_possible=no]
491 AC_MSG_RESULT([no])
492[fi]
493])
fd49ceb3
CW
494
495dnl Create an output variable with the transformed name of a GRUB utility
496dnl program.
497AC_DEFUN([grub_TRANSFORM],[dnl
498AC_SUBST(AS_TR_SH([$1]), [`AS_ECHO([$1]) | sed "$program_transform_name"`])dnl
499])