# Copyright 2014-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit flag-o-matic readme.gentoo-r1 toolchain-funcs verify-sig

DESCRIPTION="A UNIX init scheme with service supervision"
HOMEPAGE="http://smarden.org/runit/"
SRC_URI="http://smarden.org/runit/${P}.tar.gz
	verify-sig? ( https://smarden.org/runit/sha256sum.asc -> ${P}.sha256sum.asc )"
S="${WORKDIR}/admin/${P}/src"
LICENSE="BSD"
SLOT="0/vanilla"
KEYWORDS="~amd64 ~x86"
IUSE="static verify-sig"

VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/gerritpape.asc
BDEPEND="verify-sig? ( sec-keys/openpgp-keys-gerritpape )"

# runtime dependencies in /etc/runit/{1,3}
RDEPEND="
	sys-apps/openrc
	sys-process/psmisc
"

PATCHES=( "${FILESDIR}"/bug721880-dont-hardcode-ar-ranlib.patch )

src_unpack() {
	if use verify-sig; then
		pushd "${DISTDIR}" || die
		verify-sig_verify_signed_checksums \
			"${P}".sha256sum.asc sha256 "${P}".tar.gz
		popd || die
	fi

	default
}

src_prepare() {
	default

	# No half measures: USE=static determines whether everything or nothing is built static.
	sed -i -e 's:-static: :' Makefile
}

src_configure() {
	use static && append-ldflags "-static"

	echo "$(tc-getCC) ${CFLAGS}"  > conf-cc
	echo "$(tc-getCC) ${LDFLAGS}" > conf-ld # [sic]
	tc-getAR     > conf-ar
	tc-getRANLIB > conf-ranlib
}

src_install() {
	cd "${S}/.." || die

	# Install documentation.
	DOCS=( package/{CHANGES,README,THANKS} )
	HTML_DOCS=( doc/*.html )
	einstalldocs
	doman man/*.[18]
	readme.gentoo_create_doc

	# Install OpenRC runit-init stages.
	stage_dir=/lib/runit/stages/openrc
	exeinto "${stage_dir}"
	dosym -r "${stage_dir}" /etc/runit/current
	for script in 1 2 3 ctrlaltdel; do
		doexe "${FILESDIR}/${script}"
		dosym "current/${script}" "/etc/runit/${script}"
	done

	# Install the example other-distro scripts as reference material.
	docinto examples
	dodoc -r etc/2 etc/*/
	# …and our own agetty one
	docinto examples/gentoo/agetty
	# this slightly awkward dance is to avoid using newdoc, which does the same worsely
	mkdir "${T}"/agetty
	for script in finish run; do
		cp "${FILESDIR}/${script}.agetty" "${T}/agetty/${script}"
		dodoc "${T}/agetty/${script}"
	done

	# Tell runit programs and shell completions where our services live.
	# The "standard" dir is /service, and every distro rightfully ignores it.
	dodir /etc/service
	newenvd - "99${PN}" <<- EOF
		# /etc/env.d/99${PN}
		SVDIR="/etc/service"
	EOF

	cd "${S}" || die

	# Install compiled binaries
	into /
	dobin chpst runsv runsvchdir runsvdir sv svlogd
	dosbin runit runit-init utmpset
}

pkg_postinst() {
	readme.gentoo_print_elog

	if [[ -n ${REPLACING_VERSIONS} ]] ; then
		ewarn "A pre-existing runit version was detected."
		ewarn "This package no longer installs agetty scripts to /etc/sv/"
		ewarn "You may want to verify your /etc/service setup is sane."
	fi
}

pkg_postrm() {
	if [[ -z ${REPLACED_BY_VERSION} ]] ; then
		ewarn "${P} was uninstalled. Make sure your system is still bootable!"
	fi
}