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