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