#!/usr/bin/env bash
# Copyright 1999-2020 Gentoo Authors
# 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;;
		riscv32*)     machine="generic32 -DL_ENDIAN";;
		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}
