1 # Process this file with autoconf to produce a configure script.
3 # Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
5 # This configure.ac is free software; the author
6 # gives unlimited permission to copy and/or distribute it,
7 # with or without modifications, as long as this notice is preserved.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
11 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14 dnl This configure script is complicated, because GRUB needs to deal
15 dnl with three potentially different types:
17 dnl build -- the environment for building GRUB
18 dnl host -- the environment for running utilities
19 dnl target -- the environment for running GRUB
21 dnl In addition, GRUB needs to deal with a platform specification
22 dnl which specifies the system running GRUB, such as firmware.
23 dnl This is necessary because the target type in autoconf does not
24 dnl describe such a system very well.
26 dnl The current strategy is to use variables with no prefix (such as
27 dnl CC, CFLAGS, etc.) for the host type as well as the build type,
28 dnl because GRUB does not need to use those variables for the build
29 dnl type, so there is no conflict. Variables with the prefix "TARGET_"
30 dnl (such as TARGET_CC, TARGET_CFLAGS, etc.) are used for the target
34 AC_INIT([GRUB],[1.96],[bug-grub@gnu.org])
36 AC_CONFIG_SRCDIR([include/grub/dl.h])
37 AC_CONFIG_HEADER([config.h])
39 # Checks for host and target systems.
43 # Program name transformations
47 i[[3456]]86) target_cpu=i386 ;;
48 sparc) target_cpu=sparc64 ;;
51 # Specify the platform (such as firmware).
52 AC_ARG_WITH([platform],
53 AS_HELP_STRING([--with-platform=PLATFORM],
54 [select the host platform [[guessed]]]))
56 # Guess the platform if not specified.
57 if test "x$with_platform" = x; then
58 case "$target_cpu"-"$target_vendor" in
59 i386-apple) platform=efi ;;
60 i386-*) platform=pc ;;
61 x86_64-apple) platform=efi ;;
62 x86_64-*) platform=pc ;;
63 powerpc-*) platform=ieee1275 ;;
64 powerpc64-*) platform=ieee1275 ;;
65 sparc64-*) platform=ieee1275 ;;
66 *) AC_MSG_ERROR([unsupported CPU: "$target_cpu"]) ;;
69 platform="$with_platform"
72 # Adjust CPU unless target was explicitly specified.
73 if test -z "$target_alias"; then
74 case "$target_cpu"-"$platform" in
76 x86_64-*) target_cpu=i386 ;;
77 powerpc64-ieee1275) target_cpu=powerpc ;;
81 # Check if the platform is supported, make final adjustments.
82 case "$target_cpu"-"$platform" in
87 i386-linuxbios) platform=coreboot ;;
92 *) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;;
96 i386 | powerpc) target_m32=1 ;;
97 x86_64 | sparc64) target_m64=1 ;;
101 mingw32) host_os=cygwin ;;
104 # This normalizes the names, and creates a new variable ("host_kernel")
105 # while at it, since the mapping is not always 1:1 (e.g. different OSes
106 # using the same kernel type).
108 gnu*) host_kernel=hurd ;;
109 linux*) host_kernel=linux ;;
110 freebsd* | kfreebsd*-gnu) host_kernel=freebsd ;;
111 cygwin) host_kernel=windows ;;
116 AC_SUBST(host_kernel)
122 # Checks for build programs.
125 # Although cmp is listed in the GNU Coding Standards as a command which
126 # can used directly, OpenBSD lacks cmp in the default installation.
127 AC_CHECK_PROGS([CMP], [cmp])
128 if test "x$CMP" = x; then
129 AC_MSG_ERROR([cmp is not found])
132 AC_CHECK_PROGS([YACC], [bison])
133 if test "x$YACC" = x; then
134 AC_MSG_ERROR([bison is not found])
137 for file in /usr/src/unifont.bdf ; do
138 if test -e $file ; then
139 AC_SUBST([UNIFONT_BDF], [$file])
148 # These are not a "must".
149 AC_PATH_PROG(RUBY, ruby)
150 AC_PATH_PROG(HELP2MAN, help2man)
153 # Checks for host programs.
158 test "x$GCC" = xyes || AC_MSG_ERROR([GCC is required])
163 # Identify characteristics of the host architecture.
165 AC_CHECK_SIZEOF(void *)
166 AC_CHECK_SIZEOF(long)
169 if test x$grub_cv_apple_cc = xyes ; then
170 CFLAGS="$CFLAGS -DAPPLE_CC=1 -fnested-functions"
171 ASFLAGS="$ASFLAGS -DAPPLE_CC=1"
174 # Check for functions.
175 AC_CHECK_FUNCS(posix_memalign memalign asprintf)
178 # Check for target programs.
181 # Find tools for the target.
182 if test "x$target_alias" != x && test "x$host_alias" != "x$target_alias"; then
183 tmp_ac_tool_prefix="$ac_tool_prefix"
184 ac_tool_prefix=$target_alias-
186 AC_CHECK_TOOLS(TARGET_CC, [gcc egcs cc],
187 [AC_MSG_ERROR([none of gcc, egcs and cc is found. set TARGET_CC manually.])])
188 AC_CHECK_TOOL(OBJCOPY, objcopy)
189 AC_CHECK_TOOL(STRIP, strip)
190 AC_CHECK_TOOL(NM, nm)
192 ac_tool_prefix="$tmp_ac_tool_prefix"
194 if test "x$TARGET_CC" = x; then
197 AC_CHECK_TOOL(OBJCOPY, objcopy)
198 AC_CHECK_TOOL(STRIP, strip)
199 AC_CHECK_TOOL(NM, nm)
204 # Test the C compiler for the target environment.
207 tmp_LDFLAGS="$LDFLAGS"
208 tmp_CPPFLAGS="$CPPFLAGS"
211 CFLAGS="$TARGET_CFLAGS"
212 CPPFLAGS="$TARGET_CPPFLAGS"
213 LDFLAGS="$TARGET_LDFLAGS"
216 if test "x$TARGET_CFLAGS" = x; then
218 TARGET_CFLAGS="-Wall -W -Wshadow -Wpointer-arith -Wmissing-prototypes \
219 -Wundef -Wstrict-prototypes -g"
221 # optimization flags.
222 AC_CACHE_CHECK([whether optimization for size works], grub_cv_cc_Os, [
224 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
228 if test "x$grub_cv_cc_Os" = xyes; then
229 TARGET_CFLAGS="$TARGET_CFLAGS -Os"
231 TARGET_CFLAGS="$TARGET_CFLAGS -O2 -fno-strength-reduce -fno-unroll-loops"
234 # Force no alignment to save space on i386.
235 if test "x$target_cpu" = xi386; then
236 AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [
237 CFLAGS="$CFLAGS -falign-loops=1"
238 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
239 [grub_cv_cc_falign_loop=yes],
240 [grub_cv_cc_falign_loop=no])
243 if test "x$grub_cv_cc_falign_loop" = xyes; then
244 TARGET_CFLAGS="$TARGET_CFLAGS -falign-jumps=1 -falign-loops=1 -falign-functions=1"
246 TARGET_CFLAGS="$TARGET_CFLAGS -malign-jumps=1 -malign-loops=1 -malign-functions=1"
252 if test x$grub_cv_apple_target_cc = xyes ; then
253 TARGET_CFLAGS="$TARGET_CFLAGS -DAPPLE_CC=1 -fnested-functions"
254 CFLAGS="$CFLAGS -DAPPLE_CC=1 -fnested-functions"
255 TARGET_ASFLAGS="$TARGET_ASFLAGS -DAPPLE_CC=1"
257 AC_CHECK_PROG([OBJCONV], [objconv], [objconv], [])
258 if test "x$OBJCONV" = x ; then
259 AC_CHECK_PROG([OBJCONV], [objconv], [./objconv], [], [.])
261 if test "x$OBJCONV" = x ; then
262 AC_MSG_ERROR([objconv not found which is required when building with apple compiler])
265 TARGET_IMG_CFLAGS="-static"
266 TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20 -Wl,-image_base,'
267 TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20 -Wl,-image_base,'
270 # Use linker script if present, otherwise use builtin -N script.
271 if test -f "${srcdir}/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"; then
272 TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"
273 TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT} -Wl,-Ttext,"
274 TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"
277 TARGET_IMG_LDFLAGS='-Wl,-N -Wl,-Ttext,'
278 TARGET_IMG_LDFLAGS_AC='-Wl,-N -Wl,-Ttext,'
283 AC_SUBST(TARGET_IMG_LDSCRIPT)
284 AC_SUBST(TARGET_IMG_LDFLAGS)
285 AC_SUBST(TARGET_IMG_CFLAGS)
287 # For platforms where ELF is not the default link format.
288 AC_MSG_CHECKING([for command to convert module to ELF format])
290 cygwin) TARGET_OBJ2ELF='grub-pe2elf' ;;
293 AC_SUBST(TARGET_OBJ2ELF)
294 AC_MSG_RESULT([$TARGET_OBJ2ELF])
297 if test "x$target_m32" = x1; then
299 TARGET_CFLAGS="$TARGET_CFLAGS -m32"
300 TARGET_LDFLAGS="$TARGET_LDFLAGS -m32"
301 TARGET_MODULE_FORMAT="elf32"
304 if test "x$target_m64" = x1; then
306 TARGET_CFLAGS="$TARGET_CFLAGS -m64"
307 TARGET_LDFLAGS="$TARGET_LDFLAGS -m64"
308 TARGET_MODULE_FORMAT="elf64"
311 if test "$target_cpu"-"$platform" = x86_64-efi; then
312 # Use large model to support 4G memory
313 AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
315 CFLAGS="$CFLAGS -m64 -mcmodel=large"
316 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
317 [grub_cv_cc_mcmodel=yes],
318 [grub_cv_cc_mcmodel=no])
320 if test "x$grub_cv_cc_mcmodel" = xno; then
321 CFLAGS="$SAVED_CFLAGS -m64 -DMCMODEL_SMALL=1"
322 TARGET_CFLAGS="$TARGET_CFLAGS -DMCMODEL_SMALL=1"
323 AC_MSG_WARN([-mcmodel=large not supported. You won't be able to use the memory over 4GiB. Upgrade your gcc])
325 TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
328 # EFI writes to stack below %rsp, we must not use the red zone
329 AC_CACHE_CHECK([whether option -mno-red-zone works], grub_cv_cc_no_red_zone, [
330 CFLAGS="$CFLAGS -m64 -mno-red-zone"
331 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
332 [grub_cv_cc_no_red_zone=yes],
333 [grub_cv_cc_no_red_zone=no])
335 if test "x$grub_cv_cc_no_red_zone" = xno; then
336 AC_MSG_ERROR([-mno-red-zone not supported, upgrade your gcc])
339 TARGET_CFLAGS="$TARGET_CFLAGS -mno-red-zone"
346 # Need __enable_execute_stack() for nested function trampolines?
347 grub_CHECK_ENABLE_EXECUTE_STACK
349 # Smashing stack protector.
350 grub_CHECK_STACK_PROTECTOR
351 # Need that, because some distributions ship compilers that include
352 # `-fstack-protector' in the default specs.
353 if test "x$ssp_possible" = xyes; then
354 TARGET_CFLAGS="$TARGET_CFLAGS -fno-stack-protector"
356 grub_CHECK_STACK_ARG_PROBE
357 # Cygwin's GCC uses alloca() to probe the stackframe on static
358 # stack allocations above some threshold.
359 if test x"$sap_possible" = xyes; then
360 TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe"
363 AC_SUBST(TARGET_CFLAGS)
364 AC_SUBST(TARGET_MODULE_FORMAT)
366 AC_SUBST(TARGET_APPLE_CC)
367 AC_SUBST(TARGET_ASFLAGS)
368 AC_SUBST(TARGET_CPPFLAGS)
369 AC_SUBST(TARGET_LDFLAGS)
371 # Set them to their new values for the tests below.
373 if test "x$TARGET_APPLE_CC" = x1 ; then
374 CFLAGS="$TARGET_CFLAGS -nostdlib"
376 CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100"
378 CPPFLAGS="$TARGET_CPPFLAGS"
379 LDFLAGS="$TARGET_LDFLAGS"
381 # Defined in aclocal.m4.
383 if test "x$TARGET_APPLE_CC" != x1 ; then
384 grub_PROG_OBJCOPY_ABSOLUTE
386 grub_PROG_LD_BUILD_ID_NONE
388 if test "x$target_cpu" = xi386; then
389 if test ! -z "$TARGET_IMG_LDSCRIPT"; then
390 # Check symbols provided by linker script.
391 CFLAGS="$TARGET_CFLAGS -nostdlib $TARGET_IMG_LDFLAGS_AC -Wl,-Ttext,8000,--defsym,___main=0x8100"
393 if test "x$TARGET_APPLE_CC" != x1 ; then
394 grub_CHECK_BSS_START_SYMBOL
395 grub_CHECK_END_SYMBOL
397 CFLAGS="$TARGET_CFLAGS"
398 grub_I386_ASM_PREFIX_REQUIREMENT
400 grub_I386_ASM_ABSOLUTE_WITHOUT_ASTERISK
402 AC_DEFINE([NESTED_FUNC_ATTR], [], [Catch gcc bug])
405 AH_BOTTOM([#if defined(__i386__) && !defined(GRUB_UTIL)
406 #define NESTED_FUNC_ATTR __attribute__ ((__regparm__ (1)))
408 #define NESTED_FUNC_ATTR
411 AC_ARG_ENABLE([efiemu],
412 [AS_HELP_STRING([--enable-efiemu],
413 [build and install the efiemu runtimes (default=guessed)])])
414 if test x"$enable_efiemu" = xno ; then
415 efiemu_excuse="explicitly disabled"
417 if test x"$efiemu_excuse" = x ; then
418 AC_CACHE_CHECK([whether options required for efiemu work], grub_cv_cc_efiemu, [
419 CFLAGS="$CFLAGS -m64 -mcmodel=large -mno-red-zone -nostdlib"
420 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
421 [grub_cv_cc_efiemu=yes],
422 [grub_cv_cc_efiemu=no])
424 if test x$grub_cv_cc_efiemu = xno; then
425 efiemu_excuse="cannot compile with -m64 -mcmodel=large -mno-red-zone -nostdlib"
428 if test x"$enable_efiemu" = xyes && test x"$efiemu_excuse" != x ; then
429 AC_MSG_ERROR([efiemu runtime was explicitly requested but can't be compiled])
431 if test x"$efiemu_excuse" = x ; then
436 AC_SUBST([enable_efiemu])
442 CPPFLAGS="$tmp_CPPFLAGS"
443 LDFLAGS="$tmp_LDFLAGS"
450 # Memory manager debugging.
451 AC_ARG_ENABLE([mm-debug],
452 AS_HELP_STRING([--enable-mm-debug],
453 [include memory manager debugging]),
454 [AC_DEFINE([MM_DEBUG], [1],
455 [Define to 1 if you enable memory manager debugging.])])
457 AC_ARG_ENABLE([grub-emu],
458 [AS_HELP_STRING([--enable-grub-emu],
459 [build and install the `grub-emu' debugging utility (default=guessed)])])
460 AC_ARG_ENABLE([grub-emu-usb],
461 [AS_HELP_STRING([--enable-grub-emu-usb],
462 [build and install the `grub-emu' debugging utility with USB support (default=guessed)])])
463 if test x"$enable_grub_emu" = xno ; then
464 grub_emu_excuse="explicitly disabled"
467 [# Check for curses libraries.]
468 [if [ x"$grub_emu_excuse" = x ]; then ]
469 AC_CHECK_LIB([ncurses], [wgetch], [LIBCURSES="-lncurses"],
470 [AC_CHECK_LIB([curses], [wgetch], [LIBCURSES="-lcurses"],
471 [grub_emu_excuse=["need (n)curses libraries"]])])
472 AC_SUBST([LIBCURSES])
474 [if [ x"$grub_emu_excuse" = x ]; then ]
475 [# Check for headers.]
476 AC_CHECK_HEADERS([ncurses/curses.h], [],
477 [AC_CHECK_HEADERS([ncurses.h], [],
478 [AC_CHECK_HEADERS([curses.h], [],
479 [grub_emu_excuse=["need (n)curses headers"]])])])
482 if test x"$enable_grub_emu" = xyes && test x"$grub_emu_excuse" != x ; then
483 AC_MSG_ERROR([grub-emu was explicitly requested but can't be compiled])
485 if test x"$grub_emu_excuse" = x ; then
489 grub_emu_usb_excuse="grub-emu isn't built"
491 if test x"$enable_grub_emu_usb" = xno ; then
492 grub_emu_usb_excuse="explicitly disabled"
494 [if [ x"$grub_emu_usb_excuse" = x ]; then
495 # Check for libusb libraries.]
496 AC_CHECK_LIB([usb], [usb_claim_interface], [LIBUSB="-lusb"],
497 [grub_emu_usb_excuse=["need libusb library"]])
500 [if [ x"$grub_emu_usb_excuse" = x ]; then
501 # Check for headers.]
502 AC_CHECK_HEADERS([usb.h], [],
503 [grub_emu_usb_excuse=["need libusb headers"]])
505 if test x"enable_grub_emu_usb" = xyes && test x"$grub_emu_usb_excuse" != x ; then
506 AC_MSG_ERROR([USB support for grub-emu was explicitly requested but can't be compiled])
508 if test x"$grub_emu_usb_excuse" = x ; then
509 enable_grub_emu_usb=yes
511 enable_grub_emu_usb=no
514 AC_SUBST([enable_grub_emu])
515 AC_SUBST([enable_grub_emu_usb])
517 AC_ARG_ENABLE([grub-fstest],
518 [AS_HELP_STRING([--enable-grub-fstest],
519 [build and install the `grub-fstest' debugging utility (default=guessed)])])
520 if test x"$enable_grub_fstest" = xno ; then
521 grub_fstest_excuse="explicitly disabled"
523 if test x"$grub_fstest_excuse" = x ; then
524 enable_grub_fstest=yes
526 enable_grub_fstest=no
528 AC_SUBST([enable_grub_fstest])
530 AC_ARG_ENABLE([grub-pe2elf],
531 [AS_HELP_STRING([--enable-grub-pe2elf],
532 [build and install the `grub-pe2elf' conversion utility])])
533 AC_SUBST([enable_grub_pe2elf])
535 AC_ARG_ENABLE([grub-mkfont],
536 [AS_HELP_STRING([--enable-grub-mkfont],
537 [build and install the `grub-mkfont' utility (default=guessed)])])
538 if test x"$enable_grub_mkfont" = xno ; then
539 grub_mkfont_excuse="explicitly disabled"
542 if test x"$grub_mkfont_excuse" = x ; then
543 # Check for freetype libraries.
544 AC_CHECK_PROGS([FREETYPE], [freetype-config])
545 if test "x$FREETYPE" = x ; then
546 grub_mkfont_excuse=["need freetype2 library"]
548 freetype_cflags=`freetype-config --cflags`
549 freetype_libs=`freetype-config --libs`
551 if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then
552 AC_MSG_ERROR([grub-mkfont was explicitly requested but can't be compiled])
554 if test x"$grub_mkfont_excuse" = x ; then
555 enable_grub_mkfont=yes
557 enable_grub_mkfont=no
559 AC_SUBST([enable_grub_mkfont])
560 AC_SUBST([freetype_cflags])
561 AC_SUBST([freetype_libs])
567 if test x"$link_dir" = xyes ; then
568 AC_CONFIG_LINKS([include/grub/cpu:include/grub/$target_cpu
569 include/grub/machine:include/grub/$target_cpu/$platform])
571 mkdir -p include/grub 2>/dev/null
572 rm -rf include/grub/cpu
573 cp -rp $srcdir/include/grub/$target_cpu include/grub/cpu 2>/dev/null
574 rm -rf include/grub/machine
575 cp -rp $srcdir/include/grub/$target_cpu/$platform include/grub/machine 2>/dev/null
577 AC_CONFIG_FILES([Makefile gensymlist.sh genkernsyms.sh])
578 AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
581 echo "*******************************************************"
582 echo GRUB2 will be compiled with following components:
583 echo Platform: "$target_cpu"-"$platform"
584 if [ x"$grub_emu_excuse" = x ]; then
587 echo grub-emu: No "($grub_emu_excuse)"
589 if [ x"$grub_emu_usb_excuse" = x ]; then
590 echo USB support for grub-emu: Yes
592 echo USB support for grub-emu: No "($grub_emu_usb_excuse)"
594 if [ x"$enable_mm_debug" = xyes ]; then
595 echo With memory debugging: Yes
597 echo With memory debugging: No
599 if [ x"$enable_grub_pe2elf" = xyes ]; then
600 echo grub-pe2elf will be built and installed
601 elif [ x$TARGET_OBJ2ELF = xgrub-pe2elf ]; then
602 echo grub-pe2elf will be built but not installed
604 echo grub-pe2elf will not be built
606 if [ x"$efiemu_excuse" = x ]; then
607 echo efiemu runtime: Yes
609 echo efiemu runtime: No "($efiemu_excuse)"
611 if [ x"$grub_fstest_excuse" = x ]; then
612 echo grub-fstest: Yes
614 echo grub-fstest: No "($grub_fstest_excuse)"
616 if [ x"$grub_mkfont_excuse" = x ]; then
617 echo grub-mkfont: Yes
619 echo grub-mkfont: No "($grub_mkfont_excuse)"
621 echo "*******************************************************"