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