mirror of https://git.musl-libc.org/git/musl
initial commit of configure script
this script is not based on autoconf; however it attempts to follow the same interface contracts for ease of integration with build systems. it is also not necessary to use musl. manually written config.mak files are still supported, as is building without any config.mak at all as long as you are happy with the default options and you supply at least ARCH on the command line to make.
This commit is contained in:
parent
7e4d79464a
commit
64d2f8e82a
|
@ -0,0 +1,275 @@
|
|||
#!/bin/sh
|
||||
|
||||
usage () {
|
||||
cat <<EOF
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]... [BUILDTYPE]
|
||||
|
||||
To assign environment variables (e.g., CC, CFLAGS...), specify them as
|
||||
VAR=VALUE. See below for descriptions of some of the useful variables.
|
||||
|
||||
Defaults for the options are specified in brackets.
|
||||
|
||||
Installation directories:
|
||||
--prefix=PREFIX main installation prefix [/usr/local/musl]
|
||||
--exec-prefix=EPREFIX installation prefix for executable files [PREFIX]
|
||||
|
||||
Fine tuning of the installation directories:
|
||||
--bindir=DIR user executables [EPREFIX/bin]
|
||||
--libdir=DIR library files for the linker [PREFIX/lib]
|
||||
--includedir=DIR include files for the C compiler [PREFIX/include]
|
||||
--syslibdir=DIR location for the dynamic linker [/lib]
|
||||
|
||||
System types:
|
||||
--target=TARGET configure to run on target TARGET [detected]
|
||||
--build=BUILD same as --target
|
||||
|
||||
Optional features:
|
||||
--enable-debug build with debugging information [disabled]
|
||||
--enable-warnings build with recommended warnings flags [disabled]
|
||||
--enable-gcc-wrapper build musl-gcc toolchain wrapper [auto]
|
||||
--disable-shared inhibit building shared library [enabled]
|
||||
--disable-static inhibit building static library [enabled]
|
||||
|
||||
Some influential environment variables:
|
||||
CC C compiler command [detected]
|
||||
CFLAGS C compiler flags [-Os -pipe ...]
|
||||
|
||||
Use these variables to override the choices made by configure.
|
||||
|
||||
EOF
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Helper functions
|
||||
|
||||
echo () { printf "%s\n" "$*" ; }
|
||||
fail () { echo "$*" ; exit 1 ; }
|
||||
fnmatch () { eval "case \"\$2\" in $1) return 0 ;; *) return 1 ;; esac" ; }
|
||||
cmdexists () { type "$1" >/dev/null 2>&1 ; }
|
||||
trycc () { test -z "$CC" && cmdexists "$1" && CC=$1 ; }
|
||||
|
||||
setdir () {
|
||||
if eval "test -z \"\${$1}\"" ; then eval "$1=\$2"
|
||||
else eval "fnmatch '*/' \"\${$1}\"" && eval "$1=\${$1%/}" ; fi
|
||||
}
|
||||
|
||||
tryflag () {
|
||||
printf "checking whether compiler accepts %s... " "$2"
|
||||
echo "typedef int x;" > "$tmpc"
|
||||
if "$CC" "$2" -c -o /dev/null "$tmpc" 2>/dev/null ; then
|
||||
printf "yes\n"
|
||||
eval "$1=\"\${$1} \$2\""
|
||||
eval "$1=\${$1# }"
|
||||
return 0
|
||||
else
|
||||
printf "no\n"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Beginning of actual script
|
||||
|
||||
prefix=
|
||||
exec_prefix=
|
||||
bindir=
|
||||
libdir=
|
||||
includedir=
|
||||
syslibdir=
|
||||
build=
|
||||
debug=no
|
||||
warnings=
|
||||
shared=yes
|
||||
static=yes
|
||||
|
||||
for arg ; do
|
||||
case "$arg" in
|
||||
--help) usage ;;
|
||||
--prefix=*) prefix=${arg#*=} ;;
|
||||
--exec-prefix=*) exec_prefix=${arg#*=} ;;
|
||||
--bindir=*) bindir=${arg#*=} ;;
|
||||
--libdir=*) libdir=${arg#*=} ;;
|
||||
--includedir=*) includedir=${arg#*=} ;;
|
||||
--syslibdir=*) syslibdir=${arg#*=} ;;
|
||||
--enable-shared|--enable-shared=yes) shared=yes ;;
|
||||
--disable-shared|--enable-shared=no) shared=no ;;
|
||||
--enable-static|--enable-static=yes) static=yes ;;
|
||||
--disable-static|--enable-static=no) static=no ;;
|
||||
--enable-debug|--enable-debug=yes) debug=yes ;;
|
||||
--disable-debug|--enable-debug=no) debug=no ;;
|
||||
--enable-warnings|--enable-warnings=yes) warnings=yes ;;
|
||||
--disable-warnings|--enable-warnings=no) warnings=no ;;
|
||||
--enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ;;
|
||||
--disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;;
|
||||
--enable-*|--disable-*|--with-*|--without-*|--*dir=*|--host=*) ;;
|
||||
--build=*|--target=*) build=${arg#*=} ;;
|
||||
-* ) echo "$0: unknown option $arg" ;;
|
||||
CC=*) CC=${arg#*=} ;;
|
||||
CFLAGS=*) CFLAGS=${arg#*=} ;;
|
||||
CPPFLAGS=*) CPPFLAGS=${arg#*=} ;;
|
||||
LDFLAGS=*) LDFLAGS=${arg#*=} ;;
|
||||
*) build=$arg ;;
|
||||
esac
|
||||
done
|
||||
|
||||
setdir prefix /usr/local/musl
|
||||
setdir exec_prefix '$(prefix)'
|
||||
setdir bindir '$(exec_prefix)/bin'
|
||||
setdir libdir '$(prefix)/lib'
|
||||
setdir includedir '$(prefix)/include'
|
||||
setdir syslibdir '/lib'
|
||||
|
||||
#
|
||||
# Get a temp filename we can use
|
||||
#
|
||||
i=0
|
||||
set -C
|
||||
while : ; do i=$(($i+1))
|
||||
tmpc="./conf$$-$PPID-$i.c"
|
||||
2>/dev/null > "$tmpc" && break
|
||||
test "$i" -gt 50 && fail "$0: cannot create temporary file $tmpc"
|
||||
done
|
||||
set +C
|
||||
trap 'rm "$tmpc"' EXIT INT QUIT TERM HUP
|
||||
|
||||
#
|
||||
# Find a C compiler to use
|
||||
#
|
||||
printf "checking for C compiler... "
|
||||
trycc gcc
|
||||
trycc c99
|
||||
trycc cc
|
||||
printf "%s\n" "$CC"
|
||||
test -n "$CC" || { echo "$0: cannot find a C compiler" ; exit 1 ; }
|
||||
|
||||
#
|
||||
# Only build musl-gcc wrapper if toolchain does not already target musl
|
||||
#
|
||||
if test -z "$wrapper" ; then
|
||||
printf "checking whether compiler is gcc... "
|
||||
if fnmatch 'gcc*|GCC*' "$("$CC" --version 2>/dev/null)" ; then
|
||||
echo yes
|
||||
printf "checking whether to build musl-gcc wrapper... "
|
||||
wrapper=yes
|
||||
while read line ; do
|
||||
case "$line" in */ld-musl-*) wrapper=no ;; esac
|
||||
done <<EOF
|
||||
$($CC -dumpspecs)
|
||||
EOF
|
||||
echo $wrapper
|
||||
else
|
||||
echo no
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Find the build architecture
|
||||
#
|
||||
printf "checking build system type... "
|
||||
test -n "$build" || build=$("$CC" -dumpmachine 2>/dev/null) || build=unknown
|
||||
printf "%s\n" "$build"
|
||||
|
||||
#
|
||||
# Convert to just ARCH
|
||||
#
|
||||
case "$build" in
|
||||
arm*) ARCH=arm ;;
|
||||
i?86*) ARCH=i386 ;;
|
||||
x86_64*) ARCH=x86_64 ;;
|
||||
unknown) fail "$0: unable to detect built target; try $0 --build=..." ;;
|
||||
*) fail "$0: unknown or unsupported build target \"$build\"" ;;
|
||||
esac
|
||||
|
||||
#
|
||||
# Try to get a conforming C99 freestanding environment
|
||||
#
|
||||
tryflag CFLAGS_C99FSE -std=c99
|
||||
tryflag CFLAGS_C99FSE -nostdinc
|
||||
tryflag CFLAGS_C99FSE -ffreestanding \
|
||||
|| tryflag CFLAGS_C99FSE -fno-builtin
|
||||
tryflag CFLAGS_C99FSE -fexcess-precision=standard \
|
||||
|| tryflag CFLAGS_C99FSE -ffloat-store
|
||||
|
||||
#
|
||||
# Setup basic default CFLAGS: debug, optimization, and -pipe
|
||||
#
|
||||
if fnmatch '-O*|*\ -O*' "$CFLAGS_AUTO $CFLAGS" ; then :
|
||||
else
|
||||
tryflag CFLAGS_AUTO -Os || tryflag CFLAGS_AUTO -O2
|
||||
fi
|
||||
test "x$debug" = xyes && CFLAGS_AUTO="-g"
|
||||
tryflag CFLAGS_AUTO -pipe
|
||||
|
||||
#
|
||||
# If debugging is disabled, omit bloated DWARF2 unwind tables & frame ptr
|
||||
#
|
||||
if fnmatch '-g*|*\ -g*' "$CFLAGS_AUTO $CFLAGS" ; then :
|
||||
else
|
||||
tryflag CFLAGS_AUTO -fno-unwind-tables
|
||||
tryflag CFLAGS_AUTO -fno-asynchronous-unwind-tables
|
||||
tryflag CFLAGS_AUTO -fomit-frame-pointer
|
||||
fi
|
||||
|
||||
#
|
||||
# Some optimization levels add bloated alignment that hurt performance
|
||||
#
|
||||
tryflag CFLAGS_AUTO -falign-functions=1
|
||||
tryflag CFLAGS_AUTO -falign-labels=1
|
||||
tryflag CFLAGS_AUTO -falign-loops=1
|
||||
tryflag CFLAGS_AUTO -falign-jumps=1
|
||||
|
||||
#
|
||||
# On x86, make sure we don't have incompatible instruction set
|
||||
# extensions enabled by default. This is bad for making static binaries.
|
||||
# We cheat and use i486 rather than i386 because i386 really does not
|
||||
# work anyway (issues with atomic ops).
|
||||
#
|
||||
if test "$ARCH" = "i386" ; then
|
||||
fnmatch '-march=*|*\ -march=*' "$CFLAGS" || tryflag CFLAGS_AUTO -march=i486
|
||||
fnmatch '-mtune=*|*\ -mtune=*' "$CFLAGS" || tryflag CFLAGS_AUTO -mtune=generic
|
||||
fi
|
||||
|
||||
if test "x$warnings" = xyes ; then
|
||||
tryflag CFLAGS_AUTO -Wall
|
||||
tryflag CFLAGS_AUTO -Wpointer-arith
|
||||
tryflag CFLAGS_AUTO -Wcast-align
|
||||
tryflag CFLAGS_AUTO -Wno-parentheses
|
||||
tryflag CFLAGS_AUTO -Wno-uninitialized
|
||||
tryflag CFLAGS_AUTO -Wno-missing-braces
|
||||
tryflag CFLAGS_AUTO -Wno-unused-value
|
||||
tryflag CFLAGS_AUTO -Wno-unused-but-set-variable
|
||||
tryflag CFLAGS_AUTO -Wno-unknown-pragmas
|
||||
fi
|
||||
|
||||
|
||||
printf "creating config.mak... "
|
||||
|
||||
exec 3>&1 1>config.mak
|
||||
|
||||
|
||||
cat << EOF
|
||||
# This version of config.mak was generated by configure
|
||||
# Any changes made here will be lost if configure is re-run
|
||||
ARCH = $ARCH
|
||||
prefix = $prefix
|
||||
exec_prefix = $exec_prefix
|
||||
bindir = $bindir
|
||||
libdir = $libdir
|
||||
includedir = $includedir
|
||||
syslibdir = $syslibdir
|
||||
CC = $CC
|
||||
CFLAGS= $CFLAGS_AUTO $CFLAGS
|
||||
CFLAGS_C99FSE = $CFLAGS_C99FSE
|
||||
CPPFLAGS = $CPPFLAGS
|
||||
LDFLAGS = $LDFLAGS
|
||||
EOF
|
||||
test "x$static" = xno && echo "STATIC_LIBS ="
|
||||
test "x$shared" = xno && echo "SHARED_LIBS ="
|
||||
test "x$wrapper" = xno && echo "ALL_TOOLS ="
|
||||
test "x$wrapper" = xno && echo "TOOL_LIBS ="
|
||||
exec 1>&3 3>&-
|
||||
|
||||
printf "done\n"
|
Loading…
Reference in New Issue