summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2026-02-05 17:37:46 +0900
committerNobuyoshi Nakada <nobu.nakada@gmail.com>2026-02-07 21:18:25 +0900
commitf33076be41394b1ac613b010aaff8c79f7e437f4 (patch)
tree1a8fa8ab898795fada2a085196be8ca38b148af4
parent51e65c210ed63e3ec8005ab6d5098210b59a158e (diff)
Clean rust target when rustc bumped up
Fix: ``` error[E0514]: found crate `jit` compiled by an incompatible version of rustc ```
-rw-r--r--defs/jit.mk17
-rw-r--r--yjit/yjit.mk4
-rw-r--r--zjit/zjit.mk4
3 files changed, 18 insertions, 7 deletions
diff --git a/defs/jit.mk b/defs/jit.mk
index 27b14e7a07..2c1e819684 100644
--- a/defs/jit.mk
+++ b/defs/jit.mk
@@ -22,7 +22,7 @@ RUST_LIB_TOUCH = touch $@
# ld: warning: object file (target/debug/libjit.a(<libcapstone object>)) was built for
# newer macOS version (15.2) than being linked (15.0)
# This limits us to an older set of macOS API in the rust code, but we don't use any.
-$(RUST_LIB): $(srcdir)/ruby.rs
+$(RUST_LIB): $(srcdir)/ruby.rs target/.rustc-version
$(Q)if [ '$(ZJIT_SUPPORT)' != no -a '$(YJIT_SUPPORT)' != no ]; then \
echo 'building YJIT and ZJIT ($(JIT_CARGO_SUPPORT:yes=release) mode)'; \
elif [ '$(ZJIT_SUPPORT)' != no ]; then \
@@ -37,7 +37,7 @@ $(RUST_LIB): $(srcdir)/ruby.rs
$(RUST_LIB_TOUCH)
else ifneq ($(strip $(RLIB_DIR)),) # combo build
-$(RUST_LIB): $(srcdir)/ruby.rs
+$(RUST_LIB): $(srcdir)/ruby.rs target/.rustc-version
$(ECHO) 'building $(@F)'
$(gnumake_recursive)$(Q) $(RUSTC) --edition=2024 \
$(RUSTC_FLAGS) \
@@ -54,7 +54,7 @@ $(RUST_LIB): $(srcdir)/ruby.rs
JIT_RLIB = $(TOP_BUILD_DIR)/$(RLIB_DIR)/libjit.rlib
$(YJIT_RLIB): $(JIT_RLIB)
$(ZJIT_RLIB): $(JIT_RLIB)
-$(JIT_RLIB):
+$(JIT_RLIB): target/.rustc-version
$(ECHO) 'building $(@F)'
$(gnumake_recursive)$(Q) $(RUSTC) --crate-name=jit \
--edition=2024 \
@@ -77,6 +77,17 @@ endif
rust-libobj: $(RUST_LIBOBJ)
rust-lib: $(RUST_LIB)
+rustc-version-check: target/.rustc-version
+
+target/.rustc-version: PHONY
+ $(eval prev_version := $(if $(wildcard $@),$(shell cat $@)))
+ $(eval curr_version := $(shell $(RUSTC) -V | cut -d' ' -f2))
+ $(eval clean := $(filter-out $(prev_version),$(curr_version)))
+ $(if $(clean),$(ECHO) Cleaning $(@D) for rustc $(curr_version))
+ $(if $(clean),$(Q)$(RMALL) $(@D))
+ $(if $(clean),$(Q)$(MAKEDIRS) $(@D))
+ $(if $(clean),$(Q)echo $(curr_version) > $@)
+
# For Darwin only: a list of symbols that we want the glommed Rust static lib to export.
# Unfortunately, using wildcard like '_rb_*' with -exported-symbol does not work, at least
# not on version 820.1. Assume llvm-nm, so XCode 8.0 (from 2016) or newer.
diff --git a/yjit/yjit.mk b/yjit/yjit.mk
index 21fd96514b..187ea758a2 100644
--- a/yjit/yjit.mk
+++ b/yjit/yjit.mk
@@ -16,14 +16,14 @@ BUILD_YJIT_LIBS = $(TOP_BUILD_DIR)/$(YJIT_LIBS)
# In a YJIT-only build (no ZJIT)
ifneq ($(strip $(YJIT_LIBS)),)
yjit-libs: $(BUILD_YJIT_LIBS)
-$(BUILD_YJIT_LIBS): $(YJIT_SRC_FILES)
+$(BUILD_YJIT_LIBS): $(YJIT_SRC_FILES) target/.rustc-version
$(ECHO) 'building Rust YJIT (release mode)'
$(gnumake_recursive)$(Q) $(RUSTC) $(YJIT_RUSTC_ARGS)
else ifneq ($(strip $(RLIB_DIR)),) # combo build
# Absolute path to avoid VPATH ambiguity
YJIT_RLIB = $(TOP_BUILD_DIR)/$(RLIB_DIR)/libyjit.rlib
-$(YJIT_RLIB): $(YJIT_SRC_FILES)
+$(YJIT_RLIB): $(YJIT_SRC_FILES) target/.rustc-version
$(ECHO) 'building $(@F)'
$(gnumake_recursive)$(Q) $(RUSTC) '-L$(@D)' --extern=jit $(YJIT_RUSTC_ARGS)
diff --git a/zjit/zjit.mk b/zjit/zjit.mk
index 58b45d8787..92839cf0a1 100644
--- a/zjit/zjit.mk
+++ b/zjit/zjit.mk
@@ -20,14 +20,14 @@ BUILD_ZJIT_LIBS = $(TOP_BUILD_DIR)/$(ZJIT_LIBS)
# In a ZJIT-only build (no YJIT)
ifneq ($(strip $(ZJIT_LIBS)),)
-$(BUILD_ZJIT_LIBS): $(ZJIT_SRC_FILES)
+$(BUILD_ZJIT_LIBS): $(ZJIT_SRC_FILES) target/.rustc-version
$(ECHO) 'building Rust ZJIT (release mode)'
$(gnumake_recursive)$(Q) $(RUSTC) $(ZJIT_RUSTC_ARGS)
else ifneq ($(strip $(RLIB_DIR)),) # combo build
# Absolute path to avoid VPATH ambiguity
ZJIT_RLIB = $(TOP_BUILD_DIR)/$(RLIB_DIR)/libzjit.rlib
-$(ZJIT_RLIB): $(ZJIT_SRC_FILES)
+$(ZJIT_RLIB): $(ZJIT_SRC_FILES) target/.rustc-version
$(ECHO) 'building $(@F)'
$(gnumake_recursive)$(Q) $(RUSTC) '-L$(@D)' --extern=jit $(ZJIT_RUSTC_ARGS)