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 LZO when compiling for the i386-pc.
175 if test "$target_cpu"-"$platform" = i386-pc; then
177 [AS_HELP_STRING([--enable-lzo],
178 [use lzo to compress kernel (default is lzma)])])
179 [if [ x"$enable_lzo" = xyes ]; then
180 # There are three possibilities. LZO version 2 installed with the name
181 # liblzo2, with the name liblzo, and LZO version 1.]
182 AC_DEFINE([ENABLE_LZO], [1], [Use lzo compression])
183 AC_CHECK_LIB([lzo2], [__lzo_init_v2], [LIBLZO="-llzo2"],
184 [AC_CHECK_LIB([lzo], [__lzo_init_v2], [LIBLZO="-llzo"],
185 [AC_CHECK_LIB([lzo], [__lzo_init2], [LIBLZO="-llzo"],
186 [AC_MSG_ERROR([LZO library version 1.02 or later is required])])])])
188 [LIBS="$LIBS $LIBLZO"]
189 AC_CHECK_FUNC([lzo1x_999_compress], ,
190 [AC_MSG_ERROR([LZO1X-999 must be enabled])])
192 [# LZO version 2 uses lzo/lzo1x.h, while LZO version 1 uses lzo1x.h.]
193 AC_CHECK_HEADERS([lzo/lzo1x.h lzo1x.h])
195 AC_DEFINE([ENABLE_LZMA], [1], [Use lzma compression])
197 AC_SUBST([enable_lzo])
200 # Check for functions.
201 AC_CHECK_FUNCS(posix_memalign memalign asprintf)
204 # Check for target programs.
207 # Find tools for the target.
208 if test "x$target_alias" != x && test "x$host_alias" != "x$target_alias"; then
209 tmp_ac_tool_prefix="$ac_tool_prefix"
210 ac_tool_prefix=$target_alias-
212 AC_CHECK_TOOLS(TARGET_CC, [gcc egcs cc],
213 [AC_MSG_ERROR([none of gcc, egcs and cc is found. set TARGET_CC manually.])])
214 AC_CHECK_TOOL(OBJCOPY, objcopy)
215 AC_CHECK_TOOL(STRIP, strip)
216 AC_CHECK_TOOL(NM, nm)
218 ac_tool_prefix="$tmp_ac_tool_prefix"
220 if test "x$TARGET_CC" = x; then
223 AC_CHECK_TOOL(OBJCOPY, objcopy)
224 AC_CHECK_TOOL(STRIP, strip)
225 AC_CHECK_TOOL(NM, nm)
230 # Test the C compiler for the target environment.
233 tmp_LDFLAGS="$LDFLAGS"
234 tmp_CPPFLAGS="$CPPFLAGS"
237 CFLAGS="$TARGET_CFLAGS"
238 CPPFLAGS="$TARGET_CPPFLAGS"
239 LDFLAGS="$TARGET_LDFLAGS"
242 if test "x$TARGET_CFLAGS" = x; then
244 TARGET_CFLAGS="-Wall -W -Wshadow -Wpointer-arith -Wmissing-prototypes \
245 -Wundef -Wstrict-prototypes -g"
247 # optimization flags.
248 AC_CACHE_CHECK([whether optimization for size works], grub_cv_cc_Os, [
250 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
254 if test "x$grub_cv_cc_Os" = xyes; then
255 TARGET_CFLAGS="$TARGET_CFLAGS -Os"
257 TARGET_CFLAGS="$TARGET_CFLAGS -O2 -fno-strength-reduce -fno-unroll-loops"
260 # Force no alignment to save space on i386.
261 if test "x$target_cpu" = xi386; then
262 AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [
263 CFLAGS="$CFLAGS -falign-loops=1"
264 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
265 [grub_cv_cc_falign_loop=yes],
266 [grub_cv_cc_falign_loop=no])
269 if test "x$grub_cv_cc_falign_loop" = xyes; then
270 TARGET_CFLAGS="$TARGET_CFLAGS -falign-jumps=1 -falign-loops=1 -falign-functions=1"
272 TARGET_CFLAGS="$TARGET_CFLAGS -malign-jumps=1 -malign-loops=1 -malign-functions=1"
278 if test x$grub_cv_apple_target_cc = xyes ; then
279 TARGET_CFLAGS="$TARGET_CFLAGS -DAPPLE_CC=1 -fnested-functions"
280 CFLAGS="$CFLAGS -DAPPLE_CC=1 -fnested-functions"
281 TARGET_ASFLAGS="$TARGET_ASFLAGS -DAPPLE_CC=1"
283 AC_CHECK_PROG([OBJCONV], [objconv], [objconv], [])
284 if test "x$OBJCONV" = x ; then
285 AC_CHECK_PROG([OBJCONV], [objconv], [./objconv], [], [.])
287 if test "x$OBJCONV" = x ; then
288 AC_MSG_ERROR([objconv not found which is required when building with apple compiler])
291 TARGET_IMG_CFLAGS="-static"
292 TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20 -Wl,-image_base,'
293 TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20 -Wl,-image_base,'
296 # Use linker script if present, otherwise use builtin -N script.
297 if test -f "${srcdir}/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"; then
298 TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"
299 TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT} -Wl,-Ttext,"
300 TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"
303 TARGET_IMG_LDFLAGS='-Wl,-N -Wl,-Ttext,'
304 TARGET_IMG_LDFLAGS_AC='-Wl,-N -Wl,-Ttext,'
309 AC_SUBST(TARGET_IMG_LDSCRIPT)
310 AC_SUBST(TARGET_IMG_LDFLAGS)
311 AC_SUBST(TARGET_IMG_CFLAGS)
313 # For platforms where ELF is not the default link format.
314 AC_MSG_CHECKING([for command to convert module to ELF format])
316 cygwin) TARGET_OBJ2ELF='grub-pe2elf' ;;
319 AC_SUBST(TARGET_OBJ2ELF)
320 AC_MSG_RESULT([$TARGET_OBJ2ELF])
323 if test "x$target_m32" = x1; then
325 TARGET_CFLAGS="$TARGET_CFLAGS -m32"
326 TARGET_LDFLAGS="$TARGET_LDFLAGS -m32"
327 TARGET_MODULE_FORMAT="elf32"
330 if test "x$target_m64" = x1; then
332 TARGET_CFLAGS="$TARGET_CFLAGS -m64"
333 TARGET_LDFLAGS="$TARGET_LDFLAGS -m64"
334 TARGET_MODULE_FORMAT="elf64"
337 if test "$target_cpu"-"$platform" = x86_64-efi; then
338 # Use large model to support 4G memory
339 AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
341 CFLAGS="$CFLAGS -m64 -mcmodel=large"
342 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
343 [grub_cv_cc_mcmodel=yes],
344 [grub_cv_cc_mcmodel=no])
346 if test "x$grub_cv_cc_mcmodel" = xno; then
347 CFLAGS="$SAVED_CFLAGS -m64 -DMCMODEL_SMALL=1"
348 TARGET_CFLAGS="$TARGET_CFLAGS -DMCMODEL_SMALL=1"
349 AC_MSG_WARN([-mcmodel=large not supported. You wan't be able to use the memory over 4GiB. Upgrade your gcc])
351 TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
354 # EFI writes to stack below %rsp, we must not use the red zone
355 AC_CACHE_CHECK([whether option -mno-red-zone works], grub_cv_cc_no_red_zone, [
356 CFLAGS="$CFLAGS -m64 -mno-red-zone"
357 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
358 [grub_cv_cc_no_red_zone=yes],
359 [grub_cv_cc_no_red_zone=no])
361 if test "x$grub_cv_cc_no_red_zone" = xno; then
362 AC_MSG_ERROR([-mno-red-zone not supported, upgrade your gcc])
365 TARGET_CFLAGS="$TARGET_CFLAGS -mno-red-zone"
372 # Need __enable_execute_stack() for nested function trampolines?
373 grub_CHECK_ENABLE_EXECUTE_STACK
375 # Smashing stack protector.
376 grub_CHECK_STACK_PROTECTOR
377 # Need that, because some distributions ship compilers that include
378 # `-fstack-protector' in the default specs.
379 if test "x$ssp_possible" = xyes; then
380 TARGET_CFLAGS="$TARGET_CFLAGS -fno-stack-protector"
382 grub_CHECK_STACK_ARG_PROBE
383 # Cygwin's GCC uses alloca() to probe the stackframe on static
384 # stack allocations above some threshold.
385 if test x"$sap_possible" = xyes; then
386 TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe"
389 AC_SUBST(TARGET_CFLAGS)
390 AC_SUBST(TARGET_MODULE_FORMAT)
392 AC_SUBST(TARGET_APPLE_CC)
393 AC_SUBST(TARGET_ASFLAGS)
394 AC_SUBST(TARGET_CPPFLAGS)
395 AC_SUBST(TARGET_LDFLAGS)
397 # Set them to their new values for the tests below.
399 if test "x$TARGET_APPLE_CC" = x1 ; then
400 CFLAGS="$TARGET_CFLAGS -nostdlib"
402 CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100"
404 CPPFLAGS="$TARGET_CPPFLAGS"
405 LDFLAGS="$TARGET_LDFLAGS"
407 # Defined in aclocal.m4.
409 if test "x$TARGET_APPLE_CC" != x1 ; then
410 grub_PROG_OBJCOPY_ABSOLUTE
412 grub_PROG_LD_BUILD_ID_NONE
414 if test "x$target_cpu" = xi386; then
415 if test ! -z "$TARGET_IMG_LDSCRIPT"; then
416 # Check symbols provided by linker script.
417 CFLAGS="$TARGET_CFLAGS -nostdlib $TARGET_IMG_LDFLAGS_AC -Wl,-Ttext,8000,--defsym,___main=0x8100"
419 if test "x$TARGET_APPLE_CC" != x1 ; then
420 grub_CHECK_BSS_START_SYMBOL
421 grub_CHECK_END_SYMBOL
423 CFLAGS="$TARGET_CFLAGS"
424 grub_I386_ASM_PREFIX_REQUIREMENT
426 grub_I386_ASM_ABSOLUTE_WITHOUT_ASTERISK
428 AC_DEFINE([NESTED_FUNC_ATTR], [], [Catch gcc bug])
431 AH_BOTTOM([#if defined(__i386__) && !defined(GRUB_UTIL)
432 #define NESTED_FUNC_ATTR __attribute__ ((__regparm__ (1)))
434 #define NESTED_FUNC_ATTR
440 CPPFLAGS="$tmp_CPPFLAGS"
441 LDFLAGS="$tmp_LDFLAGS"
448 # Memory manager debugging.
449 AC_ARG_ENABLE([mm-debug],
450 AS_HELP_STRING([--enable-mm-debug],
451 [include memory manager debugging]),
452 [AC_DEFINE([MM_DEBUG], [1],
453 [Define to 1 if you enable memory manager debugging.])])
455 AC_ARG_ENABLE([grub-emu],
456 [AS_HELP_STRING([--enable-grub-emu],
457 [build and install the `grub-emu' debugging utility])])
458 AC_ARG_ENABLE([grub-emu-usb],
459 [AS_HELP_STRING([--enable-grub-emu-usb],
460 [build and install the `grub-emu' debugging utility with USB support])])
461 [if [ x"$enable_grub_emu" = xyes ]; then
462 # Check for curses libraries.]
463 AC_CHECK_LIB([ncurses], [wgetch], [LIBCURSES="-lncurses"],
464 [AC_CHECK_LIB([curses], [wgetch], [LIBCURSES="-lcurses"],
465 [AC_MSG_ERROR([(n)curses libraries are required to build `grub-emu'])])])
466 AC_SUBST([LIBCURSES])
468 [# Check for headers.]
469 AC_CHECK_HEADERS([ncurses/curses.h], [],
470 [AC_CHECK_HEADERS([ncurses.h], [],
471 [AC_CHECK_HEADERS([curses.h], [],
472 [AC_MSG_ERROR([(n)curses header files are required to build `grub-emu'])])])])
474 [if [ x"$enable_grub_emu_usb" = xyes ]; then
475 # Check for libusb libraries.]
476 AC_CHECK_LIB([usb], [usb_claim_interface], [LIBUSB="-lusb"],
477 [AC_MSG_ERROR([libusb libraries are required to build `grub-emu' with USB support])])
480 [# Check for headers.]
481 AC_CHECK_HEADERS([usb.h], [],
482 [AC_MSG_ERROR([libusb header file is required to build `grub-emu' with USB support])])
485 AC_SUBST([enable_grub_emu])
486 AC_SUBST([enable_grub_emu_usb])
488 AC_ARG_ENABLE([grub-fstest],
489 [AS_HELP_STRING([--enable-grub-fstest],
490 [build and install the `grub-fstest' debugging utility])])
491 AC_SUBST([enable_grub_fstest])
493 AC_ARG_ENABLE([grub-pe2elf],
494 [AS_HELP_STRING([--enable-grub-pe2elf],
495 [build and install the `grub-pe2elf' conversion utility])])
496 AC_SUBST([enable_grub_pe2elf])
498 AC_ARG_ENABLE([grub-mkfont],
499 [AS_HELP_STRING([--enable-grub-mkfont],
500 [build and install the `grub-mkfont' utility])])
501 if test x"$enable_grub_mkfont" = xyes ; then
502 # Check for freetype libraries.
503 AC_CHECK_PROGS([FREETYPE], [freetype-config])
504 if test "x$FREETYPE" = x ; then
505 AC_MSG_ERROR([freetype2 libraries are required to build `grub-mkfont'])
507 freetype_cflags=`freetype-config --cflags`
508 freetype_libs=`freetype-config --libs`
510 AC_SUBST([enable_grub_mkfont])
511 AC_SUBST([freetype_cflags])
512 AC_SUBST([freetype_libs])
514 AC_ARG_ENABLE([efiemu],
515 [AS_HELP_STRING([--enable-efiemu],
516 [build and install the efiemu runtimes])])
517 AC_SUBST([enable_efiemu])
522 if test x"$link_dir" = xyes ; then
523 AC_CONFIG_LINKS([include/grub/cpu:include/grub/$target_cpu
524 include/grub/machine:include/grub/$target_cpu/$platform])
526 mkdir -p include/grub 2>/dev/null
527 rm -rf include/grub/cpu
528 cp -rp $srcdir/include/grub/$target_cpu include/grub/cpu 2>/dev/null
529 rm -rf include/grub/machine
530 cp -rp $srcdir/include/grub/$target_cpu/$platform include/grub/machine 2>/dev/null
532 AC_CONFIG_FILES([Makefile gensymlist.sh genkernsyms.sh])
533 AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])