#!/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;;
		riscv64*)     machine="generic64 -DL_ENDIAN";;
	#	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}
