diff --git a/tools/platform.sh b/tools/platform.sh index f3814b0..64576fb 100755 --- a/tools/platform.sh +++ b/tools/platform.sh @@ -30,10 +30,9 @@ DESTDIR= LDSOCONF="/etc/ld.so.conf" PREFIX="/usr/local" PROGNAME="platform.sh" -SOEXT= +SOEXT=".so" #executables UNAME="uname" - [ -f "$CONFIGSH" ] && . "$CONFIGSH" @@ -99,25 +98,14 @@ _library_ldsoconf() _platform_variable() { variable="$1" + context="$2" case "$variable" in ARCH) - if [ -n "$ARCH" ]; then - echo "$ARCH" - return 0 - fi - ARCH=$($UNAME -m) - case "$ARCH" in - amd64|x86_64) - echo "amd64" - ;; - i[3456]86) - echo "i386" - ;; - *) - echo "unknown" - ;; - esac + [ -n "$ARCH" ] || ARCH="$context" + [ -n "$ARCH" ] || ARCH=$($UNAME -m) + [ -n "$ARCH" ] || return 2 + echo "$ARCH" ;; BINDIR) echo "$PREFIX/bin" @@ -125,6 +113,14 @@ _platform_variable() DATADIR) echo "$PREFIX/share" ;; + LIBK_*|LIBULOADER_*|NATIVE_*|UKERNEL_*|ULOADER_*) + [ -n "$PORT" ] || PORT=$(_platform_variable "PORT" "$context") + case "$PORT" in + amd64|i386) + "_platform_variable_$PORT" "$variable" + ;; + esac + ;; LIBDIR) echo "$PREFIX/lib" ;; @@ -135,25 +131,30 @@ _platform_variable() echo "$PREFIX/share/man" fi ;; + PORT) + [ -n "$PORT" ] || PORT="$context" + if [ ! -n "$PORT" ]; then + [ -n "$ARCH" ] || ARCH=$(_platform_variable "ARCH") + case "$ARCH" in + amd64|x86_64) + PORT="amd64" + ;; + i[3456]86) + PORT="i386" + ;; + *) + return 2 + ;; + esac + fi + echo "$PORT" + ;; PREFIX) echo "$PREFIX" ;; SBINDIR) echo "$PREFIX/sbin" ;; - SOEXT) - case "$($UNAME -s)" in - "Darwin") - echo ".dylib" - ;; - "MINGW"*) - echo ".dll" - ;; - *) - echo ".so" - ;; - esac - ;; SYSCONFDIR) if [ "$PREFIX" = "/usr" ]; then echo "/etc" @@ -164,21 +165,103 @@ _platform_variable() esac } +_platform_variable_amd64() +{ + variable="$1" + extra= + platform=$($UNAME -s) + + if [ "$platform" = "OpenBSD" ]; then + extra=" -fno-stack-protector" + else + extra=" -fstack-protector" + fi + case "$variable" in + LIBK_CFLAGS) + echo "-ffreestanding -fPIC -mno-red-zone$extra" + ;; + LIBK_LDFLAGS|NATIVE_LDFLAGS) + echo "-nostdlib" + ;; + LIBULOADER_CFLAGS) + echo "-m32 -ffreestanding -fPIC -mno-red-zone$extra" + ;; + LIBULOADER_LDFLAGS) + echo "-m32 -nostdlib" + ;; + NATIVE_CFLAGS) + echo "-ffreestanding -fPIE$extra" + ;; + UKERNEL_CFLAGS) + echo "-ffreestanding -fPIE -mno-red-zone$extra" + ;; + UKERNEL_LDFLAGS) + echo "-nostdlib -pie -static -T ${prepend}src/arch/amd64/uKernel.ld" + ;; + ULOADER_CFLAGS) + echo "-m32 -ffreestanding$extra" + ;; + ULOADER_LDFLAGS) + [ -n "$CC" ] || CC="cc" + echo "-m32 -nostdlib -static -T ${prepend}src/arch/i386/uKernel.ld $($CC -m32 -print-libgcc-file-name)" + ;; + esac +} + +_platform_variable_i386() +{ + variable="$1" + extra= + platform=$($UNAME -s) + + if [ "$platform" = "OpenBSD" ]; then + extra=" -fno-stack-protector" + else + extra=" -fstack-protector" + fi + case "$variable" in + LIBK_CFLAGS|LIBULOADER_CFLAGS) + echo "-ffreestanding -fPIC$extra" + ;; + LIBK_LDFLAGS|LIBULOADER_LDFLAGS|NATIVE_LDFLAGS) + echo "-nostdlib" + ;; + NATIVE_CFLAGS|UKERNEL_CFLAGS) + echo "-ffreestanding -fPIE$extra" + ;; + UKERNEL_LDFLAGS) + echo "-nostdlib -pie -static -T ${prepend}src/arch/i386/uKernel.ld" + ;; + ULOADER_CFLAGS) + echo "-ffreestanding$extra" + ;; + ULOADER_LDFLAGS) + [ -n "$CC" ] || CC="cc" + echo "-nostdlib -static -T ${prepend}src/arch/i386/uKernel.ld $($CC -m32 -print-libgcc-file-name)" + ;; + esac +} + #usage _usage() { echo "Usage: $PROGNAME -l library" 1>&2 - echo " $PROGNAME -V variable" 1>&2 + echo " $PROGNAME -V variable [-C context]" 1>&2 return 1 } #main +prepend="${0%tools/platform.sh}" +context= type= variable= -while getopts "l:O:V:" name; do +while getopts "C:l:O:V:" name; do case "$name" in + C) + context="$OPTARG" + ;; O) export "${OPTARG%%=*}"="${OPTARG#*=}" ;; @@ -202,14 +285,12 @@ if [ $# -ne 0 ]; then exit $? fi -[ -n "$SOEXT" ] || SOEXT=$(_platform_variable SOEXT) - case "$type" in library) "_platform_$type" "$library" ;; variable) - "_platform_$type" "$variable" + "_platform_$type" "$variable" "$context" ;; *) _usage