Makefile (681c5b51dc6b8ff1ec05555243eccf64a08cb2fd) Makefile (4e1746656839ab1e88d76eec4d2fa0b41d585604)
1# SPDX-License-Identifier: GPL-2.0
2
3obj-$(CONFIG_RUST) += core.o compiler_builtins.o
4always-$(CONFIG_RUST) += exports_core_generated.h
5
6# Missing prototypes are expected in the helpers since these are exported
7# for Rust only, thus there is no header nor prototypes.
8obj-$(CONFIG_RUST) += helpers.o
9CFLAGS_REMOVE_helpers.o = -Wmissing-prototypes -Wmissing-declarations
10
11always-$(CONFIG_RUST) += libmacros.so
12no-clean-files += libmacros.so
13
14always-$(CONFIG_RUST) += bindings/bindings_generated.rs bindings/bindings_helpers_generated.rs
15obj-$(CONFIG_RUST) += alloc.o bindings.o kernel.o
16always-$(CONFIG_RUST) += exports_alloc_generated.h exports_bindings_generated.h \
17 exports_kernel_generated.h
18
1# SPDX-License-Identifier: GPL-2.0
2
3obj-$(CONFIG_RUST) += core.o compiler_builtins.o
4always-$(CONFIG_RUST) += exports_core_generated.h
5
6# Missing prototypes are expected in the helpers since these are exported
7# for Rust only, thus there is no header nor prototypes.
8obj-$(CONFIG_RUST) += helpers.o
9CFLAGS_REMOVE_helpers.o = -Wmissing-prototypes -Wmissing-declarations
10
11always-$(CONFIG_RUST) += libmacros.so
12no-clean-files += libmacros.so
13
14always-$(CONFIG_RUST) += bindings/bindings_generated.rs bindings/bindings_helpers_generated.rs
15obj-$(CONFIG_RUST) += alloc.o bindings.o kernel.o
16always-$(CONFIG_RUST) += exports_alloc_generated.h exports_bindings_generated.h \
17 exports_kernel_generated.h
18
19always-$(CONFIG_RUST) += uapi/uapi_generated.rs
20obj-$(CONFIG_RUST) += uapi.o
21
19ifdef CONFIG_RUST_BUILD_ASSERT_ALLOW
20obj-$(CONFIG_RUST) += build_error.o
21else
22always-$(CONFIG_RUST) += build_error.o
23endif
24
25obj-$(CONFIG_RUST) += exports.o
26

--- 81 unchanged lines hidden (view full) ---

108# due to things that are "configured out" vs. entirely non-existing ones.
109rustdoc-alloc: private rustc_target_flags = $(alloc-cfgs) \
110 -Arustdoc::broken_intra_doc_links
111rustdoc-alloc: $(src)/alloc/lib.rs rustdoc-core rustdoc-compiler_builtins FORCE
112 $(call if_changed,rustdoc)
113
114rustdoc-kernel: private rustc_target_flags = --extern alloc \
115 --extern build_error --extern macros=$(objtree)/$(obj)/libmacros.so \
22ifdef CONFIG_RUST_BUILD_ASSERT_ALLOW
23obj-$(CONFIG_RUST) += build_error.o
24else
25always-$(CONFIG_RUST) += build_error.o
26endif
27
28obj-$(CONFIG_RUST) += exports.o
29

--- 81 unchanged lines hidden (view full) ---

111# due to things that are "configured out" vs. entirely non-existing ones.
112rustdoc-alloc: private rustc_target_flags = $(alloc-cfgs) \
113 -Arustdoc::broken_intra_doc_links
114rustdoc-alloc: $(src)/alloc/lib.rs rustdoc-core rustdoc-compiler_builtins FORCE
115 $(call if_changed,rustdoc)
116
117rustdoc-kernel: private rustc_target_flags = --extern alloc \
118 --extern build_error --extern macros=$(objtree)/$(obj)/libmacros.so \
116 --extern bindings
119 --extern bindings --extern uapi
117rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-macros \
118 rustdoc-compiler_builtins rustdoc-alloc $(obj)/libmacros.so \
119 $(obj)/bindings.o FORCE
120 $(call if_changed,rustdoc)
121
122quiet_cmd_rustc_test_library = RUSTC TL $<
123 cmd_rustc_test_library = \
124 OBJTREE=$(abspath $(objtree)) \

