Compare commits

..
1 Commits
Author SHA1 Message Date
cat 62e57ed98b mrustc: init
This contains some extraordinarily ugly hacks for a set of even uglier
Makefiles.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-19 06:36:03 +09:00
6 changed files with 38 additions and 2222 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
From 157772049aa7da13533026292cb4f67c1e8bf542 Mon Sep 17 00:00:00 2001 From 157772049aa7da13533026292cb4f67c1e8bf542 Mon Sep 17 00:00:00 2001
From: nobody <nobody@localhost> From: nobody <nobody@localhost>
Date: Sun, 19 Jul 2026 06:21:49 +0900 Date: Sun, 19 Jul 2026 06:21:49 +0900
Subject: [PATCH 1/3] do not download rustc Subject: [PATCH 1/2] do not download rustc
The $(RUSTC_SRC_DL) file already exists, but for some reason Make wants The $(RUSTC_SRC_DL) file already exists, but for some reason Make wants
to rebuild this target when it has $(RUSTC_SRC_TARBALL) as a dependency. to rebuild this target when it has $(RUSTC_SRC_TARBALL) as a dependency.
@@ -1,7 +1,7 @@
From 6e66feb3b6ae698c3d29211847c71c00f87fbf78 Mon Sep 17 00:00:00 2001 From 6e66feb3b6ae698c3d29211847c71c00f87fbf78 Mon Sep 17 00:00:00 2001
From: nobody <nobody@localhost> From: nobody <nobody@localhost>
Date: Sun, 19 Jul 2026 06:23:12 +0900 Date: Sun, 19 Jul 2026 06:23:12 +0900
Subject: [PATCH 2/3] Revert "HIR Typecheck - Optimise by doing multiple checks Subject: [PATCH 2/2] Revert "HIR Typecheck - Optimise by doing multiple checks
per pass" per pass"
This reverts commit 99d9bd0c788b0c72fc2f4fee6187a462ceb059f2. This reverts commit 99d9bd0c788b0c72fc2f4fee6187a462ceb059f2.
File diff suppressed because it is too large Load Diff
-54
View File
@@ -1,54 +0,0 @@
diff --git a/run_rustc/Makefile b/run_rustc/Makefile
index e78d8c51..cc9f785e 100644
--- a/run_rustc/Makefile
+++ b/run_rustc/Makefile
@@ -150,14 +150,23 @@ $(CARGO_HOME)config: Makefile
$Vecho "[source.vendored-sources]" >> $@
$Vecho "directory = \"$(abspath $(VENDOR_DIR))\"" >> $@
+self-contained:
+ mkdir -p $@
+ (set -o braceexpand && ln -s \
+ /system/lib/{'rcrt1.o','crti.o','crtn.o'} \
+ /system/lib/gcc/"$(ROSA_TRIPLE)"/"$(shell gcc -dumpfullversion)"/{'crtbeginS.o','crtendS.o'} \
+ /system/lib/"$(ROSA_TRIPLE)"/* \
+ $@)
+
# -------------------------------------
# Stage 1: Build standard library (using minicargo with rustc)
# - Can't use `cargo` because there isn't a rustc-compatible std yet
# - _could_ use it if mrustc accepted all the arguments rustc does (via the proxy)
# -------------------------------------
-$(LIBDIR_S)libstd.rlib: $(BINDIR_S)rustc $(MINICARGO) Makefile
+$(LIBDIR_S)libstd.rlib: self-contained $(BINDIR_S)rustc $(MINICARGO) Makefile
@echo "[MINICARGO] $(RUST_SRC_LIBS)std > $(LIBDIR_S)"
- mkdir -p $(LIBDIR_S)
+ @mkdir -p $(LIBDIR_S)
+ @ln -sf ../../../../../../self-contained $(LIBDIR_S)
ifneq ($(TARGETVER_LEAST_1_74),)
$V+STD_ENV_ARCH=$(RUSTC_ARCH) MRUSTC_PATH=$(abspath $(BINDIR_S)rustc) $(MINICARGO) --vendor-dir $(VENDOR_DIR) --script-overrides ../script-overrides/stable-$(RUSTC_VERSION)-$(PLATFORM)/ --output-dir $(LIBDIR_S) $(RUST_SRC_LIBS)sysroot
else
@@ -178,6 +187,7 @@ CARGO_OUTDIR_STAGE2_STD := $(OUTDIR)build-std2/$(RUSTC_TARGET)/release/
CARGO_ENV_STAGE2_STD := CARGO_TARGET_DIR=$(OUTDIR)build-std2 RUSTC=$(abspath rustc_proxy.sh) PROXY_RUSTC=$(abspath $(BINDIR_2)rustc) PROXY_MRUSTC=$(abspath $(BINDIR_S)rustc) $(CARGO_ENV)
$(LIBDIR_2)libtest.rlib: $(LIBDIR_S)libstd.rlib $(BINDIR_2)rustc $(BINDIR_S)rustc $(BINDIR_S)cargo $(CARGO_HOME)config Makefile
@mkdir -p $(LIBDIR_2)
+ @ln -sf ../../../../../../self-contained $(LIBDIR_2)
@echo [CARGO] $(RUST_SRC_LIBS)test/Cargo.toml '>' $(OUTDIR)build-std2
ifneq ($(TARGETVER_LEAST_1_74),)
$V$(CARGO_ENV_STAGE2_STD) $(BINDIR_S)cargo build $(CARGO_FLAGS) --manifest-path $(RUST_SRC_LIBS)sysroot/Cargo.toml --features panic-unwind
@@ -215,6 +225,7 @@ else
@echo "[CP] libraries and results ($@)"
endif
@mkdir -p $(LIBDIR)
+ @ln -sf ../../../../../../self-contained $(LIBDIR)
$Vcp $(LIBDIR_2)*.$(DYLIB_EXT) $(PREFIX)lib
$Vcp $(CARGO_OUTDIR_RUSTC)deps/*.rlib $(LIBDIR)
$Vcp $(CARGO_OUTDIR_RUSTC)deps/*.$(DYLIB_EXT) $(LIBDIR)
@@ -243,6 +254,7 @@ CARGO_OUTDIR_STAGE3_STD := $(OUTDIR)build-std/$(RUSTC_TARGET)/release/
CARGO_ENV_STAGE3_STD := CARGO_TARGET_DIR=$(OUTDIR)build-std RUSTC=$(abspath rustc_proxy.sh) PROXY_RUSTC=$(abspath $(BINDIR)rustc) PROXY_MRUSTC=$(abspath $(BINDIR_2)rustc) $(CARGO_ENV)
$(LIBDIR)libstd.rlib: $(BINDIR)rustc
@mkdir -p $(LIBDIR)
+ @ln -sf ../../../../../../self-contained $(LIBDIR)
@echo [CARGO] $(RUST_SRC_LIBS)test/Cargo.toml '>' $(OUTDIR)build-std2
ifneq ($(TARGETVER_LEAST_1_74),)
$V$(CARGO_ENV_STAGE3_STD) $(BINDIR_S)cargo build $(CARGO_FLAGS) --manifest-path $(RUST_SRC_LIBS)sysroot/Cargo.toml --features panic-unwind
+36 -178
View File
@@ -1,54 +1,5 @@
package mrustc-source {
description = "patched mrustc source tree";
exclude = true;
version# = "0.12.0";
output = remoteGitHub {
suffix = "thepowersgang/mrustc";
tag = "v"+version;
checksum = "Db25OAKL_1yZIF6MlXOTHhrEJ-Pd-i-accVtt5rJollmpKm6B3bgS0xN7hoC1cVu";
};
chmod = true;
patches = [
"0001-do-not-download-rustc.patch",
"0002-Revert-HIR-Typecheck-Optimise-by-doing-multiple-chec.patch",
"0003-rustc-src-enable-rustix-use-libc-feature-revert-port.patch",
"remove-git-invocations.patch",
];
}
package mrustc {
description = "alternative rust compiler (re-implementation)";
website = "https://github.com/thepowersgang/mrustc";
anitya = 391250;
source = mrustc-source;
enterSource = true;
writable = true;
minimal = true;
exec = make {
inPlace = true;
skipConfigure = true;
make = [ "CXX='g++ -w'" ];
// test suite runs during rustc-bootstrap
skipCheck = true;
install = "install -vD bin/mrustc /work/system/bin/mrustc";
};
inputs = [
bash,
// mrustc requires buggy gcc behaviour
gcc,
];
runtime = [ gcc ];
}
package rustc-bootstrap-source { package rustc-bootstrap-source {
description = "unpatched bootstrap rust toolchain source tree"; description = "rustc source tree used by mrustc";
exclude = true; exclude = true;
version# = "1.90.0"; version# = "1.90.0";
@@ -60,164 +11,71 @@ package rustc-bootstrap-source {
chmod = true; chmod = true;
} }
package rustc-bootstrap-llvm { package mrustc {
description = "bootstrap rustc-standalone LLVM build"; description = "alternative rust compiler (re-implementation)";
exclude = true; website = "https://github.com/thepowersgang/mrustc";
anitya = 391250;
source = rustc-bootstrap-source; version# = "0.12.0";
exec = cmake { source = remoteGitHub {
append = [ "src", "llvm-project", "llvm" ]; suffix = "thepowersgang/mrustc";
tag = "v"+version;
// Reference $(RUSTCSRC)src/bootstrap/native.rs for these values checksum = "Db25OAKL_1yZIF6MlXOTHhrEJ-Pd-i-accVtt5rJollmpKm6B3bgS0xN7hoC1cVu";
cache = {
"CMAKE_C_COMPILER": "gcc";
"CMAKE_C_FLAGS": "-w";
"CMAKE_CXX_COMPILER": "g++";
"CMAKE_CXX_FLAGS": "-w";
"LLVM_LINK_LLVM_DYLIB": "OFF";
"LLVM_TARGETS_TO_BUILD": "'X86;ARM;AArch64'";
"LLVM_ENABLE_ASSERTIONS": "OFF";
"LLVM_INCLUDE_EXAMPLES": "OFF";
"LLVM_INCLUDE_TESTS": "OFF";
"LLVM_INCLUDE_DOCS": "OFF";
"LLVM_INCLUDE_BENCHMARKS": "OFF";
"LLVM_ENABLE_ZLIB": "OFF";
"LLVM_ENABLE_TERMINFO": "OFF";
"LLVM_ENABLE_LIBEDIT": "OFF";
"WITH_POLLY": "OFF";
"LIBUNWIND_ENABLE_SHARED": "OFF";
};
skipTest = true;
}; };
patches = [
inputs = [ "0001-do-not-download-rustc.patch",
python-early, "0002-Revert-HIR-Typecheck-Optimise-by-doing-multiple-chec.patch",
gcc,
kernel-headers,
]; ];
} extra = [ rustc-bootstrap-source ];
package rustc-mrustc {
description = "initial rustc stage compiled by mrustc";
exclude = true;
source = rustc-bootstrap-source;
extra = [
mrustc-source,
rustc-bootstrap-llvm,
];
writable = true;
early = "cd ../extra/mrustc-source";
minimal = true; minimal = true;
enterSource = true;
writable = true;
chmod = true;
exec = make { exec = make {
inPlace = true; inPlace = true;
skipConfigure = true; skipConfigure = true;
preMake = ` preMake = `
LLVM='../rustc-bootstrap-llvm/system/bin/llvm-config' ln -sf gcc /system/bin/cc
RUSTC_SOURCE='../../rustc-mrustc' ln -sf g++ /system/bin/c++
export CC=gcc CXX=g++
export PARLEVEL=`+jobsE+` export PARLEVEL=`+jobsE+`
export RUSTC_TARGET="$(uname -m)-unknown-linux-musl" export RUSTC_SOURCE='../extra/rustc-bootstrap-source'
export RUSTC_VERSION="$(cut -d ' ' -f 1 "$RUSTC_SOURCE/version")" export RUSTC_VERSION="$(cut -d ' ' -f 1 "$RUSTC_SOURCE/version")"
export MRUSTC_TARGET_VER="$(cut -d '.' -f 1,2 <<< "$RUSTC_VERSION")" export MRUSTC_TARGET_VER="$(cut -d '.' -f 1,2 <<< "$RUSTC_VERSION")"
export OUTDIR_SUF="-$RUSTC_VERSION" export OUTDIR_SUF="-$RUSTC_VERSION"
patch -d "$RUSTC_SOURCE" -p0 < "rustc-$RUSTC_VERSION-src.patch" patch -d "$RUSTC_SOURCE" -p0 < "rustc-$RUSTC_VERSION-src.patch"
touch "$RUSTC_SOURCE/dl-version" touch "$RUSTC_SOURCE/dl-version"
ln -s "$RUSTC_SOURCE" "rustc-$RUSTC_VERSION-src" ln -s "$RUSTC_SOURCE" "rustc-$RUSTC_VERSION-src"
mkdir bin && ln -s /system/bin/mrustc bin/
ln -sf gcc /system/bin/cc sed -i 's/\$(shell git show --pretty=%H -s --no-show-signature)/unknown/' Makefile
ln -sf g++ /system/bin/c++ sed -i 's/\$(shell git show -s --pretty=%h --no-show-signature)/unknown/' Makefile
sed -i 's/\$(shell git symbolic-ref -q --short HEAD || git describe --tags --exact-match)/v`+version+`/' Makefile
sed -i 's/\$(shell git diff-index --quiet HEAD; echo $$?)/0/' Makefile
sed -i 's/\$(shell env LC_TIME=C date -u +"%a, %e %b %Y %T +0000")/Thu, 1 Jan 1970 00:00:00 +0000/' Makefile
`; `;
make = [ preCheck = `
"-f", make -f minicargo.mk LIBS
"minicargo.mk", make local_tests
"CXX='g++ -w'", `;
`LLVM_CONFIG="$LLVM"`, check = [ "test" ];
"LIBS",
];
check = [
"CXX='g++ -w'",
// run this first to avoid intermittent failures
"local_tests",
];
install = ` install = `
make \ LLVM="$(which llvm-config)"
`+jobsFlagE+` \
`+loadFlagE+` \
CXX='g++ -w' \
test
OUTDIR="output-$RUSTC_VERSION" OUTDIR="output-$RUSTC_VERSION"
make -f minicargo.mk LLVM_CONFIG="$LLVM" "$OUTDIR/rustc" make -f minicargo.mk LLVM_CONFIG="$LLVM" "$OUTDIR/rustc"
make -f minicargo.mk LLVM_CONFIG="$LLVM" "$OUTDIR/cargo" make -f minicargo.mk LLVM_CONFIG="$LLVM" "$OUTDIR/cargo"
mkdir -p /work/system/bin/ make -C LLVM_CONFIG="$LLVM" run_rustc
(set -o braceexpand && cp "$OUTDIR"/{rustc,cargo} bin/minicargo /work/system/bin/)
`; `;
}; };
inputs = [ inputs = [
bash, bash,
perl,
patch, patch,
mrustc,
llvm, llvm,
];
runtime = [ gcc, llvm, mrustc ]; // mrustc requires buggy gcc behaviour
} gcc,
package rustc-bootstrap {
description = "early rustc bootstrapped by rustc-mrustc";
exclude = true;
source = rustc-bootstrap-source;
extra = [ mrustc-source ];
files = {
"b00-link-self-contained.patch";
};
writable = true;
early = "cd ../extra/mrustc-source";
minimal = true;
exec = make {
inPlace = true;
skipConfigure = true;
preMake = `
RUSTC_SOURCE='../../rustc-bootstrap'
export RUSTC_TARGET="$(uname -m)-unknown-linux-musl"
export RUSTC_VERSION="$(cut -d ' ' -f 1 "$RUSTC_SOURCE/version")"
patch -d "$RUSTC_SOURCE" -p0 < "rustc-$RUSTC_VERSION-src.patch"
cat /usr/src/*.patch | patch -p1
ln -s "$RUSTC_SOURCE" "rustc-$RUSTC_VERSION-src"
mkdir bin "output-$RUSTC_VERSION"
(set -o braceexpand && \
ln -s /system/bin/{mrustc,minicargo} bin/ && \
ln -s /system/bin/{rustc,cargo} "output-$RUSTC_VERSION")
ln -sf gcc /system/bin/cc
ln -sf g++ /system/bin/c++
`;
make = [
"-C", "run_rustc",
"CC=gcc",
"PARLEVEL="+jobsE,
];
};
inputs = [
bash,
patch,
rustc-mrustc,
]; ];
} }
-13
View File
@@ -1,13 +0,0 @@
diff --git a/Makefile b/Makefile
index bb8e64a4..6bc951a7 100644
--- a/Makefile
+++ b/Makefile
@@ -188,7 +188,7 @@ $(OBJDIR)%.o: src/%.cpp
$(OBJDIR)version.o: $(OBJDIR)%.o: src/%.cpp $(filter-out $(OBJDIR)version.o,$(OBJ)) Makefile
@+mkdir -p $(dir $@)
@echo [CXX] -o $@
- $V$(CXX) -o $@ -c $< $(CXXFLAGS) $(CPPFLAGS) -MMD -MP -MF $@.dep -D VERSION_GIT_FULLHASH=\"$(shell git show --pretty=%H -s --no-show-signature)\" -D VERSION_GIT_BRANCH="\"$(shell git symbolic-ref -q --short HEAD || git describe --tags --exact-match)\"" -D VERSION_GIT_SHORTHASH=\"$(shell git show -s --pretty=%h --no-show-signature)\" -D VERSION_BUILDTIME="\"$(shell env LC_TIME=C date -u +"%a, %e %b %Y %T +0000")\"" -D VERSION_GIT_ISDIRTY=$(shell git diff-index --quiet HEAD; echo $$?)
+ $V$(CXX) -o $@ -c $< $(CXXFLAGS) $(CPPFLAGS) -MMD -MP -MF $@.dep -D VERSION_GIT_FULLHASH=\"unknown\" -D VERSION_GIT_BRANCH="\"v0.12.0\"" -D VERSION_GIT_SHORTHASH=\"unknown\" -D VERSION_BUILDTIME="\"Nya, 0 Jan -1 25:71:99 +2928\"" -D VERSION_GIT_ISDIRTY=0
src/main.cpp: $(PCHS:%=src/%.gch)