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

EAPI=8

PYTHON_COMPAT=( python3_{12..14} )

inherit check-reqs cmake flag-o-matic python-any-r1

DESCRIPTION="Microsoft DirectX Shader Compiler which is based on LLVM/Clang"
HOMEPAGE="https://github.com/microsoft/DirectXShaderCompiler"
# Submodules pinned by the release tag.
DIRECTX_HEADERS_SHA="980971e835876dc0cde415e8f9bc646e64667bf7"
SPIRV_HEADERS_SHA="496543121ce6419f23d6fa5d7194ba66c36212d2"
SPIRV_TOOLS_SHA="ef96ed763b43b59b33b31b362f09a02b729fa1c9"
SRC_URI="https://github.com/microsoft/${PN}/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz
	https://github.com/microsoft/DirectX-Headers/archive/${DIRECTX_HEADERS_SHA}.tar.gz
		-> ${PN}-DirectX-Headers-${DIRECTX_HEADERS_SHA}.tar.gz
	https://github.com/KhronosGroup/SPIRV-Headers/archive/${SPIRV_HEADERS_SHA}.tar.gz
		-> ${PN}-SPIRV-Headers-${SPIRV_HEADERS_SHA}.tar.gz
	https://github.com/KhronosGroup/SPIRV-Tools/archive/${SPIRV_TOOLS_SHA}.tar.gz
		-> ${PN}-SPIRV-Tools-${SPIRV_TOOLS_SHA}.tar.gz"

LICENSE="Apache-2.0-with-LLVM-exceptions UoI-NCSA BSD public-domain rc"
SLOT="0"
KEYWORDS="~amd64"

RDEPEND="dev-libs/libffi:=
	virtual/zlib:="
DEPEND="${RDEPEND}"
BDEPEND="${PYTHON_DEPS}"

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

pkg_setup() {
	check-reqs_pkg_setup
	python-any-r1_pkg_setup
}

src_prepare() {
	local dir
	for dir in DirectX-Headers SPIRV-Headers SPIRV-Tools; do
		rmdir "external/${dir}" || die
	done
	mv "${WORKDIR}/DirectX-Headers-${DIRECTX_HEADERS_SHA}" external/DirectX-Headers || die
	mv "${WORKDIR}/SPIRV-Headers-${SPIRV_HEADERS_SHA}" external/SPIRV-Headers || die
	mv "${WORKDIR}/SPIRV-Tools-${SPIRV_TOOLS_SHA}" external/SPIRV-Tools || die
	cmake_src_prepare
}

src_configure() {
	# The LLVM 3.7 base punned types in ways GCC flags as breaking strict aliasing.
	append-flags -fno-strict-aliasing
	local mycmakeargs=(
		-C "${S}/cmake/caches/PredefinedParams.cmake"
		-DBUILD_SHARED_LIBS=OFF
		-DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/dxc"
		# Regenerated sources are run through the system clang-format, whose output differs from
		# the checked-in copies, and the build then fails comparing them. Use the release's copies.
		-DHLSL_DISABLE_SOURCE_GENERATION=ON
		# The tests need the googletest submodule.
		-DHLSL_INCLUDE_TESTS=OFF
		-DLLVM_BUILD_DOCS=OFF
		-DLLVM_BUILD_TOOLS=OFF
		-DLLVM_ENABLE_WERROR=OFF
		-DLLVM_INCLUDE_TESTS=OFF
		-DLLVM_VERSION_SUFFIX=dxc
		-DSPIRV_BUILD_TESTS=OFF
		-DSPIRV_WARN_EVERYTHING=OFF
		-DSPIRV_WERROR=OFF
		-Wno-dev
	)
	cmake_src_configure
}

src_install() {
	cmake_src_install
	# The static LLVM libraries and the CMake modules for building against them are not used by
	# dxc or libdxcompiler.so, and take up 1.6 GB.
	find "${ED}" -name '*.a' -delete || die
	rm -r "${ED}/usr/lib/llvm/dxc/share/llvm" || die
	newenvd - "99${PN}" <<-EOF
		LDPATH="${EPREFIX}/usr/lib/llvm/dxc/lib"
	EOF
	dosym -r /usr/lib/llvm/dxc/bin/dxc /usr/bin/dxc
}