Files
guru/sci-electronics/circt/circt-1.140.0.ebuild
Huang Rui 3e12000d97 sci-electronics/circt: fix test failure when Z3 unavailable
The circt-synth mig.mlir integration test was missing the libz3 and
circt-lec-jit REQUIRES guards that every sibling LEC test carries, so it
ran its circt-lec JIT commands and failed on unresolved Z3 symbols
instead of being skipped. Patch it to add the guards.

Closes: https://bugs.gentoo.org/977874
Signed-off-by: Huang Rui <vowstar@gmail.com>
2026-07-02 19:44:54 -07:00

145 lines
4.0 KiB
Bash

# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI="8"
MY_PV="${PV//./\/}"
MY_LLVM_PV="b7c1a6f8b447fba6fff47d309eb7ba1bc22e8c53"
CMAKE_BUILD_TYPE="Release"
PYTHON_COMPAT=( python3_{12..14} )
inherit cmake python-r1
DESCRIPTION="The fast free Verilog/SystemVerilog simulator"
HOMEPAGE="
https://circt.llvm.org
https://github.com/llvm/circt
"
if [[ "${PV}" == "9999" ]] ; then
inherit git-r3
EGIT_REPO_URI="https://github.com/llvm/${PN}.git"
S_CIRCT="${EGIT_CHECKOUT_DIR}"
S_LLVM="${S_CIRCT}/llvm"
S="${S_LLVM}/llvm"
else
SRC_URI="
https://github.com/llvm/circt/archive/refs/tags/firtool-${PV}.tar.gz -> ${P}.tar.gz
https://github.com/llvm/llvm-project/archive/${MY_LLVM_PV}.tar.gz -> llvm-project-${MY_LLVM_PV}.tar.gz
"
KEYWORDS="~amd64 ~arm64 ~riscv ~x86"
S_CIRCT="${WORKDIR}/${PN}-firtool-${PV}"
S_LLVM="${WORKDIR}/llvm-project-${MY_LLVM_PV}"
S="${S_LLVM}/llvm"
fi
LICENSE="Apache-2.0-with-LLVM-exceptions UoI-NCSA BSD public-domain rc"
SLOT="0"
IUSE="test"
REQUIRED_USE=" ${PYTHON_REQUIRED_USE} "
RESTRICT="!test? ( test )"
RDEPEND="
${PYTHON_DEPS}
test? (
dev-python/psutil[${PYTHON_USEDEP}]
sci-electronics/verilator
)
app-arch/zstd:=
sys-libs/ncurses:0=
"
DEPEND="
${RDEPEND}
"
BDEPEND="
virtual/pkgconfig
"
DOCS=(
"${S_LLVM}/llvm/llvm-LICENSE.TXT"
"${S_LLVM}/mlir/mlir-LICENSE.TXT"
"${S_CIRCT}/circt-LICENSE"
)
src_prepare() {
# mig.mlir lacks the libz3/circt-lec-jit REQUIRES guards its sibling
# circt-synth LEC tests carry, so it runs and fails when Z3 is
# unavailable instead of being skipped. See
# https://bugs.gentoo.org/977874
pushd "${S_CIRCT}" > /dev/null || die
eapply "${FILESDIR}"/${PN}-1.140.0-mig-require-libz3.patch
popd > /dev/null || die
cmake_src_prepare
}
src_configure() {
python_setup
local mycmakeargs=(
-D Python3_EXECUTABLE="${PYTHON}"
-D CMAKE_INSTALL_PREFIX=/usr
-D CMAKE_SKIP_RPATH=ON
-D LLVM_ENABLE_PROJECTS=mlir
-D BUILD_SHARED_LIBS=OFF
-D LLVM_STATIC_LINK_CXX_STDLIB=ON
-D LLVM_ENABLE_ASSERTIONS=ON
# Link zstd deterministically rather than letting cmake autodetect
# it, so the app-arch/zstd RDEPEND always matches. See
# https://bugs.gentoo.org/977877
-D LLVM_ENABLE_ZSTD=FORCE_ON
-D LLVM_BUILD_EXAMPLES=OFF
-D LLVM_ENABLE_BINDINGS=OFF
-D LLVM_ENABLE_OCAMLDOC=OFF
-D LLVM_OPTIMIZED_TABLEGEN=OFF
-D LLVM_EXTERNAL_PROJECTS=circt
-D LLVM_EXTERNAL_CIRCT_SOURCE_DIR="${S_CIRCT}"
-D LLVM_BUILD_TOOLS=ON
)
cmake_src_configure
}
src_test() {
# Only exercise CIRCT's own suites. check-mlir runs upstream MLIR
# mlir-runner JIT tests that dlopen the MLIR runtime shared libraries,
# which our static CMAKE_SKIP_RPATH build does not expose, and which are
# out of scope for packaging CIRCT. See https://bugs.gentoo.org/977441
pushd "${BUILD_DIR}" || die
eninja check-circt
eninja check-circt-integration
popd || die
}
src_install() {
mv "${S_LLVM}/llvm/LICENSE.TXT" "${S_LLVM}/llvm/llvm-LICENSE.TXT" || die
mv "${S_LLVM}/mlir/LICENSE.TXT" "${S_LLVM}/mlir/mlir-LICENSE.TXT" || die
mv "${S_CIRCT}/LICENSE" "${S_CIRCT}/circt-LICENSE" || die
einstalldocs
# Several tools are only built when their optional frontend is present:
# circt-verilog and circt-verilog-lsp-server need the slang
# SystemVerilog parser, circt-bmc and circt-lec need Z3. When those are
# unavailable the upstream build simply omits the binaries, so install
# whatever got built instead of aborting. See
# https://bugs.gentoo.org/977442
local tool
local tools=(
arcilator circt-as circt-bmc circt-cocotb-driver.py circt-dis
circt-lec circt-lsp-server circt-opt circt-reduce circt-rtl-sim.py
circt-synth circt-test circt-translate circt-verilog
circt-verilog-lsp-server domaintool firld firtool handshake-runner
hlstool kanagawatool om-linker py-split-input-file.py
)
exeinto /usr/bin
for tool in "${tools[@]}"; do
if [[ -e "${BUILD_DIR}/bin/${tool}" ]]; then
doexe "${BUILD_DIR}/bin/${tool}"
else
ewarn "Skipping ${tool}, not built (optional frontend unavailable)"
fi
done
[[ -e "${ED}/usr/bin/firtool" ]] || die "firtool was not built"
}