--- 11 unchanged lines hidden (view full) ---

136rusttestlib-macros: private rustc_target_flags = --extern proc_macro
137rusttestlib-macros: private rustc_test_library_proc = yes
138rusttestlib-macros: $(src)/macros/lib.rs rusttest-prepare FORCE
139 $(call if_changed,rustc_test_library)
140
141rusttestlib-bindings: $(src)/bindings/lib.rs rusttest-prepare FORCE
142 $(call if_changed,rustc_test_library)
143
120rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-macros \
121 rustdoc-compiler_builtins rustdoc-alloc $(obj)/libmacros.so \
122 $(obj)/bindings.o FORCE
123 $(call if_changed,rustdoc)
124
125quiet_cmd_rustc_test_library = RUSTC TL $<
126 cmd_rustc_test_library = \
127 OBJTREE=$(abspath $(objtree)) \

--- 11 unchanged lines hidden (view full) ---

139rusttestlib-macros: private rustc_target_flags = --extern proc_macro
140rusttestlib-macros: private rustc_test_library_proc = yes
141rusttestlib-macros: $(src)/macros/lib.rs rusttest-prepare FORCE
142 $(call if_changed,rustc_test_library)
143
144rusttestlib-bindings: $(src)/bindings/lib.rs rusttest-prepare FORCE
145 $(call if_changed,rustc_test_library)
146
147rusttestlib-uapi: $(src)/uapi/lib.rs rusttest-prepare FORCE
148 $(call if_changed,rustc_test_library)
149
144quiet_cmd_rustdoc_test = RUSTDOC T $<
145 cmd_rustdoc_test = \
146 OBJTREE=$(abspath $(objtree)) \
147 $(RUSTDOC) --test $(rust_common_flags) \
148 @$(objtree)/include/generated/rustc_cfg \
149 $(rustc_target_flags) $(rustdoc_test_target_flags) \
150 --sysroot $(objtree)/$(obj)/test/sysroot $(rustdoc_test_quiet) \
151 -L$(objtree)/$(obj)/test --output $(objtree)/$(obj)/doc \

--- 66 unchanged lines hidden (view full) ---

218
219rusttest-macros: private rustc_target_flags = --extern proc_macro
220rusttest-macros: private rustdoc_test_target_flags = --crate-type proc-macro
221rusttest-macros: $(src)/macros/lib.rs rusttest-prepare FORCE
222 $(call if_changed,rustc_test)
223 $(call if_changed,rustdoc_test)
224
225rusttest-kernel: private rustc_target_flags = --extern alloc \
150quiet_cmd_rustdoc_test = RUSTDOC T $<
151 cmd_rustdoc_test = \
152 OBJTREE=$(abspath $(objtree)) \
153 $(RUSTDOC) --test $(rust_common_flags) \
154 @$(objtree)/include/generated/rustc_cfg \
155 $(rustc_target_flags) $(rustdoc_test_target_flags) \
156 --sysroot $(objtree)/$(obj)/test/sysroot $(rustdoc_test_quiet) \
157 -L$(objtree)/$(obj)/test --output $(objtree)/$(obj)/doc \

--- 66 unchanged lines hidden (view full) ---

224
225rusttest-macros: private rustc_target_flags = --extern proc_macro
226rusttest-macros: private rustdoc_test_target_flags = --crate-type proc-macro
227rusttest-macros: $(src)/macros/lib.rs rusttest-prepare FORCE
228 $(call if_changed,rustc_test)
229 $(call if_changed,rustdoc_test)
230
231rusttest-kernel: private rustc_target_flags = --extern alloc \
226 --extern build_error --extern macros --extern bindings
232 --extern build_error --extern macros --extern bindings --extern uapi
227rusttest-kernel: $(src)/kernel/lib.rs rusttest-prepare \
233rusttest-kernel: $(src)/kernel/lib.rs rusttest-prepare \
228 rusttestlib-build_error rusttestlib-macros rusttestlib-bindings FORCE
234 rusttestlib-build_error rusttestlib-macros rusttestlib-bindings \
235 rusttestlib-uapi FORCE
229 $(call if_changed,rustc_test)
230 $(call if_changed,rustc_test_library)
231
232ifdef CONFIG_CC_IS_CLANG
233bindgen_c_flags = $(c_flags)
234else
235# bindgen relies on libclang to parse C. Ideally, bindgen would support a GCC
236# plugin backend and/or the Clang driver would be perfectly compatible with GCC.

