configure.ac: clean up arm64 soft-float handling
[grub.git] / configure.ac
1 # -*- autoconf -*-
2
3 # Process this file with autoconf to produce a configure script.
4
5 # Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009,2010  Free Software Foundation, Inc.
6 #
7 # This configure.ac is free software; the author
8 # gives unlimited permission to copy and/or distribute it,
9 # with or without modifications, as long as this notice is preserved.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14 # PARTICULAR PURPOSE.
15
16 dnl This configure script is complicated, because GRUB needs to deal
17 dnl with three potentially different types:
18 dnl
19 dnl   build  -- the environment for building GRUB
20 dnl   host   -- the environment for running utilities
21 dnl   target -- the environment for running GRUB
22 dnl
23 dnl In addition, GRUB needs to deal with a platform specification
24 dnl which specifies the system running GRUB, such as firmware.
25 dnl This is necessary because the target type in autoconf does not
26 dnl describe such a system very well.
27 dnl
28 dnl The current strategy is to use variables with no prefix (such as
29 dnl CC, CFLAGS, etc.) for the host type, variables with prefix "BUILD_"
30 dnl (such as BUILD_CC, BUILD_CFLAGS, etc.) for the build type and variables
31 dnl with the prefix "TARGET_" (such as TARGET_CC, TARGET_CFLAGS, etc.) are
32 dnl used for the target type. See INSTALL for full list of variables.
33
34 AC_INIT([GRUB],[2.02~beta2],[bug-grub@gnu.org])
35
36 AC_CONFIG_AUX_DIR([build-aux])
37
38 # We don't want -g -O2 by default in CFLAGS
39 : ${CFLAGS=""}
40
41 # Checks for build, host and target systems.
42 AC_CANONICAL_BUILD
43 AC_CANONICAL_HOST
44 save_program_prefix="${program_prefix}"
45 AC_CANONICAL_TARGET
46 program_prefix="${save_program_prefix}"
47
48 AM_INIT_AUTOMAKE([1.10.1])
49 AC_PREREQ(2.60)
50 AC_CONFIG_SRCDIR([include/grub/dl.h])
51 AC_CONFIG_HEADER([config-util.h])
52
53 # Program name transformations
54 AC_ARG_PROGRAM
55 grub_TRANSFORM([grub-bios-setup])
56 grub_TRANSFORM([grub-editenv])
57 grub_TRANSFORM([grub-install])
58 grub_TRANSFORM([grub-mkconfig])
59 grub_TRANSFORM([grub-mkfont])
60 grub_TRANSFORM([grub-mkimage])
61 grub_TRANSFORM([grub-glue-efi])
62 grub_TRANSFORM([grub-mklayout])
63 grub_TRANSFORM([grub-mkpasswd-pbkdf2])
64 grub_TRANSFORM([grub-mkrelpath])
65 grub_TRANSFORM([grub-mkrescue])
66 grub_TRANSFORM([grub-probe])
67 grub_TRANSFORM([grub-reboot])
68 grub_TRANSFORM([grub-script-check])
69 grub_TRANSFORM([grub-set-default])
70 grub_TRANSFORM([grub-sparc64-setup])
71 grub_TRANSFORM([grub-render-label])
72 grub_TRANSFORM([grub-file])
73
74 # Optimization flag.  Allow user to override.
75 if test "x$TARGET_CFLAGS" = x; then
76   TARGET_CFLAGS="$TARGET_CFLAGS -Os"
77 fi
78
79 # Default HOST_CPPFLAGS
80 HOST_CPPFLAGS="$HOST_CPPFLAGS -Wall -W"
81 HOST_CPPFLAGS="$HOST_CPPFLAGS -DGRUB_UTIL=1"
82
83 TARGET_CPPFLAGS="$TARGET_CPPFLAGS -Wall -W"
84
85 case "$target_cpu" in
86   i[[3456]]86)  target_cpu=i386 ;;
87   amd64)        target_cpu=x86_64 ;;
88   sparc)        target_cpu=sparc64 ;;
89   mipsel|mips64el)
90                 target_cpu=mipsel
91                 machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPSEL=1"
92                 ;;
93   mips|mips64)
94                 target_cpu=mips
95                 machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPS=1"
96                 ;;
97   arm*)
98                 target_cpu=arm
99                 ;;
100   aarch64*)
101                 target_cpu=arm64
102                 ;;
103 esac
104
105 # Specify the platform (such as firmware).
106 AC_ARG_WITH([platform],
107             AS_HELP_STRING([--with-platform=PLATFORM],
108                            [select the host platform [[guessed]]]))
109
110 # Guess the platform if not specified.
111 if test "x$with_platform" = x; then
112   case "$target_cpu"-"$target_vendor" in
113     i386-apple) platform=efi ;;
114     i386-*) platform=pc ;;
115     x86_64-apple) platform=efi ;;
116     x86_64-*) platform=pc ;;
117     powerpc-*) platform=ieee1275 ;;
118     powerpc64-*) platform=ieee1275 ;;
119     sparc64-*) platform=ieee1275 ;;
120     mipsel-*) platform=loongson ;;
121     mips-*) platform=arc ;;
122     ia64-*) platform=efi ;;
123     arm-*) platform=uboot ;;
124     arm64-*) platform=efi ;;
125     *)
126       AC_MSG_WARN([unsupported CPU: "$target_cpu" - only building utilities])
127       platform=none
128       ;;
129   esac
130 else
131   platform="$with_platform"
132 fi
133
134 case "$target_cpu"-"$platform" in
135   x86_64-efi) ;;
136   x86_64-emu) ;;
137   x86_64-xen) ;;
138   x86_64-none) ;;
139   x86_64-*) target_cpu=i386 ;;
140   powerpc64-ieee1275) target_cpu=powerpc ;;
141 esac
142
143 # Check if the platform is supported, make final adjustments.
144 case "$target_cpu"-"$platform" in
145   i386-efi) ;;
146   x86_64-efi) ;;
147   i386-xen) ;;
148   x86_64-xen) ;;
149   i386-pc) ;;
150   i386-multiboot) ;;
151   i386-coreboot) ;;
152   i386-linuxbios) platform=coreboot ;;
153   i386-ieee1275) ;;
154   i386-qemu) ;;
155   powerpc-ieee1275) ;;
156   sparc64-ieee1275) ;;
157   ia64-efi) ;;
158   mips-qemu_mips) ;;
159   mips-qemu-mips) platform=qemu_mips;;
160   mips-arc) ;;
161   mipsel-arc) ;;
162   mipsel-qemu_mips) ;;
163   mipsel-qemu-mips) platform=qemu_mips;;
164   mipsel-yeeloong) platform=loongson ;;
165   mipsel-fuloong) platform=loongson ;;
166   mipsel-loongson) ;;
167   arm-uboot) ;;
168   arm-efi) ;;
169   arm64-efi) ;;
170   *-emu) ;;
171   *-none) ;;
172   *) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;;
173 esac
174
175 if test x$platform != xemu ; then
176    case "$target_cpu" in
177         i386 | powerpc) target_m32=1 ;;
178         x86_64 | sparc64) target_m64=1 ;;
179    esac
180 fi
181
182 if test x"$target_cpu-$platform" = xsparc64-emu ; then
183    target_m64=1
184 fi
185
186 case "$target_os" in
187   windows* | mingw32*) target_os=cygwin ;;
188 esac
189
190 # This normalizes the names, and creates a new variable ("host_kernel")
191 # while at it, since the mapping is not always 1:1 (e.g. different OSes
192 # using the same kernel type).
193 case "$host_os" in
194   gnu*)                         host_kernel=hurd ;;
195   linux*)                       host_kernel=linux ;;
196   freebsd* | kfreebsd*-gnu)     host_kernel=kfreebsd ;;
197   netbsd*)                      host_kernel=netbsd ;;
198   solaris*)                     host_kernel=illumos ;;
199   darwin*)                      host_kernel=xnu ;;
200   cygwin | windows* | mingw32*) host_kernel=windows ;;
201 esac
202
203 case "$host_os" in
204   cygwin | windows* | mingw32*) have_exec=n ;;
205   aros*) have_exec=n ;;
206   *) have_exec=y;;
207 esac
208
209 case "$platform" in
210   coreboot)     machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_COREBOOT=1" ;;
211   multiboot)    machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;;
212   efi)          machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;;
213   xen)          machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;;
214   ieee1275)     machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;;
215   uboot)        machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;;
216   qemu)         machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;;
217   pc)           machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_PCBIOS=1" ;;
218   emu)          machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EMU=1" ;;
219   loongson)     machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_LOONGSON=1" ;;
220   qemu_mips)    machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_QEMU_MIPS=1" ;;
221   arc)  machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_ARC=1" ;;
222 esac
223 if test x${target_cpu} = xmipsel ; then
224    machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE=`echo mips_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`"
225 else
226    machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE=`echo ${target_cpu}_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`"
227 fi
228
229 case "${target_cpu}-$platform" in
230      mips-arc)
231         TARGET_LINK_ADDR=0x88200000
232         TARGET_DECOMPRESSOR_LINK_ADDR=0x88100000
233         ;;
234      mipsel-arc)
235         TARGET_LINK_ADDR=0x80700000
236         TARGET_DECOMPRESSOR_LINK_ADDR=0x80600000
237         ;;
238      mips*-qemu_mips | mips*-loongson)
239         TARGET_DECOMPRESSOR_LINK_ADDR=0x80100000
240         ;;
241 esac
242
243 AC_SUBST(TARGET_LINK_ADDR)
244 AC_SUBST(TARGET_DECOMPRESSOR_LINK_ADDR)
245
246 TARGET_CPPFLAGS="$TARGET_CPPFLAGS $machine_CPPFLAGS"
247
248 AC_SUBST(host_cpu)
249 AC_SUBST(host_os)
250 AC_SUBST(host_kernel)
251
252 AC_SUBST(target_cpu)
253 AC_SUBST(platform)
254
255 # Define default variables
256
257 have_with_bootdir=n
258 AC_ARG_WITH([bootdir],
259             AS_HELP_STRING([--with-bootdir=DIR],
260                            [set the name of /boot directory [[guessed]]]),
261                            [have_with_bootdir=y],
262                            [have_with_bootdir=n])
263 if test x$have_with_bootdir = xy; then
264    bootdirname="$with_bootdir"
265 else
266    case "$host_os" in
267      netbsd* | openbsd*)
268         # Because /boot is used for the boot block in NetBSD and OpenBSD,
269            bootdirname=''      ;;
270      *)    bootdirname='boot'  ;;
271    esac
272 fi
273
274 AC_SUBST(bootdirname)
275 AC_DEFINE_UNQUOTED(GRUB_BOOT_DIR_NAME, "$bootdirname",
276     [Default boot directory name]")
277
278 AC_ARG_WITH([grubdir],
279             AS_HELP_STRING([--with-grubdir=DIR],
280                            [set the name of grub directory [[guessed]]]),
281                            [grubdirname="$with_grubdir"],
282                            [grubdirname="$PACKAGE"])
283
284 AC_SUBST(grubdirname)
285 AC_DEFINE_UNQUOTED(GRUB_DIR_NAME, "$grubdirname",
286     [Default grub directory name])
287
288 #
289 # Checks for build programs.
290 #
291
292 # Although cmp is listed in the GNU Coding Standards as a command which
293 # can used directly, OpenBSD lacks cmp in the default installation.
294 AC_CHECK_PROGS([CMP], [cmp])
295 if test "x$CMP" = x; then
296   AC_MSG_ERROR([cmp is not found])
297 fi
298
299 AC_CHECK_PROGS([YACC], [bison])
300 if test "x$YACC" = x; then
301   AC_MSG_ERROR([bison is not found])
302 fi
303
304 AC_PROG_RANLIB
305 AC_PROG_INSTALL
306 AC_PROG_AWK
307 AC_PROG_LEX
308 AC_PROG_YACC
309 AC_PROG_MAKE_SET
310 AC_PROG_MKDIR_P
311 AC_PROG_LN_S
312
313 if test "x$LEX" = "x:"; then
314   AC_MSG_ERROR([flex is not found])
315 else
316   version=`$LEX --version | $AWK '{ split($NF,x,"."); print x[[1]]*10000+x[[2]]*100+x[[3]]; }'`
317   if test -n "$version" -a "$version" -ge 20535; then
318     :
319   else
320     AC_MSG_ERROR([flex is too old. GRUB requires 2.5.35 or above])
321   fi
322 fi
323
324 # These are not a "must".
325 AC_PATH_PROGS(MAKEINFO, makeinfo true)
326
327 #
328 # Checks for host programs.
329 #
330
331 AC_PROG_CC
332 gl_EARLY
333 AC_PROG_CXX
334 AM_PROG_CC_C_O
335 AM_PROG_AS
336
337 # Must be GCC.
338 test "x$GCC" = xyes || AC_MSG_ERROR([GCC is required])
339
340 AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no)
341
342 AC_GNU_SOURCE
343 AM_GNU_GETTEXT([external])
344 AC_SYS_LARGEFILE
345
346 # Identify characteristics of the host architecture.
347 unset ac_cv_c_bigendian
348
349 if test x"$target_cpu-$platform" = xsparc64-emu ; then
350   CFLAGS="$CFLAGS -m64"
351   HOST_CFLAGS="$HOST_CFLAGS -m64"
352 fi
353
354 CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64"
355 HOST_CPPFLAGS="$HOST_CPPFLAGS -D_FILE_OFFSET_BITS=64"
356
357 AC_C_BIGENDIAN
358 AC_CHECK_SIZEOF(void *)
359 AC_CHECK_SIZEOF(long)
360
361 case "$host_os" in
362   cygwin | windows* | mingw32*)
363      HOST_CPPFLAGS="$HOST_CPPFLAGS -DUNICODE=1 -D_WIN32_WINNT=0x0500"
364      CPPFLAGS="$CPPFLAGS -DUNICODE=1 -D_WIN32_WINNT=0x0500"
365      AC_CHECK_SIZEOF(TCHAR,,[#include <windows.h>])
366    ;;
367 esac
368
369 case "$host_os" in
370   cygwin | windows* | mingw32* | aros*)
371      ;;
372   *)
373      AC_CHECK_SIZEOF(off_t)
374      test x"$ac_cv_sizeof_off_t" = x8 || AC_MSG_ERROR([Large file support is required]);;
375 esac
376
377 if test x$USE_NLS = xno; then
378   HOST_CFLAGS="$HOST_CFLAGS -fno-builtin-gettext"
379 fi
380
381 if test "x$cross_compiling" = xyes; then
382   AC_MSG_WARN([cannot generate manual pages while cross compiling])
383 else
384   AC_PATH_PROG(HELP2MAN, help2man)
385 fi
386
387 # Check for functions and headers.
388 AC_CHECK_FUNCS(posix_memalign memalign getextmntent)
389 AC_CHECK_HEADERS(sys/param.h sys/mount.h sys/mnttab.h sys/mkdev.h limits.h)
390
391 AC_CHECK_MEMBERS([struct statfs.f_fstypename],,,[$ac_includes_default
392 #include <sys/param.h>
393 #include <sys/mount.h>])
394
395 AC_CHECK_MEMBERS([struct statfs.f_mntfromname],,,[$ac_includes_default
396 #include <sys/param.h>
397 #include <sys/mount.h>])
398
399 # For opendisk() and getrawpartition() on NetBSD.
400 # Used in util/deviceiter.c and in util/hostdisk.c.
401 AC_CHECK_HEADER([util.h], [
402   AC_CHECK_LIB([util], [opendisk], [
403     LIBUTIL="-lutil"
404     AC_DEFINE(HAVE_OPENDISK, 1, [Define if opendisk() in -lutil can be used])
405   ])
406   AC_CHECK_LIB([util], [getrawpartition], [
407     LIBUTIL="-lutil"
408     AC_DEFINE(HAVE_GETRAWPARTITION, 1, [Define if getrawpartition() in -lutil can be used])
409   ])
410 ])
411 AC_SUBST([LIBUTIL])
412
413 AC_CACHE_CHECK([whether -Wtrampolines work], [grub_cv_host_cc_wtrampolines], [
414   SAVED_CFLAGS="$CFLAGS"
415   CFLAGS="$HOST_CFLAGS -Wtrampolines -Werror"
416   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
417 int va_arg_func (int fixed, va_list args);]], [[]])],
418       [grub_cv_host_cc_wtrampolines=yes],
419       [grub_cv_host_cc_wtrampolines=no])
420   CFLAGS="$SAVED_CFLAGS"
421 ])
422
423 if test x"$grub_host_cv_cc_wtrampolines" = xyes ; then
424   HOST_CFLAGS="$HOST_CFLAGS -Wtrampolines"
425 fi
426
427 #
428 # Check for host and build compilers.
429 #
430 HOST_CC=$CC
431 AC_CHECK_PROGS(BUILD_CC, [gcc egcs cc])
432 test -z "$BUILD_CC" && AC_MSG_ERROR([none of gcc, egcs and cc is found. set BUILD_CC manually.])
433 BUILD_CPP="$BUILD_CC -E"
434
435 case "$build_os" in
436   haiku*)                               BUILD_LIBM= ;;
437   *)                                    BUILD_LIBM=-lm ;;
438 esac
439
440 dnl FIXME proper test seems to require too deep dive into Autoconf internals.
441 dnl For now just list known platforms that we support.
442
443 case "$build_os" in
444   cygwin*|mingw32*|mingw64*)            BUILD_EXEEXT=.exe ;;
445   *)                                    BUILD_EXEEXT= ;;
446 esac
447 AC_SUBST(BUILD_EXEEXT)
448
449 # For gnulib.
450 gl_INIT
451
452 WARN_FLAGS="-Wall -W -Wshadow -Wpointer-arith -Wundef -Wchar-subscripts -Wcomment -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wfloat-equal -Wformat-extra-args -Wformat-security -Wformat-y2k -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wmain -Wmissing-braces -Wmissing-format-attribute -Wmultichar -Wparentheses -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wswitch -Wtrigraphs -Wunknown-pragmas -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value  -Wunused-variable -Wwrite-strings -Wnested-externs -Wstrict-prototypes"
453 EXTRA_WARN_FLAGS="-Wextra -Wattributes -Wendif-labels -Winit-self -Wint-to-pointer-cast -Winvalid-pch -Wmissing-field-initializers -Wnonnull -Woverflow -Wvla -Wpointer-to-int-cast -Wstrict-aliasing -Wvariadic-macros -Wvolatile-register-var -Wpointer-sign -Wmissing-include-dirs -Wmissing-prototypes -Wmissing-declarations -Wformat=2"
454
455 HOST_CFLAGS="$HOST_CFLAGS $WARN_FLAGS -Wcast-align"
456
457 AC_CACHE_CHECK([which extra warnings work], [grub_cv_cc_w_extra_flags], [
458   SAVED_CFLAGS="$CFLAGS"
459   grub_cv_cc_w_extra_flags=
460   for x in $EXTRA_WARN_FLAGS; do
461       CFLAGS="$HOST_CFLAGS $x -Werror"
462       AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [flag=1], [flag=0])
463       if test x$flag = x1 ; then
464          grub_cv_cc_w_extra_flags="$grub_cv_cc_w_extra_flags $x"
465       fi
466   done
467   CFLAGS="$SAVED_CFLAGS"
468 ])
469
470 HOST_CFLAGS="$HOST_CFLAGS $grub_cv_cc_w_extra_flags"
471
472 #
473 # Check for target programs.
474 #
475
476 # Find tools for the target.
477 if test "x$target_alias" != x && test "x$host_alias" != "x$target_alias"; then
478   tmp_ac_tool_prefix="$ac_tool_prefix"
479   ac_tool_prefix=$target_alias-
480
481   AC_CHECK_TOOLS(TARGET_CC, [gcc egcs cc],
482                  [AC_MSG_ERROR([none of gcc, egcs and cc is found. set TARGET_CC manually.])])
483   AC_CHECK_TOOL(TARGET_OBJCOPY, objcopy)
484   AC_CHECK_TOOL(TARGET_STRIP, strip)
485   AC_CHECK_TOOL(TARGET_NM, nm)
486   AC_CHECK_TOOL(TARGET_RANLIB, ranlib)
487
488   ac_tool_prefix="$tmp_ac_tool_prefix"
489 else
490   if test "x$TARGET_CC" = x; then
491     TARGET_CC=$CC
492   fi
493   AC_CHECK_TOOL(TARGET_OBJCOPY, objcopy)
494   AC_CHECK_TOOL(TARGET_STRIP, strip)
495   AC_CHECK_TOOL(TARGET_NM, nm)
496   AC_CHECK_TOOL(TARGET_RANLIB, ranlib)
497 fi
498
499 AC_SUBST(HOST_CC)
500 AC_SUBST(BUILD_CC)
501 AC_SUBST(BUILD_CFLAGS)
502 AC_SUBST(BUILD_CPPFLAGS)
503 AC_SUBST(BUILD_LDFLAGS)
504 AC_SUBST(TARGET_CC)
505 AC_SUBST(TARGET_NM)
506 AC_SUBST(TARGET_RANLIB)
507 AC_SUBST(TARGET_STRIP)
508 AC_SUBST(TARGET_OBJCOPY)
509
510 # Test the C compiler for the target environment.
511 tmp_CC="$CC"
512 tmp_CFLAGS="$CFLAGS"
513 tmp_LDFLAGS="$LDFLAGS"
514 tmp_CPPFLAGS="$CPPFLAGS"
515 tmp_LIBS="$LIBS"
516 CC="$TARGET_CC"
517 CFLAGS="$TARGET_CFLAGS"
518 CPPFLAGS="$TARGET_CPPFLAGS"
519 LDFLAGS="$TARGET_LDFLAGS"
520 LIBS=""
521
522 # debug flags.
523 TARGET_CFLAGS="$TARGET_CFLAGS $WARN_FLAGS -g -Wredundant-decls -Wmissing-prototypes -Wmissing-declarations"
524 TARGET_CCASFLAGS="$TARGET_CCASFLAGS -g"
525
526 if test "x$target_cpu" != xi386 && test "x$target_cpu" != xx86_64; then
527 TARGET_CFLAGS="$TARGET_CFLAGS -Wcast-align"
528 fi
529
530 TARGET_CC_VERSION="$(LC_ALL=C $TARGET_CC --version | head -n1)"
531
532 AC_CACHE_CHECK([which extra warnings work], [grub_cv_target_cc_w_extra_flags], [
533   LDFLAGS="$TARGET_LDFLAGS -nostdlib -static"
534
535   grub_cv_target_cc_w_extra_flags=
536   for x in $EXTRA_WARN_FLAGS; do
537       CFLAGS="$TARGET_CFLAGS $x -Werror"
538       AC_LINK_IFELSE([AC_LANG_PROGRAM([[
539 asm (".globl start; start:");
540 void __main (void);
541 void __main (void) {}
542 int main (void);
543 ]], [[]])], [flag=1], [flag=0])
544       if test x$flag = x1 ; then
545          grub_cv_target_cc_w_extra_flags="$grub_cv_target_cc_w_extra_flags $x"
546       fi
547   done
548 ])
549
550 TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_w_extra_flags"
551
552 AC_CACHE_CHECK([if compiling with clang], [grub_cv_cc_target_clang],
553 [
554 CFLAGS="$TARGET_CFLAGS"
555 AC_COMPILE_IFELSE(
556 [AC_LANG_PROGRAM([], [[
557 #ifdef __clang__
558 #error "is clang"
559 #endif
560 ]])],
561 [grub_cv_cc_target_clang=no], [grub_cv_cc_target_clang=yes])])
562
563 AC_CACHE_CHECK([for options to compile assembly], [grub_cv_cc_target_asm_compile], [
564 test_program=
565 case "x$target_cpu-$platform" in
566      xmips-* | xmipsel-*)
567         test_program=mips
568         ;;
569      xi386-pc)
570        test_program=i386-pc
571         ;;
572      xi386-* | xx86_64-*)
573        test_program=i386
574         ;;
575      xpowerpc-* | xsparc64-* | xarm-*)
576         test_program=$target_cpu
577         ;;
578 esac
579 if test x"$test_program" = x ; then
580   grub_cv_cc_target_asm_compile=
581 else
582   found=no
583   for arg in "" "-no-integrated-as"; do
584     cmdline="$TARGET_CC -c -o /dev/null $TARGET_CCASFLAGS $arg $TARGET_CPPFLAGS $srcdir/asm-tests/$test_program.S"
585     echo "Running $cmdline" >&AS_MESSAGE_LOG_FD
586     if $cmdline >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then
587       grub_cv_cc_target_asm_compile="$arg"
588       found=yes
589       break
590     fi
591   done
592   if test x"$found" = xno ; then
593     AC_MSG_ERROR([could not compile assembly])
594   fi
595 fi
596 ])
597
598 TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_cc_target_asm_compile"
599
600 if test "x$target_cpu" = xi386 && test "x$platform" != xemu; then
601   TARGET_CFLAGS="$TARGET_CFLAGS -march=i386"
602 fi
603
604 if test "x$target_m32" = x1; then
605   # Force 32-bit mode.
606   TARGET_CFLAGS="$TARGET_CFLAGS -m32"
607   TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m32"
608   TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m32"
609   TARGET_LDFLAGS="$TARGET_LDFLAGS -m32"
610   TARGET_MODULE_FORMAT="elf32"
611 fi
612
613 if test "x$target_m64" = x1; then
614   # Force 64-bit mode.
615   TARGET_CFLAGS="$TARGET_CFLAGS -m64"
616   TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m64"
617   TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m64"
618   TARGET_LDFLAGS="$TARGET_LDFLAGS -m64"
619   TARGET_MODULE_FORMAT="elf64"
620 fi
621
622 if test "x$grub_cv_cc_target_clang" = xno && test "x$target_cpu" = xi386 && test "x$platform" != xemu && test "x$platform" != xefi; then
623    TARGET_CFLAGS="$TARGET_CFLAGS -mrtd -mregparm=3"
624 fi
625
626 # on mips redirect cache flushing function to non-existant one.
627 if test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ; then
628   AC_CACHE_CHECK([whether -mflush-func=grub_red_herring works], [grub_cv_cc_mflush_func], [
629     CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring -Werror"
630     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
631         [grub_cv_cc_mflush_func=yes],
632         [grub_cv_cc_mflush_func=no])
633   ])
634
635   if test "x$grub_cv_cc_mflush_func" = xyes; then
636     TARGET_CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring"
637   fi
638 fi
639
640
641 # Force no alignment to save space on i386.
642 if test "x$target_cpu" = xi386; then
643   AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [
644     CFLAGS="$TARGET_CFLAGS -falign-loops=1 -Werror"
645     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
646         [grub_cv_cc_falign_loop=yes],
647         [grub_cv_cc_falign_loop=no])
648   ])
649
650   AC_CACHE_CHECK([whether -malign-loops works], [grub_cv_cc_malign_loop], [
651     CFLAGS="$TARGET_CFLAGS -malign-loops=1 -Werror"
652     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
653         [grub_cv_cc_malign_loop=yes],
654         [grub_cv_cc_malign_loop=no])
655   ])
656
657   if test "x$grub_cv_cc_falign_loop" = xyes; then
658     TARGET_CFLAGS="$TARGET_CFLAGS -falign-jumps=1 -falign-loops=1 -falign-functions=1"
659   elif test "x$grub_cv_cc_malign_loop" = xyes; then
660     TARGET_CFLAGS="$TARGET_CFLAGS -malign-jumps=1 -malign-loops=1 -malign-functions=1"
661   fi
662 fi
663
664 AC_CACHE_CHECK([whether -freg-struct-return works], [grub_cv_cc_freg_struct_return], [
665     CFLAGS="$TARGET_CFLAGS -freg-struct-return -Werror"
666     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
667         [grub_cv_cc_freg_struct_return=yes],
668         [grub_cv_cc_freg_struct_return=no])
669 ])
670
671 if test "x$grub_cv_cc_freg_struct_return" = xyes; then
672     TARGET_CFLAGS="$TARGET_CFLAGS -freg-struct-return"
673 fi
674
675 if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$platform" != xemu; then
676   # Some toolchains enable these features by default, but they need
677   # registers that aren't set up properly in GRUB.
678   TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-3dnow"
679 fi
680
681 # GRUB doesn't use float or doubles at all. Yet some toolchains may decide
682 # that floats are a good fit to run instead of what's written in the code.
683 # Given that floating point unit is disabled (if present to begin with)
684 # when GRUB is running which may result in various hard crashes.
685 if test x"$platform" != xemu ; then
686   AC_CACHE_CHECK([for options to get soft-float], grub_cv_target_cc_soft_float, [
687     grub_cv_target_cc_soft_float=no
688     if test "x$target_cpu" = xarm64; then
689        CFLAGS="$TARGET_CFLAGS -mgeneral-regs-only -Werror"
690        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
691                          [grub_cv_target_cc_soft_float="-mgeneral-regs-only"], [])
692     fi
693     if test "x$target_cpu" = xia64; then
694        CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt -Werror"
695        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
696                          [grub_cv_target_cc_soft_float="-mno-inline-float-divide -mno-inline-sqrt"], [])
697     fi
698     for cand in "-msoft-float -Xclang -msoft-float -Xclang -no-implicit-float" \
699                 "-Xclang -msoft-float -Xclang -no-implicit-float" \
700                 "-Xclang -msoft-float" "-msoft-float"; do
701       if test x"$grub_cv_target_cc_soft_float" != xno ; then
702         break
703       fi
704       CFLAGS="$TARGET_CFLAGS $cand -Werror"
705       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
706                         [grub_cv_target_cc_soft_float="$cand"], [])
707     done
708   ])
709
710   if test x"$grub_cv_target_cc_soft_float" = xno ; then
711     AC_MSG_ERROR([could not force soft-float])
712   fi
713
714   case x"$grub_cv_target_cc_soft_float" in
715     x*"-Xclang"*)
716       # A trick so that clang doesn't see it on link stаge
717       TARGET_CPPFLAGS="$TARGET_CPPFLAGS $grub_cv_target_cc_soft_float"
718       ;;
719     *)
720       TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_soft_float"
721       ;;
722   esac
723   TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_soft_float"
724
725 fi
726
727 if test x"$target_cpu" = xsparc64 ; then
728   AC_CACHE_CHECK([for options to reserve application registers], grub_cv_target_cc_mno_app_regs, [
729     grub_cv_target_cc_mno_app_regs=no
730     for cand in "-mllvm -sparc-reserve-app-registers" \
731                 "-mno-app-regs"; do
732       if test x"$grub_cv_target_cc_mno_app_regs" != xno ; then
733         break
734       fi
735       CFLAGS="$TARGET_CFLAGS $cand -Werror"
736       CPPFLAGS="$TARGET_CPPFLAGS"
737       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
738                         [grub_cv_target_cc_mno_app_regs="$cand"], [])
739     done
740   ])
741
742   if test x"$grub_cv_target_cc_mno_app_regs" = xno ; then
743     AC_MSG_ERROR([could not reserve application registers])
744   fi
745   if test x"$grub_cv_target_cc_mno_app_regs" = x"-mllvm -sparc-reserve-app-registers" ; then
746     # A trick so that clang doesn't see it on link stаge
747     TARGET_CPPFLAGS="$TARGET_CPPFLAGS $grub_cv_target_cc_mno_app_regs"
748   else
749     TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mno_app_regs"
750   fi
751
752   AC_CACHE_CHECK([for no-relax options], grub_cv_target_cc_mno_relax, [
753     grub_cv_target_cc_mno_relax=no
754     for cand in "-mno-relax" "-Wl,--no-relax"; do
755       if test x"$grub_cv_target_cc_mno_relax" != xno ; then
756         break
757       fi
758       LDFLAGS="$TARGET_LDFLAGS $cand -nostdlib -static"
759       CFLAGS="$TARGET_CFLAGS -Werror"
760       AC_LINK_IFELSE([AC_LANG_PROGRAM([[
761             asm (".globl start; start:");
762             void __main (void);
763             void __main (void) {}
764             int main (void);
765             ]], [[]])], [grub_cv_target_cc_mno_relax="$cand"], [])
766     done
767   ])
768   LDFLAGS="$TARGET_LDFLAGS"
769   CFLAGS="$TARGET_CFLAGS"
770
771   if test x"$grub_cv_target_cc_mno_relax" = xno ; then
772     AC_MSG_ERROR([could not find no-relax options])
773   fi
774   TARGET_LDFLAGS="$TARGET_LDFLAGS $grub_cv_target_cc_mno_relax"
775 fi
776
777 # By default, GCC 4.4 generates .eh_frame sections containing unwind
778 # information in some cases where it previously did not. GRUB doesn't need
779 # these and they just use up vital space. Restore the old compiler
780 # behaviour.
781 AC_CACHE_CHECK([whether -fno-dwarf2-cfi-asm works], [grub_cv_cc_fno_dwarf2_cfi_asm], [
782   CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
783   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
784       [grub_cv_cc_fno_dwarf2_cfi_asm=yes],
785       [grub_cv_cc_fno_dwarf2_cfi_asm=no])
786 ])
787
788 if test "x$grub_cv_cc_fno_dwarf2_cfi_asm" = xyes; then
789   TARGET_CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
790 fi
791
792 if test x"$target_os" = xcygwin; then
793   AC_CACHE_CHECK([whether option -fno-reorder-functions works], grub_cv_cc_no_reorder_functions, [
794     CFLAGS="$TARGET_CFLAGS -fno-reorder-functions"
795     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
796                       [grub_cv_cc_no_reorder_functions=yes],
797                       [grub_cv_cc_no_reorder_functions=no])
798   ])
799 fi
800
801 if test x"$target_os" = xcygwin && test "x$grub_cv_cc_no_reorder_functions" = xyes; then
802   TARGET_CFLAGS="$TARGET_CFLAGS -fno-reorder-functions"
803 fi
804
805 # By default, GCC 4.6 generates .eh_frame sections containing unwind
806 # information in some cases where it previously did not. GRUB doesn't need
807 # these and they just use up vital space. Restore the old compiler
808 # behaviour.
809 AC_CACHE_CHECK([whether -fno-asynchronous-unwind-tables works], [grub_cv_cc_fno_asynchronous_unwind_tables], [
810   CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
811   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
812       [grub_cv_cc_fno_asynchronous_unwind_tables=yes],
813       [grub_cv_cc_fno_asynchronous_unwind_tables=no])
814 ])
815
816 if test "x$grub_cv_cc_fno_asynchronous_unwind_tables" = xyes; then
817   TARGET_CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables"
818 fi
819
820 AC_ARG_ENABLE([efiemu],
821               [AS_HELP_STRING([--enable-efiemu],
822                              [build and install the efiemu runtimes (default=guessed)])])
823 if test x"$enable_efiemu" = xno ; then
824   efiemu_excuse="explicitly disabled"
825 fi
826 if test x"$grub_cv_target_cc_link_format" = x-mi386pe || test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then
827   efiemu_excuse="not available on cygwin"
828 fi
829 if test x"$target_cpu" != xi386 ; then
830   efiemu_excuse="only available on i386"
831 fi
832 if test x"$platform" = xefi ; then
833   efiemu_excuse="not available on efi"
834 fi
835 if test x"$efiemu_excuse" = x ; then
836   AC_CACHE_CHECK([whether options required for efiemu work], grub_cv_cc_efiemu, [
837     CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
838     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
839                       [grub_cv_cc_efiemu=yes],
840                       [grub_cv_cc_efiemu=no])
841   ])
842   if test x$grub_cv_cc_efiemu = xno; then
843      efiemu_excuse="cannot compile with -m64 -mcmodel=large -mno-red-zone -nostdlib"
844   fi
845 fi
846 if test x"$efiemu_excuse" = x ; then
847   AC_CACHE_CHECK([for efiemu64 linking format], [grub_cv_target_cc_efiemu64_link_format], [
848     grub_cv_target_cc_efiemu64_link_format=unknown
849     for format in -melf_x86_64 -melf_x86_64_fbsd -melf_x86_64_obsd -melf_x86_64_haiku -arch,x86_64; do
850       CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
851       LDFLAGS="-m64 -Wl,$format -nostdlib -static"
852       AC_LINK_IFELSE([AC_LANG_PROGRAM([[
853       asm (".globl start; start:");
854       asm (".globl _start; _start:");
855       asm (".globl __start; __start:");
856       void __main (void);
857       void __main (void) {}
858       ]], [[]])], [flag=1], [flag=0])
859       if test x"$flag" = x1; then
860         grub_cv_target_cc_efiemu64_link_format="$format"
861         break
862       fi
863     done])
864   if test x"$grub_cv_target_cc_efiemu64_link_format" = xunknown; then
865     efiemu_excuse="no suitable link format for efiemu64 found"
866   else
867     EFIEMU64_LINK_FORMAT="-Wl,$grub_cv_target_cc_efiemu64_link_format"
868   fi
869 fi
870 if test x"$enable_efiemu" = xyes && test x"$efiemu_excuse" != x ; then
871   AC_MSG_ERROR([efiemu runtime was explicitly requested but can't be compiled ($efiemu_excuse)])
872 fi
873 if test x"$efiemu_excuse" = x ; then
874 enable_efiemu=yes
875 else
876 enable_efiemu=no
877 fi
878 AC_SUBST([enable_efiemu])
879 AC_SUBST([EFIEMU64_LINK_FORMAT])
880
881 CFLAGS="$TARGET_CFLAGS"
882
883
884 if test x"$platform" = xemu ; then
885   TARGET_OBJ2ELF=
886   grub_cv_target_cc_link_format=
887   case "$host_os" in
888     *darwin* | *mac*)
889        grub_cv_target_cc_link_format="-arch,${target_cpu}"
890        TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
891         ;;
892     *windows* | *cygwin* | *mingw*)
893       if test x${target_cpu} = xi386 ; then
894         grub_cv_target_cc_link_format=-mi386pe
895         TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)'
896       fi
897       if test x${target_cpu} = xx86_64 ; then
898         grub_cv_target_cc_link_format=-mi386pep
899         TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)'
900       fi
901       TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
902       ;;
903   esac
904 elif test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
905   AC_CACHE_CHECK([for target linking format], [grub_cv_target_cc_link_format], [
906     grub_cv_target_cc_link_format=unknown
907     for format in -melf_${target_cpu} -melf_${target_cpu}_fbsd -melf_${target_cpu}_obsd -melf_${target_cpu}_haiku -mi386pe -mi386pep -arch,${target_cpu}; do
908       if test x${target_cpu} != xi386 && test x$format = x-mi386pe; then
909         continue
910       fi
911       if test x${target_cpu} != xx86_64 && test x$format = x-mi386pep; then
912         continue
913       fi
914       CFLAGS="$TARGET_CFLAGS"
915       LDFLAGS="$TARGET_LDFLAGS -Wl,$format -nostdlib -static"
916       AC_LINK_IFELSE([AC_LANG_PROGRAM([[
917       asm (".globl start; start:");
918       asm (".globl _start; _start:");
919       asm (".globl __start; __start:");
920       void __main (void);
921       void __main (void) {}
922       ]], [[]])], [flag=1], [flag=0])
923       if test x"$flag" = x1; then
924         grub_cv_target_cc_link_format="$format"
925         break
926       fi
927     done])
928   if test x"$grub_cv_target_cc_link_format" = xunknown; then
929     AC_MSG_ERROR([no suitable link format found])
930   fi
931   TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
932   if test x"$grub_cv_target_cc_link_format" = x-mi386pe ; then
933     TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)'
934   fi
935   if test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then
936     TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)'
937   fi
938 fi
939
940 if test x$grub_cv_target_cc_link_format = x-arch,i386 || test x$grub_cv_target_cc_link_format = x-arch,x86_64; then
941    TARGET_APPLE_LINKER=1
942    AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [objconv], [])
943    if test "x$TARGET_OBJCONV" = x ; then
944       AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [./objconv], [], [.])
945    fi
946    if test "x$TARGET_OBJCONV" = x ; then
947       AC_MSG_ERROR([objconv not found which is required when building with apple compiler])
948    fi
949    TARGET_IMG_LDSCRIPT=
950    TARGET_IMG_CFLAGS="-static"
951    TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
952    TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
953    TARGET_IMG_BASE_LDOPT="-Wl,-image_base"
954    TARGET_LDFLAGS_OLDMAGIC=""
955 elif test x$grub_cv_target_cc_link_format = x-mi386pe || test x$grub_cv_target_cc_link_format = x-mi386pep ; then
956   TARGET_APPLE_LINKER=0
957   TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
958   TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/${grub_coredir}/conf/i386-cygwin-img-ld.sc"
959   TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}"
960   TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/${grub_coredir}/conf/i386-cygwin-img-ld.sc"
961   TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
962   TARGET_IMG_CFLAGS=
963 else
964   TARGET_APPLE_LINKER=0
965   TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
966   TARGET_IMG_LDSCRIPT=
967   TARGET_IMG_LDFLAGS='-Wl,-N'
968   TARGET_IMG_LDFLAGS_AC='-Wl,-N'
969   TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
970   TARGET_IMG_CFLAGS=
971 fi
972
973 AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
974
975
976 LDFLAGS="$TARGET_LDFLAGS"
977
978 if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 ; then
979   # Use large model to support 4G memory
980   AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
981     CFLAGS="$TARGET_CFLAGS -mcmodel=large"
982     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
983                       [grub_cv_cc_mcmodel=yes],
984                       [grub_cv_cc_mcmodel=no])
985   ])
986   if test "x$grub_cv_cc_mcmodel" = xyes; then
987     TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
988   elif test "$target_cpu" = sparc64; then
989     TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany"
990   fi
991 fi
992
993 if test "$target_cpu"-"$platform" = x86_64-efi; then
994   # EFI writes to stack below %rsp, we must not use the red zone
995   AC_CACHE_CHECK([whether option -mno-red-zone works], grub_cv_cc_no_red_zone, [
996     CFLAGS="$TARGET_CFLAGS -mno-red-zone"
997     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
998                       [grub_cv_cc_no_red_zone=yes],
999                       [grub_cv_cc_no_red_zone=no])
1000   ])
1001   if test "x$grub_cv_cc_no_red_zone" = xno; then
1002     AC_MSG_ERROR([-mno-red-zone not supported, upgrade your gcc])
1003   fi
1004
1005   TARGET_CFLAGS="$TARGET_CFLAGS -mno-red-zone"
1006 fi
1007
1008 if test "x$target_cpu" = xarm; then
1009   AC_CACHE_CHECK([whether option -mlong-calls works], grub_cv_cc_mlong_calls, [
1010     CFLAGS="$TARGET_CFLAGS -mlong-calls -Werror"
1011     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
1012                       [grub_cv_cc_mlong_calls=yes],
1013                       [grub_cv_cc_mlong_calls=no])
1014   ])
1015   if test "x$grub_cv_cc_mlong_calls" = xyes; then
1016     TARGET_CFLAGS="$TARGET_CFLAGS -mlong-calls"
1017   fi
1018   AC_CACHE_CHECK([whether option -mthumb-interwork works], grub_cv_cc_mthumb_interwork, [
1019     CFLAGS="$TARGET_CFLAGS -mthumb-interwork -Werror"
1020     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
1021                       [grub_cv_cc_mthumb_interwork=yes],
1022                       [grub_cv_cc_mthumb_interwork=no])
1023   ])
1024   if test "x$grub_cv_cc_mthumb_interwork" = xyes; then
1025     TARGET_CFLAGS="$TARGET_CFLAGS -mthumb-interwork"
1026   # Clang defaults to thumb interworking
1027   elif test "x$grub_cv_cc_target_clang" = xno ; then
1028     AC_MSG_ERROR([your compiler doesn't support -mthumb-interwork])
1029   fi
1030 fi
1031
1032 AC_CACHE_CHECK([whether option -Qn works], grub_cv_target_cc_qn, [
1033   CFLAGS="$TARGET_CFLAGS -Qn -Werror"
1034   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
1035                     [grub_cv_target_cc_qn=yes],
1036                     [grub_cv_target_cc_qn=no])])
1037 if test "x$grub_cv_target_cc_qn" = xyes; then
1038   TARGET_CFLAGS="$TARGET_CFLAGS -Qn"
1039 fi
1040
1041 #
1042 # Compiler features.
1043 #
1044
1045 CFLAGS="$TARGET_CFLAGS"
1046
1047 # Position independent executable.
1048 grub_CHECK_PIE
1049 [# Need that, because some distributions ship compilers that include
1050 # `-fPIE' in the default specs.
1051 if [ x"$pie_possible" = xyes ]; then
1052   TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIE"
1053 fi]
1054
1055 CFLAGS="$TARGET_CFLAGS"
1056
1057 # Position independent executable.
1058 grub_CHECK_PIC
1059 [# On most platforms we don't want PIC as it only makes relocations harder
1060 # and code less efficient. On mips we want to have one got table per module
1061 # and reload $gp in every function.
1062 # GCC implements it using symbol __gnu_local_gp in non-PIC as well.
1063 # However with clang we need PIC for this reloading to happen.
1064 # Since default varies across dictributions use either -fPIC or -fno-PIC
1065 # explicitly.
1066 if ( test x$target_cpu = xmips || test x$target_cpu = xmipsel ) && test "x$grub_cv_cc_target_clang" = xyes ; then
1067    TARGET_CFLAGS="$TARGET_CFLAGS -fPIC"
1068 elif [ x"$pic_possible" = xyes ]; then
1069    TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIC"
1070 fi]
1071
1072 CFLAGS="$TARGET_CFLAGS"
1073
1074 # Smashing stack protector.
1075 grub_CHECK_STACK_PROTECTOR
1076 # Need that, because some distributions ship compilers that include
1077 # `-fstack-protector' in the default specs.
1078 if test "x$ssp_possible" = xyes; then
1079   TARGET_CFLAGS="$TARGET_CFLAGS -fno-stack-protector"
1080 fi
1081
1082 CFLAGS="$TARGET_CFLAGS"
1083
1084 grub_CHECK_STACK_ARG_PROBE
1085 # Cygwin's GCC uses alloca() to probe the stackframe on static
1086 # stack allocations above some threshold.
1087 if test x"$sap_possible" = xyes; then
1088   TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe"
1089 fi
1090
1091 CFLAGS="$TARGET_CFLAGS"
1092
1093 # -mno-unaligned-access -mstrict-align
1094 if test "$target_cpu" = arm; then
1095   AC_CACHE_CHECK([for compile options to get strict alignment], [grub_cv_target_cc_strict_align], [
1096     grub_cv_target_cc_strict_align=
1097     for arg in -mno-unaligned-access "-Xclang -mstrict-align" -mstrict-align; do
1098       CFLAGS="$TARGET_CFLAGS $arg -Werror"
1099       LDFLAGS="$TARGET_LDFLAGS"
1100       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [flag=1], [flag=0])
1101       if test x"$flag" = x1; then
1102         grub_cv_target_cc_strict_align="$arg"
1103         break
1104       fi
1105     done])
1106
1107   TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_strict_align"
1108   if test x"$grub_cv_target_cc_strict_align" = x"-Xclang -mstrict-align"; then
1109     TARGET_LDFLAGS="$TARGET_LDFLAGS -Qunused-arguments"
1110   fi
1111   AC_CACHE_CHECK([if compiler generates unaligned accesses], [grub_cv_cc_target_emits_unaligned],
1112   [CFLAGS="$TARGET_CFLAGS"
1113    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[
1114 #ifdef __ARM_FEATURE_UNALIGNED
1115 #error "unaligned"
1116 #endif
1117      ]])],
1118      [grub_cv_cc_target_emits_unaligned=no], [grub_cv_cc_target_emits_unaligned=yes])])
1119   if test x$grub_cv_cc_target_emits_unaligned = xyes; then
1120     AC_MSG_ERROR([compiler generates unaligned accesses])
1121   fi
1122 fi
1123
1124 # Set them to their new values for the tests below.
1125 CC="$TARGET_CC"
1126 if test x"$platform" = xemu ; then
1127 CFLAGS="$TARGET_CFLAGS -Wno-error"
1128 elif test "x$TARGET_APPLE_LINKER" = x1 ; then
1129 CFLAGS="$TARGET_CFLAGS -nostdlib -static -Wno-error"
1130 else
1131 CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error"
1132 fi
1133 CPPFLAGS="$TARGET_CPPFLAGS"
1134
1135 grub_ASM_USCORE
1136 if test "x$TARGET_APPLE_LINKER" = x0 && test x"$platform" != xemu; then
1137 if test x$grub_cv_asm_uscore = xyes; then
1138 DEFSYM="-Wl,--defsym,_abort=_main -Wl,--defsym,__main=_main"
1139 else
1140 DEFSYM="-Wl,--defsym,abort=main -Wl,--defsym,_main=main -Wl,--defsym,__main=main"
1141 fi
1142 CFLAGS="$TARGET_CFLAGS -nostdlib $DEFSYM"
1143 fi
1144
1145 # Check for libgcc symbols
1146 if test x"$platform" = xemu; then
1147 AC_CHECK_FUNCS(__udivsi3 __umodsi3 __divsi3 __modsi3 __divdi3 __moddi3 __udivdi3 __umoddi3 __ctzdi2 __ctzsi2 __aeabi_uidiv __aeabi_uidivmod __aeabi_idiv __aeabi_idivmod __aeabi_ulcmp __muldi3 __aeabi_lmul __aeabi_memcpy __aeabi_memset __aeabi_lasr __aeabi_llsl __aeabi_llsr _restgpr_14_x __ucmpdi2 __ashldi3 __ashrdi3 __lshrdi3 __bswapsi2 __bswapdi2 __bzero __register_frame_info __deregister_frame_info ___chkstk_ms __chkstk_ms)
1148 fi
1149
1150 if test "x$TARGET_APPLE_LINKER" = x1 ; then
1151 CFLAGS="$TARGET_CFLAGS -nostdlib -static"
1152 else
1153 CFLAGS="$TARGET_CFLAGS -nostdlib"
1154 fi
1155 LIBS=""
1156
1157 # Defined in aclocal.m4.
1158 grub_PROG_TARGET_CC
1159 if test "x$TARGET_APPLE_LINKER" != x1 ; then
1160 grub_PROG_OBJCOPY_ABSOLUTE
1161 fi
1162 grub_PROG_LD_BUILD_ID_NONE
1163 if test "x$target_cpu" = xi386; then
1164   if test "$platform" != emu && test "x$TARGET_APPLE_LINKER" != x1 ; then
1165     if test ! -z "$TARGET_IMG_LDSCRIPT"; then
1166       # Check symbols provided by linker script.
1167       CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},0x8000"
1168     fi
1169     grub_CHECK_BSS_START_SYMBOL
1170     grub_CHECK_END_SYMBOL
1171   fi
1172   CFLAGS="$TARGET_CFLAGS"
1173 fi
1174
1175 grub_PROG_NM_WORKS
1176 grub_PROG_NM_MINUS_P
1177 grub_PROG_NM_DEFINED_ONLY
1178 AC_SUBST(TARGET_NMFLAGS_MINUS_P)
1179 AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY)
1180
1181 if test "$platform" != emu; then
1182 AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [
1183   SAVED_CPPFLAGS="$CPPFLAGS"
1184   CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
1185   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
1186 #include <stddef.h>
1187 int va_arg_func (int fixed, va_list args);]], [[]])],
1188       [grub_cv_cc_isystem=yes],
1189       [grub_cv_cc_isystem=no])
1190   CPPFLAGS="$SAVED_CPPFLAGS"
1191 ])
1192
1193 if test x"$grub_cv_cc_isystem" = xyes ; then
1194   TARGET_CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
1195 fi
1196 fi
1197
1198 AC_CACHE_CHECK([whether -Wtrampolines work], [grub_cv_cc_wtrampolines], [
1199   CFLAGS="$TARGET_CFLAGS -Wtrampolines -Werror"
1200   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
1201 int va_arg_func (int fixed, va_list args);]], [[]])],
1202       [grub_cv_cc_wtrampolines=yes],
1203       [grub_cv_cc_wtrampolines=no])
1204 ])
1205
1206 if test x"$grub_cv_cc_wtrampolines" = xyes ; then
1207   TARGET_CFLAGS="$TARGET_CFLAGS -Wtrampolines"
1208 fi
1209
1210 # Restore the flags.
1211 CC="$tmp_CC"
1212 CFLAGS="$tmp_CFLAGS"
1213 CPPFLAGS="$tmp_CPPFLAGS"
1214 LDFLAGS="$tmp_LDFLAGS"
1215 LIBS="$tmp_LIBS"
1216
1217 #
1218 # Check for options.
1219 #
1220
1221 # Memory manager debugging.
1222 AC_ARG_ENABLE([mm-debug],
1223               AS_HELP_STRING([--enable-mm-debug],
1224                              [include memory manager debugging]),
1225               [AC_DEFINE([MM_DEBUG], [1],
1226                          [Define to 1 if you enable memory manager debugging.])])
1227
1228 AC_ARG_ENABLE([cache-stats],
1229               AS_HELP_STRING([--enable-cache-stats],
1230                              [enable disk cache statistics collection]))
1231
1232 if test x$enable_cache_stats = xyes; then
1233   DISK_CACHE_STATS=1
1234 else
1235   DISK_CACHE_STATS=0
1236 fi
1237 AC_SUBST([DISK_CACHE_STATS])
1238
1239 AC_ARG_ENABLE([boot-time],
1240               AS_HELP_STRING([--enable-boot-time],
1241                              [enable boot time statistics collection]))
1242
1243 if test x$enable_boot_time = xyes; then
1244   BOOT_TIME_STATS=1
1245 else
1246   BOOT_TIME_STATS=0
1247 fi
1248 AC_SUBST([BOOT_TIME_STATS])
1249
1250 AC_ARG_ENABLE([grub-emu-sdl],
1251               [AS_HELP_STRING([--enable-grub-emu-sdl],
1252                              [build and install the `grub-emu' debugging utility with SDL support (default=guessed)])])
1253
1254 AC_ARG_ENABLE([grub-emu-pci],
1255               [AS_HELP_STRING([--enable-grub-emu-pci],
1256                              [build and install the `grub-emu' debugging utility with PCI support (potentially dangerous) (default=no)])])
1257
1258 if test "$platform" = emu; then
1259
1260 if test x"$enable_grub_emu_sdl" = xno ; then
1261   grub_emu_sdl_excuse="explicitly disabled"
1262 fi
1263 [if [ x"$grub_emu_sdl_excuse" = x ]; then
1264     # Check for libSDL libraries.]
1265 AC_CHECK_LIB([SDL], [SDL_Init], [LIBSDL="-lSDL"],
1266     [grub_emu_sdl_excuse=["libSDL libraries are required to build \`grub-emu' with SDL support"]])
1267     AC_SUBST([LIBSDL])
1268 [fi]
1269
1270 [if [ x"$grub_emu_sdl_excuse" = x ]; then
1271     # Check for headers.]
1272     AC_CHECK_HEADERS([SDL/SDL.h], [],
1273       [grub_emu_sdl_excuse=["libSDL header file is required to build \`grub-emu' with SDL support"]])
1274 [fi]
1275
1276 if test x"enable_grub_emu_sdl" = xyes && test x"$grub_emu_sdl_excuse" != x ; then
1277   AC_MSG_ERROR([SDL support for grub-emu was explicitly requested but can't be compiled ($grub_emu_sdl_excuse)])
1278 fi
1279 if test x"$grub_emu_sdl_excuse" = x ; then
1280 enable_grub_emu_sdl=yes
1281 else
1282 enable_grub_emu_sdl=no
1283 fi
1284
1285 if test x"$enable_grub_emu_pci" != xyes ; then
1286    grub_emu_pci_excuse="not enabled"
1287 fi
1288
1289 [if [ x"$grub_emu_pci_excuse" = x ]; then
1290       # Check for libpci libraries.]
1291    AC_CHECK_LIB([pciaccess], [pci_system_init], [LIBPCIACCESS="-lpciaccess"],
1292       [grub_emu_pci_excuse=["need libpciaccess library"]])
1293     AC_SUBST([LIBPCIACCESS])
1294 [fi]
1295 [if [ x"$grub_emu_pci_excuse" = x ]; then
1296     # Check for headers.]
1297     AC_CHECK_HEADERS([pciaccess.h], [],
1298       [grub_emu_pci_excuse=["need libpciaccess headers"]])
1299 [fi]
1300
1301 if test x"$grub_emu_pci_excuse" = x ; then
1302 enable_grub_emu_pci=yes
1303 else
1304
1305 enable_grub_emu_pci=no
1306 fi
1307
1308 AC_SUBST([enable_grub_emu_sdl])
1309 AC_SUBST([enable_grub_emu_pci])
1310
1311 else
1312
1313 # Ignore --enable-emu-* if platform is not emu
1314 enable_grub_emu_sdl=no
1315 enable_grub_emu_pci=no
1316 fi
1317
1318 AC_ARG_ENABLE([grub-mkfont],
1319               [AS_HELP_STRING([--enable-grub-mkfont],
1320                              [build and install the `grub-mkfont' utility (default=guessed)])])
1321 if test x"$enable_grub_mkfont" = xno ; then
1322   grub_mkfont_excuse="explicitly disabled"
1323 fi
1324
1325 if test x"$grub_mkfont_excuse" = x ; then
1326   # Check for freetype libraries.
1327   AC_CHECK_TOOLS([FREETYPE], [freetype-config])
1328   if test "x$FREETYPE" = x ; then
1329     grub_mkfont_excuse=["need freetype2 library"]
1330   fi
1331 fi
1332
1333 unset ac_cv_header_ft2build_h
1334
1335 if test x"$grub_mkfont_excuse" = x ; then
1336   # Check for freetype libraries.
1337   freetype_cflags=`$FREETYPE --cflags`
1338   freetype_libs=`$FREETYPE --libs`
1339   SAVED_CPPFLAGS="$CPPFLAGS"
1340   SAVED_LIBS="$LIBS"
1341   CPPFLAGS="$CPPFLAGS $freetype_cflags"
1342   LIBS="$LIBS $freetype_libs"
1343   AC_CHECK_HEADERS([ft2build.h], [],
1344         [grub_mkfont_excuse=["need freetype2 headers"]])
1345   AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_mkfont_excuse=["freetype2 library unusable"]])
1346   CPPFLAGS="$SAVED_CPPFLAGS"
1347   LIBS="$SAVED_LIBS"
1348 fi
1349
1350 if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then
1351   AC_MSG_ERROR([grub-mkfont was explicitly requested but can't be compiled ($grub_mkfont_excuse)])
1352 fi
1353 if test x"$grub_mkfont_excuse" = x ; then
1354 enable_grub_mkfont=yes
1355 else
1356 enable_grub_mkfont=no
1357 fi
1358 AC_SUBST([enable_grub_mkfont])
1359 AC_SUBST([freetype_cflags])
1360 AC_SUBST([freetype_libs])
1361
1362 SAVED_CC="$CC"
1363 SAVED_CPP="$CPP"
1364 SAVED_CFLAGS="$CFLAGS"
1365 SAVED_CPPFLAGS="$CPPFLAGS"
1366 SAVED_LDFLAGS="$LDFLAGS"
1367 CC="$BUILD_CC"
1368 CPP="$BUILD_CPP"
1369 CFLAGS="$BUILD_CFLAGS"
1370 CPPFLAGS="$BUILD_CPPFLAGS"
1371 LDFLAGS="$BUILD_LDFAGS"
1372
1373 unset ac_cv_c_bigendian
1374 unset ac_cv_header_ft2build_h
1375
1376 AC_COMPUTE_INT([BUILD_SIZEOF_VOID_P], [sizeof (void *)])
1377 AC_COMPUTE_INT([BUILD_SIZEOF_LONG], [sizeof (long)])
1378 AC_C_BIGENDIAN([BUILD_WORDS_BIGENDIAN=1], [BUILD_WORDS_BIGENDIAN=0], [BUILD_WORDS_BIGENDIAN=err], [BUILD_WORDS_BIGENDIAN=err])
1379
1380 if test x$BUILD_WORDS_BIGENDIAN = xerr ; then
1381    AC_MSG_ERROR([couldnt determine build endianness])
1382 fi
1383
1384 AC_SUBST([BUILD_SIZEOF_LONG])
1385 AC_SUBST([BUILD_SIZEOF_VOID_P])
1386 AC_SUBST([BUILD_WORDS_BIGENDIAN])
1387
1388 if test x"$grub_build_mkfont_excuse" = x ; then
1389   # Check for freetype libraries.
1390   AC_CHECK_PROGS([BUILD_FREETYPE], [freetype-config])
1391   if test "x$BUILD_FREETYPE" = x ; then
1392     grub_build_mkfont_excuse=["need freetype2 library"]
1393   fi
1394 fi
1395
1396 if test x"$grub_build_mkfont_excuse" = x ; then
1397   # Check for freetype libraries.
1398   build_freetype_cflags=`$BUILD_FREETYPE --cflags`
1399   build_freetype_libs=`$BUILD_FREETYPE --libs`
1400   SAVED_CPPFLAGS_2="$CPPFLAGS"
1401   SAVED_LIBS="$LIBS"
1402   CPPFLAGS="$CPPFLAGS $build_freetype_cflags"
1403   LIBS="$LIBS $build_freetype_libs"
1404   AC_CHECK_HEADERS([ft2build.h], [],
1405         [grub_build_mkfont_excuse=["need freetype2 headers"]])
1406   AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_build_mkfont_excuse=["freetype2 library unusable"]])
1407   LIBS="$SAVED_LIBS"
1408   CPPFLAGS="$SAVED_CPPFLAGS_2"
1409 fi
1410
1411 if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then
1412   AC_MSG_ERROR([build-grub-mkfont was explicitly requested but can't be compiled ($grub_build_mkfont_excuse)])
1413 fi
1414 if test x"$grub_build_mkfont_excuse" = x ; then
1415   enable_build_grub_mkfont=yes
1416 else
1417   enable_build_grub_mkfont=no
1418 fi
1419 if test x"$enable_build_grub_mkfont" = xno && ( test "x$platform" = xqemu || test "x$platform" = xloongson || test "x$platform" = xqemu_mips || test "x$target_cpu"-"$platform" = xpowerpc-ieee1275 || test "x$platform" = xcoreboot ); then
1420   if test x"$grub_build_mkfont_excuse" = x ; then
1421     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont])
1422   else
1423     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont ($grub_build_mkfont_excuse)])
1424   fi
1425 fi
1426
1427 AC_SUBST([build_freetype_cflags])
1428 AC_SUBST([build_freetype_libs])
1429
1430 CC="$SAVED_CC"
1431 CPP="$SAVED_CPP"
1432 CFLAGS="$SAVED_CFLAGS"
1433 CPPFLAGS="$SAVED_CPPFLAGS"
1434 LDFLAGS="$SAVED_LDFLAGS"
1435
1436
1437 DJVU_FONT_SOURCE=
1438
1439 starfield_excuse=
1440
1441 AC_ARG_ENABLE([grub-themes],
1442               [AS_HELP_STRING([--enable-grub-themes],
1443                              [build and install GRUB themes (default=guessed)])])
1444 if test x"$enable_grub_themes" = xno ; then
1445   starfield_excuse="explicitly disabled"
1446 fi
1447
1448 if test x"$starfield_excuse" = x && test x"$enable_build_grub_mkfont" = xno ; then
1449   starfield_excuse="No build-time grub-mkfont"
1450 fi
1451
1452 if test x"$starfield_excuse" = x; then
1453    for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
1454      for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/truetype/ttf-dejavu /usr/share/fonts/dejavu /usr/share/fonts/truetype; do
1455         if test -f "$dir/DejaVuSans.$ext"; then
1456           DJVU_FONT_SOURCE="$dir/DejaVuSans.$ext"
1457           break 2
1458         fi
1459      done
1460    done
1461
1462    if test "x$DJVU_FONT_SOURCE" = x; then
1463      starfield_excuse="No DejaVu found"
1464    fi
1465 fi
1466
1467 if test x"$enable_grub_themes" = xyes &&  test x"$starfield_excuse" != x; then
1468    AC_MSG_ERROR([themes were explicitly requested but requirements are not satisfied ($starfield_excuse)])
1469 fi
1470
1471 AC_SUBST([DJVU_FONT_SOURCE])
1472
1473 FONT_SOURCE=
1474
1475 for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
1476   for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/unifont /usr/share/fonts/uni /usr/share/fonts/truetype/unifont /usr/share/fonts/misc; do
1477     if test -f "$dir/unifont.$ext"; then
1478       md5="$(md5sum "$dir/unifont.$ext"|awk '{ print $1; }')"
1479       # PCF and BDF from version 6.3 isn't hanled properly by libfreetype.
1480       if test "$md5" = 0a54834d2788c83886a3e1785a6a1e61 || test "$md5" = 28f2565c7a41d8d407e2551159385edb || test "$md5" = dae5e588461b3b92b87b6ffee734f936 || test "$md5" = 4a3d687aa5bb329ed05f4263a1016791 ; then
1481         continue
1482       fi
1483       FONT_SOURCE="$dir/unifont.$ext"
1484       break 2
1485     fi
1486   done
1487 done
1488
1489 if test x"$enable_build_grub_mkfont" = xno ; then
1490   FONT_SOURCE=
1491 fi
1492
1493 if test "x$FONT_SOURCE" = x && ( test "x$platform" = xqemu || test "x$platform" = xloongson || test "x$platform" = xqemu_mips || test "x$target_cpu"-"$platform" = xpowerpc-ieee1275 || test "x$platform" = xcoreboot ); then
1494   if test x"$grub_build_mkfont_excuse" = x ; then
1495     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont])
1496   else
1497     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont ($grub_build_mkfont_excuse)])
1498   fi
1499 fi
1500
1501 AC_SUBST([FONT_SOURCE])
1502
1503 if test x"$FONT_SOURCE" = x &&  test x"$DJVU_FONT_SOURCE" = x && test x"$grub_build_mkfont_excuse" = x; then
1504   grub_build_mkfont_excuse="no fonts"
1505 fi
1506
1507
1508 AC_ARG_ENABLE([grub-mount],
1509               [AS_HELP_STRING([--enable-grub-mount],
1510                              [build and install the `grub-mount' utility (default=guessed)])])
1511 if test x"$enable_grub_mount" = xno ; then
1512   grub_mount_excuse="explicitly disabled"
1513 fi
1514
1515 if test x"$grub_mount_excuse" = x ; then
1516   AC_CHECK_LIB([fuse], [fuse_main_real], [],
1517                [grub_mount_excuse="need FUSE library"])
1518 fi
1519
1520 if test x"$grub_mount_excuse" = x ; then
1521   # Check for fuse headers.
1522   SAVED_CPPFLAGS="$CPPFLAGS"
1523   CPPFLAGS="$CPPFLAGS -DFUSE_USE_VERSION=26"
1524   AC_CHECK_HEADERS([fuse/fuse.h], [],
1525         [grub_mount_excuse=["need FUSE headers"]])
1526   CPPFLAGS="$SAVED_CPPFLAGS"
1527 fi
1528
1529 if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then
1530   AC_MSG_ERROR([grub-mount was explicitly requested but can't be compiled ($grub_mount_excuse)])
1531 fi
1532 if test x"$grub_mount_excuse" = x ; then
1533 enable_grub_mount=yes
1534 else
1535 enable_grub_mount=no
1536 fi
1537 AC_SUBST([enable_grub_mount])
1538
1539 AC_ARG_ENABLE([device-mapper],
1540               [AS_HELP_STRING([--enable-device-mapper],
1541                               [enable Linux device-mapper support (default=guessed)])])
1542 if test x"$enable_device_mapper" = xno ; then
1543   device_mapper_excuse="explicitly disabled"
1544 fi
1545
1546 if test x"$device_mapper_excuse" = x ; then
1547   # Check for device-mapper header.
1548   AC_CHECK_HEADER([libdevmapper.h], [],
1549                [device_mapper_excuse="need libdevmapper header"])
1550 fi
1551
1552 if test x"$device_mapper_excuse" = x ; then
1553   # Check for device-mapper library.
1554   AC_CHECK_LIB([devmapper], [dm_task_create], [],
1555                [device_mapper_excuse="need devmapper library"])
1556 fi
1557
1558 if test x"$device_mapper_excuse" = x ; then
1559   # Check for device-mapper library.
1560   AC_CHECK_LIB([devmapper], [dm_log_with_errno_init],
1561                [],
1562                [device_mapper_excuse="need devmapper library"])
1563 fi
1564
1565 if test x"$device_mapper_excuse" = x ; then
1566    LIBDEVMAPPER="-ldevmapper"
1567    AC_DEFINE([HAVE_DEVICE_MAPPER], [1],
1568              [Define to 1 if you have the devmapper library.])
1569 fi
1570
1571 AC_SUBST([LIBDEVMAPPER])
1572
1573 LIBGEOM=
1574 if test x$host_kernel = xkfreebsd; then
1575   AC_CHECK_LIB([geom], [geom_gettree], [],
1576                [AC_MSG_ERROR([Your platform requires libgeom])])
1577   LIBGEOM="-lgeom"
1578 fi
1579
1580 AC_SUBST([LIBGEOM])
1581
1582 AC_ARG_ENABLE([liblzma],
1583               [AS_HELP_STRING([--enable-liblzma],
1584                               [enable liblzma integration (default=guessed)])])
1585 if test x"$enable_liblzma" = xno ; then
1586   liblzma_excuse="explicitly disabled"
1587 fi
1588
1589 if test x"$liblzma_excuse" = x ; then
1590 AC_CHECK_LIB([lzma], [lzma_code],
1591              [],[liblzma_excuse="need lzma library"])
1592 fi
1593 if test x"$liblzma_excuse" = x ; then
1594 AC_CHECK_HEADER([lzma.h], [], [liblzma_excuse="need lzma header"])
1595 fi
1596
1597 if test x"$enable_liblzma" = xyes && test x"$liblzma_excuse" != x ; then
1598   AC_MSG_ERROR([liblzma support was explicitly requested but requirements are not satisfied ($liblzma_excuse)])
1599 fi
1600
1601
1602 if test x"$liblzma_excuse" = x ; then
1603    LIBLZMA="-llzma"
1604    AC_DEFINE([USE_LIBLZMA], [1],
1605              [Define to 1 if you have the LZMA library.])
1606 fi
1607
1608 AC_SUBST([LIBLZMA])
1609
1610 AC_ARG_ENABLE([libzfs],
1611               [AS_HELP_STRING([--enable-libzfs],
1612                               [enable libzfs integration (default=guessed)])])
1613 if test x"$enable_libzfs" = xno ; then
1614   libzfs_excuse="explicitly disabled"
1615 fi
1616
1617 if test x"$libzfs_excuse" = x ; then
1618   # Only check for system headers if libzfs support has not been disabled.
1619   AC_CHECK_HEADERS(libzfs.h libnvpair.h)
1620 fi
1621
1622 if test x"$libzfs_excuse" = x ; then
1623   AC_CHECK_LIB([zfs], [libzfs_init],
1624                [],
1625                [libzfs_excuse="need zfs library"])
1626 fi
1627
1628 if test x"$libzfs_excuse" = x ; then
1629   AC_CHECK_LIB([nvpair], [nvlist_lookup_string],
1630                [],
1631                [libzfs_excuse="need nvpair library"])
1632 fi
1633
1634 if test x"$enable_libzfs" = xyes && test x"$libzfs_excuse" != x ; then
1635   AC_MSG_ERROR([libzfs support was explicitly requested but requirements are not satisfied ($libzfs_excuse)])
1636 fi
1637
1638 if test x"$libzfs_excuse" = x ; then
1639   # We need both libzfs and libnvpair for a successful build.
1640   LIBZFS="-lzfs"
1641   AC_DEFINE([HAVE_LIBZFS], [1],
1642             [Define to 1 if you have the ZFS library.])
1643   LIBNVPAIR="-lnvpair"
1644   AC_DEFINE([HAVE_LIBNVPAIR], [1],
1645             [Define to 1 if you have the NVPAIR library.])
1646 fi
1647
1648 AC_SUBST([LIBZFS])
1649 AC_SUBST([LIBNVPAIR])
1650
1651 LIBS=""
1652
1653 AC_SUBST([FONT_SOURCE])
1654 AS_IF([test x$target_cpu = xi386 -a x$platform = xqemu],
1655             [AC_SUBST([GRUB_BOOT_MACHINE_LINK_ADDR], 0xffe00)])
1656
1657 AC_SUBST(HAVE_ASM_USCORE)
1658 AC_SUBST(BSS_START_SYMBOL)
1659 AC_SUBST(END_SYMBOL)
1660 AC_SUBST(PACKAGE)
1661 AC_SUBST(VERSION)
1662
1663 AC_ARG_ENABLE([werror],
1664               [AS_HELP_STRING([--disable-werror],
1665                              [do not use -Werror when building GRUB])])
1666 if test x"$enable_werror" != xno ; then
1667   TARGET_CFLAGS="$TARGET_CFLAGS -Werror"
1668   HOST_CFLAGS="$HOST_CFLAGS -Werror"
1669 fi
1670
1671 TARGET_CPP="$TARGET_CC -E"
1672 TARGET_CCAS=$TARGET_CC
1673
1674 # Includes which include make-time substitutions. They must come last
1675 # as to avoid executing top_builddir in shell.
1676 HOST_CPPFLAGS="$HOST_CPPFLAGS -I\$(top_builddir)/include"
1677 TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_srcdir)/include"
1678 TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_builddir)/include"
1679
1680 GRUB_TARGET_CPU="${target_cpu}"
1681 GRUB_PLATFORM="${platform}"
1682
1683 AC_SUBST(GRUB_TARGET_CPU)
1684 AC_SUBST(GRUB_PLATFORM)
1685
1686 AC_SUBST(TARGET_OBJCONV)
1687 AC_SUBST(TARGET_CPP)
1688 AC_SUBST(TARGET_CCAS)
1689 AC_SUBST(TARGET_OBJ2ELF)
1690 AC_SUBST(TARGET_MODULE_FORMAT)
1691 AC_SUBST(TARGET_CC_VERSION)
1692
1693 AC_SUBST(TARGET_CFLAGS)
1694 AC_SUBST(TARGET_LDFLAGS)
1695 AC_SUBST(TARGET_CPPFLAGS)
1696 AC_SUBST(TARGET_CCASFLAGS)
1697
1698 AC_SUBST(TARGET_IMG_LDFLAGS)
1699 AC_SUBST(TARGET_IMG_CFLAGS)
1700 AC_SUBST(TARGET_IMG_BASE_LDOPT)
1701 AC_SUBST(TARGET_APPLE_LINKER)
1702
1703 AC_SUBST(HOST_CFLAGS)
1704 AC_SUBST(HOST_LDFLAGS)
1705 AC_SUBST(HOST_CPPFLAGS)
1706 AC_SUBST(HOST_CCASFLAGS)
1707
1708 AC_SUBST(BUILD_LIBM)
1709
1710 #
1711 # Automake conditionals
1712 #
1713
1714 AM_CONDITIONAL([COND_real_platform], [test x$platform != xnone])
1715 AM_CONDITIONAL([COND_emu], [test x$platform = xemu])
1716 AM_CONDITIONAL([COND_i386_pc], [test x$target_cpu = xi386 -a x$platform = xpc])
1717 AM_CONDITIONAL([COND_i386_efi], [test x$target_cpu = xi386 -a x$platform = xefi])
1718 AM_CONDITIONAL([COND_ia64_efi], [test x$target_cpu = xia64 -a x$platform = xefi])
1719 AM_CONDITIONAL([COND_i386_qemu], [test x$target_cpu = xi386 -a x$platform = xqemu])
1720 AM_CONDITIONAL([COND_i386_ieee1275], [test x$target_cpu = xi386 -a x$platform = xieee1275])
1721 AM_CONDITIONAL([COND_i386_coreboot], [test x$target_cpu = xi386 -a x$platform = xcoreboot])
1722 AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot])
1723 AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi])
1724 AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen])
1725 AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen])
1726 AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson])
1727 AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")"  -a x$platform = xqemu_mips])
1728 AM_CONDITIONAL([COND_mips_arc], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")"  -a x$platform = xarc])
1729 AM_CONDITIONAL([COND_sparc64_ieee1275], [test x$target_cpu = xsparc64 -a x$platform = xieee1275])
1730 AM_CONDITIONAL([COND_sparc64_emu], [test x$target_cpu = xsparc64 -a x$platform = xemu])
1731 AM_CONDITIONAL([COND_powerpc_ieee1275], [test x$target_cpu = xpowerpc -a x$platform = xieee1275])
1732 AM_CONDITIONAL([COND_mips], [test x$target_cpu = xmips -o x$target_cpu = xmipsel])
1733 AM_CONDITIONAL([COND_mipsel], [test x$target_cpu = xmipsel])
1734 AM_CONDITIONAL([COND_mipseb], [test x$target_cpu = xmips])
1735 AM_CONDITIONAL([COND_arm], [test x$target_cpu = xarm ])
1736 AM_CONDITIONAL([COND_arm_uboot], [test x$target_cpu = xarm -a x$platform = xuboot])
1737 AM_CONDITIONAL([COND_arm_efi], [test x$target_cpu = xarm -a x$platform = xefi])
1738 AM_CONDITIONAL([COND_arm64], [test x$target_cpu = xarm64 ])
1739 AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi])
1740
1741 AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd])
1742 AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux])
1743 AM_CONDITIONAL([COND_HOST_NETBSD], [test x$host_kernel = xnetbsd])
1744 AM_CONDITIONAL([COND_HOST_WINDOWS], [test x$host_kernel = xwindows])
1745 AM_CONDITIONAL([COND_HOST_KFREEBSD], [test x$host_kernel = xkfreebsd])
1746 AM_CONDITIONAL([COND_HOST_XNU], [test x$host_kernel = xxnu])
1747 AM_CONDITIONAL([COND_HOST_ILLUMOS], [test x$host_kernel = xillumos])
1748
1749 AM_CONDITIONAL([COND_MAN_PAGES], [test x$cross_compiling = xno -a x$HELP2MAN != x])
1750 AM_CONDITIONAL([COND_GRUB_EMU_SDL], [test x$enable_grub_emu_sdl = xyes])
1751 AM_CONDITIONAL([COND_GRUB_EMU_PCI], [test x$enable_grub_emu_pci = xyes])
1752 AM_CONDITIONAL([COND_GRUB_MKFONT], [test x$enable_grub_mkfont = xyes])
1753 AM_CONDITIONAL([COND_GRUB_MOUNT], [test x$enable_grub_mount = xyes])
1754 AM_CONDITIONAL([COND_HAVE_FONT_SOURCE], [test x$FONT_SOURCE != x])
1755 if test x$FONT_SOURCE != x ; then
1756    HAVE_FONT_SOURCE=1
1757 else
1758    HAVE_FONT_SOURCE=0
1759 fi
1760 AC_SUBST(HAVE_FONT_SOURCE)
1761 AM_CONDITIONAL([COND_APPLE_LINKER], [test x$TARGET_APPLE_LINKER = x1])
1762 AM_CONDITIONAL([COND_ENABLE_EFIEMU], [test x$enable_efiemu = xyes])
1763 AM_CONDITIONAL([COND_ENABLE_CACHE_STATS], [test x$DISK_CACHE_STATS = x1])
1764 AM_CONDITIONAL([COND_ENABLE_BOOT_TIME_STATS], [test x$BOOT_TIME_STATS = x1])
1765
1766 AM_CONDITIONAL([COND_HAVE_CXX], [test x$HAVE_CXX = xyes])
1767
1768 AM_CONDITIONAL([COND_HAVE_ASM_USCORE], [test x$HAVE_ASM_USCORE = x1])
1769 AM_CONDITIONAL([COND_STARFIELD], [test "x$starfield_excuse" = x])
1770 AM_CONDITIONAL([COND_HAVE_EXEC], [test "x$have_exec" = xy])
1771
1772 test "x$prefix" = xNONE && prefix="$ac_default_prefix"
1773 test "x$exec_prefix" = xNONE && exec_prefix="${prefix}"
1774 datarootdir="$(eval echo "$datarootdir")"
1775 grub_libdir="$(eval echo "$libdir")"
1776 grub_localedir="$(eval echo "$localedir")"
1777 grub_datadir="$(eval echo "$datadir")"
1778 grub_sysconfdir="$(eval echo "$sysconfdir")"
1779 AC_DEFINE_UNQUOTED(LOCALEDIR, "$grub_localedir", [Locale dir])
1780 AC_DEFINE_UNQUOTED(GRUB_LIBDIR, "$grub_libdir", [Library dir])
1781 AC_DEFINE_UNQUOTED(GRUB_DATADIR, "$grub_datadir", [Data dir])
1782 AC_DEFINE_UNQUOTED(GRUB_SYSCONFDIR, "$grub_sysconfdir", [Configuration dir])
1783
1784
1785 # Output files.
1786 if test "$platform" != none; then
1787   cpudir="${target_cpu}"
1788   if test x${cpudir} = xmipsel; then
1789     cpudir=mips;
1790   fi
1791   grub_CHECK_LINK_DIR
1792   if test x"$link_dir" = xyes ; then
1793     AC_CONFIG_LINKS([include/grub/cpu:include/grub/$cpudir])
1794     if test "$platform" != emu ; then
1795       AC_CONFIG_LINKS([include/grub/machine:include/grub/$cpudir/$platform])
1796     fi
1797   else
1798     mkdir -p include/grub 2>/dev/null
1799     rm -rf include/grub/cpu
1800     cp -rp $srcdir/include/grub/$cpudir include/grub/cpu 2>/dev/null
1801     if test "$platform" != emu ; then
1802       rm -rf include/grub/machine
1803       cp -rp $srcdir/include/grub/$cpudir/$platform include/grub/machine 2>/dev/null
1804     fi
1805   fi
1806 else
1807   # Just enough to stop the compiler failing with -I$(srcdir)/include.
1808   mkdir -p include 2>/dev/null
1809   rm -rf include/grub/cpu include/grub/machine
1810 fi
1811
1812 AC_CONFIG_FILES([Makefile])
1813 AC_CONFIG_FILES([grub-core/Makefile])
1814 AC_CONFIG_FILES([grub-core/gnulib/Makefile])
1815 AC_CONFIG_FILES([po/Makefile.in])
1816 AC_CONFIG_FILES([docs/Makefile])
1817 AC_CONFIG_FILES([util/bash-completion.d/Makefile])
1818 AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
1819 AC_CONFIG_FILES([config.h])
1820
1821 AC_OUTPUT
1822 [
1823 echo "*******************************************************"
1824 echo GRUB2 will be compiled with following components:
1825 echo Platform: "$target_cpu"-"$platform"
1826 if [ x"$platform" = xemu ]; then
1827 if [ x"$grub_emu_sdl_excuse" = x ]; then
1828 echo SDL support for grub-emu: Yes
1829 else
1830 echo SDL support for grub-emu: No "($grub_emu_sdl_excuse)"
1831 fi
1832 if [ x"$grub_emu_pci_excuse" = x ]; then
1833 echo PCI support for grub-emu: Yes
1834 else
1835 echo PCI support for grub-emu: No "($grub_emu_pci_excuse)"
1836 fi
1837 fi
1838 if test x"$device_mapper_excuse" = x ; then
1839 echo With devmapper support: Yes
1840 else
1841 echo With devmapper support: No "($device_mapper_excuse)"
1842 fi
1843 if [ x"$enable_mm_debug" = xyes ]; then
1844 echo With memory debugging: Yes
1845 else
1846 echo With memory debugging: No
1847 fi
1848 if [ x"$enable_cache_stats" = xyes ]; then
1849 echo With disk cache statistics: Yes
1850 else
1851 echo With disk cache statistics: No
1852 fi
1853
1854 if [ x"$enable_boot_time" = xyes ]; then
1855 echo With boot time statistics: Yes
1856 else
1857 echo With boot time statistics: No
1858 fi
1859
1860 if [ x"$efiemu_excuse" = x ]; then
1861 echo efiemu runtime: Yes
1862 else
1863 echo efiemu runtime: No "($efiemu_excuse)"
1864 fi
1865 if [ x"$grub_mkfont_excuse" = x ]; then
1866 echo grub-mkfont: Yes
1867 else
1868 echo grub-mkfont: No "($grub_mkfont_excuse)"
1869 fi
1870 if [ x"$grub_mount_excuse" = x ]; then
1871 echo grub-mount: Yes
1872 else
1873 echo grub-mount: No "($grub_mount_excuse)"
1874 fi
1875 if [ x"$starfield_excuse" = x ]; then
1876 echo starfield theme: Yes
1877 echo With DejaVuSans font from $DJVU_FONT_SOURCE
1878 else
1879 echo starfield theme: No "($starfield_excuse)"
1880 fi
1881 if [ x"$libzfs_excuse" = x ]; then
1882 echo With libzfs support: Yes
1883 else
1884 echo With libzfs support: No "($libzfs_excuse)"
1885 fi
1886 if [ x"$grub_build_mkfont_excuse" = x ]; then
1887   echo Build-time grub-mkfont: Yes
1888   if test "x$FONT_SOURCE" = x ; then
1889     echo "Without unifont"
1890   else
1891     echo "With unifont from $FONT_SOURCE"
1892   fi
1893 else
1894   echo Build-time grub-mkfont: No "($grub_build_mkfont_excuse)"
1895   echo "Without unifont (no build-time grub-mkfont)"
1896 fi
1897 if test x"$liblzma_excuse" != x ; then
1898 echo "Without liblzma (no support for XZ-compressed mips images) ($liblzma_excuse)"
1899 else
1900 echo "With liblzma from $LIBLZMA (support for XZ-compressed mips images)"
1901 fi
1902 echo "*******************************************************"
1903 ]