aboutsummaryrefslogtreecommitdiffstats
path: root/yjit/yjit.mk
blob: 2c3a6b3af84e8c037ce1fe18b518eb38f6f47d5a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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