# Template file for 'j'
pkgname=j
reverts="807_1 901.c_1 901.d_1 901.e_1 901.f_1"
version=9.5.1
revision=1
_vmaj="${version%.*}"
_vmin="${version#${_vmaj}}"
_vrel=${_vmaj}-release${_vmin:+-}${_vmin#.}
archs="aarch64* armv[67]* i686* x86_64*"
makedepends="libgomp-devel"
short_desc="Modern, high-performance, ASCII-based successor to APL"
maintainer="B. Wilson <x@wilsonb.com>"
license="GPL-3.0-or-later"
homepage="https://jsoftware.com/"
distfiles="https://github.com/jsoftware/jsource/archive/${version}.tar.gz"
checksum=593249894579af87b325833678dfe8a35c937fe344dcc954a0ad0e31f167497a

_jsz="j${XBPS_TARGET_WORDSIZE}"
_jtype="release"
_jbuilder="voidlinux.org"
_jlib="/usr/lib/j"
_jshare="/usr/share/j"
_jetc="/etc/j"
_juser=".j"

case "${XBPS_TARGET_MACHINE}" in
	i686*|x86_64*) hostmakedepends+=" nasm";;
esac

case "${XBPS_TARGET_MACHINE}" in
	aarch64*|arm*) _jpl="raspberry";;
	*) _jpl="linux";;
esac

if [ "${XBPS_TARGET_LIBC}" = musl ]; then
	makedepends+=" musl-fts-devel"
	LDFLAGS=-lfts
fi

do_configure() {
	cp jsrc/jversion-x.h jsrc/jversion.h
	vsed -i "/jversion/s@${_vmaj}@&-${_vmin#.}@;
	         /jplatform/s@unknown@${_jpl}@;
	         /jtype/s@beta@${_jtype}@;
	         /jbuilder/s@unknown@${_jbuilder}@" \
	     jsrc/jversion.h

	# Remove version directory component from "~install" and "~user" paths
	cp jlibrary/bin/profile.ijs jlibrary/bin/profile.ijs.new
	vsed -i "/^install=./s@/usr/share/j/[0-9.]\+@${_jshare}@;
	         /^user=./s@home,userx@home,'/${_juser}'@" \
	     jlibrary/bin/profile.ijs.new

	# Munge the build scripts into reason:
	# 1) Short-circut their fragile compiler detection to directly use gcc;
	# 2) Make sure they pick up our CFLAGS and LDFLAGS; and
	# 3) Ensure they propogate errors to do_build()
	vsed -i '/^compiler/s/=.*/=gcc/;
	         /^common="\$common/n;
	         /^common/s/="/&$CFLAGS /;
	         /^LDFLAGS/s/="/&$LDFLAGS /;
	         s/-Werror//
	         /^#!/a\set -o errexit' \
	     make2/build_jconsole.sh make2/build_libj.sh
}

##
# Crossbuilds do not distinguish between AVX- and non-AVX targets, so instead
# we build all applicable binaries and install a wrapper script that executes
# the correct one on the target machine.
do_build() {
	cd make2  # The build scripts assume this is $PWD
	export USE_OPENMP=1

	jplatform=${_jpl} j64x=${_jsz} ./build_jconsole.sh
	jplatform=${_jpl} j64x=${_jsz} ./build_libj.sh

	if [ "${_jsz}" = 'j64' ]; then
		jplatform=${_jpl} j64x=${_jsz}avx ./build_jconsole.sh
		jplatform=${_jpl} j64x=${_jsz}avx ./build_libj.sh

		jplatform=${_jpl} j64x=${_jsz}avx2 ./build_jconsole.sh
		jplatform=${_jpl} j64x=${_jsz}avx2 ./build_libj.sh
	fi
}

do_check() {
	if [ -d "${_jlib}/j64avx2" ] \
	   && sed -n '/^flags/{s/\<avx2\>//;t;q1}' /proc/cpuinfo; then
		javx='avx2'
	elif [ -d "${_jlib}/j64avx" ] \
	     && sed -n '/^flags/{s/\<avx\>//;t;q1}' /proc/cpuinfo; then
		javx='avx'
	else
		javx=''
	fi

	mkdir -p test/bin
	cp -r jlibrary/addons test/bin
	cp -r jlibrary/system test/bin
	cp -r jlibrary/tools test/bin
	cp -r "bin/${_jpl}/${_jsz}${javx}" test/bin
	cp jlibrary/bin/profile.ijs "test/bin/${_jsz}${javx}"

	echo 'RECHO ddall' | "test/bin/${_jsz}${javx}/jconsole" test/tsu.ijs
}

##
# Script to detect AVX/AVX2 support and launch appropriate jconsole binary
_jconsole_wrapper_script() {
cat <<JC
#!/usr/bin/env sh

cpu_has_avx() { sed -n '/^flags/{s/\<avx\>//;t;q1}' /proc/cpuinfo; }
cpu_has_avx2() { sed -n '/^flags/{s/\<avx2\>//;t;q1}' /proc/cpuinfo; }

if [ -d "${_jlib}/j64avx2" ] && cpu_has_avx2; then
	javx='avx2'
elif [ -d "${_jlib}/j64avx" ] && cpu_has_avx; then
	javx='avx'
elif [ -d "${_jlib}/j64" ]; then
	javx=''
else
	>&2 echo "\${0}: Cannot find jconsole executable"
	exit 1
fi

exec ${_jlib}/${_jsz}\${javx}/jconsole -jprofile "${_jetc}/profile.ijs" "\${@}"
JC
}

do_install() {
	vmkdir "${_jlib}" 0755
	vcopy "bin/${_jpl}/*" "${_jlib}"
	vcopy jlibrary/system "${_jlib}"
	vcopy jlibrary/tools "${_jlib}"
	vcopy jlibrary/addons "${_jlib}"

	vmkdir "${_jetc}" 0755
	vinstall "${FILESDIR}/profilex_template.ijs" 644 "${_jetc}"
	vinstall "jlibrary/bin/profile.ijs.new" 644 "${_jetc}" profile.ijs

	_jconsole_wrapper_script >bin/jc.sh
	vbin "bin/jc.sh" jc

	rm -rf ${DESTDIR}/usr/lib/j/tools
}
