removes external dependency on tinf by replacing the compression algorithm with a simpler, faster, smaller and more auditable fixed-width LZ77 encoding purpose-tailored to x86 code mixed with data. before: decompressor.bin 2,492 bytes (tinf dependency) with .text 0x875 and .rodata 0x13c bytes each. after: decompressor.bin consists only of .text, 0xe6-byte decompressor; 90.8% reduction in decompressor volume. the dependency on gzip during compile-time is replaced by host/limlzpack.c, a Lempel-Ziv encoder in 275 SLoC that uses a suffix array matchfinder (prefix-doubling in mathcal O(n log^2 n) and Storer-Szymanski backwards parse. the fixed-width formats packets as [F][LLLL][MMM], favouring a literal-skewed distribution with F switching between one-byte and two-byte offsets (favouring recent statistics). integrity checking is done via crc32 with the polynomial 0xEDB88320, reflected. the effective loss in compression ratio by using a tremendously simpler and less packed with edge cases algorithm causes a compression ratio hit well below 1KB, factoring in the stub sizes. also adds new machinery for host cc detection per review.
347 lines
9.5 KiB
Plaintext
347 lines
9.5 KiB
Plaintext
AC_INIT([Limine], [m4_esyscmd([./version.sh])], [https://github.com/Limine-Bootloader/Limine/issues], [limine], [https://limine-bootloader.org/])
|
|
|
|
AC_PREREQ([2.69])
|
|
|
|
AC_CONFIG_AUX_DIR([build-aux])
|
|
AC_CONFIG_MACRO_DIRS([m4])
|
|
|
|
SRCDIR="$(cd "$srcdir" && pwd -P)"
|
|
BUILDDIR="$(pwd -P)"
|
|
|
|
AC_SUBST([SRCDIR])
|
|
AC_SUBST([BUILDDIR])
|
|
|
|
. "$SRCDIR"/timestamps
|
|
|
|
AC_SUBST([REGEN_DATE])
|
|
AC_SUBST([SOURCE_DATE_EPOCH])
|
|
AC_SUBST([SOURCE_DATE_EPOCH_TOUCH])
|
|
|
|
AC_CANONICAL_HOST
|
|
AC_CANONICAL_BUILD
|
|
|
|
# Portably convert relative paths into absolute paths.
|
|
rel2abs() {
|
|
rel2abs_first=true
|
|
for i in $1; do
|
|
if test $rel2abs_first = true; then
|
|
case "$i" in
|
|
/*)
|
|
printf "%s" "$i"
|
|
;;
|
|
*/*)
|
|
if test -d "$(dirname "$i")"; then
|
|
printf "%s" "$(cd "$(dirname "$i")" && pwd -P)/$(basename "$i")"
|
|
else
|
|
printf "false"
|
|
fi
|
|
;;
|
|
*)
|
|
printf "%s" "$i"
|
|
;;
|
|
esac
|
|
rel2abs_first=false
|
|
else
|
|
printf " %s" "$i"
|
|
fi
|
|
done
|
|
printf "\n"
|
|
}
|
|
|
|
test "x${CFLAGS+set}" = "x" && CFLAGS='-g -O2 -pipe'
|
|
|
|
AC_LANG([C])
|
|
AC_PROG_CC
|
|
CC="$(rel2abs "$CC")"
|
|
|
|
AX_PROG_CC_FOR_BUILD
|
|
CC_FOR_BUILD="$(rel2abs "$CC_FOR_BUILD")"
|
|
|
|
werror_state="no"
|
|
AC_ARG_ENABLE([werror],
|
|
[AS_HELP_STRING([--enable-werror], [treat warnings as errors])],
|
|
[werror_state="$enableval"])
|
|
if test "$werror_state" = "yes"; then
|
|
AC_SUBST([WERROR_FLAG], [-Werror])
|
|
else
|
|
AC_SUBST([WERROR_FLAG], [-Wno-error])
|
|
fi
|
|
|
|
AC_PROG_MKDIR_P
|
|
MKDIR_P="$(rel2abs "$MKDIR_P")"
|
|
AC_PROG_INSTALL
|
|
INSTALL="$(rel2abs "$INSTALL")"
|
|
AC_PROG_SED
|
|
SED="$(rel2abs "$SED")"
|
|
AC_PROG_GREP
|
|
GREP="$(rel2abs "$GREP")"
|
|
AC_PROG_AWK
|
|
AWK="$(rel2abs "$AWK")"
|
|
|
|
AC_CHECK_PROG([FIND_FOUND], [find], [yes])
|
|
if ! test "x$FIND_FOUND" = "xyes"; then
|
|
AC_MSG_ERROR([find not found, please install find before configuring])
|
|
fi
|
|
|
|
# $1 - UPPERCASEVAR, $2 - default command, $3 - 'tool' if toolchain, $4 - 'no-err' to ignore errors
|
|
AC_DEFUN([GET_PROG], [
|
|
if test "x${$1+set}" = "xset"; then
|
|
first_elem="$(rel2abs $(echo "$$1" | cut -f 1 -d " "))"
|
|
case "$first_elem" in
|
|
/*)
|
|
AC_MSG_CHECKING([for $first_elem])
|
|
if test -f "$first_elem" && test -x "$first_elem"; then
|
|
$1="$(rel2abs "$$1")"
|
|
$1_FOUND=yes
|
|
else
|
|
$1_FOUND=no
|
|
fi
|
|
AC_MSG_RESULT([$$1_FOUND])
|
|
;;
|
|
*)
|
|
AC_CHECK_PROG([$1_FOUND], [$first_elem], [yes])
|
|
;;
|
|
esac
|
|
else
|
|
if ! test -z "$2"; then
|
|
if test "x$3" = "xtool"; then
|
|
AC_CHECK_TOOL([$1_FOUND], [$2], [no])
|
|
if ! test "x$$1_FOUND" = "xno"; then
|
|
$1="$(rel2abs "$$1_FOUND")"
|
|
$1_FOUND=yes
|
|
fi
|
|
else
|
|
first_elem="$(rel2abs $(echo "$2" | cut -f 1 -d " "))"
|
|
AC_CHECK_PROG([$1_FOUND], [$first_elem], [yes])
|
|
if test "x$$1_FOUND" = "xyes"; then
|
|
$1="$(rel2abs "$2")"
|
|
fi
|
|
fi
|
|
else
|
|
$1_FOUND=no
|
|
fi
|
|
fi
|
|
|
|
if ! test "x$$1_FOUND" = "xyes"; then
|
|
if test "x$4" = "xno-err"; then
|
|
AC_MSG_WARN([$first_elem invalid, set $1 to a valid program])
|
|
else
|
|
AC_MSG_ERROR([$first_elem invalid, set $1 to a valid program])
|
|
fi
|
|
fi
|
|
])
|
|
|
|
AC_ARG_VAR([STRIP], [strip command])
|
|
GET_PROG([STRIP], [strip], [tool])
|
|
|
|
AC_CHECK_HEADERS([stdio.h stdlib.h stdint.h stddef.h stdbool.h stdarg.h string.h errno.h inttypes.h limits.h time.h],
|
|
[], [AC_MSG_ERROR([required header not found])])
|
|
|
|
AC_ARG_VAR([TOOLCHAIN_FOR_TARGET], [alternative toolchain prefix for Limine])
|
|
|
|
AC_ARG_VAR([CC_FOR_TARGET], [C compiler command for Limine])
|
|
if test "x${CC_FOR_TARGET+set}" = "x"; then
|
|
if test "x${TOOLCHAIN_FOR_TARGET+set}" = "x"; then
|
|
CC_FOR_TARGET="clang"
|
|
else
|
|
CC_FOR_TARGET="${TOOLCHAIN_FOR_TARGET}gcc"
|
|
fi
|
|
fi
|
|
AC_ARG_VAR([LD_FOR_TARGET], [linker command for Limine])
|
|
if test "x${LD_FOR_TARGET+set}" = "x"; then
|
|
if test "x${TOOLCHAIN_FOR_TARGET+set}" = "x"; then
|
|
LD_FOR_TARGET="ld.lld"
|
|
else
|
|
LD_FOR_TARGET="${TOOLCHAIN_FOR_TARGET}ld"
|
|
fi
|
|
fi
|
|
|
|
test "x${TOOLCHAIN_FOR_TARGET+set}" = "x" && TOOLCHAIN_FOR_TARGET=llvm-
|
|
|
|
AC_ARG_VAR([OBJCOPY_FOR_TARGET], [objcopy command for Limine])
|
|
test "x${OBJCOPY_FOR_TARGET+set}" = "x" && OBJCOPY_FOR_TARGET="${TOOLCHAIN_FOR_TARGET}objcopy"
|
|
AC_ARG_VAR([OBJDUMP_FOR_TARGET], [objdump command for Limine])
|
|
test "x${OBJDUMP_FOR_TARGET+set}" = "x" && OBJDUMP_FOR_TARGET="${TOOLCHAIN_FOR_TARGET}objdump"
|
|
AC_ARG_VAR([READELF_FOR_TARGET], [readelf command for Limine])
|
|
test "x${READELF_FOR_TARGET+set}" = "x" && READELF_FOR_TARGET="${TOOLCHAIN_FOR_TARGET}readelf"
|
|
|
|
GET_PROG([CC_FOR_TARGET])
|
|
GET_PROG([LD_FOR_TARGET])
|
|
GET_PROG([OBJCOPY_FOR_TARGET])
|
|
GET_PROG([OBJDUMP_FOR_TARGET])
|
|
GET_PROG([READELF_FOR_TARGET])
|
|
|
|
BUILD_ALL="no"
|
|
|
|
AC_ARG_ENABLE([all],
|
|
[AS_HELP_STRING([--enable-all], [enable ALL ports and targets])],
|
|
[BUILD_ALL="$enableval"])
|
|
|
|
BUILD_BIOS_CD="$BUILD_ALL"
|
|
|
|
AC_ARG_ENABLE([bios-cd],
|
|
[AS_HELP_STRING([--enable-bios-cd], [enable building the x86 BIOS CD image])],
|
|
[BUILD_BIOS_CD="$enableval"])
|
|
|
|
AC_SUBST([BUILD_BIOS_CD])
|
|
|
|
BUILD_BIOS_PXE="$BUILD_ALL"
|
|
|
|
AC_ARG_ENABLE([bios-pxe],
|
|
[AS_HELP_STRING([--enable-bios-pxe], [enable building the x86 BIOS PXE image])],
|
|
[BUILD_BIOS_PXE="$enableval"])
|
|
|
|
AC_SUBST([BUILD_BIOS_PXE])
|
|
|
|
BUILD_BIOS="$BUILD_ALL"
|
|
|
|
AC_ARG_ENABLE([bios],
|
|
[AS_HELP_STRING([--enable-bios], [enable building the x86 BIOS port])],
|
|
[BUILD_BIOS="$enableval"])
|
|
|
|
if test "x$BUILD_BIOS" = "xno"; then
|
|
if test "x$BUILD_BIOS_CD" = "xyes"; then
|
|
BUILD_BIOS="yes"
|
|
fi
|
|
if test "x$BUILD_BIOS_PXE" = "xyes"; then
|
|
BUILD_BIOS="yes"
|
|
fi
|
|
fi
|
|
|
|
if test "x$BUILD_BIOS" = "xno"; then
|
|
BUILD_BIOS=""
|
|
else
|
|
BUILD_BIOS="limine-bios"
|
|
NEED_NASM=yes
|
|
fi
|
|
|
|
AC_SUBST([BUILD_BIOS])
|
|
|
|
BUILD_UEFI_IA32="$BUILD_ALL"
|
|
|
|
AC_ARG_ENABLE([uefi-ia32],
|
|
[AS_HELP_STRING([--enable-uefi-ia32], [enable building the IA-32 UEFI port])],
|
|
[BUILD_UEFI_IA32="$enableval"])
|
|
|
|
if test "x$BUILD_UEFI_IA32" = "xno"; then
|
|
BUILD_UEFI_IA32=""
|
|
else
|
|
BUILD_UEFI_IA32="limine-uefi-ia32"
|
|
NEED_NASM=yes
|
|
fi
|
|
|
|
AC_SUBST([BUILD_UEFI_IA32])
|
|
|
|
BUILD_UEFI_X86_64="$BUILD_ALL"
|
|
|
|
AC_ARG_ENABLE([uefi-x86-64],
|
|
[AS_HELP_STRING([--enable-uefi-x86-64], [enable building the x86-64 UEFI port])],
|
|
[BUILD_UEFI_X86_64="$enableval"])
|
|
|
|
if test "x$BUILD_UEFI_X86_64" = "xno"; then
|
|
BUILD_UEFI_X86_64=""
|
|
else
|
|
BUILD_UEFI_X86_64="limine-uefi-x86-64"
|
|
NEED_NASM=yes
|
|
fi
|
|
|
|
AC_SUBST([BUILD_UEFI_X86_64])
|
|
|
|
BUILD_UEFI_AARCH64="$BUILD_ALL"
|
|
|
|
AC_ARG_ENABLE([uefi-aarch64],
|
|
[AS_HELP_STRING([--enable-uefi-aarch64], [enable building the aarch64 UEFI port])],
|
|
[BUILD_UEFI_AARCH64="$enableval"])
|
|
|
|
if test "x$BUILD_UEFI_AARCH64" = "xno"; then
|
|
BUILD_UEFI_AARCH64=""
|
|
else
|
|
BUILD_UEFI_AARCH64="limine-uefi-aarch64"
|
|
fi
|
|
|
|
AC_SUBST([BUILD_UEFI_AARCH64])
|
|
|
|
BUILD_UEFI_RISCV64="$BUILD_ALL"
|
|
|
|
AC_ARG_ENABLE([uefi-riscv64],
|
|
[AS_HELP_STRING([--enable-uefi-riscv64], [enable building the riscv64 UEFI port])],
|
|
[BUILD_UEFI_RISCV64="$enableval"])
|
|
|
|
if test "x$BUILD_UEFI_RISCV64" = "xno"; then
|
|
BUILD_UEFI_RISCV64=""
|
|
else
|
|
BUILD_UEFI_RISCV64="limine-uefi-riscv64"
|
|
fi
|
|
|
|
AC_SUBST([BUILD_UEFI_RISCV64])
|
|
|
|
BUILD_UEFI_LOONGARCH64="$BUILD_ALL"
|
|
|
|
AC_ARG_ENABLE([uefi-loongarch64],
|
|
[AS_HELP_STRING([--enable-uefi-loongarch64], [enable building the loongarch64 UEFI port])],
|
|
[BUILD_UEFI_LOONGARCH64="$enableval"])
|
|
|
|
if test "x$BUILD_UEFI_LOONGARCH64" = "xno"; then
|
|
BUILD_UEFI_LOONGARCH64=""
|
|
else
|
|
BUILD_UEFI_LOONGARCH64="limine-uefi-loongarch64"
|
|
fi
|
|
|
|
AC_SUBST([BUILD_UEFI_LOONGARCH64])
|
|
|
|
BUILD_UEFI_CD="$BUILD_ALL"
|
|
|
|
AC_ARG_ENABLE([uefi-cd],
|
|
[AS_HELP_STRING([--enable-uefi-cd], [enable building limine-uefi-cd.bin])],
|
|
[BUILD_UEFI_CD="$enableval"])
|
|
|
|
if ! test "x$BUILD_UEFI_CD" = "xno"; then
|
|
AC_CHECK_PROG([MTOOLS_FOUND], [mcopy], [yes])
|
|
if ! test "x$MTOOLS_FOUND" = "xyes"; then
|
|
if test "x$BUILD_UEFI_CD" = "xyes"; then
|
|
AC_MSG_ERROR([mtools not found, install mtools to build limine-uefi-cd.bin])
|
|
fi
|
|
AC_MSG_WARN([mtools not found, install mtools to build limine-uefi-cd.bin])
|
|
BUILD_UEFI_CD="no"
|
|
fi
|
|
fi
|
|
|
|
AC_SUBST([BUILD_UEFI_CD])
|
|
|
|
if test "x$NEED_NASM" = "xyes"; then
|
|
AC_CHECK_PROG([NASM_FOUND], [nasm], [yes])
|
|
if ! test "x$NASM_FOUND" = "xyes"; then
|
|
AC_MSG_ERROR([nasm not found, please install nasm before configuring])
|
|
fi
|
|
fi
|
|
|
|
|
|
BORROWED_CFLAGS=""
|
|
for cflag in $CFLAGS; do
|
|
case $cflag in
|
|
-O*|-pipe|-g|-f*-prefix-map*)
|
|
BORROWED_CFLAGS="$BORROWED_CFLAGS $cflag"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
AC_ARG_VAR([CFLAGS_FOR_TARGET], [C flags for Limine])
|
|
test "x${CFLAGS_FOR_TARGET+set}" = "x" && CFLAGS_FOR_TARGET="$BORROWED_CFLAGS"
|
|
|
|
AC_ARG_VAR([CPPFLAGS_FOR_TARGET], [C preprocessor flags for Limine])
|
|
test "x${CPPFLAGS_FOR_TARGET+set}" = "x" && CPPFLAGS_FOR_TARGET=""
|
|
|
|
AC_ARG_VAR([LDFLAGS_FOR_TARGET], [linker flags for Limine])
|
|
test "x${LDFLAGS_FOR_TARGET+set}" = "x" && LDFLAGS_FOR_TARGET=""
|
|
|
|
AC_ARG_VAR([NASMFLAGS_FOR_TARGET], [nasm flags for Limine])
|
|
test "x${NASMFLAGS_FOR_TARGET+set}" = "x" && NASMFLAGS_FOR_TARGET="-g"
|
|
|
|
LIMINE_COPYRIGHT=$($GREP Copyright "$SRCDIR/COPYING")
|
|
AC_SUBST([LIMINE_COPYRIGHT])
|
|
|
|
AC_PREFIX_DEFAULT([/usr/local])
|
|
|
|
AC_CONFIG_FILES([man/man1/limine.1 GNUmakefile config.h])
|
|
AC_OUTPUT
|