# Maintainer: Celeste <cielesti@protonmail.com>
maintainer="Celeste <cielesti@protonmail.com>"
_pkgname=erlang
pkgver=27.3.4.1
pkgrel=0
_pkgver=${pkgver/_rc/-rc}
_majorver=${pkgver%%.*}
_prevmajorver=$((_majorver - 1))
pkgname=$_pkgname$_majorver
pkgdesc="General-purpose programming language and runtime environment, version $_majorver"
url="https://www.erlang.org/"
license="Apache-2.0"
arch="all"
makedepends="
	autoconf
	font-terminus
	glu-dev
	linux-headers
	ncurses-dev
	openssl-dev
	perl
	perl-dev
	unixodbc-dev
	wxwidgets-dev
	xauth
	zlib-dev
	"
subpackages="
	$pkgname-dev
	$pkgname-doc
	$pkgname-debugger:_mv_erlang_lib
	$pkgname-dialyzer:_mv_erlang_lib
	$pkgname-et:_mv_erlang_lib
	$pkgname-megaco:_mv_erlang_lib
	$pkgname-observer:_mv_erlang_lib
	$pkgname-odbc:_mv_erlang_lib
	$pkgname-reltool:_mv_erlang_lib
	$pkgname-wx:_mv_erlang_lib
	"
source="https://github.com/erlang/otp/releases/download/OTP-$_pkgver/otp_src_$_pkgver.tar.gz"

builddir="$srcdir/otp_src_$_pkgver"

# Whether this package provides "erlang" without the version suffix.
_default_erlang="no"

if [ "$_default_erlang" = yes ]; then
	provides="erlang=$pkgver-r$pkgrel"
	replaces="erlang"
elif [ "$_pkgver" = "$pkgver" ]; then
	# allow using non-rc versions as erlang if installed explicitly
	provides="erlang"
fi

# explicit override for previous version as well
replaces="$replaces erlang$_prevmajorver"

# Disable Java support (jinterface) on architectures that lack OpenJDK 8
case "$CARCH" in
	riscv64)
		;;
	*)
		makedepends="$makedepends openjdk8"
		[ "$CARCH" = "loongarch64" ] &&
			makedepends="$makedepends-loongarch"
		export PATH="/usr/lib/jvm/java-1.8-openjdk/bin:$PATH"
		;;
esac

build() {
	# it's a whole language runtime
	export CFLAGS="${CFLAGS//-Os/-O2} -D_BSD_SOURCE"
	export CXXFLAGS="${CXXFLAGS//-Os/-O2}"

	./configure \
		--prefix=/usr \
		--sysconfdir=/etc \
		--mandir=/usr/share/man \
		--infodir=/usr/share/info \
		--host="$CHOST" \
		--build="$CBUILD" \
		--enable-pie \
		--enable-threads \
		--enable-shared-zlib \
		--enable-ssl=dynamic-ssl-lib
	make
	make DOC_TARGETS="chunks man" docs
}

check() {
	ERL_TOP="$builddir" make release_tests
}

package() {
	make DESTDIR="$pkgdir" \
		DOC_TARGETS="chunks man" \
		install \
		install-docs
}

_mv_erlang_lib() {
	_default_provide

	depends="$pkgname=$pkgver-r$pkgrel"

	local lib=${subpkgname#"$pkgname-"}
	lib=${lib//-/_}
	case "$lib" in
		debugger)	depends="$pkgname-wx=$pkgver-r$pkgrel";;
		dialyzer)	depends="$pkgname-wx=$pkgver-r$pkgrel";;
		et)		depends="$pkgname-wx=$pkgver-r$pkgrel";;
		megaco)		depends="$pkgname-debugger=$pkgver-r$pkgrel $pkgname-et=$pkgver-r$pkgrel";;
		observer)	depends="$pkgname-et=$pkgver-r$pkgrel $pkgname-wx=$pkgver-r$pkgrel";;
		reltool)	depends="$pkgname-wx=$pkgver-r$pkgrel";;
		wx)		depends="$pkgname=$pkgver-r$pkgrel xauth font-terminus";;
	esac

	mkdir -p "$subpkgdir"/usr/lib/erlang/lib
	rm -f "$pkgdir"/usr/lib/erlang/lib/$lib-*/src/*.erl
	mv "$pkgdir"/usr/lib/erlang/lib/$lib-* "$subpkgdir"/usr/lib/erlang/lib/
}

dev() {
	if [ "$_pkgver" = "$pkgver" ]; then
		# allow using non-rc versions as erlang-dev if installed explicitly
		provides="erlang-dev"
	fi
	_default_provide

	set -x
	local i=''
	depends="$pkgname=$pkgver-r$pkgrel $depends_dev"
	pkgdesc="$pkgdesc (development files)"

	cd "$pkgdir"
	local libdirs=usr/
	[ -d lib/ ] && libdirs="lib/ $libdirs"
	for i in usr/include usr/lib/pkgconfig usr/share/aclocal\
			usr/share/gettext usr/bin/*-config		\
			usr/share/vala/vapi usr/share/gir-[0-9]*	\
			usr/share/qt*/mkspecs				\
			usr/lib/qt*/mkspecs				\
			usr/lib/cmake					\
			$(find . -name include -type d)			\
			$(find $libdirs -name '*.[acho]'		\
			-o -name '*.prl' 2>/dev/null); do

		if [ -e "$pkgdir/$i" ] || [ -L "$pkgdir/$i" ]; then
			d="$subpkgdir/${i%/*}"  # dirname $i
			mkdir -p "$d"
			mv "$pkgdir/$i" "$d"
			rmdir "$pkgdir/${i%/*}" 2>/dev/null || true
		fi
	done

	# move *.so links needed when linking the apps to -dev packages
	for i in lib/*.so usr/lib/*.so; do
		if [ -L "$i" ]; then
			mkdir -p "$subpkgdir"/"${i%/*}"
			mv "$i" "$subpkgdir/$i"
		fi
	done
}

doc() {
	default_doc
	_default_provide

	pkgdesc="$pkgdesc (documentation chunks and man pages)"

	amove \
		usr/lib/erlang/lib/*/doc \
		usr/lib/erlang/man
}

# helper script to manually check the dependencies of subpackages
verifydeps() {
	local _p
	for _p in $subpackages; do
		case $_p in
			*:*) _p=${_p%:*};;
			*) continue;;
		esac
		local _subdir="$pkgdir/../$_p"
		local _pkginfo="$pkgdir/../.control.$_p"/.PKGINFO
		msg "$_p"
		grep '^depend ='  $_pkginfo || true
		find "$_subdir" -name '*.app' | while read -r _f; do
			echo "  $_f"
			sed -n '/{runtime_dependencies/,/}/p' $_f
		done
	done
}

_default_provide() {
	if [ "$_default_erlang" = yes ]; then
		provides="erlang${subpkgname#"$pkgname"}=$pkgver-r$pkgrel"
		replaces="erlang${subpkgname#"$pkgname"} erlang${_prevmajorver}${subpkgname#"$pkgname"}"
	fi
}

sha512sums="
ed052e2439041d3a8d8e04b33ba41b42a5cc8c020a8fceea7f3b4314a780cf0c9bfca716a412ce92d1308b4f88bcb4ac69e2fe3fc784923a217cace833498007  otp_src_27.3.4.1.tar.gz
"
