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 powerpc64) host_m32=1 ;;
51 i[[3456]]86) target_cpu=i386 ;;
54 # Specify the platform (such as firmware).
55 AC_ARG_WITH([platform],
56 AS_HELP_STRING([--with-platform=PLATFORM],
57 [select the host platform [[guessed]]]))
59 # Guess the platform if not specified.
60 if test "x$with_platform" = x; then
61 case "$target_cpu"-"$target_vendor" in
62 i386-apple) platform=efi ;;
63 i386-*) platform=pc ;;
64 x86_64-apple) platform=efi ;;
65 x86_64-*) platform=pc ;;
66 powerpc-*) platform=ieee1275 ;;
67 powerpc64-*) platform=ieee1275 ;;
68 sparc64-*) platform=ieee1275 ;;
69 *) AC_MSG_ERROR([unsupported CPU: "$target_cpu"]) ;;
72 platform="$with_platform"
75 # Adjust CPU unless target was explicitly specified.
76 if test -z "$target_alias"; then
77 case "$target_cpu"-"$platform" in
79 x86_64-*) target_cpu=i386 ;;
80 powerpc64-ieee1275) target_cpu=powerpc ;;
84 # Check if the platform is supported, make final adjustments.
85 case "$target_cpu"-"$platform" in
90 i386-linuxbios) platform=coreboot ;;
94 *) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;;
98 i386 | powerpc) target_m32=1 ;;
99 x86_64 | sparc64) target_m64=1 ;;
103 mingw32) host_os=cygwin ;;
106 # This normalizes the names, and creates a new variable ("host_kernel")
107 # while at it, since the mapping is not always 1:1 (e.g. different OSes
108 # using the same kernel type).
110 gnu*) host_kernel=hurd ;;
111 linux*) host_kernel=linux ;;
112 freebsd* | kfreebsd*-gnu) host_kernel=freebsd ;;
113 cygwin) host_kernel=windows ;;
118 AC_SUBST(host_kernel)
124 # Checks for build programs.
127 # Although cmp is listed in the GNU Coding Standards as a command which
128 # can used directly, OpenBSD lacks cmp in the default installation.
129 AC_CHECK_PROGS([CMP], [cmp])
130 if test "x$CMP" = x; then
131 AC_MSG_ERROR([cmp is not found])
134 AC_CHECK_PROGS([YACC], [bison])
135 if test "x$YACC" = x; then
136 AC_MSG_ERROR([bison is not found])
139 for file in /usr/src/unifont.bdf ; do
140 if test -e $file ; then
141 AC_SUBST([UNIFONT_BDF], [$file])
150 # These are not a "must".
151 AC_PATH_PROG(RUBY, ruby)
152 AC_PATH_PROG(HELP2MAN, help2man)
155 # Checks for host programs.
160 test "x$GCC" = xyes || AC_MSG_ERROR([GCC is required])
165 # Identify characteristics of the host architecture.
167 AC_CHECK_SIZEOF(void *)
168 AC_CHECK_SIZEOF(long)
170 if test "x$host_m32" = x1; then
172 CFLAGS="$CFLAGS -m32"
173 LDFLAGS="$LDFLAGS -m32"
176 # Check LZO when compiling for the i386-pc.
177 if test "$target_cpu"-"$platform" = i386-pc; then
179 [AS_HELP_STRING([--enable-lzo],
180 [use lzo to compress kernel (default is lzma)])])
181 [if [ x"$enable_lzo" = xyes ]; then
182 # There are three possibilities. LZO version 2 installed with the name
183 # liblzo2, with the name liblzo, and LZO version 1.]
184 AC_DEFINE([ENABLE_LZO], [1], [Use lzo compression])
185 AC_CHECK_LIB([lzo2], [__lzo_init_v2], [LIBLZO="-llzo2"],
186 [AC_CHECK_LIB([lzo], [__lzo_init_v2], [LIBLZO="-llzo"],
187 [AC_CHECK_LIB([lzo], [__lzo_init2], [LIBLZO="-llzo"],
188 [AC_MSG_ERROR([LZO library version 1.02 or later is required])])])])
190 [LIBS="$LIBS $LIBLZO"]
191 AC_CHECK_FUNC([lzo1x_999_compress], ,
192 [AC_MSG_ERROR([LZO1X-999 must be enabled])])
194 [# LZO version 2 uses lzo/lzo1x.h, while LZO version 1 uses lzo1x.h.]
195 AC_CHECK_HEADERS([lzo/lzo1x.h lzo1x.h])
197 AC_DEFINE([ENABLE_LZMA], [1], [Use lzma compression])
199 AC_SUBST([enable_lzo])
202 # Check for functions.
203 AC_CHECK_FUNCS(posix_memalign memalign asprintf)
206 # Check for target programs.
210 # Use linker script if present, otherwise use builtin -N script.
211 AC_MSG_CHECKING([for option to link raw image])
212 if test -f "${srcdir}/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"; then
213 TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"
214 TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}"
215 TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"
218 TARGET_IMG_LDFLAGS='-Wl,-N'
219 TARGET_IMG_LDFLAGS_AC='-Wl,-N'
221 AC_SUBST(TARGET_IMG_LDSCRIPT)
222 AC_SUBST(TARGET_IMG_LDFLAGS)
223 AC_MSG_RESULT([$TARGET_IMG_LDFLAGS_AC])
225 # For platforms where ELF is not the default link format.
226 AC_MSG_CHECKING([for command to convert module to ELF format])
228 cygwin) TARGET_OBJ2ELF='grub-pe2elf' ;;
231 AC_SUBST(TARGET_OBJ2ELF)
232 AC_MSG_RESULT([$TARGET_OBJ2ELF])
234 # Find tools for the target.
235 if test "x$target_alias" != x && test "x$host_alias" != "x$target_alias"; then
236 tmp_ac_tool_prefix="$ac_tool_prefix"
237 ac_tool_prefix=$target_alias-
239 AC_CHECK_TOOLS(TARGET_CC, [gcc egcs cc],
240 [AC_MSG_ERROR([none of gcc, egcs and cc is found. set TARGET_CC manually.])])
241 AC_CHECK_TOOL(OBJCOPY, objcopy)
242 AC_CHECK_TOOL(STRIP, strip)
243 AC_CHECK_TOOL(NM, nm)
245 ac_tool_prefix="$tmp_ac_tool_prefix"
247 if test "x$TARGET_CC" = x; then
250 AC_CHECK_TOOL(OBJCOPY, objcopy)
251 AC_CHECK_TOOL(STRIP, strip)
252 AC_CHECK_TOOL(NM, nm)
257 # Test the C compiler for the target environment.
260 tmp_LDFLAGS="$LDFLAGS"
261 tmp_CPPFLAGS="$CPPFLAGS"
264 CFLAGS="$TARGET_CFLAGS"
265 CPPFLAGS="$TARGET_CPPFLAGS"
266 LDFLAGS="$TARGET_LDFLAGS"
269 if test "x$TARGET_CFLAGS" = x; then
271 TARGET_CFLAGS="-Wall -W -Wshadow -Wpointer-arith -Wmissing-prototypes \
272 -Wundef -Wstrict-prototypes -g"
274 # optimization flags.
275 AC_CACHE_CHECK([whether optimization for size works], grub_cv_cc_Os, [
277 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
281 if test "x$grub_cv_cc_Os" = xyes; then
282 TARGET_CFLAGS="$TARGET_CFLAGS -Os"
284 TARGET_CFLAGS="$TARGET_CFLAGS -O2 -fno-strength-reduce -fno-unroll-loops"
287 # Force no alignment to save space on i386.
288 if test "x$target_cpu" = xi386; then
289 AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [
290 CFLAGS="-falign-loops=1"
291 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
292 [grub_cv_cc_falign_loop=yes],
293 [grub_cv_cc_falign_loop=no])
296 if test "x$grub_cv_cc_falign_loop" = xyes; then
297 TARGET_CFLAGS="$TARGET_CFLAGS -falign-jumps=1 -falign-loops=1 -falign-functions=1"
299 TARGET_CFLAGS="$TARGET_CFLAGS -malign-jumps=1 -malign-loops=1 -malign-functions=1"
304 if test "x$target_m32" = x1; then
306 TARGET_CFLAGS="$TARGET_CFLAGS -m32"
307 TARGET_LDFLAGS="$TARGET_LDFLAGS -m32"
310 if test "x$target_m64" = x1; then
312 TARGET_CFLAGS="$TARGET_CFLAGS -m64"
313 TARGET_LDFLAGS="$TARGET_LDFLAGS -m64"
316 if test "$target_cpu"-"$platform" = x86_64-efi; then
317 # Use large model to support 4G memory
318 AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
319 CFLAGS="-m64 -mcmodel=large"
320 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
321 [grub_cv_cc_mcmodel=yes],
322 [grub_cv_cc_mcmodel=no])
324 if test "x$grub_cv_cc_no_mcmodel" = xno; then
325 AC_MSG_ERROR([-mcmodel=large not supported, upgrade your gcc])
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="-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 -mcmodel=large -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_CPPFLAGS)
365 AC_SUBST(TARGET_LDFLAGS)
367 # Set them to their new values for the tests below.
369 CFLAGS="$TARGET_CFLAGS"
370 CPPFLAGS="$TARGET_CPPFLAGS"
371 LDFLAGS="$TARGET_LDFLAGS"
373 # Check for target functions.
374 AC_CHECK_FUNCS(__bswapsi2 __bswapdi2)
376 # Defined in aclocal.m4.
378 grub_PROG_OBJCOPY_ABSOLUTE
379 grub_PROG_LD_BUILD_ID_NONE
381 if test "x$target_cpu" = xi386; then
382 if test ! -z "$TARGET_IMG_LDSCRIPT"; then
383 # Check symbols provided by linker script.
384 CFLAGS="$TARGET_CFLAGS -nostdlib $TARGET_IMG_LDFLAGS_AC -Wl,-Ttext,8000,--defsym,___main=0x8100"
386 if test "x$platform" = xpc; then
387 grub_CHECK_BSS_START_SYMBOL
388 grub_CHECK_END_SYMBOL
390 CFLAGS="$TARGET_CFLAGS"
391 grub_I386_ASM_PREFIX_REQUIREMENT
393 grub_I386_ASM_ABSOLUTE_WITHOUT_ASTERISK
395 AC_DEFINE([NESTED_FUNC_ATTR], [], [Catch gcc bug])
398 AH_BOTTOM([#if defined(__i386__) && !defined(GRUB_UTIL)
399 #define NESTED_FUNC_ATTR __attribute__ ((__regparm__ (1)))
401 #define NESTED_FUNC_ATTR
407 CPPFLAGS="$tmp_CPPFLAGS"
408 LDFLAGS="$tmp_LDFLAGS"
415 # Memory manager debugging.
416 AC_ARG_ENABLE([mm-debug],
417 AS_HELP_STRING([--enable-mm-debug],
418 [include memory manager debugging]),
419 [AC_DEFINE([MM_DEBUG], [1],
420 [Define to 1 if you enable memory manager debugging.])])
422 AC_ARG_ENABLE([grub-emu],
423 [AS_HELP_STRING([--enable-grub-emu],
424 [build and install the `grub-emu' debugging utility])])
425 AC_ARG_ENABLE([grub-emu-usb],
426 [AS_HELP_STRING([--enable-grub-emu-usb],
427 [build and install the `grub-emu' debugging utility with USB support])])
428 [if [ x"$enable_grub_emu" = xyes ]; then
429 # Check for curses libraries.]
430 AC_CHECK_LIB([ncurses], [wgetch], [LIBCURSES="-lncurses"],
431 [AC_CHECK_LIB([curses], [wgetch], [LIBCURSES="-lcurses"],
432 [AC_MSG_ERROR([(n)curses libraries are required to build `grub-emu'])])])
433 AC_SUBST([LIBCURSES])
435 [# Check for headers.]
436 AC_CHECK_HEADERS([ncurses/curses.h], [],
437 [AC_CHECK_HEADERS([ncurses.h], [],
438 [AC_CHECK_HEADERS([curses.h], [],
439 [AC_MSG_ERROR([(n)curses header files are required to build `grub-emu'])])])])
441 [if [ x"$enable_grub_emu_usb" = xyes ]; then
442 # Check for libusb libraries.]
443 AC_CHECK_LIB([usb], [usb_claim_interface], [LIBUSB="-lusb"],
444 [AC_MSG_ERROR([libusb libraries are required to build `grub-emu' with USB support])])
447 [# Check for headers.]
448 AC_CHECK_HEADERS([usb.h], [],
449 [AC_MSG_ERROR([libusb header file is required to build `grub-emu' with USB support])])
452 AC_SUBST([enable_grub_emu])
453 AC_SUBST([enable_grub_emu_usb])
455 AC_ARG_ENABLE([grub-fstest],
456 [AS_HELP_STRING([--enable-grub-fstest],
457 [build and install the `grub-fstest' debugging utility])])
458 AC_SUBST([enable_grub_fstest])
460 AC_ARG_ENABLE([grub-pe2elf],
461 [AS_HELP_STRING([--enable-grub-pe2elf],
462 [build and install the `grub-pe2elf' conversion utility])])
463 AC_SUBST([enable_grub_pe2elf])
465 AC_ARG_ENABLE([grub-mkfont],
466 [AS_HELP_STRING([--enable-grub-mkfont],
467 [build and install the `grub-mkfont' utility])])
468 if test x"$enable_grub_mkfont" = xyes ; then
469 # Check for freetype libraries.
470 AC_CHECK_PROGS([FREETYPE], [freetype-config])
471 if test "x$FREETYPE" = x ; then
472 AC_MSG_ERROR([freetype2 libraries are required to build `grub-mkfont'])
474 freetype_cflags=`freetype-config --cflags`
475 freetype_libs=`freetype-config --libs`
477 AC_SUBST([enable_grub_mkfont])
478 AC_SUBST([freetype_cflags])
479 AC_SUBST([freetype_libs])
481 AC_ARG_ENABLE([efiemu],
482 [AS_HELP_STRING([--enable-efiemu],
483 [build and install the efiemu runtimes])])
484 AC_SUBST([enable_efiemu])
488 if test x"$link_dir" = xyes ; then
489 AC_CONFIG_LINKS([include/grub/cpu:include/grub/$target_cpu
490 include/grub/machine:include/grub/$target_cpu/$platform])
492 mkdir -p include/grub 2>/dev/null
493 rm -rf include/grub/cpu
494 cp -rp $srcdir/include/grub/$target_cpu include/grub/cpu 2>/dev/null
495 rm -rf include/grub/machine
496 cp -rp $srcdir/include/grub/$target_cpu/$platform include/grub/machine 2>/dev/null
498 AC_CONFIG_FILES([Makefile gensymlist.sh genkernsyms.sh])
499 AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])