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

EAPI=8
PYTHON_COMPAT=( python3_{10..14} )

inherit cmake python-any-r1 check-reqs linux-info

DESCRIPTION="Translation layer for running macOS software on Linux"
HOMEPAGE="https://www.darlinghq.org"

SRC_URI="
	https://github.com/darlinghq/darling/releases/download/v${PV}/darling-source.tar.gz
		-> darling-complete-source-${PV}.tar.gz
"

S="${WORKDIR}/darling"

LICENSE="GPL-3"
SLOT="0"
KEYWORDS="~amd64"
IUSE="cli cli-dev cli-extra gui gui-frameworks gui-stubs jsc webkit python ruby perl metal multilib +system"

REQUIRED_USE="
	cli-dev?		( cli python ruby perl )
	cli?			( system )
	cli-extra?		( cli )
	gui-frameworks?	( gui )
	gui-stubs?		( gui-frameworks )
	gui?			( system )
	webkit?			( jsc )
	python?			( system )
	ruby?			( system )
	perl?			( system )
	metal?			( gui )
"

DEPEND="
	x11-misc/xdg-user-dirs
	sys-fs/fuse:0
	dev-libs/icu:=
	dev-libs/libbsd
	dev-libs/libxml2:2
	llvm-core/llvm:=
	media-libs/freetype
	media-libs/libjpeg-turbo
	media-libs/fontconfig
	media-libs/tiff:=
	multilib? (
		media-libs/freetype[abi_x86_32]
		media-libs/libjpeg-turbo[abi_x86_32]
		media-libs/fontconfig[abi_x86_32]
		media-libs/tiff[abi_x86_32]
		sys-libs/glibc[multilib]
	)

	gui? (
		media-libs/mesa[X]
		virtual/opengl
		virtual/glu
		media-libs/libpng:=
		media-libs/giflib:=
		x11-libs/libX11
		x11-libs/libXext
		x11-libs/libXrandr
		x11-libs/libXcursor
		x11-libs/libxkbfile
		x11-libs/cairo
		media-libs/libpulse
		media-libs/vulkan-loader
	)
	gui? ( multilib? (
		media-libs/mesa[X,abi_x86_32]
		virtual/opengl[abi_x86_32]
		virtual/glu[abi_x86_32]
	) )

	sys-apps/dbus
	media-video/ffmpeg:=
"

BDEPEND="
	>=llvm-core/clang-11
	sys-devel/flex
	sys-devel/bison
	dev-build/cmake
	virtual/pkgconfig
	llvm-core/llvm:=
	${PYTHON_DEPS}
	gui? ( dev-util/vulkan-headers )
"

RDEPEND="${DEPEND}"

QA_SONAME="*"

pkg_pretend(){
	# https://unix.stackexchange.com/questions/131954/check-sse3-support-from-bash
	if ! grep -qE '^flags.* (sse3|pni)' /proc/cpuinfo; then
		eerror "darling requires a cpu with support of the sse3 instruction set"
		die "cpu doesn't support sse3 instruction set"
	fi

	if kernel_is -lt 5 0; then
		eerror "darling requires Linux kernel 5.0 or newer to be installed"
		die "darling requires Linux kernel 5.0 or newer"
	fi

	CHECKREQS_DISK_BUILD="16G"
	CHECKREQS_MEMORY="4G"

	check-reqs_pkg_pretend
}

pkg_setup(){
	# https://unix.stackexchange.com/questions/131954/check-sse3-support-from-bash
	if ! grep -qE '^flags.* (sse3|pni)' /proc/cpuinfo; then
		eerror "darling requires a cpu with support of the sse3 instruction set"
		die "cpu doesn't support sse3 instruction set"
	fi

	if kernel_is -lt 5 0; then
		eerror "darling requires Linux kernel 5.0 or newer to be installed"
		die "darling requires Linux kernel 5.0 or newer"
	fi

	CHECKREQS_DISK_BUILD="16G"
	CHECKREQS_MEMORY="4G"

	check-reqs_pkg_setup
	python-any-r1_pkg_setup
}

src_prepare() {
	default

	cd "${S}"

	# We need clang as we're building a Darwin system
	export CC=clang
	export CXX=clang++

	unset LDFLAGS
	export LDFLAGS=""

	cmake_src_prepare

}

src_configure() {
	export CC=clang
	export CXX=clang++

	unset LDFLAGS
	export LDFLAGS=""

	local components="core"

	use system			&& components+=",system"
	use python			&& components+=",python"
	use ruby			&& components+=",ruby"
	use perl			&& components+=",perl"
	use cli				&& components+=",cli"
	use cli-dev			&& components+=",cli_dev"
	use cli-extra		&& components+=",cli_extra"
	use gui				&& components+=",gui"
	use gui-frameworks	&& components+=",gui_frameworks"
	use gui-stubs		&& components+=",gui_stubs"
	use jsc				&& components+=",jsc"
	use webkit			&& components+=",webkit"

	local mycmakeargs=(
		"-DCMAKE_INSTALL_PREFIX=/usr"
		"-DCMAKE_POSITION_INDEPENDENT_CODE=ON"
		"-DDARLING_COMPONENTS=\"${components}\""
		"-DJSC_UNIFIED_BUILD=ON"
		"-DENABLE_METAL=$(usex metal ON OFF)"
		"-DTARGET_i386=$(usex multilib ON OFF)"
	)

	cmake_src_configure
}

src_compile() {
	cmake_src_compile
}

src_install() {
	cmake_src_install

	# Darlingserver requires these empty dirs to exist at runtime
	# to set up its container (procfs mount, tmp, var, etc.)
	keepdir /usr/libexec/darling/private/tmp
	keepdir /usr/libexec/darling/private/var
	keepdir /usr/libexec/darling/private/etc
	keepdir /usr/libexec/darling/proc
	keepdir /usr/libexec/darling/run
}