diff options
Diffstat (limited to 'yjit/yjit.mk')
| -rw-r--r-- | yjit/yjit.mk | 98 |
1 files changed, 22 insertions, 76 deletions
diff --git a/yjit/yjit.mk b/yjit/yjit.mk index 90f14568da..187ea758a2 100644 --- a/yjit/yjit.mk +++ b/yjit/yjit.mk @@ -1,100 +1,46 @@ # -*- 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)) - YJIT_SRC_FILES = $(wildcard \ $(top_srcdir)/yjit/Cargo.* \ $(top_srcdir)/yjit/src/*.rs \ $(top_srcdir)/yjit/src/*/*.rs \ $(top_srcdir)/yjit/src/*/*/*.rs \ $(top_srcdir)/yjit/src/*/*/*/*.rs \ + $(top_srcdir)/jit/src/lib.rs \ ) -# Because of Cargo cache, if the actual binary is not changed from the -# previous build, the mtime is preserved as the cached file. -# This means the target is not updated actually, and it will need to -# rebuild at the next build. -YJIT_LIB_TOUCH = touch $@ +# Absolute path to match RUST_LIB rules to avoid picking +# the "target" dir in the source directory through VPATH. +BUILD_YJIT_LIBS = $(TOP_BUILD_DIR)/$(YJIT_LIBS) -# YJIT_SUPPORT=yes when `configure` gets `--enable-yjit` -ifeq ($(YJIT_SUPPORT),yes) -$(YJIT_LIBS): $(YJIT_SRC_FILES) +# In a YJIT-only build (no ZJIT) +ifneq ($(strip $(YJIT_LIBS)),) +yjit-libs: $(BUILD_YJIT_LIBS) +$(BUILD_YJIT_LIBS): $(YJIT_SRC_FILES) target/.rustc-version $(ECHO) 'building Rust YJIT (release mode)' - +$(Q) $(RUSTC) $(YJIT_RUSTC_ARGS) - $(YJIT_LIB_TOUCH) -else ifeq ($(YJIT_SUPPORT),no) -$(YJIT_LIBS): - $(ECHO) 'Error: Tried to build YJIT without configuring it first. Check `make showconfig`?' - @false -else ifeq ($(YJIT_SUPPORT),$(filter dev dev_nodebug stats,$(YJIT_SUPPORT))) -# NOTE: MACOSX_DEPLOYMENT_TARGET to match `rustc --print deployment-target` to avoid the warning below. -# ld: warning: object file (yjit/target/debug/libyjit.a(<libcapstone object>)) was built for -# newer macOS version (15.2) than being linked (15.0) -# We don't use newer macOS feature as of yet. -$(YJIT_LIBS): $(YJIT_SRC_FILES) - $(ECHO) 'building Rust YJIT ($(YJIT_SUPPORT) mode)' - +$(Q)$(CHDIR) $(top_srcdir)/yjit && \ - CARGO_TARGET_DIR='$(CARGO_TARGET_DIR)' \ - CARGO_TERM_PROGRESS_WHEN='never' \ - MACOSX_DEPLOYMENT_TARGET=11.0 \ - $(CARGO) $(CARGO_VERBOSE) build $(CARGO_BUILD_ARGS) - $(YJIT_LIB_TOUCH) -else -endif + $(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-libobj: $(YJIT_LIBOBJ) - -YJIT_LIB_SYMBOLS = $(YJIT_LIBS:.a=).symbols -$(YJIT_LIBOBJ): $(YJIT_LIBS) - $(ECHO) 'partial linking $(YJIT_LIBS) into $@' -ifneq ($(findstring darwin,$(target_os)),) - $(Q) $(CC) -nodefaultlibs -r -o $@ -exported_symbols_list $(YJIT_LIB_SYMBOLS) $(YJIT_LIBS) -else - $(Q) $(LD) -r -o $@ --whole-archive $(YJIT_LIBS) - -$(Q) $(OBJCOPY) --wildcard --keep-global-symbol='$(SYMBOL_PREFIX)rb_*' $(@) -endif +$(YJIT_RLIB): $(YJIT_SRC_FILES) target/.rustc-version + $(ECHO) 'building $(@F)' + $(gnumake_recursive)$(Q) $(RUSTC) '-L$(@D)' --extern=jit $(YJIT_RUSTC_ARGS) -# 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. -# -# The -exported_symbols_list pulls out the right archive members. Symbols not listed -# in the list are made private extern, which are in turn made local as we're using `ld -r`. -# Note, section about -keep_private_externs in ld's man page hints at this behavior on which -# we rely. -ifneq ($(findstring darwin,$(target_os)),) -$(YJIT_LIB_SYMBOLS): $(YJIT_LIBS) - $(Q) $(tooldir)/darwin-ar $(NM) --defined-only --extern-only $(YJIT_LIBS) | \ - sed -n -e 's/.* //' -e '/^$(SYMBOL_PREFIX)rb_/p' \ - -e '/^$(SYMBOL_PREFIX)rust_eh_personality/p' \ - > $@ +$(RUST_LIB): $(YJIT_RLIB) +endif # ifneq ($(strip $(YJIT_LIBS)),) -$(YJIT_LIBOBJ): $(YJIT_LIB_SYMBOLS) +ifneq ($(YJIT_SUPPORT),no) +$(RUST_LIB): $(YJIT_SRC_FILES) endif -# By using YJIT_BENCH_OPTS instead of RUN_OPTS, you can skip passing the options to `make install` -YJIT_BENCH_OPTS = $(RUN_OPTS) --enable-gems -YJIT_BENCH = benchmarks/railsbench/benchmark.rb - -# Run yjit-bench's ./run_once.sh for CI -yjit-bench: install update-yjit-bench PHONY - $(Q) cd $(srcdir)/yjit-bench && PATH=$(prefix)/bin:$$PATH \ - ./run_once.sh $(YJIT_BENCH_OPTS) $(YJIT_BENCH) - -update-yjit-bench: - $(Q) $(tooldir)/git-refresh -C $(srcdir) --branch main \ - https://github.com/Shopify/yjit-bench yjit-bench $(GIT_OPTS) - RUST_VERSION = +1.58.0 # Gives quick feedback about YJIT. Not a replacement for a full test run. -.PHONY: yjit-smoke-test -yjit-smoke-test: +.PHONY: yjit-check +yjit-check: ifneq ($(strip $(CARGO)),) - $(CARGO) $(RUST_VERSION) test --all-features -q --manifest-path='$(top_srcdir)/yjit/Cargo.toml' + $(CARGO) test --all-features -q --manifest-path='$(top_srcdir)/yjit/Cargo.toml' endif $(MAKE) btest RUN_OPTS='--yjit-call-threshold=1' BTESTS=-j $(MAKE) test-all TESTS='$(top_srcdir)/test/ruby/test_yjit.rb' |
