Remove obsolete ADDR32 and DATA32 checks.
[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 fi
1100
1101 grub_PROG_NM_WORKS
1102 grub_PROG_NM_MINUS_P
1103 grub_PROG_NM_DEFINED_ONLY
1104 AC_SUBST(TARGET_NMFLAGS_MINUS_P)
1105 AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY)
1106
1107 if test "$platform" != emu; then
1108 AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [
1109   SAVED_CPPFLAGS="$CPPFLAGS"
1110   CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
1111   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
1112 #include <stddef.h>
1113 int va_arg_func (int fixed, va_list args);]], [[]])],
1114       [grub_cv_cc_isystem=yes],
1115       [grub_cv_cc_isystem=no])
1116   CPPFLAGS="$SAVED_CPPFLAGS"
1117 ])
1118
1119 if test x"$grub_cv_cc_isystem" = xyes ; then
1120   TARGET_CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
1121 fi
1122 fi
1123
1124 AC_CACHE_CHECK([whether -Wtrampolines work], [grub_cv_cc_wtrampolines], [
1125   CFLAGS="$TARGET_CFLAGS -Wtrampolines -Werror"
1126   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
1127 int va_arg_func (int fixed, va_list args);]], [[]])],
1128       [grub_cv_cc_wtrampolines=yes],
1129       [grub_cv_cc_wtrampolines=no])
1130 ])
1131
1132 if test x"$grub_cv_cc_wtrampolines" = xyes ; then
1133   TARGET_CFLAGS="$TARGET_CFLAGS -Wtrampolines"
1134 fi
1135
1136 # Restore the flags.
1137 CC="$tmp_CC"
1138 CFLAGS="$tmp_CFLAGS"
1139 CPPFLAGS="$tmp_CPPFLAGS"
1140 LDFLAGS="$tmp_LDFLAGS"
1141 LIBS="$tmp_LIBS"
1142
1143 #
1144 # Check for options.
1145 #
1146
1147 # Memory manager debugging.
1148 AC_ARG_ENABLE([mm-debug],
1149               AS_HELP_STRING([--enable-mm-debug],
1150                              [include memory manager debugging]),
1151               [AC_DEFINE([MM_DEBUG], [1],
1152                          [Define to 1 if you enable memory manager debugging.])])
1153
1154 AC_ARG_ENABLE([cache-stats],
1155               AS_HELP_STRING([--enable-cache-stats],
1156                              [enable disk cache statistics collection]))
1157
1158 if test x$enable_cache_stats = xyes; then
1159   DISK_CACHE_STATS=1
1160 else
1161   DISK_CACHE_STATS=0
1162 fi
1163 AC_SUBST([DISK_CACHE_STATS])
1164
1165 AC_ARG_ENABLE([boot-time],
1166               AS_HELP_STRING([--enable-boot-time],
1167                              [enable boot time statistics collection]))
1168
1169 if test x$enable_boot_time = xyes; then
1170   BOOT_TIME_STATS=1
1171 else
1172   BOOT_TIME_STATS=0
1173 fi
1174 AC_SUBST([BOOT_TIME_STATS])
1175
1176 AC_ARG_ENABLE([grub-emu-usb],
1177               [AS_HELP_STRING([--enable-grub-emu-usb],
1178                              [build and install the `grub-emu' debugging utility with USB support (default=guessed)])])
1179
1180 AC_ARG_ENABLE([grub-emu-sdl],
1181               [AS_HELP_STRING([--enable-grub-emu-sdl],
1182                              [build and install the `grub-emu' debugging utility with SDL support (default=guessed)])])
1183
1184 AC_ARG_ENABLE([grub-emu-pci],
1185               [AS_HELP_STRING([--enable-grub-emu-pci],
1186                              [build and install the `grub-emu' debugging utility with PCI support (potentially dangerous) (default=no)])])
1187
1188 if test "$platform" = emu; then
1189
1190 if test x"$enable_grub_emu_usb" != xyes ; then
1191    grub_emu_usb_excuse="not enabled"
1192 fi
1193
1194 if test x"$enable_grub_emu_pci" = xyes ; then
1195    grub_emu_usb_excuse="conflicts with PCI support"
1196 fi
1197
1198 [if [ x"$grub_emu_usb_excuse" = x ]; then
1199     # Check for libusb libraries.]
1200 AC_CHECK_LIB([usb], [usb_claim_interface], [LIBUSB="-lusb"],
1201     [grub_emu_usb_excuse=["need libusb library"]])
1202     AC_SUBST([LIBUSB])
1203 [fi]
1204 [if [ x"$grub_emu_usb_excuse" = x ]; then
1205     # Check for headers.]
1206     AC_CHECK_HEADERS([usb.h], [],
1207       [grub_emu_usb_excuse=["need libusb headers"]])
1208 [fi]
1209 if test x"$enable_grub_emu_usb" = xyes && test x"$grub_emu_usb_excuse" != x ; then
1210   AC_MSG_ERROR([USB support for grub-emu was explicitly requested but can't be compiled ($grub_emu_usb_excuse)])
1211 fi
1212 if test x"$grub_emu_usb_excuse" = x ; then
1213 enable_grub_emu_usb=yes
1214 else
1215 enable_grub_emu_usb=no
1216 fi
1217
1218 if test x"$enable_grub_emu_sdl" = xno ; then
1219   grub_emu_sdl_excuse="explicitly disabled"
1220 fi
1221 [if [ x"$grub_emu_sdl_excuse" = x ]; then
1222     # Check for libSDL libraries.]
1223 AC_CHECK_LIB([SDL], [SDL_Init], [LIBSDL="-lSDL"],
1224     [grub_emu_sdl_excuse=["libSDL libraries are required to build \`grub-emu' with SDL support"]])
1225     AC_SUBST([LIBSDL])
1226 [fi]
1227
1228 [if [ x"$grub_emu_sdl_excuse" = x ]; then
1229     # Check for headers.]
1230     AC_CHECK_HEADERS([SDL/SDL.h], [],
1231       [grub_emu_sdl_excuse=["libSDL header file is required to build \`grub-emu' with SDL support"]])
1232 [fi]
1233
1234 if test x"enable_grub_emu_sdl" = xyes && test x"$grub_emu_sdl_excuse" != x ; then
1235   AC_MSG_ERROR([SDL support for grub-emu was explicitly requested but can't be compiled ($grub_emu_sdl_excuse)])
1236 fi
1237 if test x"$grub_emu_sdl_excuse" = x ; then
1238 enable_grub_emu_sdl=yes
1239 else
1240 enable_grub_emu_sdl=no
1241 fi
1242
1243 if test x"$enable_grub_emu_pci" != xyes ; then
1244    grub_emu_pci_excuse="not enabled"
1245 fi
1246
1247 if test x"$enable_grub_emu_usb" = xyes ; then
1248    grub_emu_pci_excuse="conflicts with USB support"
1249 fi
1250
1251 [if [ x"$grub_emu_pci_excuse" = x ]; then
1252       # Check for libpci libraries.]
1253    AC_CHECK_LIB([pciaccess], [pci_system_init], [LIBPCIACCESS="-lpciaccess"],
1254       [grub_emu_pci_excuse=["need libpciaccess library"]])
1255     AC_SUBST([LIBPCIACCESS])
1256 [fi]
1257 [if [ x"$grub_emu_pci_excuse" = x ]; then
1258     # Check for headers.]
1259     AC_CHECK_HEADERS([pci/pci.h], [],
1260       [grub_emu_pci_excuse=["need libpciaccess headers"]])
1261 [fi]
1262
1263 if test x"$grub_emu_pci_excuse" = x ; then
1264 enable_grub_emu_pci=yes
1265 else
1266
1267 enable_grub_emu_pci=no
1268 fi
1269
1270 AC_SUBST([enable_grub_emu_sdl])
1271 AC_SUBST([enable_grub_emu_usb])
1272 AC_SUBST([enable_grub_emu_pci])
1273
1274 else
1275
1276 # Ignore --enable-emu-* if platform is not emu
1277 enable_grub_emu_sdl=no
1278 enable_grub_emu_usb=no
1279 enable_grub_emu_pci=no
1280 fi
1281
1282 AC_ARG_ENABLE([grub-mkfont],
1283               [AS_HELP_STRING([--enable-grub-mkfont],
1284                              [build and install the `grub-mkfont' utility (default=guessed)])])
1285 if test x"$enable_grub_mkfont" = xno ; then
1286   grub_mkfont_excuse="explicitly disabled"
1287 fi
1288
1289 if test x"$grub_mkfont_excuse" = x ; then
1290   # Check for freetype libraries.
1291   AC_CHECK_TOOLS([FREETYPE], [freetype-config])
1292   if test "x$FREETYPE" = x ; then
1293     grub_mkfont_excuse=["need freetype2 library"]
1294   fi
1295 fi
1296
1297 unset ac_cv_header_ft2build_h
1298
1299 if test x"$grub_mkfont_excuse" = x ; then
1300   # Check for freetype libraries.
1301   freetype_cflags=`$FREETYPE --cflags`
1302   freetype_libs=`$FREETYPE --libs`
1303   SAVED_CPPFLAGS="$CPPFLAGS"
1304   SAVED_LIBS="$LIBS"
1305   CPPFLAGS="$CPPFLAGS $freetype_cflags"
1306   LIBS="$LIBS $freetype_libs"
1307   AC_CHECK_HEADERS([ft2build.h], [],
1308         [grub_mkfont_excuse=["need freetype2 headers"]])
1309   AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_mkfont_excuse=["freetype2 library unusable"]])
1310   CPPFLAGS="$SAVED_CPPFLAGS"
1311   LIBS="$SAVED_LIBS"
1312 fi
1313
1314 if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then
1315   AC_MSG_ERROR([grub-mkfont was explicitly requested but can't be compiled ($grub_mkfont_excuse)])
1316 fi
1317 if test x"$grub_mkfont_excuse" = x ; then
1318 enable_grub_mkfont=yes
1319 else
1320 enable_grub_mkfont=no
1321 fi
1322 AC_SUBST([enable_grub_mkfont])
1323 AC_SUBST([freetype_cflags])
1324 AC_SUBST([freetype_libs])
1325
1326 SAVED_CC="$CC"
1327 SAVED_CPP="$CPP"
1328 SAVED_CFLAGS="$CFLAGS"
1329 SAVED_CPPFLAGS="$CPPFLAGS"
1330 SAVED_LDFLAGS="$LDFLAGS"
1331 CC="$BUILD_CC"
1332 CPP="$BUILD_CPP"
1333 CFLAGS="$BUILD_CFLAGS"
1334 CPPFLAGS="$BUILD_CPPFLAGS"
1335 LDFLAGS="$BUILD_LDFAGS"
1336
1337 unset ac_cv_c_bigendian
1338 unset ac_cv_header_ft2build_h
1339
1340 AC_COMPUTE_INT([BUILD_SIZEOF_VOID_P], [sizeof (void *)])
1341 AC_COMPUTE_INT([BUILD_SIZEOF_LONG], [sizeof (long)])
1342 AC_C_BIGENDIAN([BUILD_WORDS_BIGENDIAN=1], [BUILD_WORDS_BIGENDIAN=0], [BUILD_WORDS_BIGENDIAN=err], [BUILD_WORDS_BIGENDIAN=err])
1343
1344 if test x$BUILD_WORDS_BIGENDIAN = xerr ; then
1345    AC_MSG_ERROR([couldnt determine build endianness])
1346 fi
1347
1348 AC_SUBST([BUILD_SIZEOF_LONG])
1349 AC_SUBST([BUILD_SIZEOF_VOID_P])
1350 AC_SUBST([BUILD_WORDS_BIGENDIAN])
1351
1352 if test x"$grub_build_mkfont_excuse" = x ; then
1353   # Check for freetype libraries.
1354   AC_CHECK_PROGS([BUILD_FREETYPE], [freetype-config])
1355   if test "x$BUILD_FREETYPE" = x ; then
1356     grub_build_mkfont_excuse=["need freetype2 library"]
1357   fi
1358 fi
1359
1360 if test x"$grub_build_mkfont_excuse" = x ; then
1361   # Check for freetype libraries.
1362   build_freetype_cflags=`$BUILD_FREETYPE --cflags`
1363   build_freetype_libs=`$BUILD_FREETYPE --libs`
1364   SAVED_CPPFLAGS_2="$CPPFLAGS"
1365   SAVED_LIBS="$LIBS"
1366   CPPFLAGS="$CPPFLAGS $build_freetype_cflags"
1367   LIBS="$LIBS $build_freetype_libs"
1368   AC_CHECK_HEADERS([ft2build.h], [],
1369         [grub_build_mkfont_excuse=["need freetype2 headers"]])
1370   AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_build_mkfont_excuse=["freetype2 library unusable"]])
1371   LIBS="$SAVED_LIBS"
1372   CPPFLAGS="$SAVED_CPPFLAGS_2"
1373 fi
1374
1375 if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then
1376   AC_MSG_ERROR([build-grub-mkfont was explicitly requested but can't be compiled ($grub_build_mkfont_excuse)])
1377 fi
1378 if test x"$grub_build_mkfont_excuse" = x ; then
1379   enable_build_grub_mkfont=yes
1380 else
1381   enable_build_grub_mkfont=no
1382 fi
1383 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
1384   if test x"$grub_build_mkfont_excuse" = x ; then
1385     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont])
1386   else
1387     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont ($grub_build_mkfont_excuse)])
1388   fi
1389 fi
1390
1391 AC_SUBST([build_freetype_cflags])
1392 AC_SUBST([build_freetype_libs])
1393
1394 CC="$SAVED_CC"
1395 CPP="$SAVED_CPP"
1396 CFLAGS="$SAVED_CFLAGS"
1397 CPPFLAGS="$SAVED_CPPFLAGS"
1398 LDFLAGS="$SAVED_LDFLAGS"
1399
1400
1401 DJVU_FONT_SOURCE=
1402
1403 starfield_excuse=
1404
1405 AC_ARG_ENABLE([grub-themes],
1406               [AS_HELP_STRING([--enable-grub-themes],
1407                              [build and install GRUB themes (default=guessed)])])
1408 if test x"$enable_grub_themes" = xno ; then
1409   starfield_excuse="explicitly disabled"
1410 fi
1411
1412 if test x"$starfield_excuse" = x && test x"$enable_build_grub_mkfont" = xno ; then
1413   starfield_excuse="No build-time grub-mkfont"
1414 fi
1415
1416 if test x"$starfield_excuse" = x; then
1417    for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
1418      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
1419         if test -f "$dir/DejaVuSans.$ext"; then
1420           DJVU_FONT_SOURCE="$dir/DejaVuSans.$ext"
1421           break 2
1422         fi
1423      done
1424    done
1425
1426    if test "x$DJVU_FONT_SOURCE" = x; then
1427      starfield_excuse="No DejaVu found"
1428    fi
1429 fi
1430
1431 if test x"$enable_grub_themes" = xyes &&  test x"$starfield_excuse" != x; then
1432    AC_MSG_ERROR([themes were explicitly requested but requirements are not satisfied ($starfield_excuse)])
1433 fi
1434
1435 AC_SUBST([DJVU_FONT_SOURCE])
1436
1437 FONT_SOURCE=
1438
1439 for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
1440   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
1441     if test -f "$dir/unifont.$ext"; then
1442       md5="$(md5sum "$dir/unifont.$ext"|awk '{ print $1; }')"
1443       # PCF and BDF from version 6.3 isn't hanled properly by libfreetype.
1444       if test "$md5" = 0a54834d2788c83886a3e1785a6a1e61 || test "$md5" = 28f2565c7a41d8d407e2551159385edb || test "$md5" = dae5e588461b3b92b87b6ffee734f936 || test "$md5" = 4a3d687aa5bb329ed05f4263a1016791 ; then
1445         continue
1446       fi
1447       FONT_SOURCE="$dir/unifont.$ext"
1448       break 2
1449     fi
1450   done
1451 done
1452
1453 if test x"$enable_build_grub_mkfont" = xno ; then
1454   FONT_SOURCE=
1455 fi
1456
1457 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
1458   if test x"$grub_build_mkfont_excuse" = x ; then
1459     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont])
1460   else
1461     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont ($grub_build_mkfont_excuse)])
1462   fi
1463 fi
1464
1465 AC_SUBST([FONT_SOURCE])
1466
1467 if test x"$FONT_SOURCE" = x &&  test x"$DJVU_FONT_SOURCE" = x && test x"$grub_build_mkfont_excuse" = x; then
1468   grub_build_mkfont_excuse="no fonts"
1469 fi
1470
1471
1472 AC_ARG_ENABLE([grub-mount],
1473               [AS_HELP_STRING([--enable-grub-mount],
1474                              [build and install the `grub-mount' utility (default=guessed)])])
1475 if test x"$enable_grub_mount" = xno ; then
1476   grub_mount_excuse="explicitly disabled"
1477 fi
1478
1479 if test x"$grub_mount_excuse" = x ; then
1480   AC_CHECK_LIB([fuse], [fuse_main_real], [],
1481                [grub_mount_excuse="need FUSE library"])
1482 fi
1483
1484 if test x"$grub_mount_excuse" = x ; then
1485   # Check for fuse headers.
1486   SAVED_CPPFLAGS="$CPPFLAGS"
1487   CPPFLAGS="$CPPFLAGS -DFUSE_USE_VERSION=26"
1488   AC_CHECK_HEADERS([fuse/fuse.h], [],
1489         [grub_mount_excuse=["need FUSE headers"]])
1490   CPPFLAGS="$SAVED_CPPFLAGS"
1491 fi
1492
1493 if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then
1494   AC_MSG_ERROR([grub-mount was explicitly requested but can't be compiled ($grub_mount_excuse)])
1495 fi
1496 if test x"$grub_mount_excuse" = x ; then
1497 enable_grub_mount=yes
1498 else
1499 enable_grub_mount=no
1500 fi
1501 AC_SUBST([enable_grub_mount])
1502
1503 AC_ARG_ENABLE([device-mapper],
1504               [AS_HELP_STRING([--enable-device-mapper],
1505                               [enable Linux device-mapper support (default=guessed)])])
1506 if test x"$enable_device_mapper" = xno ; then
1507   device_mapper_excuse="explicitly disabled"
1508 fi
1509
1510 if test x"$device_mapper_excuse" = x ; then
1511   # Check for device-mapper header.
1512   AC_CHECK_HEADER([libdevmapper.h], [],
1513                [device_mapper_excuse="need libdevmapper header"])
1514 fi
1515
1516 if test x"$device_mapper_excuse" = x ; then
1517   # Check for device-mapper library.
1518   AC_CHECK_LIB([devmapper], [dm_task_create], [],
1519                [device_mapper_excuse="need devmapper library"])
1520 fi
1521
1522 if test x"$device_mapper_excuse" = x ; then
1523   # Check for device-mapper library.
1524   AC_CHECK_LIB([devmapper], [dm_log_with_errno_init],
1525                [],
1526                [device_mapper_excuse="need devmapper library"])
1527 fi
1528
1529 if test x"$device_mapper_excuse" = x ; then
1530    LIBDEVMAPPER="-ldevmapper"
1531    AC_DEFINE([HAVE_DEVICE_MAPPER], [1],
1532              [Define to 1 if you have the devmapper library.])
1533 fi
1534
1535 AC_SUBST([LIBDEVMAPPER])
1536
1537 LIBGEOM=
1538 if test x$host_kernel = xkfreebsd; then
1539   AC_CHECK_LIB([geom], [geom_gettree], [],
1540                [AC_MSG_ERROR([Your platform requires libgeom])])
1541   LIBGEOM="-lgeom"
1542 fi
1543
1544 AC_SUBST([LIBGEOM])
1545
1546 AC_ARG_ENABLE([liblzma],
1547               [AS_HELP_STRING([--enable-liblzma],
1548                               [enable liblzma integration (default=guessed)])])
1549 if test x"$enable_liblzma" = xno ; then
1550   liblzma_excuse="explicitly disabled"
1551 fi
1552
1553 if test x"$liblzma_excuse" = x ; then
1554 AC_CHECK_LIB([lzma], [lzma_code],
1555              [],[liblzma_excuse="need lzma library"])
1556 fi
1557 if test x"$liblzma_excuse" = x ; then
1558 AC_CHECK_HEADER([lzma.h], [], [liblzma_excuse="need lzma header"])
1559 fi
1560
1561 if test x"$enable_liblzma" = xyes && test x"$liblzma_excuse" != x ; then
1562   AC_MSG_ERROR([liblzma support was explicitly requested but requirements are not satisfied ($liblzma_excuse)])
1563 fi
1564
1565
1566 if test x"$liblzma_excuse" = x ; then
1567    LIBLZMA="-llzma"
1568    AC_DEFINE([USE_LIBLZMA], [1],
1569              [Define to 1 if you have the LZMA library.])
1570 fi
1571
1572 AC_SUBST([LIBLZMA])
1573
1574 AC_ARG_ENABLE([libzfs],
1575               [AS_HELP_STRING([--enable-libzfs],
1576                               [enable libzfs integration (default=guessed)])])
1577 if test x"$enable_libzfs" = xno ; then
1578   libzfs_excuse="explicitly disabled"
1579 fi
1580
1581 if test x"$libzfs_excuse" = x ; then
1582   # Only check for system headers if libzfs support has not been disabled.
1583   AC_CHECK_HEADERS(libzfs.h libnvpair.h)
1584 fi
1585
1586 if test x"$libzfs_excuse" = x ; then
1587   AC_CHECK_LIB([zfs], [libzfs_init],
1588                [],
1589                [libzfs_excuse="need zfs library"])
1590 fi
1591
1592 if test x"$libzfs_excuse" = x ; then
1593   AC_CHECK_LIB([nvpair], [nvlist_lookup_string],
1594                [],
1595                [libzfs_excuse="need nvpair library"])
1596 fi
1597
1598 if test x"$enable_libzfs" = xyes && test x"$libzfs_excuse" != x ; then
1599   AC_MSG_ERROR([libzfs support was explicitly requested but requirements are not satisfied ($libzfs_excuse)])
1600 fi
1601
1602 if test x"$libzfs_excuse" = x ; then
1603   # We need both libzfs and libnvpair for a successful build.
1604   LIBZFS="-lzfs"
1605   AC_DEFINE([HAVE_LIBZFS], [1],
1606             [Define to 1 if you have the ZFS library.])
1607   LIBNVPAIR="-lnvpair"
1608   AC_DEFINE([HAVE_LIBNVPAIR], [1],
1609             [Define to 1 if you have the NVPAIR library.])
1610 fi
1611
1612 AC_SUBST([LIBZFS])
1613 AC_SUBST([LIBNVPAIR])
1614
1615 LIBS=""
1616
1617 AC_SUBST([FONT_SOURCE])
1618 AS_IF([test x$target_cpu = xi386 -a x$platform = xqemu],
1619             [AC_SUBST([GRUB_BOOT_MACHINE_LINK_ADDR], 0xffe00)])
1620
1621 AC_SUBST(HAVE_ASM_USCORE)
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 ]