#!/bin/sh fail() { echo "$0: $*" >&2 exit 1 } host= target= gcclibdir= for arg ; do case "$arg" in --host=*) host=${arg#*=} ;; --target=*) target=${arg#*=} ;; --with-cpp=*) DEFAULT_PREPROCESSOR=${arg#*=} ;; --with-qbe=*) DEFAULT_QBE=${arg#*=} ;; --with-as=*) DEFAULT_ASSEMBLER=${arg#*=} ;; --with-ld=*) DEFAULT_LINKER=${arg#*=} ;; --with-ldso=*) DEFAULT_DYNAMIC_LINKER=${arg#*=} ;; --with-gcc-libdir=*) gcclibdir=${arg#*=} ;; CC=*) CC=${arg#*=} ;; CFLAGS=*) CFLAGS=${arg#*=} ;; LDFLAGS=*) LDFLAGS=${arg#*=} ;; *) fail "unknown option '$arg'" esac done : ${CC:=cc} printf 'checking host system type... ' test -n "$host" || host=$($CC -dumpmachine 2>/dev/null) || fail "could not determine host" printf '%s\n' "$host" printf 'checking target system type... ' test -n "$target" || target=$host printf '%s\n' "$target" toolprefix= if [ "$host" != "$target" ] ; then toolprefix=$target- fi : ${DEFAULT_PREPROCESSOR:=${toolprefix}cpp} : ${DEFAULT_QBE:=qbe} : ${DEFAULT_ASSEMBLER:=${toolprefix}as} : ${DEFAULT_LINKER:=${toolprefix}ld} case "$target" in x86_64*|amd64*) qbetarget=amd64_sysv ;; aarch64*) qbetarget=arm64 ;; *) fail "unsupported architecture '${target%%-*}'" esac startfiles=0 endfiles=0 defines= linkflags= gnuc=' /* specify the GNU C extensions we support */ "-D", "__GNUC__=1", "-D", "__GNUC_MINOR__=0", ' case "$target" in *-linux-*musl*) test "${DEFAULT_DYNAMIC_LINKER+set}" || case "$target" in x86_64*) DEFAULT_DYNAMIC_LINKER=/lib/ld-musl-x86_64.so.1 ;; aarch64*) DEFAULT_DYNAMIC_LINKER=/lib/ld-musl-aarch64.so.1 ;; *) fail "unsuported target '$target'" esac startfiles='"-l", ":crt1.o", "-l", ":crti.o"' endfiles='"-l", "c", "-l", ":crtn.o"' ;; *-linux-*gnu*) test "${DEFAULT_DYNAMIC_LINKER+set}" || case "$target" in x86_64*) DEFAULT_DYNAMIC_LINKER=/lib64/ld-linux-x86-64.so.2 ;; aarch64*) DEFAULT_DYNAMIC_LINKER=/lib/ld-linux-aarch64.so.1 ;; *) fail "unsuported target '$target'" esac startfiles='"-l", ":crt1.o", "-l", ":crti.o", "-l", ":crtbegin.o"' endfiles='"-l", "c", "-l", ":crtend.o", "-l", ":crtn.o"' if [ -z "$gcclibdir" ] ; then test "$host" = "$target" || fail "gcc libdir must be specified when building a cross-compiler" crtbegin=$($CC -print-file-name=crtbegin.o 2>/dev/null) gcclibdir=${crtbegin%/*} fi linkflags='"-L", "'$gcclibdir'",' defines=' /* prevent glibc from using statement expressions for assert */ "-D", "__STRICT_ANSI__", ' ;; *-*freebsd*) : ${DEFAULT_DYNAMIC_LINKER:=/libexec/ld-elf.so.1} startfiles='"-l", ":crt1.o", "-l", ":crti.o"' endfiles='"-l", "c", "-l", ":crtn.o"' # any value of __GNUC__ will cause FreeBSD's headers to use asm for bswap gnuc= linkflags='"-L", "/usr/lib",' defines=' "-D", "_Pragma(x)=", "-D", "_Nullable=", "-D", "_Nonnull=", "-D", "__GNUCLIKE_BUILTIN_STDARG", "-D", "__GNUCLIKE_BUILTIN_VARARGS", /* required to define _RuneLocale, needed by xlocale/_ctype.h */ "-D", "_USE_CTYPE_INLINE_", /* workaround for #42 */ "-D", "_XLOCALE_INLINE=static inline", /* used like attribute after declarator, so _Alignas will not work here */ "-D", "__aligned(x)=", /* TLS is not yet supported (#8) */ "-D", "__NO_TLS", /* disable warnings for redefining _Pragma */ "-Wno-builtin-macro-redefined", ' ;; *-*openbsd*) : ${DEFAULT_DYNAMIC_LINKER:=/usr/libexec/ld.so} startfiles='"-l", ":crt0.o", "-l", ":crtbegin.o"' endfiles='"-l", "c", "-l", ":crtend.o"' linkflags='"-L", "/usr/lib",' ;; *) fail "unknown target '$target', please create config.h manually" esac test "$DEFAULT_DYNAMIC_LINKER" && linkflags=$linkflags' "--dynamic-linker", "'$DEFAULT_DYNAMIC_LINKER'"' printf "creating config.h... " cat >config.h <config.mk <