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