#!/usr/bin/env bash
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
#
# Openssl doesn't play along nicely with cross-compiling
# like autotools based projects, so let's teach it new tricks.
#
# Review the bundled 'config' script to see why kind of targets
# we can pass to the 'Configure' script.


# Testing routines
if [[ $1 == "test" ]] ; then
	for c in \
		"arm-gentoo-linux-uclibc      |linux-generic32 -DL_ENDIAN" \
		"armv5b-linux-gnu             |linux-armv4 -DB_ENDIAN" \
		"x86_64-pc-linux-gnu          |linux-x86_64" \
		"alpha-linux-gnu              |linux-alpha-gcc" \
		"alphaev56-unknown-linux-gnu  |linux-alpha+bwx-gcc" \
		"i686-pc-linux-gnu            |linux-elf" \
		"whatever-gentoo-freebsdX.Y   |BSD-generic32" \
		"i686-gentoo-freebsdX.Y       |BSD-x86-elf" \
		"sparc64-alpha-freebsdX.Y     |BSD-sparc64" \
		"ia64-gentoo-freebsd5.99234   |BSD-ia64" \
		"x86_64-gentoo-freebsdX.Y     |BSD-x86_64" \
		"hppa64-aldsF-linux-gnu5.3    |linux-generic32 -DB_ENDIAN" \
		"powerpc-gentOO-linux-uclibc  |linux-ppc" \
		"powerpc64-unk-linux-gnu      |linux-ppc64" \
		"powerpc64le-linux-gnu        |linux-ppc64le" \
		"x86_64-apple-darwinX         |darwin64-x86_64-cc" \
		"powerpc64-apple-darwinX      |darwin64-ppc-cc" \
		"i686-apple-darwinX           |darwin-i386-cc" \
		"i386-apple-darwinX           |darwin-i386-cc" \
		"powerpc-apple-darwinX        |darwin-ppc-cc" \
		"i586-pc-winnt                |winnt-parity" \
		"s390-ibm-linux-gnu           |linux-generic32 -DB_ENDIAN" \
		"s390x-linux-gnu              |linux64-s390x" \
	;do
		CHOST=${c/|*}
		ret_want=${c/*|}
		ret_got=$(CHOST=${CHOST} "$0")

		if [[ ${ret_want} == "${ret_got}" ]] ; then
			echo "PASS: ${CHOST}"
		else
			echo "FAIL: ${CHOST}"
			echo -e "\twanted: ${ret_want}"
			echo -e "\twe got: ${ret_got}"
		fi
	done
	exit 0
fi
[[ -z ${CHOST} && -n $1 ]] && CHOST=$1


# Detect the operating system
case ${CHOST} in
	*-aix*)          system="aix";;
	*-darwin*)       system="darwin";;
	*-freebsd*)      system="BSD";;
	*-hpux*)         system="hpux";;
	*-linux*)        system="linux";;
	*-solaris*)      system="solaris";;
	*-winnt*)        system="winnt";;
	x86_64-*-mingw*) system="mingw64";;
	*mingw*)         system="mingw";;
	*)               exit 0;;
esac


# Compiler munging
compiler="gcc"
if [[ ${CC} == "ccc" ]] ; then
	compiler=${CC}
fi


# Detect target arch
machine=""
chost_machine=${CHOST%%-*}
case ${system} in
linux)
	case ${chost_machine}:${ABI} in
		aarch64*be*)  machine="aarch64 -DB_ENDIAN";;
		aarch64*)     machine="aarch64 -DL_ENDIAN";;
		alphaev56*|\
		alphaev[678]*)machine=alpha+bwx-${compiler};;
		alpha*)       machine=alpha-${compiler};;
		armv[4-9]*b*) machine="armv4 -DB_ENDIAN";;
		armv[4-9]*)   machine="armv4 -DL_ENDIAN";;
		arm*b*)       machine="generic32 -DB_ENDIAN";;
		arm*)         machine="generic32 -DL_ENDIAN";;
		avr*)         machine="generic32 -DL_ENDIAN";;
		bfin*)        machine="generic32 -DL_ENDIAN";;
	#	hppa64*)      machine=parisc64;;
		hppa*)        machine="generic32 -DB_ENDIAN";;
		i[0-9]86*|\
		x86_64*:x86)  machine=elf;;
		ia64*)        machine=ia64;;
		m68*)         machine="generic32 -DB_ENDIAN";;
		mips*el*)     machine="generic32 -DL_ENDIAN";;
		mips*)        machine="generic32 -DB_ENDIAN";;
		powerpc64*le*)machine=ppc64le;;
		powerpc64*)   machine=ppc64;;
		powerpc*le*)  machine="generic32 -DL_ENDIAN";;
		powerpc*)     machine=ppc;;
	#	sh64*)        machine=elf;;
		sh*b*)        machine="generic32 -DB_ENDIAN";;
		sh*)          machine="generic32 -DL_ENDIAN";;
		# TODO: Might want to do -mcpu probing like glibc to determine a
		# better default for sparc-linux-gnu targets.  This logic will
		# break v7 and older systems when they use it.
		sparc*v7*)    machine="generic32 -DB_ENDIAN";;
		sparc64*)     machine=sparcv9 system=linux64;;
		sparc*v9*)    machine=sparcv9;;
		sparc*v8*)    machine=sparcv8;;
		sparc*)       machine=sparcv8;;
		s390x*)       machine=s390x system=linux64;;
		s390*)        machine="generic32 -DB_ENDIAN";;
		x86_64*:x32)  machine=x32;;
		x86_64*)      machine=x86_64;;
	esac
	;;
BSD)
	case ${chost_machine} in
		alpha*)       machine=generic64;;
		i[6-9]86*)    machine=x86-elf;;
		ia64*)        machine=ia64;;
		sparc64*)     machine=sparc64;;
		x86_64*)      machine=x86_64;;
		*)            machine=generic32;;
	esac
	;;
aix)
	machine=${compiler}
	;;
darwin)
	case ${chost_machine} in
		powerpc64)    machine=ppc-cc; system=${system}64;;
		powerpc)      machine=ppc-cc;;
		i?86*)        machine=i386-cc;;
		x86_64)       machine=x86_64-cc; system=${system}64;;
	esac
	;;
hpux)
	case ${chost_machine} in
		ia64)	machine=ia64-${compiler} ;;
	esac
	;;
solaris)
	case ${chost_machine} in
		i386)         machine=x86-${compiler} ;;
		x86_64*)      machine=x86_64-${compiler}; system=${system}64;;
		sparcv9*)     machine=sparcv9-${compiler}; system=${system}64;;
		sparc*)       machine=sparcv8-${compiler};;
	esac
	;;
winnt)
	machine=parity
	;;
mingw*)
	# special case ... no xxx-yyy style name
	echo ${system}
	;;
esac


# If we have something, show it
[[ -n ${machine} ]] && echo ${system}-${machine}
