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