#!/usr/bin/env bash

# List of hardcoded paths that should be ignored, as they may
# contain binaries for an architecture different from the
# architecture of the target.
declare -a IGNORES=(
	# Skip firmware files, they could be ELF files for other
	# architectures
	"/lib/firmware"
	"/usr/lib/firmware"

	# Skip kernel modules
	# When building a 32-bit userland on 64-bit architectures, the kernel
	# and its modules may still be 64-bit. To keep the basic
	# check-bin-arch logic simple, just skip this directory.
	"/lib/modules"
	"/usr/lib/modules"

	# Skip files in /usr/share, several packages (qemu,
	# pru-software-support) legitimately install ELF binaries that
	# are not for the target architecture
	"/usr/share"

	# Skip files in {/usr,}/lib/grub, since it is possible to have
	# it for a different architecture (e.g. i386 grub on x86_64).
	"/lib/grub"
	"/usr/lib/grub"

	# Guile modules are ELF files, with a "None" machine
	"/usr/lib/guile"
)

while getopts p:l:r:a:i: OPT ; do
	case "${OPT}" in
	p) package="${OPTARG}";;
	l) pkg_list="${OPTARG}";;
	r) readelf="${OPTARG}";;
	a) arch_name="${OPTARG}";;
	i)
		# Ensure we do have single '/' as separators,
		# and that we have a leading and a trailing one.
		pattern="$(sed -r -e 's:/+:/:g; s:^/*:/:; s:/*$:/:;' <<<"${OPTARG}")"
		IGNORES+=("${pattern}")
		;;
	:) error "option '%s' expects a mandatory argument\n" "${OPTARG}";;
	\?) error "unknown option '%s'\n" "${OPTARG}";;
	esac
done

if test -z "${package}" -o -z "${pkg_list}" -o -z "${readelf}" -o -z "${arch_name}" ; then
	echo "Usage: $0 -p <pkg> -l <pkg-file-list> -r <readelf> -a <arch name> [-i PATH ...]"
	exit 1
fi

exitcode=0

# Only split on new lines, for filenames-with-spaces
IFS="
"

while read f; do
	for ignore in "${IGNORES[@]}"; do
		if [[ "${f}" =~ ^"${ignore}" ]]; then
			continue 2
		fi
	done

	# Skip symlinks. Some symlinks may have absolute paths as
	# target, pointing to host binaries while we're building.
	if [[ -L "${TARGET_DIR}/${f}" ]]; then
		continue
	fi

	# Get architecture using readelf. We pipe through 'head -1' so
	# that when the file is a static library (.a), we only take
	# into account the architecture of the first object file.
	arch=$(LC_ALL=C ${readelf} -h "${TARGET_DIR}/${f}" 2>&1 | \
		       sed -r -e '/^  Machine: +(.+)/!d; s//\1/;' | head -1)

	# If no architecture found, assume it was not an ELF file
	if test "${arch}" = "" ; then
		continue
	fi

	# Architecture is correct
	if test "${arch}" = "${arch_name}" ; then
		continue
	fi

	printf 'ERROR: architecture for "%s" is "%s", should be "%s"\n' \
	       "${f}" "${arch}" "${arch_name}"

	exitcode=1
done < <( sed -r -e "/^${package},\.(.+)$/!d; s//\1/;" ${pkg_list} )

exit ${exitcode}