--- 20 unchanged lines hidden (view full) ---

257BINDGEN_TARGET_x86 := x86_64-linux-gnu
258BINDGEN_TARGET := $(BINDGEN_TARGET_$(SRCARCH))
259
260# All warnings are inhibited since GCC builds are very experimental,
261# many GCC warnings are not supported by Clang, they may only appear in
262# some configurations, with new GCC versions, etc.
263bindgen_extra_c_flags = -w --target=$(BINDGEN_TARGET)
264
236 $(call if_changed,rustc_test)
237 $(call if_changed,rustc_test_library)
238
239ifdef CONFIG_CC_IS_CLANG
240bindgen_c_flags = $(c_flags)
241else
242# bindgen relies on libclang to parse C. Ideally, bindgen would support a GCC
243# plugin backend and/or the Clang driver would be perfectly compatible with GCC.

--- 20 unchanged lines hidden (view full) ---

264BINDGEN_TARGET_x86 := x86_64-linux-gnu
265BINDGEN_TARGET := $(BINDGEN_TARGET_$(SRCARCH))
266
267# All warnings are inhibited since GCC builds are very experimental,
268# many GCC warnings are not supported by Clang, they may only appear in
269# some configurations, with new GCC versions, etc.
270bindgen_extra_c_flags = -w --target=$(BINDGEN_TARGET)
271
265# Auto variable zero-initialization requires an additional special option with
266# clang that is going to be removed sometime in the future (likely in
267# clang-18), so make sure to pass this option only if clang supports it
268# (libclang major version < 16).
269#
270# https://github.com/llvm/llvm-project/issues/44842
271# https://github.com/llvm/llvm-project/blob/llvmorg-16.0.0-rc2/clang/docs/ReleaseNotes.rst#deprecated-compiler-flags
272ifdef CONFIG_INIT_STACK_ALL_ZERO
273libclang_maj_ver=$(shell $(BINDGEN) $(srctree)/scripts/rust_is_available_bindgen_libclang.h 2>&1 | sed -ne 's/.*clang version \([0-9]*\).*/\1/p')
274ifeq ($(shell expr $(libclang_maj_ver) \< 16), 1)
275bindgen_extra_c_flags += -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
276endif
277endif
278
279bindgen_c_flags = $(filter-out $(bindgen_skip_c_flags), $(c_flags)) \
280 $(bindgen_extra_c_flags)
281endif
282
283ifdef CONFIG_LTO
284bindgen_c_flags_lto = $(filter-out $(CC_FLAGS_LTO), $(bindgen_c_flags))
285else
286bindgen_c_flags_lto = $(bindgen_c_flags)

--- 5 unchanged lines hidden (view full) ---

292 cmd_bindgen = \
293 $(BINDGEN) $< $(bindgen_target_flags) \
294 --use-core --with-derive-default --ctypes-prefix core::ffi --no-layout-tests \
295 --no-debug '.*' \
296 --size_t-is-usize -o $@ -- $(bindgen_c_flags_final) -DMODULE \
297 $(bindgen_target_cflags) $(bindgen_target_extra)
298
299$(obj)/bindings/bindings_generated.rs: private bindgen_target_flags = \
272bindgen_c_flags = $(filter-out $(bindgen_skip_c_flags), $(c_flags)) \
273 $(bindgen_extra_c_flags)
274endif
275
276ifdef CONFIG_LTO
277bindgen_c_flags_lto = $(filter-out $(CC_FLAGS_LTO), $(bindgen_c_flags))
278else
279bindgen_c_flags_lto = $(bindgen_c_flags)

--- 5 unchanged lines hidden (view full) ---

