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