Fix in-tree --platform=none
[grub.git] / configure.ac
1 # -*- autoconf -*-
2
3 # Process this file with autoconf to produce a configure script.
4
5 # Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009,2010  Free Software Foundation, Inc.
6 #
7 # This configure.ac is free software; the author
8 # gives unlimited permission to copy and/or distribute it,
9 # with or without modifications, as long as this notice is preserved.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14 # PARTICULAR PURPOSE.
15
16 dnl This configure script is complicated, because GRUB needs to deal
17 dnl with three potentially different types:
18 dnl
19 dnl   build  -- the environment for building GRUB
20 dnl   host   -- the environment for running utilities
21 dnl   target -- the environment for running GRUB
22 dnl
23 dnl In addition, GRUB needs to deal with a platform specification
24 dnl which specifies the system running GRUB, such as firmware.
25 dnl This is necessary because the target type in autoconf does not
26 dnl describe such a system very well.
27 dnl
28 dnl The current strategy is to use variables with no prefix (such as
29 dnl CC, CFLAGS, etc.) for the host type, variables with prefix "BUILD_"
30 dnl (such as BUILD_CC, BUILD_CFLAGS, etc.) for the build type and variables
31 dnl with the prefix "TARGET_" (such as TARGET_CC, TARGET_CFLAGS, etc.) are
32 dnl used for the target type. See INSTALL for full list of variables.
33
34 AC_INIT([GRUB],[2.02~beta2],[bug-grub@gnu.org])
35
36 AC_CONFIG_AUX_DIR([build-aux])
37
38 # We don't want -g -O2 by default in CFLAGS
39 : ${CFLAGS=""}
40
41 # Checks for build, host and target systems.
42 AC_CANONICAL_BUILD
43 AC_CANONICAL_HOST
44 save_program_prefix="${program_prefix}"
45 AC_CANONICAL_TARGET
46 program_prefix="${save_program_prefix}"
47
48 AM_INIT_AUTOMAKE([1.10.1])
49 AC_PREREQ(2.60)
50 AC_CONFIG_SRCDIR([include/grub/dl.h])
51 AC_CONFIG_HEADER([config-util.h])
52
53 # Program name transformations
54 AC_ARG_PROGRAM
55 grub_TRANSFORM([grub-bios-setup])
56 grub_TRANSFORM([grub-editenv])
57 grub_TRANSFORM([grub-install])
58 grub_TRANSFORM([grub-mkconfig])
59 grub_TRANSFORM([grub-mkfont])
60 grub_TRANSFORM([grub-mkimage])
61 grub_TRANSFORM([grub-glue-efi])
62 grub_TRANSFORM([grub-mklayout])
63 grub_TRANSFORM([grub-mkpasswd-pbkdf2])
64 grub_TRANSFORM([grub-mkrelpath])
65 grub_TRANSFORM([grub-mkrescue])
66 grub_TRANSFORM([grub-probe])
67 grub_TRANSFORM([grub-reboot])
68 grub_TRANSFORM([grub-script-check])
69 grub_TRANSFORM([grub-set-default])
70 grub_TRANSFORM([grub-sparc64-setup])
71 grub_TRANSFORM([grub-render-label])
72 grub_TRANSFORM([grub-file])
73
74 # Optimization flag.  Allow user to override.
75 if test "x$TARGET_CFLAGS" = x; then
76   TARGET_CFLAGS="$TARGET_CFLAGS -Os"
77 fi
78
79 # Default HOST_CPPFLAGS
80 HOST_CPPFLAGS="$HOST_CPPFLAGS -Wall -W"
81 HOST_CPPFLAGS="$HOST_CPPFLAGS -I\$(top_builddir)/include"
82 HOST_CPPFLAGS="$HOST_CPPFLAGS -DGRUB_UTIL=1"
83
84 TARGET_CPPFLAGS="$TARGET_CPPFLAGS -Wall -W"
85 TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_srcdir)/include"
86 TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_builddir)/include"
87
88 case "$target_cpu" in
89   i[[3456]]86)  target_cpu=i386 ;;
90   amd64)        target_cpu=x86_64 ;;
91   sparc)        target_cpu=sparc64 ;;
92   mipsel|mips64el)
93                 target_cpu=mipsel
94                 machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPSEL=1"
95                 ;;
96   mips|mips64)
97                 target_cpu=mips
98                 machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPS=1"
99                 ;;
100   arm*)
101                 target_cpu=arm
102                 ;;
103   aarch64*)
104                 target_cpu=arm64
105                 ;;
106 esac
107
108 # Specify the platform (such as firmware).
109 AC_ARG_WITH([platform],
110             AS_HELP_STRING([--with-platform=PLATFORM],
111                            [select the host platform [[guessed]]]))
112
113 # Guess the platform if not specified.
114 if test "x$with_platform" = x; then
115   case "$target_cpu"-"$target_vendor" in
116     i386-apple) platform=efi ;;
117     i386-*) platform=pc ;;
118     x86_64-apple) platform=efi ;;
119     x86_64-*) platform=pc ;;
120     powerpc-*) platform=ieee1275 ;;
121     powerpc64-*) platform=ieee1275 ;;
122     sparc64-*) platform=ieee1275 ;;
123     mipsel-*) platform=loongson ;;
124     mips-*) platform=arc ;;
125     ia64-*) platform=efi ;;
126     arm-*) platform=uboot ;;
127     arm64-*) platform=efi ;;
128     *)
129       AC_MSG_WARN([unsupported CPU: "$target_cpu" - only building utilities])
130       platform=none
131       ;;
132   esac
133 else
134   platform="$with_platform"
135 fi
136
137 case "$target_cpu"-"$platform" in
138   x86_64-efi) ;;
139   x86_64-emu) ;;
140   x86_64-xen) ;;
141   x86_64-none) ;;
142   x86_64-*) target_cpu=i386 ;;
143   powerpc64-ieee1275) target_cpu=powerpc ;;
144 esac
145
146 # Check if the platform is supported, make final adjustments.
147 case "$target_cpu"-"$platform" in
148   i386-efi) ;;
149   x86_64-efi) ;;
150   i386-xen) ;;
151   x86_64-xen) ;;
152   i386-pc) ;;
153   i386-multiboot) ;;
154   i386-coreboot) ;;
155   i386-linuxbios) platform=coreboot ;;
156   i386-ieee1275) ;;
157   i386-qemu) ;;
158   powerpc-ieee1275) ;;
159   sparc64-ieee1275) ;;
160   ia64-efi) ;;
161   mips-qemu_mips) ;;
162   mips-qemu-mips) platform=qemu_mips;;
163   mips-arc) ;;
164   mipsel-arc) ;;
165   mipsel-qemu_mips) ;;
166   mipsel-qemu-mips) platform=qemu_mips;;
167   mipsel-yeeloong) platform=loongson ;;
168   mipsel-fuloong) platform=loongson ;;
169   mipsel-loongson) ;;
170   arm-uboot) ;;
171   arm-efi) ;;
172   arm64-efi) ;;
173   *-emu) ;;
174   *-none) ;;
175   *) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;;
176 esac
177
178 if test x$platform != xemu ; then
179    case "$target_cpu" in
180         i386 | powerpc) target_m32=1 ;;
181         x86_64 | sparc64) target_m64=1 ;;
182    esac
183 fi
184
185 if test x"$target_cpu-$platform" = xsparc64-emu ; then
186    target_m64=1
187 fi
188
189 case "$target_os" in
190   windows* | mingw32*) target_os=cygwin ;;
191 esac
192
193 # This normalizes the names, and creates a new variable ("host_kernel")
194 # while at it, since the mapping is not always 1:1 (e.g. different OSes
195 # using the same kernel type).
196 case "$host_os" in
197   gnu*)                         host_kernel=hurd ;;
198   linux*)                       host_kernel=linux ;;
199   freebsd* | kfreebsd*-gnu)     host_kernel=kfreebsd ;;
200   netbsd*)                      host_kernel=netbsd ;;
201   solaris*)                     host_kernel=illumos ;;
202   darwin*)                      host_kernel=xnu ;;
203   cygwin | windows* | mingw32*) host_kernel=windows ;;
204 esac
205
206 case "$host_os" in
207   cygwin | windows* | mingw32*) have_exec=n ;;
208   aros*) have_exec=n ;;
209   *) have_exec=y;;
210 esac
211
212 case "$platform" in
213   coreboot)     machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_COREBOOT=1" ;;
214   multiboot)    machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;;
215   efi)          machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;;
216   xen)          machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;;
217   ieee1275)     machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;;
218   uboot)        machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;;
219   qemu)         machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;;
220   pc)           machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_PCBIOS=1" ;;
221   emu)          machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EMU=1" ;;
222   loongson)     machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_LOONGSON=1" ;;
223   qemu_mips)    machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_QEMU_MIPS=1" ;;
224   arc)  machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_ARC=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,`"
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
432 dnl FIXME proper test seems to require too deep dive into Autoconf internals.
433 dnl For now just list known platforms that we support.
434
435 case "$build_os" in
436   cygwin*|mingw32*|mingw64*)            BUILD_EXEEXT=.exe ;;
437   *)                                    BUILD_EXEEXT= ;;
438 esac
439 AC_SUBST(BUILD_EXEEXT)
440
441 # For gnulib.
442 gl_INIT
443
444 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"
445 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"
446
447 HOST_CFLAGS="$HOST_CFLAGS $WARN_FLAGS -Wcast-align"
448
449 AC_CACHE_CHECK([which extra warnings work], [grub_cv_cc_w_extra_flags], [
450   SAVED_CFLAGS="$CFLAGS"
451   grub_cv_cc_w_extra_flags=
452   for x in $EXTRA_WARN_FLAGS; do
453       CFLAGS="$HOST_CFLAGS $x -Werror"
454       AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [flag=1], [flag=0])
455       if test x$flag = x1 ; then
456          grub_cv_cc_w_extra_flags="$grub_cv_cc_w_extra_flags $x"
457       fi
458   done
459   CFLAGS="$SAVED_CFLAGS"
460 ])
461
462 HOST_CFLAGS="$HOST_CFLAGS $grub_cv_cc_w_extra_flags"
463
464 #
465 # Check for target programs.
466 #
467
468 # Find tools for the target.
469 if test "x$target_alias" != x && test "x$host_alias" != "x$target_alias"; then
470   tmp_ac_tool_prefix="$ac_tool_prefix"
471   ac_tool_prefix=$target_alias-
472
473   AC_CHECK_TOOLS(TARGET_CC, [gcc egcs cc],
474                  [AC_MSG_ERROR([none of gcc, egcs and cc is found. set TARGET_CC manually.])])
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
480   ac_tool_prefix="$tmp_ac_tool_prefix"
481 else
482   if test "x$TARGET_CC" = x; then
483     TARGET_CC=$CC
484   fi
485   AC_CHECK_TOOL(TARGET_OBJCOPY, objcopy)
486   AC_CHECK_TOOL(TARGET_STRIP, strip)
487   AC_CHECK_TOOL(TARGET_NM, nm)
488   AC_CHECK_TOOL(TARGET_RANLIB, ranlib)
489 fi
490
491 AC_SUBST(HOST_CC)
492 AC_SUBST(BUILD_CC)
493 AC_SUBST(BUILD_CFLAGS)
494 AC_SUBST(BUILD_CPPFLAGS)
495 AC_SUBST(BUILD_LDFLAGS)
496 AC_SUBST(TARGET_CC)
497 AC_SUBST(TARGET_NM)
498 AC_SUBST(TARGET_RANLIB)
499 AC_SUBST(TARGET_STRIP)
500 AC_SUBST(TARGET_OBJCOPY)
501
502 # Test the C compiler for the target environment.
503 tmp_CC="$CC"
504 tmp_CFLAGS="$CFLAGS"
505 tmp_LDFLAGS="$LDFLAGS"
506 tmp_CPPFLAGS="$CPPFLAGS"
507 tmp_LIBS="$LIBS"
508 CC="$TARGET_CC"
509 CFLAGS="$TARGET_CFLAGS"
510 CPPFLAGS="$TARGET_CPPFLAGS"
511 LDFLAGS="$TARGET_LDFLAGS"
512 LIBS=""
513
514 # debug flags.
515 TARGET_CFLAGS="$TARGET_CFLAGS $WARN_FLAGS -g -Wredundant-decls -Wmissing-prototypes -Wmissing-declarations"
516 TARGET_CCASFLAGS="$TARGET_CCASFLAGS -g"
517
518 if test "x$target_cpu" != xi386 && test "x$target_cpu" != xx86_64; then
519 TARGET_CFLAGS="$TARGET_CFLAGS -Wcast-align"
520 fi
521
522 TARGET_CC_VERSION="$(LC_ALL=C $TARGET_CC --version | head -n1)"
523
524 AC_CACHE_CHECK([which extra warnings work], [grub_cv_target_cc_w_extra_flags], [
525   LDFLAGS="$TARGET_LDFLAGS -nostdlib -static"
526
527   grub_cv_target_cc_w_extra_flags=
528   for x in $EXTRA_WARN_FLAGS; do
529       CFLAGS="$TARGET_CFLAGS $x -Werror"
530       AC_LINK_IFELSE([AC_LANG_PROGRAM([[
531 asm (".globl start; start:");
532 void __main (void);
533 void __main (void) {}
534 int main (void);
535 ]], [[]])], [flag=1], [flag=0])
536       if test x$flag = x1 ; then
537          grub_cv_target_cc_w_extra_flags="$grub_cv_target_cc_w_extra_flags $x"
538       fi
539   done
540 ])
541
542 TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_w_extra_flags"
543
544 AC_CACHE_CHECK([if compiling with clang], [grub_cv_cc_target_clang]
545 [
546 CFLAGS="$TARGET_CFLAGS"
547 AC_COMPILE_IFELSE(
548 [AC_LANG_PROGRAM([], [[
549 #ifdef __clang__
550 #error "is clang"
551 #endif
552 ]])],
553 [grub_cv_cc_target_clang=no], [grub_cv_cc_target_clang=yes])])
554
555 # on x86 clang doesn't support .code16
556 # on arm clang doesn't support .arch directive
557 # on mips clang doesn't support privilegied instructions, doubleword store/load
558 # and crashes with hand-written assembly
559 if test "x$grub_cv_cc_target_clang" = xyes && ( test "x$target_cpu" = xi386 \
560    || test "x$target_cpu" = xx86_64 || test "x$target_cpu" = xarm \
561    || test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ); then
562    TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as"
563 fi
564
565 if test "x$grub_cv_cc_target_clang" = xyes && test "x$target_cpu" = xpowerpc; then
566 AC_CACHE_CHECK([if clang can handle ame instruction], [grub_cv_cc_target_clang_ame]
567 [
568 CFLAGS="$TARGET_CFLAGS"
569 AC_COMPILE_IFELSE(
570 [AC_LANG_PROGRAM([], [[
571    unsigned int a = 0, b = 0;
572    asm volatile ("{ame|addme} %0,%1" : "=r" (a) : "r" (b));
573    if (a)
574      return 1;
575 ]])],
576 [grub_cv_cc_target_clang_ame=yes], [grub_cv_cc_target_clang_ame=no])])
577    # clang <= 3.3 doesn't handle most of ppc assembly, not even inline assembly
578    # used by gcrypt
579    if test x$grub_cv_cc_target_clang_ame = xno ; then
580      TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as"
581      TARGET_CFLAGS="$TARGET_CFLAGS -no-integrated-as"
582    fi
583 fi
584
585 if test "x$target_cpu" = xi386 && test "x$platform" != xemu; then
586   TARGET_CFLAGS="$TARGET_CFLAGS -march=i386"
587 fi
588
589 if test "x$target_m32" = x1; then
590   # Force 32-bit mode.
591   TARGET_CFLAGS="$TARGET_CFLAGS -m32"
592   TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m32"
593   TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m32"
594   TARGET_LDFLAGS="$TARGET_LDFLAGS -m32"
595   TARGET_MODULE_FORMAT="elf32"
596 fi
597
598 if test "x$target_m64" = x1; then
599   # Force 64-bit mode.
600   TARGET_CFLAGS="$TARGET_CFLAGS -m64"
601   TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m64"
602   TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m64"
603   TARGET_LDFLAGS="$TARGET_LDFLAGS -m64"
604   TARGET_MODULE_FORMAT="elf64"
605 fi
606
607 if test "x$grub_cv_cc_target_clang" = xno && test "x$target_cpu" = xi386 && test "x$platform" != xemu && test "x$platform" != xefi; then
608    TARGET_CFLAGS="$TARGET_CFLAGS -mrtd -mregparm=3"
609 fi
610
611 # on mips redirect cache flushing function to non-existant one.
612 if test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ; then
613   AC_CACHE_CHECK([whether -mflush-func=grub_red_herring works], [grub_cv_cc_mflush_func], [
614     CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring -Werror"
615     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
616         [grub_cv_cc_mflush_func=yes],
617         [grub_cv_cc_mflush_func=no])
618   ])
619
620   if test "x$grub_cv_cc_mflush_func" = xyes; then
621     TARGET_CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring"
622   fi
623 fi
624
625
626 # Force no alignment to save space on i386.
627 if test "x$target_cpu" = xi386; then
628   AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [
629     CFLAGS="$TARGET_CFLAGS -falign-loops=1 -Werror"
630     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
631         [grub_cv_cc_falign_loop=yes],
632         [grub_cv_cc_falign_loop=no])
633   ])
634
635   AC_CACHE_CHECK([whether -malign-loops works], [grub_cv_cc_malign_loop], [
636     CFLAGS="$TARGET_CFLAGS -malign-loops=1 -Werror"
637     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
638         [grub_cv_cc_malign_loop=yes],
639         [grub_cv_cc_malign_loop=no])
640   ])
641
642   if test "x$grub_cv_cc_falign_loop" = xyes; then
643     TARGET_CFLAGS="$TARGET_CFLAGS -falign-jumps=1 -falign-loops=1 -falign-functions=1"
644   elif test "x$grub_cv_cc_malign_loop" = xyes; then
645     TARGET_CFLAGS="$TARGET_CFLAGS -malign-jumps=1 -malign-loops=1 -malign-functions=1"
646   fi
647 fi
648
649 AC_CACHE_CHECK([whether -freg-struct-return works], [grub_cv_cc_freg_struct_return], [
650     CFLAGS="$TARGET_CFLAGS -freg-struct-return -Werror"
651     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
652         [grub_cv_cc_freg_struct_return=yes],
653         [grub_cv_cc_freg_struct_return=no])
654 ])
655
656 if test "x$grub_cv_cc_freg_struct_return" = xyes; then
657     TARGET_CFLAGS="$TARGET_CFLAGS -freg-struct-return"
658 fi
659
660 if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$platform" != xemu; then
661   # Some toolchains enable these features by default, but they need
662   # registers that aren't set up properly in GRUB.
663   TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-3dnow"
664 fi
665
666 # By default, GCC 4.4 generates .eh_frame sections containing unwind
667 # information in some cases where it previously did not. GRUB doesn't need
668 # these and they just use up vital space. Restore the old compiler
669 # behaviour.
670 AC_CACHE_CHECK([whether -fno-dwarf2-cfi-asm works], [grub_cv_cc_fno_dwarf2_cfi_asm], [
671   CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
672   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
673       [grub_cv_cc_fno_dwarf2_cfi_asm=yes],
674       [grub_cv_cc_fno_dwarf2_cfi_asm=no])
675 ])
676
677 if test "x$grub_cv_cc_fno_dwarf2_cfi_asm" = xyes; then
678   TARGET_CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
679 fi
680
681 if test x"$target_os" = xcygwin; then
682   AC_CACHE_CHECK([whether option -fno-reorder-functions works], grub_cv_cc_no_reorder_functions, [
683     CFLAGS="$TARGET_CFLAGS -fno-reorder-functions"
684     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
685                       [grub_cv_cc_no_reorder_functions=yes],
686                       [grub_cv_cc_no_reorder_functions=no])
687   ])
688 fi
689
690 if test x"$target_os" = xcygwin && test "x$grub_cv_cc_no_reorder_functions" = xyes; then
691   TARGET_CFLAGS="$TARGET_CFLAGS -fno-reorder-functions"
692 fi
693
694 # By default, GCC 4.6 generates .eh_frame sections containing unwind
695 # information in some cases where it previously did not. GRUB doesn't need
696 # these and they just use up vital space. Restore the old compiler
697 # behaviour.
698 AC_CACHE_CHECK([whether -fno-asynchronous-unwind-tables works], [grub_cv_cc_fno_asynchronous_unwind_tables], [
699   CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
700   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
701       [grub_cv_cc_fno_asynchronous_unwind_tables=yes],
702       [grub_cv_cc_fno_asynchronous_unwind_tables=no])
703 ])
704
705 if test "x$grub_cv_cc_fno_asynchronous_unwind_tables" = xyes; then
706   TARGET_CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables"
707 fi
708
709 AC_ARG_ENABLE([efiemu],
710               [AS_HELP_STRING([--enable-efiemu],
711                              [build and install the efiemu runtimes (default=guessed)])])
712 if test x"$enable_efiemu" = xno ; then
713   efiemu_excuse="explicitly disabled"
714 fi
715 if test x"$grub_cv_target_cc_link_format" = x-mi386pe || test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then
716   efiemu_excuse="not available on cygwin"
717 fi
718 if test x"$target_cpu" != xi386 ; then
719   efiemu_excuse="only available on i386"
720 fi
721 if test x"$platform" = xefi ; then
722   efiemu_excuse="not available on efi"
723 fi
724 if test x"$efiemu_excuse" = x ; then
725   AC_CACHE_CHECK([whether options required for efiemu work], grub_cv_cc_efiemu, [
726     CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
727     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
728                       [grub_cv_cc_efiemu=yes],
729                       [grub_cv_cc_efiemu=no])
730   ])
731   if test x$grub_cv_cc_efiemu = xno; then
732      efiemu_excuse="cannot compile with -m64 -mcmodel=large -mno-red-zone -nostdlib"
733   fi
734 fi
735 if test x"$efiemu_excuse" = x ; then
736   AC_CACHE_CHECK([for efiemu64 linking format], [grub_cv_target_cc_efiemu64_link_format], [
737     grub_cv_target_cc_efiemu64_link_format=unknown
738     for format in -melf_x86_64 -melf_x86_64_fbsd -melf_x86_64_obsd -melf_x86_64_haiku -arch,x86_64; do
739       CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
740       LDFLAGS="-m64 -Wl,$format -nostdlib -static"
741       AC_LINK_IFELSE([AC_LANG_PROGRAM([[
742       asm (".globl start; start:");
743       asm (".globl _start; _start:");
744       asm (".globl __start; __start:");
745       void __main (void);
746       void __main (void) {}
747       ]], [[]])], [flag=1], [flag=0])
748       if test x"$flag" = x1; then
749         grub_cv_target_cc_efiemu64_link_format="$format"
750         break
751       fi
752     done])
753   if test x"$grub_cv_target_cc_efiemu64_link_format" = xunknown; then
754     efiemu_excuse="no suitable link format for efiemu64 found"
755   else
756     EFIEMU64_LINK_FORMAT="-Wl,$grub_cv_target_cc_efiemu64_link_format"
757   fi
758 fi
759 if test x"$enable_efiemu" = xyes && test x"$efiemu_excuse" != x ; then
760   AC_MSG_ERROR([efiemu runtime was explicitly requested but can't be compiled ($efiemu_excuse)])
761 fi
762 if test x"$efiemu_excuse" = x ; then
763 enable_efiemu=yes
764 else
765 enable_efiemu=no
766 fi
767 AC_SUBST([enable_efiemu])
768 AC_SUBST([EFIEMU64_LINK_FORMAT])
769
770 CFLAGS="$TARGET_CFLAGS"
771
772
773 if test x"$platform" = xemu ; then
774   TARGET_OBJ2ELF=
775   grub_cv_target_cc_link_format=
776   case "$host_os" in
777     *darwin* | *mac*)
778        grub_cv_target_cc_link_format="-arch,${target_cpu}"
779        TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
780         ;;
781     *windows* | *cygwin* | *mingw*)
782       if test x${target_cpu} = xi386 ; then
783         grub_cv_target_cc_link_format=-mi386pe
784         TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)'
785       fi
786       if test x${target_cpu} = xx86_64 ; then
787         grub_cv_target_cc_link_format=-mi386pep
788         TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)'
789       fi
790       TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
791       ;;
792   esac
793 elif test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
794   AC_CACHE_CHECK([for target linking format], [grub_cv_target_cc_link_format], [
795     grub_cv_target_cc_link_format=unknown
796     for format in -melf_${target_cpu} -melf_${target_cpu}_fbsd -melf_${target_cpu}_obsd -melf_${target_cpu}_haiku -mi386pe -mi386pep -arch,${target_cpu}; do
797       if test x${target_cpu} != xi386 && test x$format = x-mi386pe; then
798         continue
799       fi
800       if test x${target_cpu} != xx86_64 && test x$format = x-mi386pep; then
801         continue
802       fi
803       CFLAGS="$TARGET_CFLAGS"
804       LDFLAGS="$TARGET_LDFLAGS -Wl,$format -nostdlib -static"
805       AC_LINK_IFELSE([AC_LANG_PROGRAM([[
806       asm (".globl start; start:");
807       asm (".globl _start; _start:");
808       asm (".globl __start; __start:");
809       void __main (void);
810       void __main (void) {}
811       ]], [[]])], [flag=1], [flag=0])
812       if test x"$flag" = x1; then
813         grub_cv_target_cc_link_format="$format"
814         break
815       fi
816     done])
817   if test x"$grub_cv_target_cc_link_format" = xunknown; then
818     AC_MSG_ERROR([no suitable link format found])
819   fi
820   TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
821   if test x"$grub_cv_target_cc_link_format" = x-mi386pe ; then
822     TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)'
823   fi
824   if test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then
825     TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)'
826   fi
827 fi
828
829 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
830    TARGET_APPLE_LINKER=1
831    AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [objconv], [])
832    if test "x$TARGET_OBJCONV" = x ; then
833       AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [./objconv], [], [.])
834    fi
835    if test "x$TARGET_OBJCONV" = x ; then
836       AC_MSG_ERROR([objconv not found which is required when building with apple compiler])
837    fi
838    TARGET_IMG_LDSCRIPT=
839    TARGET_IMG_CFLAGS="-static"
840    TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
841    TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
842    TARGET_IMG_BASE_LDOPT="-Wl,-image_base"
843    TARGET_LDFLAGS_OLDMAGIC=""
844 elif test x$grub_cv_target_cc_link_format = x-mi386pe || test x$grub_cv_target_cc_link_format = x-mi386pep ; then
845   TARGET_APPLE_LINKER=0
846   TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
847   TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/${grub_coredir}/conf/i386-cygwin-img-ld.sc"
848   TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}"
849   TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/${grub_coredir}/conf/i386-cygwin-img-ld.sc"
850   TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
851   TARGET_IMG_CFLAGS=
852 else
853   TARGET_APPLE_LINKER=0
854   TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
855   TARGET_IMG_LDSCRIPT=
856   TARGET_IMG_LDFLAGS='-Wl,-N'
857   TARGET_IMG_LDFLAGS_AC='-Wl,-N'
858   TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
859   TARGET_IMG_CFLAGS=
860 fi
861
862 AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
863
864
865 LDFLAGS="$TARGET_LDFLAGS"
866
867 if test "$target_cpu" = x86_64 || test "$target_cpu-$platform" = sparc64-emu ; then
868   # Use large model to support 4G memory
869   AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
870     CFLAGS="$TARGET_CFLAGS -mcmodel=large"
871     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
872                       [grub_cv_cc_mcmodel=yes],
873                       [grub_cv_cc_mcmodel=no])
874   ])
875   if test "x$grub_cv_cc_mcmodel" = xyes; then
876     TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
877   elif test "$target_cpu-$platform" = sparc64-emu; then
878     TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany"
879   fi
880 fi
881
882 if test "$target_cpu"-"$platform" = x86_64-efi; then
883   # EFI writes to stack below %rsp, we must not use the red zone
884   AC_CACHE_CHECK([whether option -mno-red-zone works], grub_cv_cc_no_red_zone, [
885     CFLAGS="$TARGET_CFLAGS -mno-red-zone"
886     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
887                       [grub_cv_cc_no_red_zone=yes],
888                       [grub_cv_cc_no_red_zone=no])
889   ])
890   if test "x$grub_cv_cc_no_red_zone" = xno; then
891     AC_MSG_ERROR([-mno-red-zone not supported, upgrade your gcc])
892   fi
893
894   TARGET_CFLAGS="$TARGET_CFLAGS -mno-red-zone"
895 fi
896
897 if test "x$target_cpu" = xarm; then
898   AC_CACHE_CHECK([whether option -mlong-calls works], grub_cv_cc_mlong_calls, [
899     CFLAGS="$TARGET_CFLAGS -mlong-calls -Werror"
900     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
901                       [grub_cv_cc_mlong_calls=yes],
902                       [grub_cv_cc_mlong_calls=no])
903   ])
904   if test "x$grub_cv_cc_mlong_calls" = xyes; then
905     TARGET_CFLAGS="$TARGET_CFLAGS -mlong-calls"
906   fi
907   AC_CACHE_CHECK([whether option -mthumb-interwork works], grub_cv_cc_mthumb_interwork, [
908     CFLAGS="$TARGET_CFLAGS -mthumb-interwork -Werror"
909     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
910                       [grub_cv_cc_mthumb_interwork=yes],
911                       [grub_cv_cc_mthumb_interwork=no])
912   ])
913   if test "x$grub_cv_cc_mthumb_interwork" = xyes; then
914     TARGET_CFLAGS="$TARGET_CFLAGS -mthumb-interwork"
915   elif test "x$grub_cv_cc_target_clang" = xno ; then
916     AC_MSG_ERROR([your compiler doesn't support -mthumb-interwork])
917   else
918     CFLAGS="$TARGET_CFLAGS"
919     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
920 #if defined (__thumb__) && !defined (__thumb2__)
921 #error thumb without interworking
922 #endif
923 ]])],
924                       [no_interwork_ok=yes],
925                       [no_interwork_ok=no])
926     if test x$no_interwork_ok = xno ; then
927        AC_MSG_ERROR([attempt to compile to thumb with no thumb interwork])
928     fi
929   fi
930 fi
931
932 AC_CACHE_CHECK([whether option -Qn works], grub_cv_target_cc_qn, [
933   CFLAGS="$TARGET_CFLAGS -Qn -Werror"
934   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
935                     [grub_cv_target_cc_qn=yes],
936                     [grub_cv_target_cc_qn=no])])
937 if test "x$grub_cv_target_cc_qn" = xyes; then
938   TARGET_CFLAGS="$TARGET_CFLAGS -Qn"
939 fi
940
941 #
942 # Compiler features.
943 #
944
945 CFLAGS="$TARGET_CFLAGS"
946
947 # Position independent executable.
948 grub_CHECK_PIE
949 [# Need that, because some distributions ship compilers that include
950 # `-fPIE' in the default specs.
951 if [ x"$pie_possible" = xyes ]; then
952   TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIE"
953 fi]
954
955 CFLAGS="$TARGET_CFLAGS"
956
957 # Position independent executable.
958 grub_CHECK_PIC
959 [# On most platforms we don't want PIC as it only makes relocations harder
960 # and code less efficient. On mips we want to have one got table per module
961 # and reload $gp in every function.
962 # GCC implements it using symbol __gnu_local_gp in non-PIC as well.
963 # However with clang we need PIC for this reloading to happen.
964 # Since default varies across dictributions use either -fPIC or -fno-PIC
965 # explicitly.
966 if ( test x$target_cpu = xmips || test x$target_cpu = xmipsel ) && test "x$grub_cv_cc_target_clang" = xyes ; then
967    TARGET_CFLAGS="$TARGET_CFLAGS -fPIC"
968 elif [ x"$pic_possible" = xyes ]; then
969    TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIC"
970 fi]
971
972 CFLAGS="$TARGET_CFLAGS"
973
974 # Smashing stack protector.
975 grub_CHECK_STACK_PROTECTOR
976 # Need that, because some distributions ship compilers that include
977 # `-fstack-protector' in the default specs.
978 if test "x$ssp_possible" = xyes; then
979   TARGET_CFLAGS="$TARGET_CFLAGS -fno-stack-protector"
980 fi
981
982 CFLAGS="$TARGET_CFLAGS"
983
984 grub_CHECK_STACK_ARG_PROBE
985 # Cygwin's GCC uses alloca() to probe the stackframe on static
986 # stack allocations above some threshold.
987 if test x"$sap_possible" = xyes; then
988   TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe"
989 fi
990
991 CFLAGS="$TARGET_CFLAGS"
992
993 # -mno-unaligned-access -mstrict-align
994 if test "$target_cpu" = arm; then
995   AC_CACHE_CHECK([for compile options to get strict alignment], [grub_cv_target_cc_strict_align], [
996     grub_cv_target_cc_strict_align=
997     for arg in -mno-unaligned-access "-Xclang -mstrict-align" -mstrict-align; do
998       CFLAGS="$TARGET_CFLAGS $arg -Werror"
999       LDFLAGS="$TARGET_LDFLAGS"
1000       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [flag=1], [flag=0])
1001       if test x"$flag" = x1; then
1002         grub_cv_target_cc_strict_align="$arg"
1003         break
1004       fi
1005     done])
1006
1007   TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_strict_align"
1008   if test x"$grub_cv_target_cc_strict_align" = x"-Xclang -mstrict-align"; then
1009     TARGET_LDFLAGS="$TARGET_LDFLAGS -Qunused-arguments"
1010   fi
1011   AC_CACHE_CHECK([if compiler generates unaligned accesses], [grub_cv_cc_target_emits_unaligned],
1012   [CFLAGS="$TARGET_CFLAGS"
1013    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[
1014 #ifdef __ARM_FEATURE_UNALIGNED
1015 #error "unaligned"
1016 #endif
1017      ]])],
1018      [grub_cv_cc_target_emits_unaligned=no], [grub_cv_cc_target_emits_unaligned=yes])])
1019   if test x$grub_cv_cc_target_emits_unaligned = xyes; then
1020     AC_MSG_ERROR([compiler generates unaligned accesses])
1021   fi
1022 fi
1023
1024 # Set them to their new values for the tests below.
1025 CC="$TARGET_CC"
1026 if test "x$TARGET_APPLE_LINKER" = x1 ; then
1027 CFLAGS="$TARGET_CFLAGS -nostdlib -static -Wno-error"
1028 else
1029 CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error"
1030 fi
1031 CPPFLAGS="$TARGET_CPPFLAGS"
1032 if test x$target_cpu = xi386 || test x$target_cpu = xx86_64 || test "x$grub_cv_cc_target_clang" = xyes ; then
1033 TARGET_LIBGCC=
1034 else
1035 TARGET_LIBGCC=-lgcc
1036 fi
1037
1038 LIBS="$TARGET_LIBGCC"
1039
1040 grub_ASM_USCORE
1041 if test "x$TARGET_APPLE_LINKER" = x0 ; then
1042 if test x$grub_cv_asm_uscore = xyes; then
1043 DEFSYM="-Wl,--defsym,_abort=_main -Wl,--defsym,__main=_main"
1044 else
1045 DEFSYM="-Wl,--defsym,abort=main -Wl,--defsym,_main=main -Wl,--defsym,__main=main"
1046 fi
1047 CFLAGS="$TARGET_CFLAGS -nostdlib $DEFSYM"
1048 fi
1049
1050 # Check for libgcc symbols
1051 AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x)
1052
1053 if test "x$TARGET_APPLE_LINKER" = x1 ; then
1054 CFLAGS="$TARGET_CFLAGS -nostdlib -static"
1055 else
1056 CFLAGS="$TARGET_CFLAGS -nostdlib"
1057 fi
1058 LIBS=""
1059
1060 # Defined in aclocal.m4.
1061 grub_PROG_TARGET_CC
1062 if test "x$TARGET_APPLE_LINKER" != x1 ; then
1063 grub_PROG_OBJCOPY_ABSOLUTE
1064 fi
1065 grub_PROG_LD_BUILD_ID_NONE
1066 if test "x$target_cpu" = xi386; then
1067   if test "$platform" != emu && test "x$TARGET_APPLE_LINKER" != x1 ; then
1068     if test ! -z "$TARGET_IMG_LDSCRIPT"; then
1069       # Check symbols provided by linker script.
1070       CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},0x8000"
1071     fi
1072     grub_CHECK_BSS_START_SYMBOL
1073     grub_CHECK_END_SYMBOL
1074   fi
1075   CFLAGS="$TARGET_CFLAGS"
1076   grub_I386_ASM_PREFIX_REQUIREMENT
1077   grub_I386_ASM_ADDR32
1078 fi
1079
1080 grub_PROG_NM_WORKS
1081 grub_PROG_NM_MINUS_P
1082 grub_PROG_NM_DEFINED_ONLY
1083 AC_SUBST(TARGET_NMFLAGS_MINUS_P)
1084 AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY)
1085
1086 if test "$platform" != emu; then
1087 AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [
1088   SAVED_CPPFLAGS="$CPPFLAGS"
1089   CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
1090   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
1091 #include <stddef.h>
1092 int va_arg_func (int fixed, va_list args);]], [[]])],
1093       [grub_cv_cc_isystem=yes],
1094       [grub_cv_cc_isystem=no])
1095   CPPFLAGS="$SAVED_CPPFLAGS"
1096 ])
1097
1098 if test x"$grub_cv_cc_isystem" = xyes ; then
1099   TARGET_CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
1100 fi
1101 fi
1102
1103 AC_CACHE_CHECK([whether -Wtrampolines work], [grub_cv_cc_wtrampolines], [
1104   CFLAGS="$TARGET_CFLAGS -Wtrampolines -Werror"
1105   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
1106 int va_arg_func (int fixed, va_list args);]], [[]])],
1107       [grub_cv_cc_wtrampolines=yes],
1108       [grub_cv_cc_wtrampolines=no])
1109 ])
1110
1111 if test x"$grub_cv_cc_wtrampolines" = xyes ; then
1112   TARGET_CFLAGS="$TARGET_CFLAGS -Wtrampolines"
1113 fi
1114
1115 # Restore the flags.
1116 CC="$tmp_CC"
1117 CFLAGS="$tmp_CFLAGS"
1118 CPPFLAGS="$tmp_CPPFLAGS"
1119 LDFLAGS="$tmp_LDFLAGS"
1120 LIBS="$tmp_LIBS"
1121
1122 #
1123 # Check for options.
1124 #
1125
1126 # Memory manager debugging.
1127 AC_ARG_ENABLE([mm-debug],
1128               AS_HELP_STRING([--enable-mm-debug],
1129                              [include memory manager debugging]),
1130               [AC_DEFINE([MM_DEBUG], [1],
1131                          [Define to 1 if you enable memory manager debugging.])])
1132
1133 AC_ARG_ENABLE([cache-stats],
1134               AS_HELP_STRING([--enable-cache-stats],
1135                              [enable disk cache statistics collection]))
1136
1137 if test x$enable_cache_stats = xyes; then
1138   DISK_CACHE_STATS=1
1139 else
1140   DISK_CACHE_STATS=0
1141 fi
1142 AC_SUBST([DISK_CACHE_STATS])
1143
1144 AC_ARG_ENABLE([boot-time],
1145               AS_HELP_STRING([--enable-boot-time],
1146                              [enable boot time statistics collection]))
1147
1148 if test x$enable_boot_time = xyes; then
1149   BOOT_TIME_STATS=1
1150 else
1151   BOOT_TIME_STATS=0
1152 fi
1153 AC_SUBST([BOOT_TIME_STATS])
1154
1155 AC_ARG_ENABLE([grub-emu-usb],
1156               [AS_HELP_STRING([--enable-grub-emu-usb],
1157                              [build and install the `grub-emu' debugging utility with USB support (default=guessed)])])
1158
1159 AC_ARG_ENABLE([grub-emu-sdl],
1160               [AS_HELP_STRING([--enable-grub-emu-sdl],
1161                              [build and install the `grub-emu' debugging utility with SDL support (default=guessed)])])
1162
1163 AC_ARG_ENABLE([grub-emu-pci],
1164               [AS_HELP_STRING([--enable-grub-emu-pci],
1165                              [build and install the `grub-emu' debugging utility with PCI support (potentially dangerous) (default=no)])])
1166
1167 if test "$platform" = emu; then
1168
1169 if test x"$enable_grub_emu_usb" != xyes ; then
1170    grub_emu_usb_excuse="not enabled"
1171 fi
1172
1173 if test x"$enable_grub_emu_pci" = xyes ; then
1174    grub_emu_usb_excuse="conflicts with PCI support"
1175 fi
1176
1177 [if [ x"$grub_emu_usb_excuse" = x ]; then
1178     # Check for libusb libraries.]
1179 AC_CHECK_LIB([usb], [usb_claim_interface], [LIBUSB="-lusb"],
1180     [grub_emu_usb_excuse=["need libusb library"]])
1181     AC_SUBST([LIBUSB])
1182 [fi]
1183 [if [ x"$grub_emu_usb_excuse" = x ]; then
1184     # Check for headers.]
1185     AC_CHECK_HEADERS([usb.h], [],
1186       [grub_emu_usb_excuse=["need libusb headers"]])
1187 [fi]
1188 if test x"$enable_grub_emu_usb" = xyes && test x"$grub_emu_usb_excuse" != x ; then
1189   AC_MSG_ERROR([USB support for grub-emu was explicitly requested but can't be compiled ($grub_emu_usb_excuse)])
1190 fi
1191 if test x"$grub_emu_usb_excuse" = x ; then
1192 enable_grub_emu_usb=yes
1193 else
1194 enable_grub_emu_usb=no
1195 fi
1196
1197 if test x"$enable_grub_emu_sdl" = xno ; then
1198   grub_emu_sdl_excuse="explicitly disabled"
1199 fi
1200 [if [ x"$grub_emu_sdl_excuse" = x ]; then
1201     # Check for libSDL libraries.]
1202 AC_CHECK_LIB([SDL], [SDL_Init], [LIBSDL="-lSDL"],
1203     [grub_emu_sdl_excuse=["libSDL libraries are required to build \`grub-emu' with SDL support"]])
1204     AC_SUBST([LIBSDL])
1205 [fi]
1206
1207 [if [ x"$grub_emu_sdl_excuse" = x ]; then
1208     # Check for headers.]
1209     AC_CHECK_HEADERS([SDL/SDL.h], [],
1210       [grub_emu_sdl_excuse=["libSDL header file is required to build \`grub-emu' with SDL support"]])
1211 [fi]
1212
1213 if test x"enable_grub_emu_sdl" = xyes && test x"$grub_emu_sdl_excuse" != x ; then
1214   AC_MSG_ERROR([SDL support for grub-emu was explicitly requested but can't be compiled ($grub_emu_sdl_excuse)])
1215 fi
1216 if test x"$grub_emu_sdl_excuse" = x ; then
1217 enable_grub_emu_sdl=yes
1218 else
1219 enable_grub_emu_sdl=no
1220 fi
1221
1222 if test x"$enable_grub_emu_pci" != xyes ; then
1223    grub_emu_pci_excuse="not enabled"
1224 fi
1225
1226 if test x"$enable_grub_emu_usb" = xyes ; then
1227    grub_emu_pci_excuse="conflicts with USB support"
1228 fi
1229
1230 [if [ x"$grub_emu_pci_excuse" = x ]; then
1231       # Check for libpci libraries.]
1232    AC_CHECK_LIB([pciaccess], [pci_system_init], [LIBPCIACCESS="-lpciaccess"],
1233       [grub_emu_pci_excuse=["need libpciaccess library"]])
1234     AC_SUBST([LIBPCIACCESS])
1235 [fi]
1236 [if [ x"$grub_emu_pci_excuse" = x ]; then
1237     # Check for headers.]
1238     AC_CHECK_HEADERS([pci/pci.h], [],
1239       [grub_emu_pci_excuse=["need libpciaccess headers"]])
1240 [fi]
1241
1242 if test x"$grub_emu_pci_excuse" = x ; then
1243 enable_grub_emu_pci=yes
1244 else
1245
1246 enable_grub_emu_pci=no
1247 fi
1248
1249 AC_SUBST([enable_grub_emu_sdl])
1250 AC_SUBST([enable_grub_emu_usb])
1251 AC_SUBST([enable_grub_emu_pci])
1252
1253 else
1254
1255 # Ignore --enable-emu-* if platform is not emu
1256 enable_grub_emu_sdl=no
1257 enable_grub_emu_usb=no
1258 enable_grub_emu_pci=no
1259 fi
1260
1261 AC_ARG_ENABLE([grub-mkfont],
1262               [AS_HELP_STRING([--enable-grub-mkfont],
1263                              [build and install the `grub-mkfont' utility (default=guessed)])])
1264 if test x"$enable_grub_mkfont" = xno ; then
1265   grub_mkfont_excuse="explicitly disabled"
1266 fi
1267
1268 if test x"$grub_mkfont_excuse" = x ; then
1269   # Check for freetype libraries.
1270   AC_CHECK_TOOLS([FREETYPE], [freetype-config])
1271   if test "x$FREETYPE" = x ; then
1272     grub_mkfont_excuse=["need freetype2 library"]
1273   fi
1274 fi
1275
1276 unset ac_cv_header_ft2build_h
1277
1278 if test x"$grub_mkfont_excuse" = x ; then
1279   # Check for freetype libraries.
1280   freetype_cflags=`$FREETYPE --cflags`
1281   freetype_libs=`$FREETYPE --libs`
1282   SAVED_CPPFLAGS="$CPPFLAGS"
1283   SAVED_LIBS="$LIBS"
1284   CPPFLAGS="$CPPFLAGS $freetype_cflags"
1285   LIBS="$LIBS $freetype_libs"
1286   AC_CHECK_HEADERS([ft2build.h], [],
1287         [grub_mkfont_excuse=["need freetype2 headers"]])
1288   AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_mkfont_excuse=["freetype2 library unusable"]])
1289   CPPFLAGS="$SAVED_CPPFLAGS"
1290   LIBS="$SAVED_LIBS"
1291 fi
1292
1293 if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then
1294   AC_MSG_ERROR([grub-mkfont was explicitly requested but can't be compiled ($grub_mkfont_excuse)])
1295 fi
1296 if test x"$grub_mkfont_excuse" = x ; then
1297 enable_grub_mkfont=yes
1298 else
1299 enable_grub_mkfont=no
1300 fi
1301 AC_SUBST([enable_grub_mkfont])
1302 AC_SUBST([freetype_cflags])
1303 AC_SUBST([freetype_libs])
1304
1305 SAVED_CC="$CC"
1306 SAVED_CPP="$CPP"
1307 SAVED_CFLAGS="$CFLAGS"
1308 SAVED_CPPFLAGS="$CPPFLAGS"
1309 SAVED_LDFLAGS="$LDFLAGS"
1310 CC="$BUILD_CC"
1311 CPP="$BUILD_CPP"
1312 CFLAGS="$BUILD_CFLAGS"
1313 CPPFLAGS="$BUILD_CPPFLAGS"
1314 LDFLAGS="$BUILD_LDFAGS"
1315
1316 unset ac_cv_c_bigendian
1317 unset ac_cv_header_ft2build_h
1318
1319 AC_COMPUTE_INT([BUILD_SIZEOF_VOID_P], [sizeof (void *)])
1320 AC_COMPUTE_INT([BUILD_SIZEOF_LONG], [sizeof (long)])
1321 AC_C_BIGENDIAN([BUILD_WORDS_BIGENDIAN=1], [BUILD_WORDS_BIGENDIAN=0], [BUILD_WORDS_BIGENDIAN=err], [BUILD_WORDS_BIGENDIAN=err])
1322
1323 if test x$BUILD_WORDS_BIGENDIAN = xerr ; then
1324    AC_MSG_ERROR([couldnt determine build endianness])
1325 fi
1326
1327 AC_SUBST([BUILD_SIZEOF_LONG])
1328 AC_SUBST([BUILD_SIZEOF_VOID_P])
1329 AC_SUBST([BUILD_WORDS_BIGENDIAN])
1330
1331 if test x"$grub_build_mkfont_excuse" = x ; then
1332   # Check for freetype libraries.
1333   AC_CHECK_PROGS([BUILD_FREETYPE], [freetype-config])
1334   if test "x$BUILD_FREETYPE" = x ; then
1335     grub_build_mkfont_excuse=["need freetype2 library"]
1336   fi
1337 fi
1338
1339 if test x"$grub_build_mkfont_excuse" = x ; then
1340   # Check for freetype libraries.
1341   build_freetype_cflags=`$BUILD_FREETYPE --cflags`
1342   build_freetype_libs=`$BUILD_FREETYPE --libs`
1343   SAVED_CPPFLAGS_2="$CPPFLAGS"
1344   SAVED_LIBS="$LIBS"
1345   CPPFLAGS="$CPPFLAGS $build_freetype_cflags"
1346   LIBS="$LIBS $build_freetype_libs"
1347   AC_CHECK_HEADERS([ft2build.h], [],
1348         [grub_build_mkfont_excuse=["need freetype2 headers"]])
1349   AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_build_mkfont_excuse=["freetype2 library unusable"]])
1350   LIBS="$SAVED_LIBS"
1351   CPPFLAGS="$SAVED_CPPFLAGS_2"
1352 fi
1353
1354 if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then
1355   AC_MSG_ERROR([build-grub-mkfont was explicitly requested but can't be compiled ($grub_build_mkfont_excuse)])
1356 fi
1357 if test x"$grub_build_mkfont_excuse" = x ; then
1358   enable_build_grub_mkfont=yes
1359 else
1360   enable_build_grub_mkfont=no
1361 fi
1362 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
1363   if test x"$grub_build_mkfont_excuse" = x ; then
1364     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont])
1365   else
1366     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont ($grub_build_mkfont_excuse)])
1367   fi
1368 fi
1369
1370 AC_SUBST([build_freetype_cflags])
1371 AC_SUBST([build_freetype_libs])
1372
1373 CC="$SAVED_CC"
1374 CPP="$SAVED_CPP"
1375 CFLAGS="$SAVED_CFLAGS"
1376 CPPFLAGS="$SAVED_CPPFLAGS"
1377 LDFLAGS="$SAVED_LDFLAGS"
1378
1379
1380 DJVU_FONT_SOURCE=
1381
1382 starfield_excuse=
1383
1384 AC_ARG_ENABLE([grub-themes],
1385               [AS_HELP_STRING([--enable-grub-themes],
1386                              [build and install GRUB themes (default=guessed)])])
1387 if test x"$enable_grub_themes" = xno ; then
1388   starfield_excuse="explicitly disabled"
1389 fi
1390
1391 if test x"$starfield_excuse" = x && test x"$enable_build_grub_mkfont" = xno ; then
1392   starfield_excuse="No build-time grub-mkfont"
1393 fi
1394
1395 if test x"$starfield_excuse" = x; then
1396    for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
1397      for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/truetype/ttf-dejavu /usr/share/fonts/dejavu /usr/share/fonts/truetype; do
1398         if test -f "$dir/DejaVuSans.$ext"; then
1399           DJVU_FONT_SOURCE="$dir/DejaVuSans.$ext"
1400           break 2
1401         fi
1402      done
1403    done
1404
1405    if test "x$DJVU_FONT_SOURCE" = x; then
1406      starfield_excuse="No DejaVu found"
1407    fi
1408 fi
1409
1410 if test x"$enable_grub_themes" = xyes &&  test x"$starfield_excuse" != x; then
1411    AC_MSG_ERROR([themes were explicitly requested but requirements are not satisfied ($starfield_excuse)])
1412 fi
1413
1414 AC_SUBST([DJVU_FONT_SOURCE])
1415
1416 FONT_SOURCE=
1417
1418 for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
1419   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
1420     if test -f "$dir/unifont.$ext"; then
1421       md5="$(md5sum "$dir/unifont.$ext"|awk '{ print $1; }')"
1422       # PCF and BDF from version 6.3 isn't hanled properly by libfreetype.
1423       if test "$md5" = 0a54834d2788c83886a3e1785a6a1e61 || test "$md5" = 28f2565c7a41d8d407e2551159385edb || test "$md5" = dae5e588461b3b92b87b6ffee734f936 || test "$md5" = 4a3d687aa5bb329ed05f4263a1016791 ; then
1424         continue
1425       fi
1426       FONT_SOURCE="$dir/unifont.$ext"
1427       break 2
1428     fi
1429   done
1430 done
1431
1432 if test x"$enable_build_grub_mkfont" = xno ; then
1433   FONT_SOURCE=
1434 fi
1435
1436 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
1437   if test x"$grub_build_mkfont_excuse" = x ; then
1438     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont])
1439   else
1440     AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont ($grub_build_mkfont_excuse)])
1441   fi
1442 fi
1443
1444 AC_SUBST([FONT_SOURCE])
1445
1446 if test x"$FONT_SOURCE" = x &&  test x"$DJVU_FONT_SOURCE" = x && test x"$grub_build_mkfont_excuse" = x; then
1447   grub_build_mkfont_excuse="no fonts"
1448 fi
1449
1450
1451 AC_ARG_ENABLE([grub-mount],
1452               [AS_HELP_STRING([--enable-grub-mount],
1453                              [build and install the `grub-mount' utility (default=guessed)])])
1454 if test x"$enable_grub_mount" = xno ; then
1455   grub_mount_excuse="explicitly disabled"
1456 fi
1457
1458 if test x"$grub_mount_excuse" = x ; then
1459   AC_CHECK_LIB([fuse], [fuse_main_real], [],
1460                [grub_mount_excuse="need FUSE library"])
1461 fi
1462
1463 if test x"$grub_mount_excuse" = x ; then
1464   # Check for fuse headers.
1465   SAVED_CPPFLAGS="$CPPFLAGS"
1466   CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64 -DFUSE_USE_VERSION=26"
1467   AC_CHECK_HEADERS([fuse/fuse.h], [],
1468         [grub_mount_excuse=["need FUSE headers"]])
1469   CPPFLAGS="$SAVED_CPPFLAGS"
1470 fi
1471
1472 if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then
1473   AC_MSG_ERROR([grub-mount was explicitly requested but can't be compiled ($grub_mount_excuse)])
1474 fi
1475 if test x"$grub_mount_excuse" = x ; then
1476 enable_grub_mount=yes
1477 else
1478 enable_grub_mount=no
1479 fi
1480 AC_SUBST([enable_grub_mount])
1481
1482 AC_ARG_ENABLE([device-mapper],
1483               [AS_HELP_STRING([--enable-device-mapper],
1484                               [enable Linux device-mapper support (default=guessed)])])
1485 if test x"$enable_device_mapper" = xno ; then
1486   device_mapper_excuse="explicitly disabled"
1487 fi
1488
1489 if test x"$device_mapper_excuse" = x ; then
1490   # Check for device-mapper header.
1491   AC_CHECK_HEADER([libdevmapper.h], [],
1492                [device_mapper_excuse="need libdevmapper header"])
1493 fi
1494
1495 if test x"$device_mapper_excuse" = x ; then
1496   # Check for device-mapper library.
1497   AC_CHECK_LIB([devmapper], [dm_task_create], [],
1498                [device_mapper_excuse="need devmapper library"])
1499 fi
1500
1501 if test x"$device_mapper_excuse" = x ; then
1502   # Check for device-mapper library.
1503   AC_CHECK_LIB([devmapper], [dm_log_with_errno_init],
1504                [],
1505                [device_mapper_excuse="need devmapper library"])
1506 fi
1507
1508 if test x"$device_mapper_excuse" = x ; then
1509    LIBDEVMAPPER="-ldevmapper"
1510    AC_DEFINE([HAVE_DEVICE_MAPPER], [1],
1511              [Define to 1 if you have the devmapper library.])
1512 fi
1513
1514 AC_SUBST([LIBDEVMAPPER])
1515
1516 LIBGEOM=
1517 if test x$host_kernel = xkfreebsd; then
1518   AC_CHECK_LIB([geom], [geom_gettree], [],
1519                [AC_MSG_ERROR([Your platform requires libgeom])])
1520   LIBGEOM="-lgeom"
1521 fi
1522
1523 AC_SUBST([LIBGEOM])
1524
1525 AC_ARG_ENABLE([liblzma],
1526               [AS_HELP_STRING([--enable-liblzma],
1527                               [enable liblzma integration (default=guessed)])])
1528 if test x"$enable_liblzma" = xno ; then
1529   liblzma_excuse="explicitly disabled"
1530 fi
1531
1532 if test x"$liblzma_excuse" = x ; then
1533 AC_CHECK_LIB([lzma], [lzma_code],
1534              [],[liblzma_excuse="need lzma library"])
1535 fi
1536 if test x"$liblzma_excuse" = x ; then
1537 AC_CHECK_HEADER([lzma.h], [], [liblzma_excuse="need lzma header"])
1538 fi
1539
1540 if test x"$enable_liblzma" = xyes && test x"$liblzma_excuse" != x ; then
1541   AC_MSG_ERROR([liblzma support was explicitly requested but requirements are not satisfied ($liblzma_excuse)])
1542 fi
1543
1544
1545 if test x"$liblzma_excuse" = x ; then
1546    LIBLZMA="-llzma"
1547    AC_DEFINE([USE_LIBLZMA], [1],
1548              [Define to 1 if you have the LZMA library.])
1549 fi
1550
1551 AC_SUBST([LIBLZMA])
1552
1553 AC_ARG_ENABLE([libzfs],
1554               [AS_HELP_STRING([--enable-libzfs],
1555                               [enable libzfs integration (default=guessed)])])
1556 if test x"$enable_libzfs" = xno ; then
1557   libzfs_excuse="explicitly disabled"
1558 fi
1559
1560 if test x"$libzfs_excuse" = x ; then
1561   # Only check for system headers if libzfs support has not been disabled.
1562   AC_CHECK_HEADERS(libzfs.h libnvpair.h)
1563 fi
1564
1565 if test x"$libzfs_excuse" = x ; then
1566   AC_CHECK_LIB([zfs], [libzfs_init],
1567                [],
1568                [libzfs_excuse="need zfs library"])
1569 fi
1570
1571 if test x"$libzfs_excuse" = x ; then
1572   AC_CHECK_LIB([nvpair], [nvlist_lookup_string],
1573                [],
1574                [libzfs_excuse="need nvpair library"])
1575 fi
1576
1577 if test x"$enable_libzfs" = xyes && test x"$libzfs_excuse" != x ; then
1578   AC_MSG_ERROR([libzfs support was explicitly requested but requirements are not satisfied ($libzfs_excuse)])
1579 fi
1580
1581 if test x"$libzfs_excuse" = x ; then
1582   # We need both libzfs and libnvpair for a successful build.
1583   LIBZFS="-lzfs"
1584   AC_DEFINE([HAVE_LIBZFS], [1],
1585             [Define to 1 if you have the ZFS library.])
1586   LIBNVPAIR="-lnvpair"
1587   AC_DEFINE([HAVE_LIBNVPAIR], [1],
1588             [Define to 1 if you have the NVPAIR library.])
1589 fi
1590
1591 AC_SUBST([LIBZFS])
1592 AC_SUBST([LIBNVPAIR])
1593
1594 LIBS=""
1595
1596 AC_SUBST([FONT_SOURCE])
1597 AS_IF([test x$target_cpu = xi386 -a x$platform = xqemu],
1598             [AC_SUBST([GRUB_BOOT_MACHINE_LINK_ADDR], 0xffe00)])
1599
1600 AC_SUBST(HAVE_ASM_USCORE)
1601 AC_SUBST(ADDR32)
1602 AC_SUBST(DATA32)
1603 AC_SUBST(BSS_START_SYMBOL)
1604 AC_SUBST(END_SYMBOL)
1605 AC_SUBST(PACKAGE)
1606 AC_SUBST(VERSION)
1607
1608 AC_ARG_ENABLE([werror],
1609               [AS_HELP_STRING([--disable-werror],
1610                              [do not use -Werror when building GRUB])])
1611 if test x"$enable_werror" != xno ; then
1612   TARGET_CFLAGS="$TARGET_CFLAGS -Werror"
1613   HOST_CFLAGS="$HOST_CFLAGS -Werror"
1614 fi
1615
1616 if test "x$grub_cv_cc_target_clang" = xno; then
1617    TARGET_LDFLAGS_STATIC_LIBGCC="-static-libgcc"
1618 else
1619    TARGET_LDFLAGS_STATIC_LIBGCC=
1620 fi
1621
1622 TARGET_CPP="$TARGET_CC -E"
1623 TARGET_CCAS=$TARGET_CC
1624
1625 GRUB_TARGET_CPU="${target_cpu}"
1626 GRUB_PLATFORM="${platform}"
1627
1628 AC_SUBST(GRUB_TARGET_CPU)
1629 AC_SUBST(GRUB_PLATFORM)
1630
1631 AC_SUBST(TARGET_OBJCONV)
1632 AC_SUBST(TARGET_LIBGCC)
1633 AC_SUBST(TARGET_LDFLAGS_STATIC_LIBGCC)
1634 AC_SUBST(TARGET_CPP)
1635 AC_SUBST(TARGET_CCAS)
1636 AC_SUBST(TARGET_OBJ2ELF)
1637 AC_SUBST(TARGET_MODULE_FORMAT)
1638 AC_SUBST(TARGET_CC_VERSION)
1639
1640 AC_SUBST(TARGET_CFLAGS)
1641 AC_SUBST(TARGET_LDFLAGS)
1642 AC_SUBST(TARGET_CPPFLAGS)
1643 AC_SUBST(TARGET_CCASFLAGS)
1644
1645 AC_SUBST(TARGET_IMG_LDFLAGS)
1646 AC_SUBST(TARGET_IMG_CFLAGS)
1647 AC_SUBST(TARGET_IMG_BASE_LDOPT)
1648 AC_SUBST(TARGET_APPLE_LINKER)
1649
1650 AC_SUBST(HOST_CFLAGS)
1651 AC_SUBST(HOST_LDFLAGS)
1652 AC_SUBST(HOST_CPPFLAGS)
1653 AC_SUBST(HOST_CCASFLAGS)
1654
1655 AC_SUBST(BUILD_LIBM)
1656
1657 #
1658 # Automake conditionals
1659 #
1660
1661 AM_CONDITIONAL([COND_real_platform], [test x$platform != xnone])
1662 AM_CONDITIONAL([COND_emu], [test x$platform = xemu])
1663 AM_CONDITIONAL([COND_clang], [test x$grub_cv_cc_target_clang = xyes])
1664 AM_CONDITIONAL([COND_i386_pc], [test x$target_cpu = xi386 -a x$platform = xpc])
1665 AM_CONDITIONAL([COND_i386_efi], [test x$target_cpu = xi386 -a x$platform = xefi])
1666 AM_CONDITIONAL([COND_ia64_efi], [test x$target_cpu = xia64 -a x$platform = xefi])
1667 AM_CONDITIONAL([COND_i386_qemu], [test x$target_cpu = xi386 -a x$platform = xqemu])
1668 AM_CONDITIONAL([COND_i386_ieee1275], [test x$target_cpu = xi386 -a x$platform = xieee1275])
1669 AM_CONDITIONAL([COND_i386_coreboot], [test x$target_cpu = xi386 -a x$platform = xcoreboot])
1670 AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot])
1671 AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi])
1672 AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen])
1673 AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen])
1674 AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson])
1675 AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")"  -a x$platform = xqemu_mips])
1676 AM_CONDITIONAL([COND_mips_arc], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")"  -a x$platform = xarc])
1677 AM_CONDITIONAL([COND_sparc64_ieee1275], [test x$target_cpu = xsparc64 -a x$platform = xieee1275])
1678 AM_CONDITIONAL([COND_sparc64_emu], [test x$target_cpu = xsparc64 -a x$platform = xemu])
1679 AM_CONDITIONAL([COND_powerpc_ieee1275], [test x$target_cpu = xpowerpc -a x$platform = xieee1275])
1680 AM_CONDITIONAL([COND_mips], [test x$target_cpu = xmips -o x$target_cpu = xmipsel])
1681 AM_CONDITIONAL([COND_mipsel], [test x$target_cpu = xmipsel])
1682 AM_CONDITIONAL([COND_mipseb], [test x$target_cpu = xmips])
1683 AM_CONDITIONAL([COND_arm], [test x$target_cpu = xarm ])
1684 AM_CONDITIONAL([COND_arm_uboot], [test x$target_cpu = xarm -a x$platform = xuboot])
1685 AM_CONDITIONAL([COND_arm_efi], [test x$target_cpu = xarm -a x$platform = xefi])
1686 AM_CONDITIONAL([COND_arm64], [test x$target_cpu = xarm64 ])
1687 AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi])
1688
1689 AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd])
1690 AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux])
1691 AM_CONDITIONAL([COND_HOST_NETBSD], [test x$host_kernel = xnetbsd])
1692 AM_CONDITIONAL([COND_HOST_WINDOWS], [test x$host_kernel = xwindows])
1693 AM_CONDITIONAL([COND_HOST_KFREEBSD], [test x$host_kernel = xkfreebsd])
1694 AM_CONDITIONAL([COND_HOST_XNU], [test x$host_kernel = xxnu])
1695 AM_CONDITIONAL([COND_HOST_ILLUMOS], [test x$host_kernel = xillumos])
1696
1697 AM_CONDITIONAL([COND_MAN_PAGES], [test x$cross_compiling = xno -a x$HELP2MAN != x])
1698 AM_CONDITIONAL([COND_GRUB_EMU_USB], [test x$enable_grub_emu_usb = xyes])
1699 AM_CONDITIONAL([COND_GRUB_EMU_SDL], [test x$enable_grub_emu_sdl = xyes])
1700 AM_CONDITIONAL([COND_GRUB_EMU_PCI], [test x$enable_grub_emu_pci = xyes])
1701 AM_CONDITIONAL([COND_GRUB_MKFONT], [test x$enable_grub_mkfont = xyes])
1702 AM_CONDITIONAL([COND_GRUB_MOUNT], [test x$enable_grub_mount = xyes])
1703 AM_CONDITIONAL([COND_HAVE_FONT_SOURCE], [test x$FONT_SOURCE != x])
1704 if test x$FONT_SOURCE != x ; then
1705    HAVE_FONT_SOURCE=1
1706 else
1707    HAVE_FONT_SOURCE=0
1708 fi
1709 AC_SUBST(HAVE_FONT_SOURCE)
1710 AM_CONDITIONAL([COND_APPLE_LINKER], [test x$TARGET_APPLE_LINKER = x1])
1711 AM_CONDITIONAL([COND_ENABLE_EFIEMU], [test x$enable_efiemu = xyes])
1712 AM_CONDITIONAL([COND_ENABLE_CACHE_STATS], [test x$DISK_CACHE_STATS = x1])
1713 AM_CONDITIONAL([COND_ENABLE_BOOT_TIME_STATS], [test x$BOOT_TIME_STATS = x1])
1714
1715 AM_CONDITIONAL([COND_HAVE_CXX], [test x$HAVE_CXX = xyes])
1716
1717 AM_CONDITIONAL([COND_HAVE_ASM_USCORE], [test x$HAVE_ASM_USCORE = x1])
1718 AM_CONDITIONAL([COND_STARFIELD], [test "x$starfield_excuse" = x])
1719 AM_CONDITIONAL([COND_HAVE_EXEC], [test "x$have_exec" = xy])
1720
1721 test "x$prefix" = xNONE && prefix="$ac_default_prefix"
1722 test "x$exec_prefix" = xNONE && exec_prefix="${prefix}"
1723 datarootdir="$(eval echo "$datarootdir")"
1724 grub_libdir="$(eval echo "$libdir")"
1725 grub_localedir="$(eval echo "$localedir")"
1726 grub_datadir="$(eval echo "$datadir")"
1727 grub_sysconfdir="$(eval echo "$sysconfdir")"
1728 AC_DEFINE_UNQUOTED(LOCALEDIR, "$grub_localedir", [Locale dir])
1729 AC_DEFINE_UNQUOTED(GRUB_LIBDIR, "$grub_libdir", [Library dir])
1730 AC_DEFINE_UNQUOTED(GRUB_DATADIR, "$grub_datadir", [Data dir])
1731 AC_DEFINE_UNQUOTED(GRUB_SYSCONFDIR, "$grub_sysconfdir", [Configuration dir])
1732
1733
1734 # Output files.
1735 if test "$platform" != none; then
1736   cpudir="${target_cpu}"
1737   if test x${cpudir} = xmipsel; then
1738     cpudir=mips;
1739   fi
1740   grub_CHECK_LINK_DIR
1741   if test x"$link_dir" = xyes ; then
1742     AC_CONFIG_LINKS([include/grub/cpu:include/grub/$cpudir])
1743     if test "$platform" != emu ; then
1744       AC_CONFIG_LINKS([include/grub/machine:include/grub/$cpudir/$platform])
1745     fi
1746   else
1747     mkdir -p include/grub 2>/dev/null
1748     rm -rf include/grub/cpu
1749     cp -rp $srcdir/include/grub/$cpudir include/grub/cpu 2>/dev/null
1750     if test "$platform" != emu ; then
1751       rm -rf include/grub/machine
1752       cp -rp $srcdir/include/grub/$cpudir/$platform include/grub/machine 2>/dev/null
1753     fi
1754   fi
1755 else
1756   # Just enough to stop the compiler failing with -I$(srcdir)/include.
1757   mkdir -p include 2>/dev/null
1758   rm -rf include/grub/cpu include/grub/machine
1759 fi
1760
1761 AC_CONFIG_FILES([Makefile])
1762 AC_CONFIG_FILES([grub-core/Makefile])
1763 AC_CONFIG_FILES([grub-core/gnulib/Makefile])
1764 AC_CONFIG_FILES([po/Makefile.in])
1765 AC_CONFIG_FILES([docs/Makefile])
1766 AC_CONFIG_FILES([util/bash-completion.d/Makefile])
1767 AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
1768 AC_CONFIG_FILES([config.h])
1769
1770 AC_OUTPUT
1771 [
1772 echo "*******************************************************"
1773 echo GRUB2 will be compiled with following components:
1774 echo Platform: "$target_cpu"-"$platform"
1775 if [ x"$platform" = xemu ]; then
1776 if [ x"$grub_emu_usb_excuse" = x ]; then
1777 echo USB support for grub-emu: Yes
1778 else
1779 echo USB support for grub-emu: No "($grub_emu_usb_excuse)"
1780 fi
1781 if [ x"$grub_emu_sdl_excuse" = x ]; then
1782 echo SDL support for grub-emu: Yes
1783 else
1784 echo SDL support for grub-emu: No "($grub_emu_sdl_excuse)"
1785 fi
1786 if [ x"$grub_emu_pci_excuse" = x ]; then
1787 echo PCI support for grub-emu: Yes
1788 else
1789 echo PCI support for grub-emu: No "($grub_emu_pci_excuse)"
1790 fi
1791 fi
1792 if test x"$device_mapper_excuse" = x ; then
1793 echo With devmapper support: Yes
1794 else
1795 echo With devmapper support: No "($device_mapper_excuse)"
1796 fi
1797 if [ x"$enable_mm_debug" = xyes ]; then
1798 echo With memory debugging: Yes
1799 else
1800 echo With memory debugging: No
1801 fi
1802 if [ x"$enable_cache_stats" = xyes ]; then
1803 echo With disk cache statistics: Yes
1804 else
1805 echo With disk cache statistics: No
1806 fi
1807
1808 if [ x"$enable_boot_time" = xyes ]; then
1809 echo With boot time statistics: Yes
1810 else
1811 echo With boot time statistics: No
1812 fi
1813
1814 if [ x"$efiemu_excuse" = x ]; then
1815 echo efiemu runtime: Yes
1816 else
1817 echo efiemu runtime: No "($efiemu_excuse)"
1818 fi
1819 if [ x"$grub_mkfont_excuse" = x ]; then
1820 echo grub-mkfont: Yes
1821 else
1822 echo grub-mkfont: No "($grub_mkfont_excuse)"
1823 fi
1824 if [ x"$grub_mount_excuse" = x ]; then
1825 echo grub-mount: Yes
1826 else
1827 echo grub-mount: No "($grub_mount_excuse)"
1828 fi
1829 if [ x"$starfield_excuse" = x ]; then
1830 echo starfield theme: Yes
1831 echo With DejaVuSans font from $DJVU_FONT_SOURCE
1832 else
1833 echo starfield theme: No "($starfield_excuse)"
1834 fi
1835 if [ x"$libzfs_excuse" = x ]; then
1836 echo With libzfs support: Yes
1837 else
1838 echo With libzfs support: No "($libzfs_excuse)"
1839 fi
1840 if [ x"$grub_build_mkfont_excuse" = x ]; then
1841   echo Build-time grub-mkfont: Yes
1842   if test "x$FONT_SOURCE" = x ; then
1843     echo "Without unifont"
1844   else
1845     echo "With unifont from $FONT_SOURCE"
1846   fi
1847 else
1848   echo Build-time grub-mkfont: No "($grub_build_mkfont_excuse)"
1849   echo "Without unifont (no build-time grub-mkfont)"
1850 fi
1851 if test x"$liblzma_excuse" != x ; then
1852 echo "Without liblzma (no support for XZ-compressed mips images) ($liblzma_excuse)"
1853 else
1854 echo "With liblzma from $LIBLZMA (support for XZ-compressed mips images)"
1855 fi
1856 echo "*******************************************************"
1857 ]