285 cmd_bindgen = \
286 $(BINDGEN) $< $(bindgen_target_flags) \
287 --use-core --with-derive-default --ctypes-prefix core::ffi --no-layout-tests \
288 --no-debug '.*' \
289 --size_t-is-usize -o $@ -- $(bindgen_c_flags_final) -DMODULE \
290 $(bindgen_target_cflags) $(bindgen_target_extra)
291
292$(obj)/bindings/bindings_generated.rs: private bindgen_target_flags = \
300 $(shell grep -v '^#\|^$$' $(srctree)/$(src)/bindgen_parameters)
293 $(shell grep -v '^\#\|^$$' $(srctree)/$(src)/bindgen_parameters)
301$(obj)/bindings/bindings_generated.rs: $(src)/bindings/bindings_helper.h \
302 $(src)/bindgen_parameters FORCE
303 $(call if_changed_dep,bindgen)
304
294$(obj)/bindings/bindings_generated.rs: $(src)/bindings/bindings_helper.h \
295 $(src)/bindgen_parameters FORCE
296 $(call if_changed_dep,bindgen)
297
298$(obj)/uapi/uapi_generated.rs: private bindgen_target_flags = \
299 $(shell grep -v '^#\|^$$' $(srctree)/$(src)/bindgen_parameters)
300$(obj)/uapi/uapi_generated.rs: $(src)/uapi/uapi_helper.h \
301 $(src)/bindgen_parameters FORCE
302 $(call if_changed_dep,bindgen)
303
305# See `CFLAGS_REMOVE_helpers.o` above. In addition, Clang on C does not warn
306# with `-Wmissing-declarations` (unlike GCC), so it is not strictly needed here
307# given it is `libclang`; but for consistency, future Clang changes and/or
308# a potential future GCC backend for `bindgen`, we disable it too.
309$(obj)/bindings/bindings_helpers_generated.rs: private bindgen_target_flags = \
310 --blacklist-type '.*' --whitelist-var '' \
311 --whitelist-function 'rust_helper_.*'
312$(obj)/bindings/bindings_helpers_generated.rs: private bindgen_target_cflags = \

--- 84 unchanged lines hidden (view full) ---

397 $(call if_changed_dep,rustc_library)
398
399$(obj)/bindings.o: $(src)/bindings/lib.rs \
400 $(obj)/compiler_builtins.o \
401 $(obj)/bindings/bindings_generated.rs \
402 $(obj)/bindings/bindings_helpers_generated.rs FORCE
403 $(call if_changed_dep,rustc_library)
404
304# See `CFLAGS_REMOVE_helpers.o` above. In addition, Clang on C does not warn
305# with `-Wmissing-declarations` (unlike GCC), so it is not strictly needed here
306# given it is `libclang`; but for consistency, future Clang changes and/or
307# a potential future GCC backend for `bindgen`, we disable it too.
308$(obj)/bindings/bindings_helpers_generated.rs: private bindgen_target_flags = \
309 --blacklist-type '.*' --whitelist-var '' \
310 --whitelist-function 'rust_helper_.*'
311$(obj)/bindings/bindings_helpers_generated.rs: private bindgen_target_cflags = \

--- 84 unchanged lines hidden (view full) ---

396 $(call if_changed_dep,rustc_library)
397
398$(obj)/bindings.o: $(src)/bindings/lib.rs \
399 $(obj)/compiler_builtins.o \
400 $(obj)/bindings/bindings_generated.rs \
401 $(obj)/bindings/bindings_helpers_generated.rs FORCE
402 $(call if_changed_dep,rustc_library)
403
404$(obj)/uapi.o: $(src)/uapi/lib.rs \
405 $(obj)/compiler_builtins.o \
406 $(obj)/uapi/uapi_generated.rs FORCE
407 $(call if_changed_dep,rustc_library)
408
405$(obj)/kernel.o: private rustc_target_flags = --extern alloc \
409$(obj)/kernel.o: private rustc_target_flags = --extern alloc \
406 --extern build_error --extern macros --extern bindings
410 --extern build_error --extern macros --extern bindings --extern uapi
407$(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/alloc.o $(obj)/build_error.o \
411$(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/alloc.o $(obj)/build_error.o \
408 $(obj)/libmacros.so $(obj)/bindings.o FORCE
412 $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o FORCE
409 $(call if_changed_dep,rustc_library)
410
411endif # CONFIG_RUST
413 $(call if_changed_dep,rustc_library)
414
415endif # CONFIG_RUST