summaryrefslogtreecommitdiffstats
path: root/include/rust-values.mk
blob: 7493c0d9e8e66d712212fbaae6631d7773012305 (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
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2023 Luca Barbato and Donald Hoskins

ifneq ($(__inc_rust_values),1)
__inc_rust_values:=1

# Single source of truth for the Rust version
RUST_VERSION:=1.99.1
RUST_SRC_TARBALL_HASH:=6451598a99e77f07571960f6b21d577399d3a30f33e80cbd2e3a4aae6535d265

# Paths to host Rust toolchain binaries. Without a toolchain of its own, the
# build uses rust/host of the packages feed, installed in $(STAGING_DIR)/host.
ifdef CONFIG_USE_RUST_TOOLCHAIN
  RUSTC:=$(STAGING_DIR_HOST)/bin/rustc
  CARGO:=$(STAGING_DIR_HOST)/bin/cargo
  RUSTC_ID:=$(shell $(RUSTC) --version --verbose 2>/dev/null)
else
  RUSTC:=$(STAGING_DIR)/host/bin/rustc
  CARGO:=$(STAGING_DIR)/host/bin/cargo
endif

# Directory holding libclang for bindgen, and the clang next to it: the host
# LLVM, the one built by tools/llvm-bpf or the prebuilt one unpacked into the
# source tree, as selected for the BPF toolchain.
ifdef CONFIG_USE_LLVM_HOST
  RUST_HOST_LLVM_PREFIX:=$(call qstrip,$(CONFIG_BPF_TOOLCHAIN_HOST_PATH))
  RUST_HOST_LLVM_LIBDIRS:= \
	$(if $(RUST_HOST_LLVM_PREFIX),$(RUST_HOST_LLVM_PREFIX)/lib $(RUST_HOST_LLVM_PREFIX)/lib64) \
	$(shell PATH='$(if $(RUST_HOST_LLVM_PREFIX),$(RUST_HOST_LLVM_PREFIX)/bin:)$(PATH)' \
		llvm-config --libdir 2>/dev/null) \
	/usr/lib /usr/lib64 /usr/local/lib
  RUST_LIBCLANG_PATH:=$(firstword $(foreach d,$(RUST_HOST_LLVM_LIBDIRS), \
	$(if $(wildcard $(d)/libclang.so* $(d)/libclang-*.so* $(d)/libclang.dylib),$(d))))
else ifdef CONFIG_USE_LLVM_BUILD
  RUST_LIBCLANG_PATH:=$(STAGING_DIR_HOST)/llvm-bpf/lib
  RUST_CLANG_PATH:=$(STAGING_DIR_HOST)/llvm-bpf/bin/clang
else ifdef CONFIG_USE_LLVM_PREBUILT
  RUST_LIBCLANG_PATH:=$(TOPDIR)/llvm-bpf/lib
  RUST_CLANG_PATH:=$(TOPDIR)/llvm-bpf/bin/clang
endif

ifeq ($(CONFIG_USE_RUST_TOOLCHAIN)$(CONFIG_RUST_SCCACHE),yy)
  RUST_SCCACHE_DIR:=$(or $(call qstrip,$(CONFIG_RUST_SCCACHE_DIR)),$(TOPDIR)/.sccache)
  RUST_SCCACHE_VARS = \
	RUSTC_WRAPPER=$(STAGING_DIR_HOST)/bin/sccache \
	SCCACHE_DIR=$(RUST_SCCACHE_DIR) \
	SCCACHE_CONF=$(RUST_SCCACHE_DIR)/config \
	SCCACHE_CACHED_CONF=$(RUST_SCCACHE_DIR)/cached-config \
	SCCACHE_SERVER_UDS=$(TMP_DIR)/sccache.sock
endif

# Rust Environmental Vars
RUSTC_HOST_SUFFIX:=$(word 4, $(subst -, ,$(GNU_HOST_NAME)))
RUSTC_HOST_ARCH:=$(HOST_ARCH)-unknown-linux-$(RUSTC_HOST_SUFFIX)
CARGO_HOME:=$(STAGING_DIR_HOSTPKG)/cargo

ifeq ($(CONFIG_USE_MUSL),y)
  # Force linking of the SSP library for musl
  ifdef CONFIG_PKG_CC_STACKPROTECTOR_REGULAR
    ifeq ($(strip $(PKG_SSP)),1)
      RUSTC_LDFLAGS+=-lssp_nonshared
    endif
  endif
  ifdef CONFIG_PKG_CC_STACKPROTECTOR_STRONG
    ifeq ($(strip $(PKG_SSP)),1)
      RUSTC_LDFLAGS+=-lssp_nonshared
    endif
  endif
endif

CARGO_RUSTFLAGS+=-Ctarget-feature=-crt-static $(RUSTC_LDFLAGS) \
	$(if $(CONFIG_DEBUG),,-Cpanic=abort -Cforce-unwind-tables=no)

ifeq ($(HOST_OS),Darwin)
  ifeq ($(HOST_ARCH),arm64)
    RUSTC_HOST_ARCH:=aarch64-apple-darwin
  else ifeq ($(HOST_ARCH),x86_64)
    RUSTC_HOST_ARCH:=x86_64-apple-darwin
  endif
endif

# Prebuilt Rust components of the release, pinned by hash. They are the
# compiler of the prebuilt choice, rust-src and llvm-tools of the prebuilt and
# host choices, and the cargo that generates vendor tarballs without one.
RUST_DIST_URL:=https://static.rust-lang.org/dist/2026-10-15/
RUST_SRC_HASH:=e485a88c45db546b73571df7bebfcb4454ba4fb552c492e25fc5b00eeb5bf22d
ifeq ($(RUSTC_HOST_ARCH),x86_64-unknown-linux-gnu)
  RUST_RUSTC_HASH:=2ff05ff9c08a90861e7f6e4065b40a8b87463b4576186fd613871c3e37f2091f
  RUST_CARGO_HASH:=53f3521949404d595efb06a55c12c5658d4ed1c75566f33d3d514eaebe70bd8a
  RUST_STD_HASH:=109b074225bf5b9ea3820890876bfdf4ed161adbfaf94b2b4b5984c85ee5d958
  RUST_LLVM_TOOLS_HASH:=8429c5117debfb45c22cf2f97712ef00e0e94976c96cf92f661974a458ca7e84
else ifeq ($(RUSTC_HOST_ARCH),aarch64-unknown-linux-gnu)
  RUST_RUSTC_HASH:=acdcdfe09ae1f103aa9a2b7f88903a9588bc2e99288af10e6fbf5514e2e49f25
  RUST_CARGO_HASH:=5156832e0c1254e9b49a79edabdc6d4c35f32f8fc1cf3ca700f268ff96087ab0
  RUST_STD_HASH:=e25668477083d6a9ddb87b9beb9c00742225f38233ccb4bfba3afa7a07427f52
  RUST_LLVM_TOOLS_HASH:=cd1818058908c1c4e99bd2843fe103df255157454e16186ec9cc3b5b5823b39c
else ifeq ($(RUSTC_HOST_ARCH),x86_64-unknown-linux-musl)
  RUST_RUSTC_HASH:=034e2cfea9551483c8cedbf89e52d045b89dcf860ab73aae618c89b1a87b0f18
  RUST_CARGO_HASH:=f70f6f9b251a2d9cbb0f5792c612fde478e06cfa76abb639aceaada2c6453b1f
  RUST_STD_HASH:=1dd241eaeb19ff3b5180461c77bdee93d6cafc669eda9de834e7c06b0ec3ca95
  RUST_LLVM_TOOLS_HASH:=8881115fd0c411e3b109f814c995ad8bbe61b3f6f405629924d5d1e4c96b4912
else ifeq ($(RUSTC_HOST_ARCH),aarch64-unknown-linux-musl)
  RUST_RUSTC_HASH:=4c80eab52764172618197bd23000c739fdf561ae9415caa2a5ef62ab5c785175
  RUST_CARGO_HASH:=50f323ec9e1e60c41d42ef4dd988cc87d0a79f7b4ea10fd364df177212b89106
  RUST_STD_HASH:=2f3eb0d0610e2b7f6b2121d106e2490ac648decfa0c09b30873bdfc60de6c1ab
  RUST_LLVM_TOOLS_HASH:=aa38b41b8a9ab513269a9362f943142060c7ad626822d36a933260ed798c16da
else ifeq ($(RUSTC_HOST_ARCH),x86_64-apple-darwin)
  RUST_RUSTC_HASH:=203feef2c2165d7dda1f30ccf75590f72a6abc52ce259ed1c418de84a6887698
  RUST_CARGO_HASH:=6636dabcec164909d1c6eb9e2c596148787c84f7d3a02ff68a141569077f80b5
  RUST_STD_HASH:=484d5b88b424ddd29df196e1eb9420c8335bb5fac90a3c37140253345a8c65c4
  RUST_LLVM_TOOLS_HASH:=3112e92b03b1cca4264a30ca602948d31976cd45db7de2bc7900efa25a39a045
else ifeq ($(RUSTC_HOST_ARCH),aarch64-apple-darwin)
  RUST_RUSTC_HASH:=23948a0a9c162fd2952defb3fb0462c44e8fcfd1a4ab8a274a1e1bdb2cf810a3
  RUST_CARGO_HASH:=685e563d94db1f003ffa5f5831439eec02569b9950b69867953c8213269c1eaf
  RUST_STD_HASH:=fe79d6ab5a0321de26463999d8c112b8ad3eafbcbcf822d66a2300b45dde1031
  RUST_LLVM_TOOLS_HASH:=b348db9d79666aee4b5e2ff4269029fffd16815cbd47f47018cd0b06e4f815f5
endif
RUST_CARGO_URL:=$(RUST_DIST_URL)cargo-$(RUST_VERSION)-$(RUSTC_HOST_ARCH).tar.xz

# mips64 n64 ABI uses the muslabi64 and gnuabi64 suffixes; n32 has no Rust target;
# o32 is not standard on 64-bit
# muslabi64 is hard-float; mips64-openwrt-linux-musl is its soft-float variant.
ifeq ($(ARCH),mips64)
  RUSTC_TARGET_ARCH:=$(subst openwrt,unknown,$(REAL_GNU_TARGET_NAME))
  ifeq ($(call qstrip,$(CONFIG_MIPS64_ABI)),64)
    RUSTC_TARGET_ARCH:=$(subst musl,muslabi64,$(subst -gnu,-gnuabi64,$(RUSTC_TARGET_ARCH)))
    ifeq ($(CONFIG_USE_MUSL)$(CONFIG_SOFT_FLOAT),yy)
      RUSTC_TARGET_ARCH:=mips64-openwrt-linux-musl
    endif
  endif
else ifeq ($(ARCH),mips64el)
  RUSTC_TARGET_ARCH:=$(subst openwrt,unknown,$(REAL_GNU_TARGET_NAME))
  ifeq ($(call qstrip,$(CONFIG_MIPS64_ABI)),64)
    RUSTC_TARGET_ARCH:=$(subst musl,muslabi64,$(subst -gnu,-gnuabi64,$(RUSTC_TARGET_ARCH)))
  endif
else
  RUSTC_TARGET_ARCH:=$(subst openwrt,unknown,$(REAL_GNU_TARGET_NAME))
endif

# rust/host of the packages feed builds its mips64 std for these triples
ifndef CONFIG_USE_RUST_TOOLCHAIN
  ifeq ($(ARCH),mips64)
    RUSTC_TARGET_ARCH:=$(REAL_GNU_TARGET_NAME)
  else ifeq ($(ARCH),mips64el)
    RUSTC_TARGET_ARCH:=$(subst openwrt,unknown,$(REAL_GNU_TARGET_NAME))
  endif
endif

RUSTC_TARGET_ARCH:=$(subst muslgnueabi,musleabi,$(RUSTC_TARGET_ARCH))

ifeq ($(ARCH),i386)
  RUSTC_TARGET_ARCH:=$(subst i486,i586,$(RUSTC_TARGET_ARCH))
else ifeq ($(ARCH),riscv64)
  RUSTC_TARGET_ARCH:=$(subst riscv64,riscv64gc,$(RUSTC_TARGET_ARCH))
endif

# ARM Logic
ifeq ($(ARCH),arm)
  ifeq ($(CONFIG_arm_v6)$(CONFIG_arm_v7),)
    RUSTC_TARGET_ARCH:=$(subst arm,armv5te,$(RUSTC_TARGET_ARCH))
  else ifeq ($(CONFIG_arm_v7),y)
    RUSTC_TARGET_ARCH:=$(subst arm,armv7,$(RUSTC_TARGET_ARCH))
  endif

  ifeq ($(CONFIG_HAS_FPU),y)
    RUSTC_TARGET_ARCH:=$(subst musleabi,musleabihf,$(RUSTC_TARGET_ARCH))
    RUSTC_TARGET_ARCH:=$(subst gnueabi,gnueabihf,$(RUSTC_TARGET_ARCH))
  endif
endif

# Cargo also links build scripts with the target linker when the target triple
# is the host's, but keeps target rustflags off them. cc-rs then compiles
# target C code with the host compiler, see scripts/rust-cc-wrapper.sh.
ifeq ($(CONFIG_USE_RUST_TOOLCHAIN)$(RUSTC_TARGET_ARCH),y$(RUSTC_HOST_ARCH))
  RUSTC_TARGET_LINKER_FLAGS:=-Clinker=$(TARGET_CC_NOCACHE)
  RUSTC_TARGET_CC_VARS:= \
	CC_$(subst -,_,$(RUSTC_TARGET_ARCH))=$(STAGING_DIR_HOST)/bin/rust-cc-wrapper \
	CXX_$(subst -,_,$(RUSTC_TARGET_ARCH))=$(STAGING_DIR_HOST)/bin/rust-cxx-wrapper \
	TARGET_CXX=$(TARGET_CXX_NOCACHE) \
	HOST_CC=$(HOSTCC_NOCACHE) \
	HOST_CXX=$(HOSTCXX_NOCACHE)
else
  RUSTC_TARGET_LINKER_VARS:= \
	CARGO_TARGET_$(subst -,_,$(call toupper,$(RUSTC_TARGET_ARCH)))_LINKER=$(TARGET_CC_NOCACHE)
endif

ifeq ($(ARCH),aarch64)
    RUSTC_CFLAGS:=-mno-outline-atomics
endif

ifneq ($(filter mips mipsel mips64 mips64el,$(ARCH)),)
  RUSTC_TARGET_CPU:=$(patsubst -%,%,$(lastword \
	$(filter -mips32% -mips64%,$(TARGET_OPTIMIZATION))))
  RUSTC_TARGET_CPU:=$(or $(RUSTC_TARGET_CPU),\
	$(patsubst -march=%,%,$(filter -march=octeon%,$(TARGET_OPTIMIZATION))),\
	$(filter mips32 mips64 mips64r2,$(call qstrip,$(CONFIG_CPU_TYPE))))
  ifneq ($(RUSTC_TARGET_CPU),)
    RUSTC_TARGET_FLAGS+=-Ctarget-cpu=$(RUSTC_TARGET_CPU)
    ifneq ($(filter mips32 mips64,$(RUSTC_TARGET_CPU)),)
      RUSTC_TARGET_FLAGS+=-Ctarget-feature=-$(RUSTC_TARGET_CPU)r2
    endif
  endif
endif

# mpc85xx (e500v2) has no FPU, but shares the hard-float powerpc triple
ifeq ($(ARCH)$(CONFIG_SOFT_FLOAT),powerpcy)
  RUSTC_TARGET_FLAGS+=-Ctarget-feature=-hard-float
endif

# Support only architectures with a valid Rust target.
# powerpc/powerpc64 with SPE FPU append 'spe' to TARGET_SUFFIX, which is an invalid target.
# mips64/mips64el n32 ABI has no standard Rust target.
# The soft-float n64 Rust target is mips64-openwrt-linux-musl only.
RUST_ARCH_DEPENDS:=@(aarch64||arm||i386||loongarch64||mips||(!MIPS64_ABI_N32&&mips64&&(USE_MUSL||!SOFT_FLOAT))||(!MIPS64_ABI_N32&&mips64el&&!SOFT_FLOAT)||mipsel||(!HAS_SPE_FPU&&powerpc)||(!HAS_SPE_FPU&&powerpc64)||riscv64||x86_64)

# LLVM codegen backends to compile into rustc, one per unique LLVM target name
# covering all architectures with a Rust target (semicolon-separated):
#   aarch64, arm           : AArch64, ARM
#   i386, x86_64           : X86
#   loongarch64            : LoongArch
#   mips, mipsel,
#     mips64, mips64el     : Mips
#   powerpc, powerpc64     : PowerPC
#   riscv64                : RISCV
RUST_LLVM_TARGETS:=AArch64;ARM;LoongArch;Mips;PowerPC;RISCV;X86

# Experimental LLVM backends (bootstrap key: llvm.experimental-targets).
# Defaults to AVR;M68k;CSKY;Xtensa, none of which are relevant to OpenWrt.
RUST_LLVM_EXPERIMENTAL_TARGETS:=

# Link against libstd-HASH.so (shipped by package/libs/libstd-rust) instead of
# bundling libstd.  Override per package with RUST_PREFER_DYNAMIC:=0 or 1.
# rust/host of the packages feed has no shared libstd.
RUST_LIBSTD_DYNAMIC = $(if $(CONFIG_USE_RUST_TOOLCHAIN), \
	$(or $(RUST_PREFER_DYNAMIC),$(if $(CONFIG_RUST_PREFER_DYNAMIC),1,0)),0)

RUST_IMMEDIATE_ABORT:=$(if $(CONFIG_DEBUG),,$(CONFIG_RUST_PANIC_IMMEDIATE_ABORT))

# Size options of unstable rustc, for libstd-rust and, through
# scripts/rust-target-wrapper.sh, for the crates of packages. A package keeps
# panic locations with RUST_PKG_LOCATION_DETAIL:=1, and selects the Debug
# output with RUST_PKG_FMT_DEBUG:=full or none. immediate-abort applies to all
# crates or none, std included.
RUST_UNSTABLE_FLAGS = $(if $(CONFIG_DEBUG),, \
	$(if $(filter 1,$(RUST_PKG_LOCATION_DETAIL)),,-Zlocation-detail=none) \
	-Zfmt-debug=$(or $(RUST_PKG_FMT_DEBUG),shallow) \
	$(if $(RUST_IMMEDIATE_ABORT),-Zunstable-options -Cpanic=immediate-abort))

RUST_LIBSTD_FEATURES:=$(if $(RUST_IMMEDIATE_ABORT),,panic-unwind) \
	$(if $(CONFIG_DEBUG),,optimize_for_size)
RUST_LIBSTD_FLAGS= \
	-Zforce-unstable-if-unmarked \
	-Ctarget-feature=-crt-static \
	-Ccodegen-units=1 \
	-Cembed-bitcode=yes \
	$(RUSTC_TARGET_FLAGS) \
	$(if $(CONFIG_DEBUG),,-Cpanic=abort -Cforce-unwind-tables=no -Copt-level=z -Cstrip=debuginfo \
		-Zlocation-detail=none -Zfmt-debug=shallow \
		$(if $(RUST_IMMEDIATE_ABORT),-Zunstable-options -Cpanic=immediate-abort))

RUST_LIBSTD_CONFIG:= \
	CONFIG_DEBUG CONFIG_CPU_TYPE CONFIG_TARGET_OPTIMIZATION \
	CONFIG_EXTRA_OPTIMIZATION CONFIG_GCC_VERSION CONFIG_BINUTILS_VERSION \
	CONFIG_SOFT_FLOAT CONFIG_USE_LTO CONFIG_USE_MOLD CONFIG_USE_MIPS16 \
	CONFIG_USE_GC_SECTIONS CONFIG_REPRODUCIBLE_DEBUG_INFO \
	CONFIG_RUST_PANIC_IMMEDIATE_ABORT \
	$(sort $(filter CONFIG_PKG_%,$(.VARIABLES)))

# Build paths in panic locations, file!() and debug information, mapped as
# iremap in rules.mk does for C. Local debugging keeps them, unless the debug
# information is to be reproducible.
RUST_PATH_REMAP = $(if $(and $(filter 1,$(call pkg_build_flag,iremap,1)), \
		$(if $(CONFIG_DEBUG),$(CONFIG_REPRODUCIBLE_DEBUG_INFO),y)), \
	--remap-path-prefix=$(PKG_BUILD_DIR)=$(notdir $(PKG_BUILD_DIR)) \
	--remap-path-prefix=$(STAGING_DIR)=staging_dir/$(notdir $(STAGING_DIR)))

# Identifier in the name of the shared libstd, libstd-ID.so, and ABI version
# of package/libs/libstd-rust. It changes with every input that changes the
# shared library.
LIBSTD_RUST_INPUTS = $(strip \
	$(RUST_VERSION) $(RUSTC_ID) $(RUST_SRC_TARBALL_HASH) $(RUSTC_TARGET_ARCH) \
	$(RUST_LIBSTD_FLAGS) $(RUST_LIBSTD_FEATURES) $(RUSTC_CFLAGS) \
	$(foreach v,$(RUST_LIBSTD_CONFIG),$(v)=$($(v))))
LIBSTD_RUST_ID = $(shell printf '%s' '$(subst ','\'',$(LIBSTD_RUST_INPUTS))' | $(MKHASH) sha256)
RUST_TARGET_SYSROOT = $(STAGING_DIR)/usr/lib/rust/$(LIBSTD_RUST_ID)
RUSTLIB_TARGET_PATH = /usr/lib/rust/$(LIBSTD_RUST_ID)/lib/rustlib/$(RUSTC_TARGET_ARCH)/lib
RUST_PKG_BUILD_DEPENDS:=USE_RUST_TOOLCHAIN:libstd-rust !USE_RUST_TOOLCHAIN:rust/host
RUST_HOST_BUILD_DEPENDS:=!USE_RUST_TOOLCHAIN:rust/host

RUST_PKG_CONFIG_DEPENDS:= \
	$(RUST_LIBSTD_CONFIG) \
	CONFIG_USE_RUST_TOOLCHAIN \
	$(if $(CONFIG_USE_RUST_TOOLCHAIN),CONFIG_RUST_PREFER_DYNAMIC LIBSTD_RUST_ID)

CARGO_RUSTFLAGS+= \
	$(RUSTC_TARGET_FLAGS) \
	$(RUSTC_TARGET_LINKER_FLAGS) \
	$(if $(CONFIG_USE_RUST_TOOLCHAIN),--sysroot=$(RUST_TARGET_SYSROOT)) \
	$(if $(filter 1,$(RUST_LIBSTD_DYNAMIC)),-Cprefer-dynamic) \
	$(RUST_PATH_REMAP)

# RUST_PKG_DEPENDS: use in Package/foo DEPENDS for all cargo-built target packages.
# Includes arch constraint and the libstd-rust runtime dependency when the
# package links libstd dynamically. The default is a Kconfig condition, as
# .config is not read when metadata is collected.
ifdef CONFIG_USE_RUST_TOOLCHAIN
  # rustc runs LTO next to -Cprefer-dynamic only with -Zdylib-lto.
  RUST_TARGET_WRAPPER_VARS = \
	RUSTC_WRAPPER=$(SCRIPT_DIR)/rust-target-wrapper.sh \
	RUST_TARGET_WRAPPER_FLAGS="$(RUST_UNSTABLE_FLAGS)" \
	RUST_TARGET_WRAPPER_LTO_FLAGS="$(if $(filter 1,$(RUST_LIBSTD_DYNAMIC)),-Zdylib-lto)" \
	RUST_TARGET_WRAPPER_NEXT=$(if $(RUST_SCCACHE_VARS),$(STAGING_DIR_HOST)/bin/sccache)
endif

RUST_PKG_DEPENDS = $(RUST_ARCH_DEPENDS) \
	$(if $(RUST_PREFER_DYNAMIC), \
		$(if $(filter 1,$(RUST_PREFER_DYNAMIC)),+USE_RUST_TOOLCHAIN:libstd-rust), \
		+RUST_PREFER_DYNAMIC:libstd-rust)

CARGO_HOST_CONFIG_VARS= \
	$(RUST_SCCACHE_VARS) \
	RUSTC=$(RUSTC) \
	CARGO_HOME=$(CARGO_HOME)

CARGO_HOST_PROFILE:=release

# Packages build the release profile, as maturin, CMake and autotools projects
# do, or one inheriting from it. CONFIG_DEBUG gives it the settings of dev;
# these take precedence over the profile settings of the package.
CARGO_PKG_CONFIG_VARS= \
	$(RUST_SCCACHE_VARS) \
	RUSTC=$(RUSTC) \
	CARGO_BUILD_TARGET=$(RUSTC_TARGET_ARCH) \
	CARGO_HOME=$(CARGO_HOME) \
	$(if $(CONFIG_DEBUG),,CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1) \
	CARGO_PROFILE_RELEASE_DEBUG=$(if $(CONFIG_DEBUG),true,false) \
	CARGO_PROFILE_RELEASE_DEBUG_ASSERTIONS=$(if $(CONFIG_DEBUG),true,false) \
	CARGO_PROFILE_RELEASE_LTO=$(if $(CONFIG_DEBUG),false,true) \
	$(RUST_TARGET_WRAPPER_VARS) \
	CARGO_PROFILE_RELEASE_OPT_LEVEL=$(if $(CONFIG_DEBUG),0,z) \
	CARGO_PROFILE_RELEASE_OVERFLOW_CHECKS=true \
	CARGO_PROFILE_RELEASE_PANIC=$(if $(CONFIG_DEBUG),unwind,abort) \
	CARGO_PROFILE_RELEASE_RPATH=false \
	$(RUSTC_TARGET_LINKER_VARS) \
	$(RUSTC_TARGET_CC_VARS) \
	CARGO_TARGET_$(subst -,_,$(call toupper,$(RUSTC_TARGET_ARCH)))_RUSTFLAGS="$(CARGO_RUSTFLAGS)" \
	TARGET_CC=$(TARGET_CC_NOCACHE) \
	TARGET_CFLAGS="$(TARGET_CFLAGS) $(RUSTC_CFLAGS)" \
	TARGET_CXXFLAGS="$(TARGET_CXXFLAGS) $(RUSTC_CFLAGS)"

CARGO_PKG_PROFILE:=release

# rustc drives the linker itself, without TARGET_LDFLAGS: pass the linker, and
# the -z options hardening.mk and package.mk set for the package.
RUSTC_TARGET_LINK_ARGS = \
	-Clink-arg=-fuse-ld=$(TARGET_LINKER) \
	$(addprefix -Clink-arg=,$(filter -z%,$(TARGET_LDFLAGS)))

CARGO_RUSTFLAGS+=$(RUSTC_TARGET_LINK_ARGS)

endif # __inc_rust_values