diff options
Diffstat (limited to 'dev-lang/mrustc/mrustc-0.11.2.ebuild')
| -rw-r--r-- | dev-lang/mrustc/mrustc-0.11.2.ebuild | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/dev-lang/mrustc/mrustc-0.11.2.ebuild b/dev-lang/mrustc/mrustc-0.11.2.ebuild new file mode 100644 index 000000000000..da872f594ddc --- /dev/null +++ b/dev-lang/mrustc/mrustc-0.11.2.ebuild @@ -0,0 +1,108 @@ +# Copyright 2024-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit edo multiprocessing rust-toolchain toolchain-funcs + +# The makefile needs to know the version of rust to build +RUST_VERSION=1.74.1 +# We need to pretend to be this version of Rust for mrustc build and outputs +MRUSTC_RUST_VER=1.74.0 + +DESCRIPTION="Mutabah's Rust Compiler" +HOMEPAGE="https://github.com/thepowersgang/mrustc" + +if [[ ${PV} == *"9999"* ]]; then + inherit git-r3 + EGIT_REPO_URI="https://github.com/thepowersgang/mrustc.git" +else + SRC_URI="https://github.com/thepowersgang/mrustc/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz + https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.xz + " + KEYWORDS="~amd64" +fi + +LICENSE="MIT" +SLOT="0" + +DEPEND="sys-libs/zlib" +# mrustc transpiles Rust to C, and currently the C code it generates doesn't currently work with clang +RDEPEND=" + ${DEPEND} + sys-devel/gcc:* +" +BDEPEND="sys-devel/gcc:*" + +PATCHES=( + "${FILESDIR}/${PN}-0.11.2-gcc15.patch" + "${FILESDIR}/${PN}-0.11.2-dont-strip-bins.patch" + "${FILESDIR}/${PN}-0.11.0-default-to-rust-1_74.patch" + "${FILESDIR}/${PN}-0.11.0-RUSTC_SRC_PROVIDED.patch" + "${FILESDIR}/${PN}-0.10.1-git-be-gone.patch" +) + +QA_FLAGS_IGNORED=" + usr/lib/rust/${P}/bin/mrustc + usr/lib/rust/${P}/bin/minicargo + usr/lib/rust/${P}/lib/rustlib/$(rust_abi)/lib/*.rlib +" + +pkg_setup() { + if [[ ${MERGE_TYPE} != binary ]] && ! tc-is-gcc; then + die "mrustc needs to be built using GCC." + fi +} + +src_configure() { + : +} + +src_compile() { + export PARLEVEL=$(makeopts_jobs) + export RUSTC_VERSION=${MRUSTC_RUST_VER} # Pretend that we're using upstream-supported Rust + export MRUSTC_TARGET_VER=${RUSTC_VERSION%.*} + export RUSTCSRC="${WORKDIR}/rustc-${RUST_VERSION}-src" + export RUSTC_SRC_PROVIDED=1 + export V='' # echo build commands in makefiles (minicargo still writes commands to file) + # build mrustc & minicargo then use them to build the standard library + # emake -f minicargo.mk will do everything including a full bootstrap + emake all + emake -C tools/minicargo/ + # It's not much, but it's enough to do a 'hello world' at least... and build dev-lang/rust! + emake -e -f minicargo.mk LIBS +} + +src_test() { + # The main makefile test targets just do this, cut out the middleman + emake -e -f minicargo.mk local_tests + # build and run 'hello world' (this is called using 'test' in the makefile, but we can do it manually) + edo "${S}"/bin/mrustc -L "${S}"/output-${MRUSTC_RUST_VER}/ \ + -g "${S}/../rustc-${RUST_VERSION}-src/tests/ui/hello_world/main.rs" -o "${T}"/hello + "${T}"/hello || die "Failed to run hello_world built with mrustc" +} + +src_install() { + # If we're installing into /usr/lib/rust we may as well be consistent + into /usr/lib/rust/${P} + dobin bin/mrustc + dobin bin/minicargo + local lib patch + local libs=( "${S}"/output-*/*.rlib* ) + insinto "/usr/lib/rust/${P}/lib/rustlib/$(rust_abi)/lib" + # If we ever want to support mrustc stdlib for multiple rusts we'll need to + # do something more clever here. + for lib in "${libs[@]}"; do + # We only want .rlib{,.hir,o} + if [[ ${lib} != *.c && ${lib} != *.d && ${lib} != *.txt ]]; then + doins "${lib}" + fi + done + # For convenience, install files required to build various rusts + insinto /usr/share/${P} + doins -r "${S}/script-overrides/" + insinto /usr/share/${P}/patches + for patch in "${S}"/rustc-*.patch "${S}"/rustc-*-overrides.toml; do + doins "${patch}" + done +} |
