ieee1275: split up grub_machine_get_bootlocation
[grub.git] / acinclude.m4
1 dnl Redefine AC_LANG_PROGRAM with a "-Wstrict-prototypes -Werror"-friendly
2 dnl version.  Patch submitted to bug-autoconf in 2009-09-16.
3 m4_define([AC_LANG_PROGRAM(C)],
4 [$1
5 int
6 main (void)
7 {
8 dnl Do *not* indent the following line: there may be CPP directives.
9 dnl Don't move the `;' right after for the same reason.
10 $2
11   ;
12   return 0;
13 }])
14
15
16 dnl Check whether target compiler is working
17 AC_DEFUN([grub_PROG_TARGET_CC],
18 [AC_MSG_CHECKING([whether target compiler is working])
19 AC_CACHE_VAL(grub_cv_prog_target_cc,
20 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
21 asm (".globl start; start:");
22 void __main (void);
23 void __main (void) {}
24 int main (void);
25 ]], [[]])],
26                 [grub_cv_prog_target_cc=yes],
27                 [grub_cv_prog_target_cc=no])
28 ])
29 AC_MSG_RESULT([$grub_cv_prog_target_cc])
30
31 if test "x$grub_cv_prog_target_cc" = xno; then
32   AC_MSG_ERROR([cannot compile for the target])
33 fi
34 ])
35
36
37 dnl grub_ASM_USCORE checks if C symbols get an underscore after
38 dnl compiling to assembler.
39 dnl Written by Pavel Roskin. Based on grub_ASM_EXT_C written by
40 dnl Erich Boleyn and modified by Yoshinori K. Okuji.
41 AC_DEFUN([grub_ASM_USCORE],
42 [AC_REQUIRE([AC_PROG_CC])
43 AC_REQUIRE([AC_PROG_EGREP])
44 AC_MSG_CHECKING([if C symbols get an underscore after compilation])
45 AC_CACHE_VAL(grub_cv_asm_uscore,
46 [cat > conftest.c <<\EOF
47 int func (int *);
48 int
49 func (int *list)
50 {
51   *list = 0;
52   return *list;
53 }
54 EOF
55
56 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
57   true
58 else
59   AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
60 fi
61
62 if $EGREP '(^|[^_[:alnum]])_func' conftest.s >/dev/null 2>&1; then
63   HAVE_ASM_USCORE=1
64   grub_cv_asm_uscore=yes
65 else
66   HAVE_ASM_USCORE=0
67   grub_cv_asm_uscore=no
68 fi
69
70 rm -f conftest*])
71
72 AC_MSG_RESULT([$grub_cv_asm_uscore])
73 ])
74
75
76 dnl Some versions of `objcopy -O binary' vary their output depending
77 dnl on the link address.
78 AC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE],
79 [AC_MSG_CHECKING([whether ${TARGET_OBJCOPY} works for absolute addresses])
80 AC_CACHE_VAL(grub_cv_prog_objcopy_absolute,
81 [cat > conftest.c <<\EOF
82 void cmain (void);
83 void
84 cmain (void)
85 {
86    *((int *) 0x1000) = 2;
87 }
88 EOF
89
90 if AC_TRY_EVAL(ac_compile) && test -s conftest.o; then :
91 else
92   AC_MSG_ERROR([${CC-cc} cannot compile C source code])
93 fi
94 grub_cv_prog_objcopy_absolute=yes
95 for link_addr in 0x2000 0x8000 0x7C00; do
96   if AC_TRY_COMMAND([${CC-cc} ${TARGET_CFLAGS} ${TARGET_LDFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},$link_addr conftest.o -o conftest.exec]); then :
97   else
98     AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
99   fi
100   if AC_TRY_COMMAND([${TARGET_OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then :
101   else
102     AC_MSG_ERROR([${TARGET_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
107     grub_cv_prog_objcopy_absolute=no
108     break
109   fi
110 done
111 rm -f conftest*])
112 AC_MSG_RESULT([$grub_cv_prog_objcopy_absolute])
113
114 if test "x$grub_cv_prog_objcopy_absolute" = xno; then
115   AC_MSG_ERROR([GRUB requires a working absolute objcopy; upgrade your binutils])
116 fi
117 ])
118
119
120 dnl Supply --build-id=none to ld if building modules.
121 dnl This suppresses warnings from ld on some systems
122 AC_DEFUN([grub_PROG_LD_BUILD_ID_NONE],
123 [AC_MSG_CHECKING([whether linker accepts --build-id=none])
124 AC_CACHE_VAL(grub_cv_prog_ld_build_id_none,
125 [save_LDFLAGS="$LDFLAGS"
126 LDFLAGS="$LDFLAGS -Wl,--build-id=none"
127 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
128                [grub_cv_prog_ld_build_id_none=yes],
129                [grub_cv_prog_ld_build_id_none=no])
130 LDFLAGS="$save_LDFLAGS"
131 ])
132 AC_MSG_RESULT([$grub_cv_prog_ld_build_id_none])
133
134 if test "x$grub_cv_prog_ld_build_id_none" = xyes; then
135   TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,--build-id=none"
136 fi
137 ])
138
139 dnl Check nm
140 AC_DEFUN([grub_PROG_NM_WORKS],
141 [AC_MSG_CHECKING([whether nm works])
142 AC_CACHE_VAL(grub_cv_prog_nm_works,
143 [
144 nm_works_tmp_dir="$(mktemp -d "./confXXXXXX")"
145 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
146 $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_works_tmp_dir/ef"
147 if $TARGET_NM "$nm_works_tmp_dir/ef" > /dev/null; then
148    grub_cv_prog_nm_works=yes
149 else
150    grub_cv_prog_nm_minus_p=no
151 fi
152 rm "$nm_works_tmp_dir/ef"
153 rmdir "$nm_works_tmp_dir"
154 ])
155 AC_MSG_RESULT([$grub_cv_prog_nm_works])
156
157 if test "x$grub_cv_prog_nm_works" != xyes; then
158   AC_MSG_ERROR([nm does not work])
159 fi
160 ])
161
162 dnl Supply -P to nm
163 AC_DEFUN([grub_PROG_NM_MINUS_P],
164 [AC_MSG_CHECKING([whether nm accepts -P])
165 AC_CACHE_VAL(grub_cv_prog_nm_minus_p,
166 [
167 nm_minus_p_tmp_dir="$(mktemp -d "./confXXXXXX")"
168 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
169 $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_minus_p_tmp_dir/ef"
170 if $TARGET_NM -P "$nm_minus_p_tmp_dir/ef" 2>&1 > /dev/null; then
171    grub_cv_prog_nm_minus_p=yes
172 else
173    grub_cv_prog_nm_minus_p=no
174 fi
175 rm "$nm_minus_p_tmp_dir/ef"
176 rmdir "$nm_minus_p_tmp_dir"
177 ])
178 AC_MSG_RESULT([$grub_cv_prog_nm_minus_p])
179
180 if test "x$grub_cv_prog_nm_minus_p" = xyes; then
181   TARGET_NMFLAGS_MINUS_P="-P"
182 else
183   TARGET_NMFLAGS_MINUS_P=
184 fi
185 ])
186
187 dnl Supply --defined-only to nm
188 AC_DEFUN([grub_PROG_NM_DEFINED_ONLY],
189 [AC_MSG_CHECKING([whether nm accepts --defined-only])
190 AC_CACHE_VAL(grub_cv_prog_nm_defined_only,
191 [
192 nm_defined_only_tmp_dir="$(mktemp -d "./confXXXXXX")"
193 AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
194 $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_defined_only_tmp_dir/ef"
195 if $TARGET_NM --defined-only "$nm_defined_only_tmp_dir/ef" 2>&1 > /dev/null; then
196    grub_cv_prog_nm_defined_only=yes
197 else
198    grub_cv_prog_nm_defined_only=no
199 fi
200 rm "$nm_defined_only_tmp_dir/ef"
201 rmdir "$nm_defined_only_tmp_dir"
202 ])
203 AC_MSG_RESULT([$grub_cv_prog_nm_defined_only])
204
205 if test "x$grub_cv_prog_nm_defined_only" = xyes; then
206   TARGET_NMFLAGS_DEFINED_ONLY=--defined-only
207 else
208   TARGET_NMFLAGS_DEFINED_ONLY=
209 fi
210 ])
211
212
213 dnl Check what symbol is defined as a bss start symbol.
214 dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
215 AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
216 [AC_REQUIRE([AC_PROG_CC])
217 AC_MSG_CHECKING([if __bss_start is defined by the compiler])
218 AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
219 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
220 asm (".globl start; start:");
221 void __main (void);
222 void __main (void) {}
223 int main (void);
224 ]],
225                 [[asm ("incl __bss_start")]])],
226                 [grub_cv_check_uscore_uscore_bss_start_symbol=yes],
227                 [grub_cv_check_uscore_uscore_bss_start_symbol=no])])
228
229 AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
230
231 AC_MSG_CHECKING([if edata is defined by the compiler])
232 AC_CACHE_VAL(grub_cv_check_edata_symbol,
233 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
234 asm (".globl start; start:");
235 void __main (void);
236 void __main (void) {}
237 int main (void);]],
238                 [[asm ("incl edata")]])],
239                 [grub_cv_check_edata_symbol=yes],
240                 [grub_cv_check_edata_symbol=no])])
241
242 AC_MSG_RESULT([$grub_cv_check_edata_symbol])
243
244 AC_MSG_CHECKING([if _edata is defined by the compiler])
245 AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
246 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
247 asm (".globl start; start:");
248 void __main (void);
249 void __main (void) {}
250 int main (void);]],
251                 [[asm ("incl _edata")]])],
252                 [grub_cv_check_uscore_edata_symbol=yes],
253                 [grub_cv_check_uscore_edata_symbol=no])])
254
255 AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
256
257 if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
258   BSS_START_SYMBOL=__bss_start
259 elif test "x$grub_cv_check_edata_symbol" = xyes; then
260   BSS_START_SYMBOL=edata
261 elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
262   BSS_START_SYMBOL=_edata
263 else
264   AC_MSG_ERROR([none of __bss_start, edata or _edata is defined])
265 fi
266 ])
267
268 dnl Check what symbol is defined as an end symbol.
269 dnl Written by Yoshinori K. Okuji.
270 AC_DEFUN([grub_CHECK_END_SYMBOL],
271 [AC_REQUIRE([AC_PROG_CC])
272 AC_MSG_CHECKING([if end is defined by the compiler])
273 AC_CACHE_VAL(grub_cv_check_end_symbol,
274 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
275 asm (".globl start; start:");
276 void __main (void);
277 void __main (void) {}
278 int main (void);]],
279                 [[asm ("incl end")]])],
280                 [grub_cv_check_end_symbol=yes],
281                 [grub_cv_check_end_symbol=no])])
282
283 AC_MSG_RESULT([$grub_cv_check_end_symbol])
284
285 AC_MSG_CHECKING([if _end is defined by the compiler])
286 AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
287 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
288 asm (".globl start; start:");
289 void __main (void);
290 void __main (void) {}
291 int main (void);]],
292                 [[asm ("incl _end")]])],
293                 [grub_cv_check_uscore_end_symbol=yes],
294                 [grub_cv_check_uscore_end_symbol=no])])
295
296 AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
297
298 if test "x$grub_cv_check_end_symbol" = xyes; then
299   END_SYMBOL=end
300 elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
301   END_SYMBOL=_end
302 else
303   AC_MSG_ERROR([neither end nor _end is defined])
304 fi
305 ])
306
307 \f
308 dnl Check if the C compiler supports `-fstack-protector'.
309 AC_DEFUN([grub_CHECK_STACK_PROTECTOR],[
310 [# Smashing stack protector.
311 ssp_possible=yes]
312 AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector'])
313 # Is this a reliable test case?
314 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
315 void foo (void) { volatile char a[8]; a[3]; }
316 ]])])
317 [# `$CC -c -o ...' might not be portable.  But, oh, well...  Is calling
318 # `ac_compile' like this correct, after all?
319 if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then]
320   AC_MSG_RESULT([yes])
321   [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
322   rm -f conftest.s
323 else
324   ssp_possible=no]
325   AC_MSG_RESULT([no])
326 [fi]
327 ])
328
329 dnl Check if the C compiler supports `-mstack-arg-probe' (Cygwin).
330 AC_DEFUN([grub_CHECK_STACK_ARG_PROBE],[
331 [# Smashing stack arg probe.
332 sap_possible=yes]
333 AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
334 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
335 void foo (void) { volatile char a[8]; a[3]; }
336 ]])])
337 [if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then]
338   AC_MSG_RESULT([yes])
339   [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
340   rm -f conftest.s
341 else
342   sap_possible=no]
343   AC_MSG_RESULT([no])
344 [fi]
345 ])
346
347 dnl Check if ln -s can handle directories properly (mingw).
348 AC_DEFUN([grub_CHECK_LINK_DIR],[
349 AC_MSG_CHECKING([whether ln -s can handle directories properly])
350 [mkdir testdir 2>/dev/null
351 case $srcdir in
352 [\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
353     *) reldir=../$srcdir/include/grub/util ;;
354 esac
355 if ln -s $reldir testdir/util 2>/dev/null && rm -f testdir/util 2>/dev/null ; then]
356   AC_MSG_RESULT([yes])
357   [link_dir=yes
358 else
359   link_dir=no]
360   AC_MSG_RESULT([no])
361 [fi
362 rm -rf testdir]
363 ])
364
365 dnl Check if the C compiler supports `-fPIE'.
366 AC_DEFUN([grub_CHECK_PIE],[
367 [# Position independent executable.
368 pie_possible=yes]
369 AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default])
370 # Is this a reliable test case?
371 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
372 #ifdef __PIE__
373 int main() {
374         return 0;
375 }
376 #else
377 #error NO __PIE__ DEFINED
378 #endif
379 ]])])
380
381 [# `$CC -c -o ...' might not be portable.  But, oh, well...  Is calling
382 # `ac_compile' like this correct, after all?
383 if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
384   AC_MSG_RESULT([yes])
385   [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
386   rm -f conftest.s
387 else
388   pie_possible=no]
389   AC_MSG_RESULT([no])
390 [fi]
391 ])
392
393 AC_DEFUN([grub_CHECK_LINK_PIE],[
394 [# Position independent executable.
395 link_nopie_needed=no]
396 AC_MSG_CHECKING([whether linker needs disabling of PIE to work])
397 AC_LANG_CONFTEST([AC_LANG_SOURCE([[]])])
398
399 [if eval "$ac_compile -Wl,-r,-d -nostdlib -Werror -o conftest.o" 2> /dev/null; then]
400   AC_MSG_RESULT([no])
401   [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
402   rm -f conftest.o
403 else
404   link_nopie_needed=yes]
405   AC_MSG_RESULT([yes])
406 [fi]
407 ])
408
409
410 dnl Check if the Linker supports `-no-pie'.
411 AC_DEFUN([grub_CHECK_NO_PIE],
412 [AC_MSG_CHECKING([whether linker accepts -no-pie])
413 AC_CACHE_VAL(grub_cv_cc_ld_no_pie,
414 [save_LDFLAGS="$LDFLAGS"
415 LDFLAGS="$LDFLAGS -no-pie -nostdlib -Werror"
416 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
417                [grub_cv_cc_ld_no_pie=yes],
418                [grub_cv_cc_ld_no_pie=no])
419 LDFLAGS="$save_LDFLAGS"
420 ])
421 AC_MSG_RESULT([$grub_cv_cc_ld_no_pie])
422 nopie_possible=no
423 if test "x$grub_cv_cc_ld_no_pie" = xyes ; then
424   nopie_possible=yes
425 fi
426 ])
427
428 AC_DEFUN([grub_CHECK_NO_PIE_ONEWORD],
429 [AC_MSG_CHECKING([whether linker accepts -nopie])
430 AC_CACHE_VAL(grub_cv_cc_ld_no_pie_oneword,
431 [save_LDFLAGS="$LDFLAGS"
432 LDFLAGS="$LDFLAGS -nopie -nostdlib -Werror"
433 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
434                [grub_cv_cc_ld_no_pie_oneword=yes],
435                [grub_cv_cc_ld_no_pie_oneword=no])
436 LDFLAGS="$save_LDFLAGS"
437 ])
438 AC_MSG_RESULT([$grub_cv_cc_ld_no_pie_oneword])
439 nopie_oneword_possible=no
440 if test "x$grub_cv_cc_ld_no_pie_oneword" = xyes ; then
441   nopie_oneword_possible=yes
442 fi
443 ])
444
445 dnl Check if the C compiler supports `-fPIC'.
446 AC_DEFUN([grub_CHECK_PIC],[
447 [# Position independent executable.
448 pic_possible=yes]
449 AC_MSG_CHECKING([whether `$CC' has `-fPIC' as default])
450 # Is this a reliable test case?
451 AC_LANG_CONFTEST([AC_LANG_SOURCE([[
452 #ifdef __PIC__
453 int main() {
454         return 0;
455 }
456 #else
457 #error NO __PIC__ DEFINED
458 #endif
459 ]])])
460
461 [# `$CC -c -o ...' might not be portable.  But, oh, well...  Is calling
462 # `ac_compile' like this correct, after all?
463 if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
464   AC_MSG_RESULT([yes])
465   [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
466   rm -f conftest.s
467 else
468   pic_possible=no]
469   AC_MSG_RESULT([no])
470 [fi]
471 ])
472
473 dnl Create an output variable with the transformed name of a GRUB utility
474 dnl program.
475 AC_DEFUN([grub_TRANSFORM],[dnl
476 AC_SUBST(AS_TR_SH([$1]), [`AS_ECHO([$1]) | sed "$program_transform_name"`])dnl
477 ])