-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMakevars
More file actions
140 lines (121 loc) · 6.06 KB
/
Makevars
File metadata and controls
140 lines (121 loc) · 6.06 KB
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# User-defined variables
# OBJECTS = rust_add.o hello.o
OBJECTS = $(patsubst %.rs,%.o,$(wildcard *.rs))
GENERATED_BINDINGS_DIR = generated_bindings
CACHE_BINDINGS_LOCATION = ../cached_bindings
ALL_R_HEADERS = $(wildcard $(R_INCLUDE_DIR)/*.h $(R_INCLUDE_DIR)/*/*.h)
NONAPI = `$(R_HOME)/bin$(R_ARCH_BIN)/Rscript --vanilla -e "cat(tools:::nonAPI, sep = '|')"`
RUSTC = rustc
R_VERSION_MAJOR_MINOR_ONLY = $(word 1,$(subst ., ,$(R_VERSION))).$(word 2,$(subst ., ,$(R_VERSION)))
RUSTC_R_VERSION_CFG = --cfg r_ver_$(subst .,_,$(R_VERSION_MAJOR_MINOR_ONLY))
UNAME = $(shell uname -s)
PLATFORM = $(UNAME)
ifeq ($(R_OSTYPE),windows)
RUSTC_DEFAULT_FLAGS = -Cembed-bitcode=no -Cdebuginfo=2
TARGET = --target x86_64-pc-windows-gnu
OS_DEFINES = -DWin32 -D_Win32
RUSTC_LINKER = -Clinker=x86_64-w64-mingw32.static.posix-gcc.exe
LIBGCC_EH_RECIPE = `mkdir -p libgcc_mock && touch libgcc_mock/libgcc_eh.a`
LIBGCC_EH_FLAG = -Llibgcc_mock
R_LIBRARY_PATH = -L"$(R_HOME)/bin$(R_ARCH)"
PLATFORM = "windows"
else
RUSTC_DEFAULT_FLAGS = -Cembed-bitcode=no -Cdebuginfo=2 -Csplit-debuginfo=unpacked
TARGET =
OS_DEFINES =
ifeq ($(UNAME), Darwin)
# Mac-specific settings
OS_DEFINES += -isysroot `xcrun -show-sdk-path`
endif
RUSTC_LINKER =
LIBGCC_EH_RECIPE =
LIBGCC_EH_FLAG =
R_LIBRARY_PATH = -L$(R_HOME)/lib$(R_ARCH)
endif
RUSTC_FLAGS = --print native-static-libs \
$(RUSTC_R_VERSION_CFG) \
$(TARGET) $(RUSTC_LINKER) $(LIBGCC_EH_FLAG) $(R_LIBRARY_PATH) -lR \
--edition=2021 \
-Cpanic=abort \
$(RUSTC_DEFAULT_FLAGS) -Cllvm-args=--align-all-functions=64 \
--crate-type=cdylib \
--emit=dep-info,obj
# PKG_LIBS += -lc -lm -lresolv -ldl -lpthread -dynamiclib -Wl,-dylib -shared -L. -lrust_add
# PKG_LIBS += -L. -lrust_add
# PKG_LIBS += -lc -lm "-Wl,-dead_strip" "-dynamiclib" "-Wl,-dylib" "-nodefaultlibs"
R_BLOCKED_ITEMS = --blocklist-item="VECTOR_PTR|SEXPREC|DL_FUNC|TYPEOF|R_altrep_Coerce_method_t|Rf_isS4"
# TODO: use --override-abi=C-unwind if the current rustc supports it..
RUSTC_VERSION = `rustc --version`
ATTRIBUTE_CUSTOM = --with-attribute-custom="$(NONAPI)=\#[cfg(feature = \"nonapi\")]"
# --with-attribute-custom=".*=\#[cfg(feature = \"$(addprefix r_,$(subst .,_,$(R_VERSION_MAJOR_MINOR_ONLY)))\")]" \
# --with-attribute-custom=".*=\#[cfg(target_family = \"$(R_OSTYPE)\")]" \
BINDGEN_ARGS = \
--raw-line "/* OS: $(R_OSTYPE) */" \
--raw-line "/* Platform: $(R_PLATFORM) */" \
--raw-line "/* $(RUSTC_VERSION) */" \
--raw-line "/* R version: $(R_VERSION) */" \
--enable-function-attribute-detection \
--no-layout-tests \
--with-derive-custom="R_CMethodDef|R_CallMethodDef=Debug,Copy,Clone" \
--opaque-type SEXPREC \
--opaque-type DL_FUNC \
--opaque-type CGContext \
--builtins \
--allowlist-item "CGContextRef|CGContext" \
--sort-semantically --translate-enum-integer-types --merge-extern-blocks \
--no-recursive-allowlist --rustified-non-exhaustive-enum=".*" \
$(R_BLOCKED_ITEMS)
BINDGEN_CLANG_ARGS = -Denum_SEXPTYPE -DR_NO_REMAP -DSTRICT_R_HEADERS -DR_INTERFACE_PTRS \
$(OS_DEFINES) \
-Wno-visibility \
-fparse-all-comments \
-include Rinternals.h -include R_ext/GraphicsEngine.h -include R_ext/GraphicsDevice.h
ALL_R_BINDINGS = $(patsubst $(R_INCLUDE_DIR)/%.h,$(GENERATED_BINDINGS_DIR)/%.rs,$(ALL_R_HEADERS))
ALL_CACHED_BINDINGS = $(patsubst $(GENERATED_BINDINGS_DIR)/%.rs,$(CACHE_BINDINGS_LOCATION)/%-$(PLATFORM)-$(R_VERSION_MAJOR_MINOR_ONLY).rs,$(ALL_R_BINDINGS))
# TODO: unless `rust_analyzer_dummy` is added here, it won't do anything
all: DEBUG LIBGCC_EH_RECIPE_SETUP $(ALL_R_BINDINGS) $(ALL_CACHED_BINDINGS) BINDINGS_CRATE $(OBJECTS) $(SHLIB)
DEBUG:
# $(ECHO) $(.VARIABLES)
# $(foreach var,$(.VARIABLES),$(info $(var) = $($(var))))
# $(ECHO) SDK `xcrun --show-sdk-path`
# $(ECHO) $(NONAPI)
# $(ECHO) $(ATTRIBUTE_CUSTOM)
LIBGCC_EH_RECIPE_SETUP:
$(LIBGCC_EH_RECIPE)
$(GENERATED_BINDINGS_DIR)/R.rs: BINDGEN_EXTRA = --blocklist-item __STDC_WANT_IEC_60559_FUNCS_EXT__
$(GENERATED_BINDINGS_DIR)/R_ext/Constants.rs: BINDGEN_EXTRA = --blocklist-item M_PI
# Applic.h includes what's in R_ext/Utils.h, so we block them
$(GENERATED_BINDINGS_DIR)/R_ext/Applic.rs: BINDGEN_EXTRA = --blocklist-item findInterval
# Lapack.h includes what's in R_ext/BLAS.h, so we block them
$(GENERATED_BINDINGS_DIR)/R_ext/Lapack.rs: BINDGEN_EXTRA = --blocklist-item zdrot_
# Rinternals.h includes what's in R_ext/Rallocators.h, so we block them (and Rembedded)
$(GENERATED_BINDINGS_DIR)/Rinternals.rs: BINDGEN_EXTRA = --blocklist-item "R_allocator|R_allocator_t|R_RunExitFinalizers"
$(GENERATED_BINDINGS_DIR)/R_ext/RStartup.rs: BINDGEN_EXTRA = --blocklist-item "setup_Rmainloop"
# Rmath includes what's in R_ext/Random.h, so we block them
$(GENERATED_BINDINGS_DIR)/Rmath.rs: BINDGEN_EXTRA = --blocklist-item "__STDC_WANT_IEC_60559_FUNCS_EXT__|norm_rand|unif_rand|R_unif_index|exp_rand"
# Rallocators have items blocked by Rinternals, so we allow them explicitly here.
$(GENERATED_BINDINGS_DIR)/R_ext/Rallocators.rs: BINDGEN_EXTRA = --allowlist-item "R_allocator|R_allocator_t"
# Varaible length arguments are messing up bindgen. Maybe it can be done by custom bindings.
$(GENERATED_BINDINGS_DIR)/R_ext/Print.rs: BINDGEN_EXTRA = --blocklist-item "Rvprintf|REvprintf"
$(GENERATED_BINDINGS_DIR)/%.rs: $(R_INCLUDE_DIR)/%.h
$(ECHO) "Generating $@ from $<"
@mkdir -p $(dir $@)
bindgen "$<" -o "$@" $(BINDGEN_ARGS) $(BINDGEN_EXTRA) --allowlist-file "$<" -- -I$(R_INCLUDE_DIR) $(BINDGEN_CLANG_ARGS)
$(CACHE_BINDINGS_LOCATION)/%-$(PLATFORM)-$(R_VERSION_MAJOR_MINOR_ONLY).rs: $(GENERATED_BINDINGS_DIR)/%.rs
$(ECHO) "Updating cache for $< -> $@"
@mkdir -p $(dir $@)
@cp -f $< $@
BINDINGS_CRATE: $(ALL_R_BINDINGS)
$(RUSTC) --print native-static-libs \
$(TARGET) $(RUSTC_LINKER) $(LIBGCC_EH_FLAG) $(R_LIBRARY_PATH) \
--edition=2021 \
-Cpanic=abort \
$(RUSTC_DEFAULT_FLAGS) \
-Cllvm-args=--align-all-functions=64 \
-l dylib=R --crate-type=lib bindings.rs
%.o: %.rs BINDINGS_CRATE
$(ECHO) "Compiling $< to $@"
$(RUSTC) $(RUSTC_FLAGS) -L. -lbindings -lR $<
# rust_analyzer_dummy: ALL_R_BINDINGS
# mkdir -p dummy/bindings
# cp -r bindings/ dummy/bindings