aboutsummaryrefslogtreecommitdiffstats
path: root/yjit/yjit.mk
diff options
context:
space:
mode:
Diffstat (limited to 'yjit/yjit.mk')
-rw-r--r--yjit/yjit.mk56
1 files changed, 56 insertions, 0 deletions
diff --git a/yjit/yjit.mk b/yjit/yjit.mk
new file mode 100644
index 0000000000..2c3a6b3af8
--- /dev/null
+++ b/yjit/yjit.mk
@@ -0,0 +1,56 @@
+# -*- mode: makefile-gmake; indent-tabs-mode: t -*-
+
+# Show Cargo progress when doing `make V=1`
+CARGO_VERBOSE_0 = -q
+CARGO_VERBOSE_1 =
+CARGO_VERBOSE = $(CARGO_VERBOSE_$(V))
+
+# Select between different build profiles with macro substitution
+.PHONY: yjit-static-lib
+yjit-static-lib: yjit-static-lib-$(YJIT_SUPPORT)
+
+# YJIT_SUPPORT=yes when `configure` gets `--enable-yjit`
+yjit-static-lib-yes:
+ $(ECHO) 'building Rust YJIT (release mode)'
+ $(Q) $(RUSTC) \
+ --crate-name=yjit \
+ --crate-type=staticlib \
+ --edition=2021 \
+ -C opt-level=3 \
+ -C overflow-checks=on \
+ '--out-dir=$(CARGO_TARGET_DIR)/release/' \
+ $(top_srcdir)/yjit/src/lib.rs
+
+yjit-static-lib-no:
+ $(ECHO) 'Error: Tried to build YJIT without configuring it first. Check `make showconfig`?'
+ @false
+
+yjit-static-lib-dev:
+ $(ECHO) 'building Rust YJIT (dev mode)'
+ $(Q)$(CHDIR) $(top_srcdir)/yjit && \
+ CARGO_TARGET_DIR='$(CARGO_TARGET_DIR)' \
+ CARGO_TERM_PROGRESS_WHEN='never' \
+ $(CARGO) $(CARGO_VERBOSE) build $(CARGO_BUILD_ARGS)
+
+# This PHONY prerequisite makes it so that we always run cargo. When there are
+# no Rust changes on rebuild, Cargo does not touch the mtime of the static
+# library and GNU make avoids relinking. $(empty) seems to be important to
+# trigger rebuild each time in release mode.
+$(YJIT_LIBS): yjit-static-lib
+ $(empty)
+
+# Put this here instead of in common.mk to avoid breaking nmake builds
+# TODO: might need to move for BSD Make support
+miniruby$(EXEEXT): $(YJIT_LIBS)
+
+# Generate Rust bindings. See source for details.
+# Needs `./configure --enable-yjit=dev` and Clang.
+ifneq ($(strip $(CARGO)),) # if configure found Cargo
+.PHONY: yjit-bindgen
+yjit-bindgen: yjit.$(OBJEXT)
+ YJIT_SRC_ROOT_PATH='$(top_srcdir)' $(CARGO) run --manifest-path '$(top_srcdir)/yjit/bindgen/Cargo.toml' -- $(CFLAGS) $(XCFLAGS) $(CPPFLAGS)
+
+# For CI, check whether YJIT's FFI bindings are up-to-date.
+check-yjit-bindings: yjit-bindgen
+ git -C "$(top_srcdir)" diff --exit-code yjit/src/cruby_bindings.inc.rs
+endif