# Copyright 2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

RUST_MIN_VER="1.95.0"

inherit cargo desktop git-r3 toolchain-funcs xdg

DESCRIPTION="Modern Emacs fork rewriting Emacs internals in Rust"
HOMEPAGE="https://github.com/eval-exec/neomacs"
EGIT_REPO_URI="https://github.com/eval-exec/neomacs.git"

LICENSE="GPL-3+ FDL-1.3+ CC-BY-SA-3.0 CC-BY-SA-4.0 CC-BY-4.0 HPND PCRE PSF-2 unicode W3C"
# Dependent crate licenses
LICENSE+="
	Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD-2 BSD Boost-1.0
	CC0-1.0 CDLA-Permissive-2.0 ISC LGPL-3 MIT MPL-2.0 UoI-NCSA
	Unicode-3.0 Unicode-DFS-2016 ZLIB
"
SLOT="0"
IUSE="+jit +terminal +video"

RESTRICT="test"

DEPEND="
	dev-libs/wayland
	media-libs/fontconfig
	media-libs/mesa
	dev-db/sqlite:3
	media-libs/vulkan-loader[X,wayland]
	sys-libs/ncurses:=
	x11-libs/libX11
	x11-libs/libXcursor
	x11-libs/libXfixes
	x11-libs/libXi
	x11-libs/libXrandr
	x11-libs/libXrender
	x11-libs/libxcb
	x11-libs/libxkbcommon[X]
	video? (
		media-libs/gstreamer:1.0
		media-libs/gst-plugins-base:1.0
	)
"
RDEPEND="${DEPEND}"
BDEPEND="virtual/pkgconfig"

DOCS=( BUGS CONTRIBUTE README.md )

src_unpack() {
	git-r3_src_unpack
	cargo_live_src_unpack
}

src_prepare() {
	default

	# Prefer Gentoo's system sqlite over rusqlite/libsqlite3-sys' bundled copy.
	sed -i -e 's/"bundled"//' Cargo.toml || die
}

src_configure() {
	local myfeatures=(
		$(usev jit)
		$(usev terminal neo-term)
		$(usev video)
	)
	cargo_src_configure --no-default-features
}

src_compile() {
	# Upstream's build script probes ncurses for the library target, but the
	# final binary also needs the full ncursesw linker set for termcap symbols.
	local ncurses_libs ncurses_link
	ncurses_libs=$("$(tc-getPKG_CONFIG)" --libs ncursesw) || die "failed to query ncursesw libs"
	for ncurses_link in ${ncurses_libs}; do
		RUSTFLAGS+=" -C link-arg=${ncurses_link}"
	done

	cargo_src_compile -p ${PN}

	cargo_env cargo xtask \
		fresh-build \
		--release \
		--skip-build \
		--bin-dir "$(cargo_target_dir)" \
		--runtime-root "${S}" || die
}

src_install() {
	local target_dir=$(cargo_target_dir)

	exeinto /usr/libexec/${PN}
	doexe "${target_dir}"/${PN}

	insinto /usr/libexec/${PN}
	doins "${target_dir}"/${PN}.pdump

	dodir /usr/bin
	cat > "${ED}"/usr/bin/${PN} <<-EOF || die
		#!/bin/sh
		export NEOMACS_RUNTIME_ROOT="\${NEOMACS_RUNTIME_ROOT:-${EPREFIX}/usr/share/${PN}}"
		exec "${EPREFIX}/usr/libexec/${PN}/${PN}" "\$@"
	EOF
	fperms 0755 /usr/bin/${PN}

	insinto /usr/share/${PN}
	doins -r etc lisp

	newicon -s 128 assets/logo-128.png ${PN}.png
	newicon -s scalable assets/window-icon.svg ${PN}.svg
	make_desktop_entry \
		--eapi9 \
		-n "Neomacs" \
		-i ${PN} \
		-c "Development;TextEditor" \
		-e "MimeType=text/plain;text/x-c;text/x-c++;text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;text/x-makefile;text/x-python;text/x-rust;application/x-shellscript;" \
		-e "StartupWMClass=Neomacs" \
		${PN}

	einstalldocs
	dodoc -r docs
}

pkg_postinst() {
	xdg_pkg_postinst
	elog "Neomacs is alpha software; live builds may change or break at any time."
	if use video; then
		elog "Install GStreamer plugin packages as needed for the media formats you want to play."
	fi
}

pkg_postrm() {
	xdg_pkg_postrm
}