configure: Add -msoft-float to CCASFLAGS
[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 # on x86 clang doesn't support .code16
564 # on arm clang doesn't support .arch directive
565 # on mips clang doesn't support privilegied instructions, doubleword store/load
566 # and crashes with hand-written assembly
567 if test "x$grub_cv_cc_target_clang" = xyes && ( test "x$target_cpu" = xi386 \
568    || test "x$target_cpu" = xx86_64 || test "x$target_cpu" = xarm \
569    || test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ); then
570    TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as"
571 fi
572
573 if test "x$grub_cv_cc_target_clang" = xyes && test "x$target_cpu" = xpowerpc; then
574 AC_CACHE_CHECK([if clang can handle ame instruction], [grub_cv_cc_target_clang_ame]
575 [
576 CFLAGS="$TARGET_CFLAGS"
577 AC_COMPILE_IFELSE(
578 [AC_LANG_PROGRAM([], [[
579    unsigned int a = 0, b = 0;
580    asm volatile ("{ame|addme} %0,%1" : "=r" (a) : "r" (b));
581    if (a)
582      return 1;
583 ]])],
584 [grub_cv_cc_target_clang_ame=yes], [grub_cv_cc_target_clang_ame=no])])
585    # clang <= 3.3 doesn't handle most of ppc assembly, not even inline assembly
586    # used by gcrypt
587    if test x$grub_cv_cc_target_clang_ame = xno ; then
588      TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as"
589      TARGET_CFLAGS="$TARGET_CFLAGS -no-integrated-as"
590    fi
591 fi
592
593 if test "x$target_cpu" = xi386 && test "x$platform" != xemu; then
594   TARGET_CFLAGS="$TARGET_CFLAGS -march=i386"
595 fi
596
597 if test "x$target_m32" = x1; then
598   # Force 32-bit mode.
599   TARGET_CFLAGS="$TARGET_CFLAGS -m32"
600   TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m32"
601   TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m32"
602   TARGET_LDFLAGS="$TARGET_LDFLAGS -m32"
603   TARGET_MODULE_FORMAT="elf32"
604 fi
605
606 if test "x$target_m64" = x1; then
607   # Force 64-bit mode.
608   TARGET_CFLAGS="$TARGET_CFLAGS -m64"
609   TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m64"
610   TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m64"
611   TARGET_LDFLAGS="$TARGET_LDFLAGS -m64"
612   TARGET_MODULE_FORMAT="elf64"
613 fi
614
615 if test "x$grub_cv_cc_target_clang" = xno && test "x$target_cpu" = xi386 && test "x$platform" != xemu && test "x$platform" != xefi; then
616    TARGET_CFLAGS="$TARGET_CFLAGS -mrtd -mregparm=3"
617 fi
618
619 # on mips redirect cache flushing function to non-existant one.
620 if test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ; then
621   AC_CACHE_CHECK([whether -mflush-func=grub_red_herring works], [grub_cv_cc_mflush_func], [
622     CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring -Werror"
623     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
624         [grub_cv_cc_mflush_func=yes],
625         [grub_cv_cc_mflush_func=no])
626   ])
627
628   if test "x$grub_cv_cc_mflush_func" = xyes; then
629     TARGET_CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring"
630   fi
631 fi
632
633
634 # Force no alignment to save space on i386.
635 if test "x$target_cpu" = xi386; then
636   AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [
637     CFLAGS="$TARGET_CFLAGS -falign-loops=1 -Werror"
638     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
639         [grub_cv_cc_falign_loop=yes],
640         [grub_cv_cc_falign_loop=no])
641   ])
642
643   AC_CACHE_CHECK([whether -malign-loops works], [grub_cv_cc_malign_loop], [
644     CFLAGS="$TARGET_CFLAGS -malign-loops=1 -Werror"
645     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
646         [grub_cv_cc_malign_loop=yes],
647         [grub_cv_cc_malign_loop=no])
648   ])
649
650   if test "x$grub_cv_cc_falign_loop" = xyes; then
651     TARGET_CFLAGS="$TARGET_CFLAGS -falign-jumps=1 -falign-loops=1 -falign-functions=1"
652   elif test "x$grub_cv_cc_malign_loop" = xyes; then
653     TARGET_CFLAGS="$TARGET_CFLAGS -malign-jumps=1 -malign-loops=1 -malign-functions=1"
654   fi
655 fi
656
657 AC_CACHE_CHECK([whether -freg-struct-return works], [grub_cv_cc_freg_struct_return], [
658     CFLAGS="$TARGET_CFLAGS -freg-struct-return -Werror"
659     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
660         [grub_cv_cc_freg_struct_return=yes],
661         [grub_cv_cc_freg_struct_return=no])
662 ])
663
664 if test "x$grub_cv_cc_freg_struct_return" = xyes; then
665     TARGET_CFLAGS="$TARGET_CFLAGS -freg-struct-return"
666 fi
667
668 if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$platform" != xemu; then
669   # Some toolchains enable these features by default, but they need
670   # registers that aren't set up properly in GRUB.
671   TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-3dnow"
672 fi
673
674 # GRUB doesn't use float or doubles at all. Yet some toolchains may decide
675 # that floats are a good fit to run instead of what's written in the code.
676 # Given that floating point unit is disabled (if present to begin with)
677 # when GRUB is running which may result in various hard crashes.
678 if test "x$target_cpu" = xarm64; then
679   TARGET_CFLAGS="$TARGET_CFLAGS -march=armv8-a+nofp+nosimd"
680 else
681   TARGET_CFLAGS="$TARGET_CFLAGS -msoft-float"
682   TARGET_CCASFLAGS="$TARGET_CCASFLAGS -msoft-float"
683 fi
684
685 # By default, GCC 4.4 generates .eh_frame sections containing unwind
686 # information in some cases where it previously did not. GRUB doesn't need
687 # these and they just use up vital space. Restore the old compiler
688 # behaviour.
689 AC_CACHE_CHECK([whether -fno-dwarf2-cfi-asm works], [grub_cv_cc_fno_dwarf2_cfi_asm], [
690   CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
691   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
692       [grub_cv_cc_fno_dwarf2_cfi_asm=yes],
693       [grub_cv_cc_fno_dwarf2_cfi_asm=no])
694 ])
695
696 if test "x$grub_cv_cc_fno_dwarf2_cfi_asm" = xyes; then
697   TARGET_CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
698 fi
699
700 if test x"$target_os" = xcygwin; then
701   AC_CACHE_CHECK([whether option -fno-reorder-functions works], grub_cv_cc_no_reorder_functions, [
702     CFLAGS="$TARGET_CFLAGS -fno-reorder-functions"
703     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
704                       [grub_cv_cc_no_reorder_functions=yes],
705                       [grub_cv_cc_no_reorder_functions=no])
706   ])
707 fi
708
709 if test x"$target_os" = xcygwin && test "x$grub_cv_cc_no_reorder_functions" = xyes; then
710   TARGET_CFLAGS="$TARGET_CFLAGS -fno-reorder-functions"
711 fi
712
713 # By default, GCC 4.6 generates .eh_frame sections containing unwind
714 # information in some cases where it previously did not. GRUB doesn't need
715 # these and they just use up vital space. Restore the old compiler
716 # behaviour.
717 AC_CACHE_CHECK([whether -fno-asynchronous-unwind-tables works], [grub_cv_cc_fno_asynchronous_unwind_tables], [
718   CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
719   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
720       [grub_cv_cc_fno_asynchronous_unwind_tables=yes],
721       [grub_cv_cc_fno_asynchronous_unwind_tables=no])
722 ])
723
724 if test "x$grub_cv_cc_fno_asynchronous_unwind_tables" = xyes; then
725   TARGET_CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables"
726 fi
727
728 AC_ARG_ENABLE([efiemu],
729               [AS_HELP_STRING([--enable-efiemu],
730                              [build and install the efiemu runtimes (default=guessed)])])
731 if test x"$enable_efiemu" = xno ; then
732   efiemu_excuse="explicitly disabled"
733 fi
734 if test x"$grub_cv_target_cc_link_format" = x-mi386pe || test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then
735   efiemu_excuse="not available on cygwin"
736 fi
737 if test x"$target_cpu" != xi386 ; then
738   efiemu_excuse="only available on i386"
739 fi
740 if test x"$platform" = xefi ; then
741   efiemu_excuse="not available on efi"
742 fi
743 if test x"$efiemu_excuse" = x ; then
744   AC_CACHE_CHECK([whether options required for efiemu work], grub_cv_cc_efiemu, [
745     CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
746     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
747                       [grub_cv_cc_efiemu=yes],
748                       [grub_cv_cc_efiemu=no])
749   ])
750   if test x$grub_cv_cc_efiemu = xno; then
751      efiemu_excuse="cannot compile with -m64 -mcmodel=large -mno-red-zone -nostdlib"
752   fi
753 fi
754 if test x"$efiemu_excuse" = x ; then
755   AC_CACHE_CHECK([for efiemu64 linking format], [grub_cv_target_cc_efiemu64_link_format], [
756     grub_cv_target_cc_efiemu64_link_format=unknown
757     for format in -melf_x86_64 -melf_x86_64_fbsd -melf_x86_64_obsd -melf_x86_64_haiku -arch,x86_64; do
758       CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
759       LDFLAGS="-m64 -Wl,$format -nostdlib -static"
760       AC_LINK_IFELSE([AC_LANG_PROGRAM([[
761       asm (".globl start; start:");
762       asm (".globl _start; _start:");
763       asm (".globl __start; __start:");
764       void __main (void);
765       void __main (void) {}
766       ]], [[]])], [flag=1], [flag=0])
767       if test x"$flag" = x1; then
768         grub_cv_target_cc_efiemu64_link_format="$format"
769         break
770       fi
771     done])
772   if test x"$grub_cv_target_cc_efiemu64_link_format" = xunknown; then
773     efiemu_excuse="no suitable link format for efiemu64 found"
774   else
775     EFIEMU64_LINK_FORMAT="-Wl,$grub_cv_target_cc_efiemu64_link_format"
776   fi
777 fi
778 if test x"$enable_efiemu" = xyes && test x"$efiemu_excuse" != x ; then
779   AC_MSG_ERROR([efiemu runtime was explicitly requested but can't be compiled ($efiemu_excuse)])
780 fi
781 if test x"$efiemu_excuse" = x ; then
782 enable_efiemu=yes
783 else
784 enable_efiemu=no
785 fi
786 AC_SUBST([enable_efiemu])
787 AC_SUBST([EFIEMU64_LINK_FORMAT])
788
789 CFLAGS="$TARGET_CFLAGS"
790
791
792 if test x"$platform" = xemu ; then
793   TARGET_OBJ2ELF=
794   grub_cv_target_cc_link_format=
795   case "$host_os" in
796     *darwin* | *mac*)
797        grub_cv_target_cc_link_format="-arch,${target_cpu}"
798        TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
799         ;;
800     *windows* | *cygwin* | *mingw*)
801       if test x${target_cpu} = xi386 ; then
802         grub_cv_target_cc_link_format=-mi386pe
803         TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)'
804       fi
805       if test x${target_cpu} = xx86_64 ; then
806         grub_cv_target_cc_link_format=-mi386pep
807         TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)'
808       fi
809       TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
810       ;;
811   esac
812 elif test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
813   AC_CACHE_CHECK([for target linking format], [grub_cv_target_cc_link_format], [
814     grub_cv_target_cc_link_format=unknown
815     for format in -melf_${target_cpu} -melf_${target_cpu}_fbsd -melf_${target_cpu}_obsd -melf_${target_cpu}_haiku -mi386pe -mi386pep -arch,${target_cpu}; do
816       if test x${target_cpu} != xi386 && test x$format = x-mi386pe; then
817         continue
818       fi
819       if test x${target_cpu} != xx86_64 && test x$format = x-mi386pep; then
820         continue
821       fi
822       CFLAGS="$TARGET_CFLAGS"
823       LDFLAGS="$TARGET_LDFLAGS -Wl,$format -nostdlib -static"
824       AC_LINK_IFELSE([AC_LANG_PROGRAM([[
825       asm (".globl start; start:");
826       asm (".globl _start; _start:");
827       asm (".globl __start; __start:");
828       void __main (void);
829       void __main (void) {}
830       ]], [[]])], [flag=1], [flag=0])
831       if test x"$flag" = x1; then
832         grub_cv_target_cc_link_format="$format"
833         break
834       fi
835     done])
836   if test x"$grub_cv_target_cc_link_format" = xunknown; then
837     AC_MSG_ERROR([no suitable link format found])
838   fi
839   TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
840   if test x"$grub_cv_target_cc_link_format" = x-mi386pe ; then
841     TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)'
842   fi
843   if test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then
844     TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)'
845   fi
846 fi
847
848 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
849    TARGET_APPLE_LINKER=1
850    AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [objconv], [])
851    if test "x$TARGET_OBJCONV" = x ; then
852       AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [./objconv], [], [.])
853    fi
854    if test "x$TARGET_OBJCONV" = x ; then
855       AC_MSG_ERROR([objconv not found which is required when building with apple compiler])
856    fi
857    TARGET_IMG_LDSCRIPT=
858    TARGET_IMG_CFLAGS="-static"
859    TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
860    TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
861    TARGET_IMG_BASE_LDOPT="-Wl,-image_base"
862    TARGET_LDFLAGS_OLDMAGIC=""
863 elif test x$grub_cv_target_cc_link_format = x-mi386pe || test x$grub_cv_target_cc_link_format = x-mi386pep ; then
864   TARGET_APPLE_LINKER=0
865   TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
866   TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/${grub_coredir}/conf/i386-cygwin-img-ld.sc"
867   TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}"
868   TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/${grub_coredir}/conf/i386-cygwin-img-ld.sc"
869   TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
870   TARGET_IMG_CFLAGS=
871 else
872   TARGET_APPLE_LINKER=0
873   TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
874   TARGET_IMG_LDSCRIPT=
875   TARGET_IMG_LDFLAGS='-Wl,-N'
876   TARGET_IMG_LDFLAGS_AC='-Wl,-N'
877   TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
878   TARGET_IMG_CFLAGS=
879 fi
880
881 AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
882
883
884 LDFLAGS="$TARGET_LDFLAGS"
885
886 if test "$target_cpu" = x86_64 || test "$target_cpu-$platform" = sparc64-emu ; then
887   # Use large model to support 4G memory
888   AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
889     CFLAGS="$TARGET_CFLAGS -mcmodel=large"
890     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
891                       [grub_cv_cc_mcmodel=yes],
892                       [grub_cv_cc_mcmodel=no])
893   ])
894   if test "x$grub_cv_cc_mcmodel" = xyes; then
895     TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
896   elif test "$target_cpu-$platform" = sparc64-emu; then
897     TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany"
898   fi
899 fi
900
901 if test "$target_cpu"-"$platform" = x86_64-efi; then
902   # EFI writes to stack below %rsp, we must not use the red zone
903   AC_CACHE_CHECK([whether option -mno-red-zone works], grub_cv_cc_no_red_zone, [
904     CFLAGS="$TARGET_CFLAGS -mno-red-zone"
905     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
906                       [grub_cv_cc_no_red_zone=yes],
907                       [grub_cv_cc_no_red_zone=no])
908   ])
909   if test "x$grub_cv_cc_no_red_zone" = xno; then
910     AC_MSG_ERROR([-mno-red-zone not supported, upgrade your gcc])
911   fi
912
913   TARGET_CFLAGS="$TARGET_CFLAGS -mno-red-zone"
914 fi
915
916 if test "x$target_cpu" = xarm; then
917   AC_CACHE_CHECK([whether option -mlong-calls works], grub_cv_cc_mlong_calls, [
918     CFLAGS="$TARGET_CFLAGS -mlong-calls -Werror"
919     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
920                       [grub_cv_cc_mlong_calls=yes],
921                       [grub_cv_cc_mlong_calls=no])
922   ])
923   if test "x$grub_cv_cc_mlong_calls" = xyes; then
924     TARGET_CFLAGS="$TARGET_CFLAGS -mlong-calls"
925   fi
926   AC_CACHE_CHECK([whether option -mthumb-interwork works], grub_cv_cc_mthumb_interwork, [
927     CFLAGS="$TARGET_CFLAGS -mthumb-interwork -Werror"
928     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
929                       [grub_cv_cc_mthumb_interwork=yes],
930                       [grub_cv_cc_mthumb_interwork=no])
931   ])
932   if test "x$grub_cv_cc_mthumb_interwork" = xyes; then
933     TARGET_CFLAGS="$TARGET_CFLAGS -mthumb-interwork"
934   elif test "x$grub_cv_cc_target_clang" = xno ; then
935     AC_MSG_ERROR([your compiler doesn't support -mthumb-interwork])
936   else
937     CFLAGS="$TARGET_CFLAGS"
938     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
939 #if defined (__thumb__) && !defined (__thumb2__)
940 #error thumb without interworking
941 #endif
942 ]])],
943                       [no_interwork_ok=yes],
944                       [no_interwork_ok=no])
945     if test x$no_interwork_ok = xno ; then
946        AC_MSG_ERROR([attempt to compile to thumb with no thumb interwork])
947     fi
948   fi
949 fi
950
951 AC_CACHE_CHECK([whether option -Qn works], grub_cv_target_cc_qn, [
952   CFLAGS="$TARGET_CFLAGS -Qn -Werror"
953   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
954                     [grub_cv_target_cc_qn=yes],
955                     [grub_cv_target_cc_qn=no])])
956 if test "x$grub_cv_target_cc_qn" = xyes; then
957   TARGET_CFLAGS="$TARGET_CFLAGS -Qn"
958 fi
959
960 #
961 # Compiler features.
962 #
963
964 CFLAGS="$TARGET_CFLAGS"
965
966 # Position independent executable.
967 grub_CHECK_PIE
968 [# Need that, because some distributions ship compilers that include
969 # `-fPIE' in the default specs.
970 if [ x"$pie_possible" = xyes ]; then
971   TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIE"
972 fi]
973
974 CFLAGS="$TARGET_CFLAGS"
975
976 # Position independent executable.
977 grub_CHECK_PIC
978 [# On most platforms we don't want PIC as it only makes relocations harder
979 # and code less efficient. On mips we want to have one got table per module
980 # and reload $gp in every function.
981 # GCC implements it using symbol __gnu_local_gp in non-PIC as well.
982 # However with clang we need PIC for this reloading to happen.
983 # Since default varies across dictributions use either -fPIC or -fno-PIC
984 # explicitly.
985 if ( test x$target_cpu = xmips || test x$target_cpu = xmipsel ) && test "x$grub_cv_cc_target_clang" = xyes ; then
986    TARGET_CFLAGS="$TARGET_CFLAGS -fPIC"
987 elif [ x"$pic_possible" = xyes ]; then
988    TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIC"
989 fi]
990
991 CFLAGS="$TARGET_CFLAGS"
992
993 # Smashing stack protector.
994 grub_CHECK_STACK_PROTECTOR
995 # Need that, because some distributions ship compilers that include
996 # `-fstack-protector' in the default specs.
997 if test "x$ssp_possible" = xyes; then
998   TARGET_CFLAGS="$TARGET_CFLAGS -fno-stack-protector"
999 fi
1000
1001 CFLAGS="$TARGET_CFLAGS"
1002
1003 grub_CHECK_STACK_ARG_PROBE
1004 # Cygwin's GCC uses alloca() to probe the stackframe on static
1005 # stack allocations above some threshold.
1006 if test x"$sap_possible" = xyes; then
1007   TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe"
1008 fi
1009
1010 CFLAGS="$TARGET_CFLAGS"
1011
1012 # -mno-unaligned-access -mstrict-align
1013 if test "$target_cpu" = arm; then
1014   AC_CACHE_CHECK([for compile options to get strict alignment], [grub_cv_target_cc_strict_align], [
1015     grub_cv_target_cc_strict_align=
1016     for arg in -mno-unaligned-access "-Xclang -mstrict-align" -mstrict-align; do
1017       CFLAGS="$TARGET_CFLAGS $arg -Werror"
1018       LDFLAGS="$TARGET_LDFLAGS"
1019       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [flag=1], [flag=0])
1020       if test x"$flag" = x1; then
1021         grub_cv_target_cc_strict_align="$arg"
1022         break
1023       fi
1024     done])
1025
1026   TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_strict_align"
1027   if test x"$grub_cv_target_cc_strict_align" = x"-Xclang -mstrict-align"; then
1028     TARGET_LDFLAGS="$TARGET_LDFLAGS -Qunused-arguments"
1029   fi
1030   AC_CACHE_CHECK([if compiler generates unaligned accesses], [grub_cv_cc_target_emits_unaligned],
1031   [CFLAGS="$TARGET_CFLAGS"
1032    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[
1033 #ifdef __ARM_FEATURE_UNALIGNED
1034 #error "unaligned"
1035 #endif
1036      ]])],
1037      [grub_cv_cc_target_emits_unaligned=no], [grub_cv_cc_target_emits_unaligned=yes])])
1038   if test x$grub_cv_cc_target_emits_unaligned = xyes; then
1039     AC_MSG_ERROR([compiler generates unaligned accesses])
1040   fi
1041 fi
1042
1043 # Set them to their new values for the tests below.
1044 CC="$TARGET_CC"
1045 if test "x$TARGET_APPLE_LINKER" = x1 ; then
1046 CFLAGS="$TARGET_CFLAGS -nostdlib -static -Wno-error"
1047 else
1048 CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error"
1049 fi
1050 CPPFLAGS="$TARGET_CPPFLAGS"
1051 if test x$target_cpu = xi386 || test x$target_cpu = xx86_64 || test "x$grub_cv_cc_target_clang" = xyes ; then
1052 TARGET_LIBGCC=
1053 else
1054 TARGET_LIBGCC=-lgcc
1055 fi
1056
1057 LIBS="$TARGET_LIBGCC"
1058
1059 grub_ASM_USCORE
1060 if test "x$TARGET_APPLE_LINKER" = x0 ; then
1061 if test x$grub_cv_asm_uscore = xyes; then
1062 DEFSYM="-Wl,--defsym,_abort=_main -Wl,--defsym,__main=_main"
1063 else
1064 DEFSYM="-Wl,--defsym,abort=main -Wl,--defsym,_main=main -Wl,--defsym,__main=main"
1065 fi
1066 CFLAGS="$TARGET_CFLAGS -nostdlib $DEFSYM"
1067 fi
1068
1069 # Check for libgcc symbols
1070 AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x)
1071
1072 if test "x$TARGET_APPLE_LINKER" = x1 ; then
1073 CFLAGS="$TARGET_CFLAGS -nostdlib -static"
1074 else
1075 CFLAGS="$TARGET_CFLAGS -nostdlib"
1076 fi
1077 LIBS=""
1078
1079 # Defined in aclocal.m4.
1080 grub_PROG_TARGET_CC
1081 if test "x$TARGET_APPLE_LINKER" != x1 ; then
1082 grub_PROG_OBJCOPY_ABSOLUTE
1083 fi
1084 grub_PROG_LD_BUILD_ID_NONE
1085 if test "x$target_cpu" = xi386; then
1086   if test "$platform" != emu && test "x$TARGET_APPLE_LINKER" != x1 ; then
1087     if test ! -z "$TARGET_IMG_LDSCRIPT"; then
1088       # Check symbols provided by linker script.
1089       CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},0x8000"
1090     fi
1091     grub_CHECK_BSS_START_SYMBOL
1092     grub_CHECK_END_SYMBOL
1093   fi
1094   CFLAGS="$TARGET_CFLAGS"
1095   grub_I386_ASM_PREFIX_REQUIREMENT
1096   grub_I386_ASM_ADDR32
1097 fi
1098
1099 grub_PROG_NM_WORKS
1100 grub_PROG_NM_MINUS_P
1101 grub_PROG_NM_DEFINED_ONLY
1102 AC_SUBST(TARGET_NMFLAGS_MINUS_P)
1103 AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY)
1104
1105 if test "$platform" != emu; then
1106 AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [
1107   SAVED_CPPFLAGS="$CPPFLAGS"
1108   CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
1109   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
1110 #include <stddef.h>
1111 int va_arg_func (int fixed, va_list args);]], [[]])],
1112       [grub_cv_cc_isystem=yes],
1113       [grub_cv_cc_isystem=no])
1114   CPPFLAGS="$SAVED_CPPFLAGS"
1115 ])
1116
1117 if test x"$grub_cv_cc_isystem" = xyes ; then
1118   TARGET_CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
1119 fi
1120 fi
1121
1122 AC_CACHE_CHECK([whether -Wtrampolines work], [grub_cv_cc_wtrampolines], [
1123   CFLAGS="$TARGET_CFLAGS -Wtrampolines -Werror"
1124   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
1125 int va_arg_func (int fixed, va_list args);]], [[]])],
1126       [grub_cv_cc_wtrampolines=yes],
1127       [grub_cv_cc_wtrampolines=no])
1128 ])
1129
1130 if test x"$grub_cv_cc_wtrampolines" = xyes ; then
1131   TARGET_CFLAGS="$TARGET_CFLAGS -Wtrampolines"
1132 fi
1133
1134 # Restore the flags.
1135 CC="$tmp_CC"
1136 CFLAGS="$tmp_CFLAGS"
1137 CPPFLAGS="$tmp_CPPFLAGS"
1138 LDFLAGS="$tmp_LDFLAGS"
1139 LIBS="$tmp_LIBS"
1140
1141 #
1142 # Check for options.
1143 #
1144
1145 # Memory manager debugging.
1146 AC_ARG_ENABLE([mm-debug],
1147               AS_HELP_STRING([--enable-mm-debug],
1148                              [include memory manager debugging]),
1149               [AC_DEFINE([MM_DEBUG], [1],
1150                          [Define to 1 if you enable memory manager debugging.])])
1151
1152 AC_ARG_ENABLE([cache-stats],
1153               AS_HELP_STRING([--enable-cache-stats],
1154                              [enable disk cache statistics collection]))
1155
1156 if test x$enable_cache_stats = xyes; then
1157   DISK_CACHE_STATS=1
1158 else
1159   DISK_CACHE_STATS=0
1160 fi
1161 AC_SUBST([DISK_CACHE_STATS])
1162
1163 AC_ARG_ENABLE([boot-time],
1164               AS_HELP_STRING([--enable-boot-time],
1165                              [enable boot time statistics collection]))
1166
1167 if test x$enable_boot_time = xyes; then
1168   BOOT_TIME_STATS=1
1169 else
1170   BOOT_TIME_STATS=0
1171 fi
1172 AC_SUBST([BOOT_TIME_STATS])
1173
1174 AC_ARG_ENABLE([grub-emu-usb],
1175               [AS_HELP_STRING([--enable-grub-emu-usb],
1176                              [build and install the `grub-emu' debugging utility with USB support (default=guessed)])])
1177
1178 AC_ARG_ENABLE([grub-emu-sdl],
1179               [AS_HELP_STRING([--enable-grub-emu-sdl],
1180                              [build and install the `grub-emu' debugging utility with SDL support (default=guessed)])])
1181
1182 AC_ARG_ENABLE([grub-emu-pci],
1183               [AS_HELP_STRING([--enable-grub-emu-pci],
1184                              [build and install the `grub-emu' debugging utility with PCI support (potentially dangerous) (default=no)])])
1185
1186 if test "$platform" = emu; then
1187
1188 if test x"$enable_grub_emu_usb" != xyes ; then
1189    grub_emu_usb_excuse="not enabled"
1190 fi
1191
1192 if test x"$enable_grub_emu_pci" = xyes ; then
1193    grub_emu_usb_excuse="conflicts with PCI support"
1194 fi
1195
1196 [if [ x"$grub_emu_usb_excuse" = x ]; then
1197     # Check for libusb libraries.]
1198 AC_CHECK_LIB([usb], [usb_claim_interface], [LIBUSB="-lusb"],
1199     [grub_emu_usb_excuse=["need libusb library"]])
1200     AC_SUBST([LIBUSB])
1201 [fi]
1202 [if [ x"$grub_emu_usb_excuse" = x ]; then
1203     # Check for headers.]
1204     AC_CHECK_HEADERS([usb.h], [],
1205       [grub_emu_usb_excuse=["need libusb headers"]])
1206 [fi]
1207 if test x"$enable_grub_emu_usb" = xyes && test x"$grub_emu_usb_excuse" != x ; then
1208   AC_MSG_ERROR([USB support for grub-emu was explicitly requested but can't be compiled ($grub_emu_usb_excuse)])
1209 fi
1210 if test x"$grub_emu_usb_excuse" = x ; then
1211 enable_grub_emu_usb=yes
1212 else
1213 enable_grub_emu_usb=no
1214 fi
1215
1216 if test x"$enable_grub_emu_sdl" = xno ; then
1217   grub_emu_sdl_excuse="explicitly disabled"
1218 fi
1219 [if [ x"$grub_emu_sdl_excuse" = x ]; then
1220     # Check for libSDL libraries.]
1221 AC_CHECK_LIB([SDL], [SDL_Init], [LIBSDL="-lSDL"],
1222     [grub_emu_sdl_excuse=["libSDL libraries are required to build \`grub-emu' with SDL support"]])
1223     AC_SUBST([LIBSDL])
1224 [fi]
1225
1226 [if [ x"$grub_emu_sdl_excuse" = x ]; then
1227     # Check for headers.]
1228     AC_CHECK_HEADERS([SDL/SDL.h], [],
1229       [grub_emu_sdl_excuse=["libSDL header file is required to build \`grub-emu' with SDL support"]])
1230 [fi]
1231
1232 if test x"enable_grub_emu_sdl" = xyes && test x"$grub_emu_sdl_excuse" != x ; then
1233   AC_MSG_ERROR([SDL support for grub-emu was explicitly requested but can't be compiled ($grub_emu_sdl_excuse)])
1234 fi
1235 if test x"$grub_emu_sdl_excuse" = x ; then
1236 enable_grub_emu_sdl=yes
1237 else
1238 enable_grub_emu_sdl=no
1239 fi
1240
1241 if test x"$enable_grub_emu_pci" != xyes ; then
1242    grub_emu_pci_excuse="not enabled"
1243 fi
1244
1245 if test x"$enable_grub_emu_usb" = xyes ; then
1246    grub_emu_pci_excuse="conflicts with USB support"
1247 fi
1248
1249 [if [ x"$grub_emu_pci_excuse" = x ]; then
1250       # Check for libpci libraries.]
1251    AC_CHECK_LIB([pciaccess], [pci_system_init], [LIBPCIACCESS="-lpciaccess"],
1252       [grub_emu_pci_excuse=["need libpciaccess library"]])
1253     AC_SUBST([LIBPCIACCESS])
1254 [fi]
1255 [if [ x"$grub_emu_pci_excuse" = x ]; then
1256     # Check for headers.]
1257     AC_CHECK_HEADERS([pci/pci.h], [],
1258       [grub_emu_pci_excuse=["need libpciaccess headers"]])
1259 [fi]
1260
1261 if test x"$grub_emu_pci_excuse" = x ; then
1262 enable_grub_emu_pci=yes
1263 else
1264
1265 enable_grub_emu_pci=no
1266 fi
1267
1268 AC_SUBST([enable_grub_emu_sdl])
1269 AC_SUBST([enable_grub_emu_usb])
1270 AC_SUBST([enable_grub_emu_pci])
1271
1272 else
1273
1274 # Ignore --enable-emu-* if platform is not emu
1275 enable_grub_emu_sdl=no
1276 enable_grub_emu_usb=no
1277 enable_grub_emu_pci=no
1278 fi
1279
1280 AC_ARG_ENABLE([grub-mkfont],
1281               [AS_HELP_STRING([--enable-grub-mkfont],
1282                              [build and install the `grub-mkfont' utility (default=guessed)])])
1283 if test x"$enable_grub_mkfont" = xno ; then
1284   grub_mkfont_excuse="explicitly disabled"
1285 fi
1286
1287 if test x"$grub_mkfont_excuse" = x ; then
1288   # Check for freetype libraries.
1289   AC_CHECK_TOOLS([FREETYPE], [freetype-config])
1290   if test "x$FREETYPE" = x ; then
1291     grub_mkfont_excuse=["need freetype2 library"]
1292   fi
1293 fi
1294
1295 unset ac_cv_header_ft2build_h
1296
1297 if test x"$grub_mkfont_excuse" = x ; then
1298   # Check for freetype libraries.
1299   freetype_cflags=`$FREETYPE --cflags`
1300   freetype_libs=`$FREETYPE --libs`
1301   SAVED_CPPFLAGS="$CPPFLAGS"
1302   SAVED_LIBS="$LIBS"
1303   CPPFLAGS="$CPPFLAGS $freetype_cflags"
1304   LIBS="$LIBS $freetype_libs"
1305   AC_CHECK_HEADERS([ft2build.h], [],
1306         [grub_mkfont_excuse=["need freetype2 headers"]])
1307   AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_mkfont_excuse=["freetype2 library unusable"]])
1308   CPPFLAGS="$SAVED_CPPFLAGS"
1309   LIBS="$SAVED_LIBS"
1310 fi
1311
1312 if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then
1313   AC_MSG_ERROR([grub-mkfont was explicitly requested but can't be compiled ($grub_mkfont_excuse)])
1314 fi
1315 if test x"$grub_mkfont_excuse" = x ; then
1316 enable_grub_mkfont=yes
1317 else
1318 enable_grub_mkfont=no
1319 fi
1320 AC_SUBST([enable_grub_mkfont])
1321 AC_SUBST([freetype_cflags])
1322 AC_SUBST([freetype_libs])
1323
1324 SAVED_CC="$CC"
1325 SAVED_CPP="$CPP"
1326 SAVED_CFLAGS="$CFLAGS"
1327 SAVED_CPPFLAGS="$CPPFLAGS"
1328 SAVED_LDFLAGS="$LDFLAGS"
1329 CC="$BUILD_CC"
1330 CPP="$BUILD_CPP"
1331 CFLAGS="$BUILD_CFLAGS"
1332 CPPFLAGS="$BUILD_CPPFLAGS"
1333 LDFLAGS="$BUILD_LDFAGS"
1334
1335 unset ac_cv_c_bigendian
1336 unset ac_cv_header_ft2build_h
1337
1338 AC_COMPUTE_INT([BUILD_SIZEOF_VOID_P], [sizeof (void *)])
1339 AC_COMPUTE_INT([BUILD_SIZEOF_LONG], [sizeof (long)])
1340 AC_C_BIGENDIAN([BUILD_WORDS_BIGENDIAN=1], [BUILD_WORDS_BIGENDIAN=0], [BUILD_WORDS_BIGENDIAN=err], [BUILD_WORDS_BIGENDIAN=err])
1341
1342 if test x$BUILD_WORDS_BIGENDIAN = xerr ; then
1343    AC_MSG_ERROR([couldnt determine build endianness])
1344 fi
1345
1346 AC_SUBST([BUILD_SIZEOF_LONG])
1347 AC_SUBST([BUILD_SIZEOF_VOID_P])
1348 AC_SUBST([BUILD_WORDS_BIGENDIAN])
1349
1350 if test x"$grub_build_mkfont_excuse" = x ; then
1351   # Check for freetype libraries.
1352   AC_CHECK_PROGS([BUILD_FREETYPE], [freetype-config])
1353   if test "x$BUILD_FREETYPE" = x ; then
1354     grub_build_mkfont_excuse=["need freetype2 library"]
1355   fi
1356 fi
1357
1358 if test x"$grub_build_mkfont_excuse" = x ; then
1359   # Check for freetype libraries.
1360   build_freetype_cflags=`$BUILD_FREETYPE --cflags`
1361   build_freetype_libs=`$BUILD_FREETYPE --libs`
1362   SAVED_CPPFLAGS_2="$CPPFLAGS"
1363   SAVED_LIBS="$LIBS"
1364   CPPFLAGS="$CPPFLAGS $build_freetype_cflags"
1365   LIBS="$LIBS $build_freetype_libs"
1366   AC_CHECK_HEADERS([ft2build.h], [],
1367         [grub_build_mkfont_excuse=["need freetype2 headers"]])
1368   AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_build_mkfont_excuse=["freetype2 library unusable"]])
1369   LIBS="$SAVED_LIBS"
1370   CPPFLAGS="$SAVED_CPPFLAGS_2"
1371 fi
1372
1373 if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then
1374   AC_MSG_ERROR([build-grub-mkfont was explicitly requested but can't be compiled ($grub_build_mkfont_excuse)])
1375 fi
1376 if test x"$grub_build_mkfont_excuse" = x ; then
1377   enable_build_grub_mkfont=yes
1378 else
1379   enable_build_grub_mkfont=no
1380 fi
1381 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
1382   if test x"$grub_build_mkfont_excuse" = x ; then
1383     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont])
1384   else
1385     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont ($grub_build_mkfont_excuse)])
1386   fi
1387 fi
1388
1389 AC_SUBST([build_freetype_cflags])
1390 AC_SUBST([build_freetype_libs])
1391
1392 CC="$SAVED_CC"
1393 CPP="$SAVED_CPP"
1394 CFLAGS="$SAVED_CFLAGS"
1395 CPPFLAGS="$SAVED_CPPFLAGS"
1396 LDFLAGS="$SAVED_LDFLAGS"
1397
1398
1399 DJVU_FONT_SOURCE=
1400
1401 starfield_excuse=
1402
1403 AC_ARG_ENABLE([grub-themes],
1404               [AS_HELP_STRING([--enable-grub-themes],
1405                              [build and install GRUB themes (default=guessed)])])
1406 if test x"$enable_grub_themes" = xno ; then
1407   starfield_excuse="explicitly disabled"
1408 fi
1409
1410 if test x"$starfield_excuse" = x && test x"$enable_build_grub_mkfont" = xno ; then
1411   starfield_excuse="No build-time grub-mkfont"
1412 fi
1413
1414 if test x"$starfield_excuse" = x; then
1415    for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
1416      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
1417         if test -f "$dir/DejaVuSans.$ext"; then
1418           DJVU_FONT_SOURCE="$dir/DejaVuSans.$ext"
1419           break 2
1420         fi
1421      done
1422    done
1423
1424    if test "x$DJVU_FONT_SOURCE" = x; then
1425      starfield_excuse="No DejaVu found"
1426    fi
1427 fi
1428
1429 if test x"$enable_grub_themes" = xyes &&  test x"$starfield_excuse" != x; then
1430    AC_MSG_ERROR([themes were explicitly requested but requirements are not satisfied ($starfield_excuse)])
1431 fi
1432
1433 AC_SUBST([DJVU_FONT_SOURCE])
1434
1435 FONT_SOURCE=
1436
1437 for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
1438   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
1439     if test -f "$dir/unifont.$ext"; then
1440       md5="$(md5sum "$dir/unifont.$ext"|awk '{ print $1; }')"
1441       # PCF and BDF from version 6.3 isn't hanled properly by libfreetype.
1442       if test "$md5" = 0a54834d2788c83886a3e1785a6a1e61 || test "$md5" = 28f2565c7a41d8d407e2551159385edb || test "$md5" = dae5e588461b3b92b87b6ffee734f936 || test "$md5" = 4a3d687aa5bb329ed05f4263a1016791 ; then
1443         continue
1444       fi
1445       FONT_SOURCE="$dir/unifont.$ext"
1446       break 2
1447     fi
1448   done
1449 done
1450
1451 if test x"$enable_build_grub_mkfont" = xno ; then
1452   FONT_SOURCE=
1453 fi
1454
1455 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
1456   if test x"$grub_build_mkfont_excuse" = x ; then
1457     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont])
1458   else
1459     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont ($grub_build_mkfont_excuse)])
1460   fi
1461 fi
1462
1463 AC_SUBST([FONT_SOURCE])
1464
1465 if test x"$FONT_SOURCE" = x &&  test x"$DJVU_FONT_SOURCE" = x && test x"$grub_build_mkfont_excuse" = x; then
1466   grub_build_mkfont_excuse="no fonts"
1467 fi
1468
1469
1470 AC_ARG_ENABLE([grub-mount],
1471               [AS_HELP_STRING([--enable-grub-mount],
1472                              [build and install the `grub-mount' utility (default=guessed)])])
1473 if test x"$enable_grub_mount" = xno ; then
1474   grub_mount_excuse="explicitly disabled"
1475 fi
1476
1477 if test x"$grub_mount_excuse" = x ; then
1478   AC_CHECK_LIB([fuse], [fuse_main_real], [],
1479                [grub_mount_excuse="need FUSE library"])
1480 fi
1481
1482 if test x"$grub_mount_excuse" = x ; then
1483   # Check for fuse headers.
1484   SAVED_CPPFLAGS="$CPPFLAGS"
1485   CPPFLAGS="$CPPFLAGS -DFUSE_USE_VERSION=26"
1486   AC_CHECK_HEADERS([fuse/fuse.h], [],
1487         [grub_mount_excuse=["need FUSE headers"]])
1488   CPPFLAGS="$SAVED_CPPFLAGS"
1489 fi
1490
1491 if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then
1492   AC_MSG_ERROR([grub-mount was explicitly requested but can't be compiled ($grub_mount_excuse)])
1493 fi
1494 if test x"$grub_mount_excuse" = x ; then
1495 enable_grub_mount=yes
1496 else
1497 enable_grub_mount=no
1498 fi
1499 AC_SUBST([enable_grub_mount])
1500
1501 AC_ARG_ENABLE([device-mapper],
1502               [AS_HELP_STRING([--enable-device-mapper],
1503                               [enable Linux device-mapper support (default=guessed)])])
1504 if test x"$enable_device_mapper" = xno ; then
1505   device_mapper_excuse="explicitly disabled"
1506 fi
1507
1508 if test x"$device_mapper_excuse" = x ; then
1509   # Check for device-mapper header.
1510   AC_CHECK_HEADER([libdevmapper.h], [],
1511                [device_mapper_excuse="need libdevmapper header"])
1512 fi
1513
1514 if test x"$device_mapper_excuse" = x ; then
1515   # Check for device-mapper library.
1516   AC_CHECK_LIB([devmapper], [dm_task_create], [],
1517                [device_mapper_excuse="need devmapper library"])
1518 fi
1519
1520 if test x"$device_mapper_excuse" = x ; then
1521   # Check for device-mapper library.
1522   AC_CHECK_LIB([devmapper], [dm_log_with_errno_init],
1523                [],
1524                [device_mapper_excuse="need devmapper library"])
1525 fi
1526
1527 if test x"$device_mapper_excuse" = x ; then
1528    LIBDEVMAPPER="-ldevmapper"
1529    AC_DEFINE([HAVE_DEVICE_MAPPER], [1],
1530              [Define to 1 if you have the devmapper library.])
1531 fi
1532
1533 AC_SUBST([LIBDEVMAPPER])
1534
1535 LIBGEOM=
1536 if test x$host_kernel = xkfreebsd; then
1537   AC_CHECK_LIB([geom], [geom_gettree], [],
1538                [AC_MSG_ERROR([Your platform requires libgeom])])
1539   LIBGEOM="-lgeom"
1540 fi
1541
1542 AC_SUBST([LIBGEOM])
1543
1544 AC_ARG_ENABLE([liblzma],
1545               [AS_HELP_STRING([--enable-liblzma],
1546                               [enable liblzma integration (default=guessed)])])
1547 if test x"$enable_liblzma" = xno ; then
1548   liblzma_excuse="explicitly disabled"
1549 fi
1550
1551 if test x"$liblzma_excuse" = x ; then
1552 AC_CHECK_LIB([lzma], [lzma_code],
1553              [],[liblzma_excuse="need lzma library"])
1554 fi
1555 if test x"$liblzma_excuse" = x ; then
1556 AC_CHECK_HEADER([lzma.h], [], [liblzma_excuse="need lzma header"])
1557 fi
1558
1559 if test x"$enable_liblzma" = xyes && test x"$liblzma_excuse" != x ; then
1560   AC_MSG_ERROR([liblzma support was explicitly requested but requirements are not satisfied ($liblzma_excuse)])
1561 fi
1562
1563
1564 if test x"$liblzma_excuse" = x ; then
1565    LIBLZMA="-llzma"
1566    AC_DEFINE([USE_LIBLZMA], [1],
1567              [Define to 1 if you have the LZMA library.])
1568 fi
1569
1570 AC_SUBST([LIBLZMA])
1571
1572 AC_ARG_ENABLE([libzfs],
1573               [AS_HELP_STRING([--enable-libzfs],
1574                               [enable libzfs integration (default=guessed)])])
1575 if test x"$enable_libzfs" = xno ; then
1576   libzfs_excuse="explicitly disabled"
1577 fi
1578
1579 if test x"$libzfs_excuse" = x ; then
1580   # Only check for system headers if libzfs support has not been disabled.
1581   AC_CHECK_HEADERS(libzfs.h libnvpair.h)
1582 fi
1583
1584 if test x"$libzfs_excuse" = x ; then
1585   AC_CHECK_LIB([zfs], [libzfs_init],
1586                [],
1587                [libzfs_excuse="need zfs library"])
1588 fi
1589
1590 if test x"$libzfs_excuse" = x ; then
1591   AC_CHECK_LIB([nvpair], [nvlist_lookup_string],
1592                [],
1593                [libzfs_excuse="need nvpair library"])
1594 fi
1595
1596 if test x"$enable_libzfs" = xyes && test x"$libzfs_excuse" != x ; then
1597   AC_MSG_ERROR([libzfs support was explicitly requested but requirements are not satisfied ($libzfs_excuse)])
1598 fi
1599
1600 if test x"$libzfs_excuse" = x ; then
1601   # We need both libzfs and libnvpair for a successful build.
1602   LIBZFS="-lzfs"
1603   AC_DEFINE([HAVE_LIBZFS], [1],
1604             [Define to 1 if you have the ZFS library.])
1605   LIBNVPAIR="-lnvpair"
1606   AC_DEFINE([HAVE_LIBNVPAIR], [1],
1607             [Define to 1 if you have the NVPAIR library.])
1608 fi
1609
1610 AC_SUBST([LIBZFS])
1611 AC_SUBST([LIBNVPAIR])
1612
1613 LIBS=""
1614
1615 AC_SUBST([FONT_SOURCE])
1616 AS_IF([test x$target_cpu = xi386 -a x$platform = xqemu],
1617             [AC_SUBST([GRUB_BOOT_MACHINE_LINK_ADDR], 0xffe00)])
1618
1619 AC_SUBST(HAVE_ASM_USCORE)
1620 AC_SUBST(ADDR32)
1621 AC_SUBST(DATA32)
1622 AC_SUBST(BSS_START_SYMBOL)
1623 AC_SUBST(END_SYMBOL)
1624 AC_SUBST(PACKAGE)
1625 AC_SUBST(VERSION)
1626
1627 AC_ARG_ENABLE([werror],
1628               [AS_HELP_STRING([--disable-werror],
1629                              [do not use -Werror when building GRUB])])
1630 if test x"$enable_werror" != xno ; then
1631   TARGET_CFLAGS="$TARGET_CFLAGS -Werror"
1632   HOST_CFLAGS="$HOST_CFLAGS -Werror"
1633 fi
1634
1635 if test "x$grub_cv_cc_target_clang" = xno; then
1636    TARGET_LDFLAGS_STATIC_LIBGCC="-static-libgcc"
1637 else
1638    TARGET_LDFLAGS_STATIC_LIBGCC=
1639 fi
1640
1641 TARGET_CPP="$TARGET_CC -E"
1642 TARGET_CCAS=$TARGET_CC
1643
1644 # Includes which include make-time substitutions. They must come last
1645 # as to avoid executing top_builddir in shell.
1646 HOST_CPPFLAGS="$HOST_CPPFLAGS -I\$(top_builddir)/include"
1647 TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_srcdir)/include"
1648 TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_builddir)/include"
1649
1650 GRUB_TARGET_CPU="${target_cpu}"
1651 GRUB_PLATFORM="${platform}"
1652
1653 AC_SUBST(GRUB_TARGET_CPU)
1654 AC_SUBST(GRUB_PLATFORM)
1655
1656 AC_SUBST(TARGET_OBJCONV)
1657 AC_SUBST(TARGET_LIBGCC)
1658 AC_SUBST(TARGET_LDFLAGS_STATIC_LIBGCC)
1659 AC_SUBST(TARGET_CPP)
1660 AC_SUBST(TARGET_CCAS)
1661 AC_SUBST(TARGET_OBJ2ELF)
1662 AC_SUBST(TARGET_MODULE_FORMAT)
1663 AC_SUBST(TARGET_CC_VERSION)
1664
1665 AC_SUBST(TARGET_CFLAGS)
1666 AC_SUBST(TARGET_LDFLAGS)
1667 AC_SUBST(TARGET_CPPFLAGS)
1668 AC_SUBST(TARGET_CCASFLAGS)
1669
1670 AC_SUBST(TARGET_IMG_LDFLAGS)
1671 AC_SUBST(TARGET_IMG_CFLAGS)
1672 AC_SUBST(TARGET_IMG_BASE_LDOPT)
1673 AC_SUBST(TARGET_APPLE_LINKER)
1674
1675 AC_SUBST(HOST_CFLAGS)
1676 AC_SUBST(HOST_LDFLAGS)
1677 AC_SUBST(HOST_CPPFLAGS)
1678 AC_SUBST(HOST_CCASFLAGS)
1679
1680 AC_SUBST(BUILD_LIBM)
1681
1682 #
1683 # Automake conditionals
1684 #
1685
1686 AM_CONDITIONAL([COND_real_platform], [test x$platform != xnone])
1687 AM_CONDITIONAL([COND_emu], [test x$platform = xemu])
1688 AM_CONDITIONAL([COND_clang], [test x$grub_cv_cc_target_clang = xyes])
1689 AM_CONDITIONAL([COND_i386_pc], [test x$target_cpu = xi386 -a x$platform = xpc])
1690 AM_CONDITIONAL([COND_i386_efi], [test x$target_cpu = xi386 -a x$platform = xefi])
1691 AM_CONDITIONAL([COND_ia64_efi], [test x$target_cpu = xia64 -a x$platform = xefi])
1692 AM_CONDITIONAL([COND_i386_qemu], [test x$target_cpu = xi386 -a x$platform = xqemu])
1693 AM_CONDITIONAL([COND_i386_ieee1275], [test x$target_cpu = xi386 -a x$platform = xieee1275])
1694 AM_CONDITIONAL([COND_i386_coreboot], [test x$target_cpu = xi386 -a x$platform = xcoreboot])
1695 AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot])
1696 AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi])
1697 AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen])
1698 AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen])
1699 AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson])
1700 AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")"  -a x$platform = xqemu_mips])
1701 AM_CONDITIONAL([COND_mips_arc], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")"  -a x$platform = xarc])
1702 AM_CONDITIONAL([COND_sparc64_ieee1275], [test x$target_cpu = xsparc64 -a x$platform = xieee1275])
1703 AM_CONDITIONAL([COND_sparc64_emu], [test x$target_cpu = xsparc64 -a x$platform = xemu])
1704 AM_CONDITIONAL([COND_powerpc_ieee1275], [test x$target_cpu = xpowerpc -a x$platform = xieee1275])
1705 AM_CONDITIONAL([COND_mips], [test x$target_cpu = xmips -o x$target_cpu = xmipsel])
1706 AM_CONDITIONAL([COND_mipsel], [test x$target_cpu = xmipsel])
1707 AM_CONDITIONAL([COND_mipseb], [test x$target_cpu = xmips])
1708 AM_CONDITIONAL([COND_arm], [test x$target_cpu = xarm ])
1709 AM_CONDITIONAL([COND_arm_uboot], [test x$target_cpu = xarm -a x$platform = xuboot])
1710 AM_CONDITIONAL([COND_arm_efi], [test x$target_cpu = xarm -a x$platform = xefi])
1711 AM_CONDITIONAL([COND_arm64], [test x$target_cpu = xarm64 ])
1712 AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi])
1713
1714 AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd])
1715 AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux])
1716 AM_CONDITIONAL([COND_HOST_NETBSD], [test x$host_kernel = xnetbsd])
1717 AM_CONDITIONAL([COND_HOST_WINDOWS], [test x$host_kernel = xwindows])
1718 AM_CONDITIONAL([COND_HOST_KFREEBSD], [test x$host_kernel = xkfreebsd])
1719 AM_CONDITIONAL([COND_HOST_XNU], [test x$host_kernel = xxnu])
1720 AM_CONDITIONAL([COND_HOST_ILLUMOS], [test x$host_kernel = xillumos])
1721
1722 AM_CONDITIONAL([COND_MAN_PAGES], [test x$cross_compiling = xno -a x$HELP2MAN != x])
1723 AM_CONDITIONAL([COND_GRUB_EMU_USB], [test x$enable_grub_emu_usb = xyes])
1724 AM_CONDITIONAL([COND_GRUB_EMU_SDL], [test x$enable_grub_emu_sdl = xyes])
1725 AM_CONDITIONAL([COND_GRUB_EMU_PCI], [test x$enable_grub_emu_pci = xyes])
1726 AM_CONDITIONAL([COND_GRUB_MKFONT], [test x$enable_grub_mkfont = xyes])
1727 AM_CONDITIONAL([COND_GRUB_MOUNT], [test x$enable_grub_mount = xyes])
1728 AM_CONDITIONAL([COND_HAVE_FONT_SOURCE], [test x$FONT_SOURCE != x])
1729 if test x$FONT_SOURCE != x ; then
1730    HAVE_FONT_SOURCE=1
1731 else
1732    HAVE_FONT_SOURCE=0
1733 fi
1734 AC_SUBST(HAVE_FONT_SOURCE)
1735 AM_CONDITIONAL([COND_APPLE_LINKER], [test x$TARGET_APPLE_LINKER = x1])
1736 AM_CONDITIONAL([COND_ENABLE_EFIEMU], [test x$enable_efiemu = xyes])
1737 AM_CONDITIONAL([COND_ENABLE_CACHE_STATS], [test x$DISK_CACHE_STATS = x1])
1738 AM_CONDITIONAL([COND_ENABLE_BOOT_TIME_STATS], [test x$BOOT_TIME_STATS = x1])
1739
1740 AM_CONDITIONAL([COND_HAVE_CXX], [test x$HAVE_CXX = xyes])
1741
1742 AM_CONDITIONAL([COND_HAVE_ASM_USCORE], [test x$HAVE_ASM_USCORE = x1])
1743 AM_CONDITIONAL([COND_STARFIELD], [test "x$starfield_excuse" = x])
1744 AM_CONDITIONAL([COND_HAVE_EXEC], [test "x$have_exec" = xy])
1745
1746 test "x$prefix" = xNONE && prefix="$ac_default_prefix"
1747 test "x$exec_prefix" = xNONE && exec_prefix="${prefix}"
1748 datarootdir="$(eval echo "$datarootdir")"
1749 grub_libdir="$(eval echo "$libdir")"
1750 grub_localedir="$(eval echo "$localedir")"
1751 grub_datadir="$(eval echo "$datadir")"
1752 grub_sysconfdir="$(eval echo "$sysconfdir")"
1753 AC_DEFINE_UNQUOTED(LOCALEDIR, "$grub_localedir", [Locale dir])
1754 AC_DEFINE_UNQUOTED(GRUB_LIBDIR, "$grub_libdir", [Library dir])
1755 AC_DEFINE_UNQUOTED(GRUB_DATADIR, "$grub_datadir", [Data dir])
1756 AC_DEFINE_UNQUOTED(GRUB_SYSCONFDIR, "$grub_sysconfdir", [Configuration dir])
1757
1758
1759 # Output files.
1760 if test "$platform" != none; then
1761   cpudir="${target_cpu}"
1762   if test x${cpudir} = xmipsel; then
1763     cpudir=mips;
1764   fi
1765   grub_CHECK_LINK_DIR
1766   if test x"$link_dir" = xyes ; then
1767     AC_CONFIG_LINKS([include/grub/cpu:include/grub/$cpudir])
1768     if test "$platform" != emu ; then
1769       AC_CONFIG_LINKS([include/grub/machine:include/grub/$cpudir/$platform])
1770     fi
1771   else
1772     mkdir -p include/grub 2>/dev/null
1773     rm -rf include/grub/cpu
1774     cp -rp $srcdir/include/grub/$cpudir include/grub/cpu 2>/dev/null
1775     if test "$platform" != emu ; then
1776       rm -rf include/grub/machine
1777       cp -rp $srcdir/include/grub/$cpudir/$platform include/grub/machine 2>/dev/null
1778     fi
1779   fi
1780 else
1781   # Just enough to stop the compiler failing with -I$(srcdir)/include.
1782   mkdir -p include 2>/dev/null
1783   rm -rf include/grub/cpu include/grub/machine
1784 fi
1785
1786 AC_CONFIG_FILES([Makefile])
1787 AC_CONFIG_FILES([grub-core/Makefile])
1788 AC_CONFIG_FILES([grub-core/gnulib/Makefile])
1789 AC_CONFIG_FILES([po/Makefile.in])
1790 AC_CONFIG_FILES([docs/Makefile])
1791 AC_CONFIG_FILES([util/bash-completion.d/Makefile])
1792 AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
1793 AC_CONFIG_FILES([config.h])
1794
1795 AC_OUTPUT
1796 [
1797 echo "*******************************************************"
1798 echo GRUB2 will be compiled with following components:
1799 echo Platform: "$target_cpu"-"$platform"
1800 if [ x"$platform" = xemu ]; then
1801 if [ x"$grub_emu_usb_excuse" = x ]; then
1802 echo USB support for grub-emu: Yes
1803 else
1804 echo USB support for grub-emu: No "($grub_emu_usb_excuse)"
1805 fi
1806 if [ x"$grub_emu_sdl_excuse" = x ]; then
1807 echo SDL support for grub-emu: Yes
1808 else
1809 echo SDL support for grub-emu: No "($grub_emu_sdl_excuse)"
1810 fi
1811 if [ x"$grub_emu_pci_excuse" = x ]; then
1812 echo PCI support for grub-emu: Yes
1813 else
1814 echo PCI support for grub-emu: No "($grub_emu_pci_excuse)"
1815 fi
1816 fi
1817 if test x"$device_mapper_excuse" = x ; then
1818 echo With devmapper support: Yes
1819 else
1820 echo With devmapper support: No "($device_mapper_excuse)"
1821 fi
1822 if [ x"$enable_mm_debug" = xyes ]; then
1823 echo With memory debugging: Yes
1824 else
1825 echo With memory debugging: No
1826 fi
1827 if [ x"$enable_cache_stats" = xyes ]; then
1828 echo With disk cache statistics: Yes
1829 else
1830 echo With disk cache statistics: No
1831 fi
1832
1833 if [ x"$enable_boot_time" = xyes ]; then
1834 echo With boot time statistics: Yes
1835 else
1836 echo With boot time statistics: No
1837 fi
1838
1839 if [ x"$efiemu_excuse" = x ]; then
1840 echo efiemu runtime: Yes
1841 else
1842 echo efiemu runtime: No "($efiemu_excuse)"
1843 fi
1844 if [ x"$grub_mkfont_excuse" = x ]; then
1845 echo grub-mkfont: Yes
1846 else
1847 echo grub-mkfont: No "($grub_mkfont_excuse)"
1848 fi
1849 if [ x"$grub_mount_excuse" = x ]; then
1850 echo grub-mount: Yes
1851 else
1852 echo grub-mount: No "($grub_mount_excuse)"
1853 fi
1854 if [ x"$starfield_excuse" = x ]; then
1855 echo starfield theme: Yes
1856 echo With DejaVuSans font from $DJVU_FONT_SOURCE
1857 else
1858 echo starfield theme: No "($starfield_excuse)"
1859 fi
1860 if [ x"$libzfs_excuse" = x ]; then
1861 echo With libzfs support: Yes
1862 else
1863 echo With libzfs support: No "($libzfs_excuse)"
1864 fi
1865 if [ x"$grub_build_mkfont_excuse" = x ]; then
1866   echo Build-time grub-mkfont: Yes
1867   if test "x$FONT_SOURCE" = x ; then
1868     echo "Without unifont"
1869   else
1870     echo "With unifont from $FONT_SOURCE"
1871   fi
1872 else
1873   echo Build-time grub-mkfont: No "($grub_build_mkfont_excuse)"
1874   echo "Without unifont (no build-time grub-mkfont)"
1875 fi
1876 if test x"$liblzma_excuse" != x ; then
1877 echo "Without liblzma (no support for XZ-compressed mips images) ($liblzma_excuse)"
1878 else
1879 echo "With liblzma from $LIBLZMA (support for XZ-compressed mips images)"
1880 fi
1881 echo "*******************************************************"
1882 ]