1- # User-defined variables
2- # OBJECTS = rust_add.o hello.o
3- OBJECTS = $(patsubst %.rs,%.o,$(wildcard *.rs))
4-
5- BINDINGS_DIR = bindings
6- CACHE_BINDINGS_LOCATION = ../cached_bindings
7- ALL_R_HEADERS = $(wildcard $(R_INCLUDE_DIR)/*.h $(R_INCLUDE_DIR)/*/*.h)
8- NONAPI = `$(R_HOME)/bin$(R_ARCH_BIN)/Rscript --vanilla -e "cat(tools:::nonAPI, sep = '|')"`
9- RUSTC = rustc
10- R_VERSION_MAJOR_MINOR_ONLY = $(word 1,$(subst ., ,$(R_VERSION))).$(word 2,$(subst ., ,$(R_VERSION)))
11- UNAME = $(shell uname -s)
12- PLATFORM = $(UNAME)
13-
14- ifeq ($(R_OSTYPE),windows)
15- RUSTC_DEFAULT_FLAGS = -Cembed-bitcode=no -Cdebuginfo=2
16- TARGET = --target x86_64-pc-windows-gnu
17- OS_DEFINES = -DWin32 -D_Win32
18- RUSTC_LINKER = -Clinker=x86_64-w64-mingw32.static.posix-gcc.exe
19- LIBGCC_EH_RECIPE = `mkdir -p libgcc_mock && touch libgcc_mock/libgcc_eh.a`
20- LIBGCC_EH_FLAG = -Llibgcc_mock
21- R_LIBRARY_PATH = -L"$(R_HOME)/bin$(R_ARCH)"
22-
23- PLATFORM = "windows"
24- else
25- RUSTC_DEFAULT_FLAGS = -Cembed-bitcode=no -Cdebuginfo=2 -Csplit-debuginfo=unpacked
26- TARGET =
27- OS_DEFINES =
28- ifeq ($(UNAME), Darwin)
29- # Mac-specific settings
30- OS_DEFINES += -isysroot `xcrun -show-sdk-path`
31- endif
32- RUSTC_LINKER =
33- LIBGCC_EH_RECIPE =
34- LIBGCC_EH_FLAG =
35- R_LIBRARY_PATH = -L$(R_HOME)/lib$(R_ARCH)
36- endif
37-
38- RUSTC_FLAGS = \
39- --print native-static-libs \
40- $(TARGET) \
41- $(RUSTC_LINKER) \
42- $(LIBGCC_EH_FLAG) \
43- $(R_LIBRARY_PATH) -lR \
44- --edition=2021 \
45- -Cpanic=abort \
46- $(RUSTC_DEFAULT_FLAGS) \
47- -Cllvm-args=--align-all-functions=64 \
48- --crate-type=cdylib \
49- --emit=dep-info,obj
50-
51- # PKG_LIBS += -lc -lm -lresolv -ldl -lpthread -dynamiclib -Wl,-dylib -shared -L. -lrust_add
52- # PKG_LIBS += -L. -lrust_add
53- # PKG_LIBS += -lc -lm "-Wl,-dead_strip" "-dynamiclib" "-Wl,-dylib" "-nodefaultlibs"
54-
55- R_BLOCKED_ITEMS = --blocklist-item="VECTOR_PTR|SEXPREC|DL_FUNC|TYPEOF|R_altrep_Coerce_method_t|Rf_isS4"
56- # TODO: use --override-abi=C-unwind if the current rustc supports it..
57- RUSTC_VERSION = `rustc --version`
58- ATTRIBUTE_CUSTOM = --with-attribute-custom="$(NONAPI)=\#[cfg(feature = \"nonapi\")]"
59- # --with-attribute-custom=".*=\#[cfg(feature = \"$(addprefix r_,$(subst .,_,$(R_VERSION_MAJOR_MINOR_ONLY)))\")]" \
60- # --with-attribute-custom=".*=\#[cfg(target_family = \"$(R_OSTYPE)\")]" \
61-
62- BINDGEN_ARGS = \
63- --raw-line "/* OS: $(R_OSTYPE) */" \
64- --raw-line "/* Platform: $(R_PLATFORM) */" \
65- --raw-line "/* $(RUSTC_VERSION) */" \
66- --raw-line "/* R version: $(R_VERSION) */" \
67- --enable-function-attribute-detection \
68- --no-layout-tests \
69- --with-derive-custom="R_CMethodDef|R_CallMethodDef=Debug,Copy,Clone" \
70- --opaque-type SEXPREC \
71- --opaque-type DL_FUNC \
72- --opaque-type CGContext \
73- --builtins \
74- --allowlist-item "CGContextRef|CGContext" \
75- --sort-semantically --translate-enum-integer-types --merge-extern-blocks \
76- --no-recursive-allowlist --rustified-non-exhaustive-enum=".*" \
77- $(R_BLOCKED_ITEMS)
78-
79- BINDGEN_CLANG_ARGS = -Denum_SEXPTYPE -DR_NO_REMAP -DSTRICT_R_HEADERS -DR_INTERFACE_PTRS \
80- $(OS_DEFINES) \
81- -Wno-visibility \
82- -fparse-all-comments \
83- -include Rinternals.h -include R_ext/GraphicsEngine.h -include R_ext/GraphicsDevice.h
84-
85- ALL_R_BINDINGS = $(patsubst $(R_INCLUDE_DIR)/%.h,$(BINDINGS_DIR)/%.rs,$(ALL_R_HEADERS))
86-
87- ALL_CACHED_BINDINGS = $(patsubst $(BINDINGS_DIR)/%.rs,$(CACHE_BINDINGS_LOCATION)/%-$(PLATFORM)-$(R_VERSION_MAJOR_MINOR_ONLY).rs,$(ALL_R_BINDINGS))
88-
89- # TODO: unless `rust_analyzer_dummy` is added here, it won't do anything
90- all: DEBUG LIBGCC_EH_RECIPE_SETUP ALL_R_BINDINGS $(ALL_CACHED_BINDINGS) $(OBJECTS) $(SHLIB)
91-
92- DEBUG:
93- #$(ECHO) $(.VARIABLES)
94- # $(foreach var,$(.VARIABLES),$(info $(var) = $($(var))))
95- # $(ECHO) SDK `xcrun --show-sdk-path`
96- # $(ECHO) $(NONAPI)
97- # $(ECHO) $(ATTRIBUTE_CUSTOM)
98-
99- LIBGCC_EH_RECIPE_SETUP:
100- $(LIBGCC_EH_RECIPE)
101-
102- # Rule to generate all bindings
103- ALL_R_BINDINGS: $(ALL_R_BINDINGS)
104- # $(ECHO) $(ALL_R_BINDINGS)
105- # $(ECHO) "All bindings are up-to-date."
106-
107- $(BINDINGS_DIR)/R_ext/Constants.rs: BINDGEN_EXTRA = --blocklist-item M_PI
108- # Applic.h includes what's in R_ext/Utils.h, so we block them
109- $(BINDINGS_DIR)/R_ext/Applic.rs: BINDGEN_EXTRA = --blocklist-item findInterval
110- # Lapack.h includes what's in R_ext/BLAS.h, so we block them
111- $(BINDINGS_DIR)/R_ext/Lapack.rs: BINDGEN_EXTRA = --blocklist-item zdrot_
112- # Rinternals.h includes what's in R_ext/Rallocators.h, so we block them (and Rembedded)
113- $(BINDINGS_DIR)/Rinternals.rs: BINDGEN_EXTRA = --blocklist-item "R_allocator|R_allocator_t|R_RunExitFinalizers"
114- $(BINDINGS_DIR)/R_ext/RStartup.rs: BINDGEN_EXTRA = --blocklist-item "setup_Rmainloop"
115- # Rmath includes what's in R_ext/Random.h, so we block them
116- $(BINDINGS_DIR)/Rmath.rs: BINDGEN_EXTRA = --blocklist-item "__STDC_WANT_IEC_60559_FUNCS_EXT__|norm_rand|unif_rand|R_unif_index|exp_rand"
117- $(BINDINGS_DIR)/R_ext/Rallocators.rs: BINDGEN_EXTRA = --allowlist-item "R_allocator|R_allocator_t"
118-
119- $(BINDINGS_DIR)/%.rs: $(R_INCLUDE_DIR)/%.h
120- $(ECHO) "Generating $@ from $<"
121- @mkdir -p $(dir $@)
122- bindgen "$<" -o "$@" $(BINDGEN_ARGS) $(BINDGEN_EXTRA) --allowlist-file "$<" -- -I$(R_INCLUDE_DIR) $(BINDGEN_CLANG_ARGS)
123-
124- $(CACHE_BINDINGS_LOCATION)/%-$(PLATFORM)-$(R_VERSION_MAJOR_MINOR_ONLY).rs: $(BINDINGS_DIR)/%.rs
125- $(ECHO) "Updating cache for $< -> $@"
126- @mkdir -p $(dir $@)
127- @cp -f $< $@
128-
129- %.o: %.rs
130- $(ECHO) "Compiling $< to $@"
131- $(RUSTC) $(RUSTC_FLAGS) $<
132-
133- # rust_analyzer_dummy: ALL_R_BINDINGS
134- # mkdir -p dummy/bindings
135- # cp -r bindings/ dummy/bindings
136-
137- # clean_rust: shlib-clean
138- # @rm -f \
139- # $(addsuffix .so, $(OBJECTS_BASENAME)) \
140- # $(addsuffix .dll, $(OBJECTS_BASENAME)) \
141- # $(addsuffix .dylib, $(addprefix lib, $(OBJECTS_BASENAME))) \
142- # $(addsuffix .d, $(OBJECTS_BASENAME))
143- # TODO: Also erase the bindings?
1+ # User-defined variables
2+ # OBJECTS = rust_add.o hello.o
3+ OBJECTS = $(patsubst %.rs,%.o,$(wildcard *.rs))
4+
5+ BINDINGS_DIR = bindings
6+ CACHE_BINDINGS_LOCATION = ../cached_bindings
7+ ALL_R_HEADERS = $(wildcard $(R_INCLUDE_DIR)/*.h $(R_INCLUDE_DIR)/*/*.h)
8+ NONAPI = `$(R_HOME)/bin$(R_ARCH_BIN)/Rscript --vanilla -e "cat(tools:::nonAPI, sep = '|')"`
9+ RUSTC = rustc
10+ R_VERSION_MAJOR_MINOR_ONLY = $(word 1,$(subst ., ,$(R_VERSION))).$(word 2,$(subst ., ,$(R_VERSION)))
11+ UNAME = $(shell uname -s)
12+ PLATFORM = $(UNAME)
13+
14+ ifeq ($(R_OSTYPE),windows)
15+ RUSTC_DEFAULT_FLAGS = -Cembed-bitcode=no -Cdebuginfo=2
16+ TARGET = --target x86_64-pc-windows-gnu
17+ OS_DEFINES = -DWin32 -D_Win32
18+ RUSTC_LINKER = -Clinker=x86_64-w64-mingw32.static.posix-gcc.exe
19+ LIBGCC_EH_RECIPE = `mkdir -p libgcc_mock && touch libgcc_mock/libgcc_eh.a`
20+ LIBGCC_EH_FLAG = -Llibgcc_mock
21+ R_LIBRARY_PATH = -L"$(R_HOME)/bin$(R_ARCH)"
22+
23+ PLATFORM = "windows"
24+ else
25+ RUSTC_DEFAULT_FLAGS = -Cembed-bitcode=no -Cdebuginfo=2 -Csplit-debuginfo=unpacked
26+ TARGET =
27+ OS_DEFINES =
28+ ifeq ($(UNAME), Darwin)
29+ # Mac-specific settings
30+ OS_DEFINES += -isysroot `xcrun -show-sdk-path`
31+ endif
32+ RUSTC_LINKER =
33+ LIBGCC_EH_RECIPE =
34+ LIBGCC_EH_FLAG =
35+ R_LIBRARY_PATH = -L$(R_HOME)/lib$(R_ARCH)
36+ endif
37+
38+ RUSTC_FLAGS = \
39+ --print native-static-libs \
40+ $(TARGET) \
41+ $(RUSTC_LINKER) \
42+ $(LIBGCC_EH_FLAG) \
43+ $(R_LIBRARY_PATH) -lR \
44+ --edition=2021 \
45+ -Cpanic=abort \
46+ $(RUSTC_DEFAULT_FLAGS) \
47+ -Cllvm-args=--align-all-functions=64 \
48+ --crate-type=cdylib \
49+ --emit=dep-info,obj
50+
51+ # PKG_LIBS += -lc -lm -lresolv -ldl -lpthread -dynamiclib -Wl,-dylib -shared -L. -lrust_add
52+ # PKG_LIBS += -L. -lrust_add
53+ # PKG_LIBS += -lc -lm "-Wl,-dead_strip" "-dynamiclib" "-Wl,-dylib" "-nodefaultlibs"
54+
55+ R_BLOCKED_ITEMS = --blocklist-item="VECTOR_PTR|SEXPREC|DL_FUNC|TYPEOF|R_altrep_Coerce_method_t|Rf_isS4"
56+ # TODO: use --override-abi=C-unwind if the current rustc supports it..
57+ RUSTC_VERSION = `rustc --version`
58+ ATTRIBUTE_CUSTOM = --with-attribute-custom="$(NONAPI)=\#[cfg(feature = \"nonapi\")]"
59+ # --with-attribute-custom=".*=\#[cfg(feature = \"$(addprefix r_,$(subst .,_,$(R_VERSION_MAJOR_MINOR_ONLY)))\")]" \
60+ # --with-attribute-custom=".*=\#[cfg(target_family = \"$(R_OSTYPE)\")]" \
61+
62+ BINDGEN_ARGS = \
63+ --raw-line "/* OS: $(R_OSTYPE) */" \
64+ --raw-line "/* Platform: $(R_PLATFORM) */" \
65+ --raw-line "/* $(RUSTC_VERSION) */" \
66+ --raw-line "/* R version: $(R_VERSION) */" \
67+ --enable-function-attribute-detection \
68+ --no-layout-tests \
69+ --with-derive-custom="R_CMethodDef|R_CallMethodDef=Debug,Copy,Clone" \
70+ --opaque-type SEXPREC \
71+ --opaque-type DL_FUNC \
72+ --opaque-type CGContext \
73+ --builtins \
74+ --allowlist-item "CGContextRef|CGContext" \
75+ --sort-semantically --translate-enum-integer-types --merge-extern-blocks \
76+ --no-recursive-allowlist --rustified-non-exhaustive-enum=".*" \
77+ $(R_BLOCKED_ITEMS)
78+
79+ BINDGEN_CLANG_ARGS = -Denum_SEXPTYPE -DR_NO_REMAP -DSTRICT_R_HEADERS -DR_INTERFACE_PTRS \
80+ $(OS_DEFINES) \
81+ -Wno-visibility \
82+ -fparse-all-comments \
83+ -include Rinternals.h -include R_ext/GraphicsEngine.h -include R_ext/GraphicsDevice.h
84+
85+ ALL_R_BINDINGS = $(patsubst $(R_INCLUDE_DIR)/%.h,$(BINDINGS_DIR)/%.rs,$(ALL_R_HEADERS))
86+
87+ ALL_CACHED_BINDINGS = $(patsubst $(BINDINGS_DIR)/%.rs,$(CACHE_BINDINGS_LOCATION)/%-$(PLATFORM)-$(R_VERSION_MAJOR_MINOR_ONLY).rs,$(ALL_R_BINDINGS))
88+
89+ # TODO: unless `rust_analyzer_dummy` is added here, it won't do anything
90+ all: DEBUG LIBGCC_EH_RECIPE_SETUP ALL_R_BINDINGS $(ALL_CACHED_BINDINGS) $(OBJECTS) $(SHLIB)
91+
92+ DEBUG:
93+ # $(ECHO) $(.VARIABLES)
94+ # $(foreach var,$(.VARIABLES),$(info $(var) = $($(var))))
95+ # $(ECHO) SDK `xcrun --show-sdk-path`
96+ # $(ECHO) $(NONAPI)
97+ # $(ECHO) $(ATTRIBUTE_CUSTOM)
98+
99+ LIBGCC_EH_RECIPE_SETUP:
100+ $(LIBGCC_EH_RECIPE)
101+
102+ # Rule to generate all bindings
103+ ALL_R_BINDINGS: $(ALL_R_BINDINGS)
104+ # $(ECHO) $(ALL_R_BINDINGS)
105+ # $(ECHO) "All bindings are up-to-date."
106+
107+ $(BINDINGS_DIR)/R_ext/Constants.rs: BINDGEN_EXTRA = --blocklist-item M_PI
108+ # Applic.h includes what's in R_ext/Utils.h, so we block them
109+ $(BINDINGS_DIR)/R_ext/Applic.rs: BINDGEN_EXTRA = --blocklist-item findInterval
110+ # Lapack.h includes what's in R_ext/BLAS.h, so we block them
111+ $(BINDINGS_DIR)/R_ext/Lapack.rs: BINDGEN_EXTRA = --blocklist-item zdrot_
112+ # Rinternals.h includes what's in R_ext/Rallocators.h, so we block them (and Rembedded)
113+ $(BINDINGS_DIR)/Rinternals.rs: BINDGEN_EXTRA = --blocklist-item "R_allocator|R_allocator_t|R_RunExitFinalizers"
114+ $(BINDINGS_DIR)/R_ext/RStartup.rs: BINDGEN_EXTRA = --blocklist-item "setup_Rmainloop"
115+ # Rmath includes what's in R_ext/Random.h, so we block them
116+ $(BINDINGS_DIR)/Rmath.rs: BINDGEN_EXTRA = --blocklist-item "__STDC_WANT_IEC_60559_FUNCS_EXT__|norm_rand|unif_rand|R_unif_index|exp_rand"
117+ # Rallocators have items blocked by Rinternals, so we allow them explicitly here.
118+ $(BINDINGS_DIR)/R_ext/Rallocators.rs: BINDGEN_EXTRA = --allowlist-item "R_allocator|R_allocator_t"
119+
120+ $(BINDINGS_DIR)/R_ext/Print.rs: BINDGEN_EXTRA = --blocklist-item "Rvprintf|REvprintf"
121+
122+
123+ $(BINDINGS_DIR)/%.rs: $(R_INCLUDE_DIR)/%.h
124+ $(ECHO) "Generating $@ from $<"
125+ @mkdir -p $(dir $@)
126+ bindgen "$<" -o "$@" $(BINDGEN_ARGS) $(BINDGEN_EXTRA) --allowlist-file "$<" -- -I$(R_INCLUDE_DIR) $(BINDGEN_CLANG_ARGS)
127+
128+ $(CACHE_BINDINGS_LOCATION)/%-$(PLATFORM)-$(R_VERSION_MAJOR_MINOR_ONLY).rs: $(BINDINGS_DIR)/%.rs
129+ $(ECHO) "Updating cache for $< -> $@"
130+ @mkdir -p $(dir $@)
131+ @cp -f $< $@
132+
133+ %.o: %.rs
134+ $(ECHO) "Compiling $< to $@"
135+ $(RUSTC) $(RUSTC_FLAGS) $<
136+
137+ # rust_analyzer_dummy: ALL_R_BINDINGS
138+ # mkdir -p dummy/bindings
139+ # cp -r bindings/ dummy/bindings
0 commit comments