aboutsummaryrefslogtreecommitdiff
path: root/make
diff options
context:
space:
mode:
authorFrances Wingerter <wingerter@google.com>2023-12-13 10:49:18 -0500
committerFrances Wingerter <wingerter@google.com>2024-02-14 09:49:20 -0500
commit4e3ec773f258c1a26f5a342834f5fbaec9fa135c (patch)
tree2643a628176302d2905e6a42f55c3c575b4b65a9 /make
parentfb617c31d37b53845f71bf09780f925c8c651462 (diff)
downloadcommon-4e3ec773f258c1a26f5a342834f5fbaec9fa135c.tar.gz
build: plumbing for kernel proc-macro dependencies
Bug: 304850822 Change-Id: I9222c6faca5a7264d388cbbee9e5ffed16d66eb3
Diffstat (limited to 'make')
-rw-r--r--make/module.mk47
-rw-r--r--make/rust-toplevel.mk7
2 files changed, 42 insertions, 12 deletions
diff --git a/make/module.mk b/make/module.mk
index 2bfd05e7..db54bd32 100644
--- a/make/module.mk
+++ b/make/module.mk
@@ -207,8 +207,22 @@ include make/compile.mk
ifeq ($(MODULE_IS_RUST),true)
-# is module a kernel module? (using module.mk directly)
-ifeq ($(LIB_SAVED_MODULE),)
+# ensure that proc-macro libraries are considered host libraries. userspace does
+# this in library.mk, but we also compile proc-macro crates for the kernel here
+ifeq ($(MODULE_RUST_CRATE_TYPES),proc-macro)
+MODULE_RUST_HOST_LIB := true
+endif
+
+MODULE_IS_KERNEL :=
+# is module using old module system? (using module.mk directly)
+ifeq ($(TRUSTY_USERSPACE),)
+ifeq ($(call TOBOOL,$(MODULE_RUST_HOST_LIB)),false)
+MODULE_IS_KERNEL := true
+endif
+endif
+
+# is module being built as kernel code?
+ifeq ($(call TOBOOL,$(MODULE_IS_KERNEL)),true)
# validate crate name
ifeq ($(MODULE_CRATE_NAME),)
@@ -221,7 +235,7 @@ MODULE_KERNEL_RUST_DEPS := $(MODULE_LIBRARY_DEPS) $(MODULE_DEPS)
define READ_CRATE_INFO
QUERY_MODULE := $1
-QUERY_VARIABLES := MODULE_CRATE_NAME
+QUERY_VARIABLES := MODULE_CRATE_NAME MODULE_RUST_CRATE_TYPES
$$(eval include make/query.mk)
# crate name has no default; error if it is not given
@@ -231,21 +245,33 @@ endif
# assign queried variables for later use
MODULE_$(1)_CRATE_NAME := $$(QUERY_MODULE_CRATE_NAME)
+MODULE_$(1)_RUST_CRATE_TYPES := $$(if $$(QUERY_MODULE_RUST_CRATE_TYPES),$$(QUERY_MODULE_RUST_CRATE_TYPES),rlib)
endef
-# ensure that MODULE_..._CRATE_NAME is populated
+# ensure that MODULE_..._CRATE_NAME and _RUST_CRATE_TYPES is populated
$(foreach rust_dep,$(MODULE_KERNEL_RUST_DEPS),$(eval $(call READ_CRATE_INFO,$(rust_dep))))
-# add rust deps to the set of modules
-MODULES += $(MODULE_KERNEL_RUST_DEPS)
+# split deps into proc-macro and non- because the former are built for the host
+KERNEL_RUST_DEPS := $(foreach dep, $(MODULE_KERNEL_RUST_DEPS), $(if $(filter proc-macro,$(MODULE_$(dep)_RUST_CRATE_TYPES)),,$(dep)))
+
+HOST_RUST_DEPS := $(foreach dep, $(MODULE_KERNEL_RUST_DEPS), $(if $(filter proc-macro,$(MODULE_$(dep)_RUST_CRATE_TYPES)),$(dep),))
+
+# add kernel rust deps to the set of modules
+MODULES += $(KERNEL_RUST_DEPS)
# determine crate names of dependency modules so we can depend on their rlibs.
# because of ordering, we cannot simply e.g. set/read MODULE_$(dep)_CRATE_NAME,
# so we must manually read the variable value from the Makefile
-DEP_CRATE_NAMES := $(foreach dep, $(MODULE_KERNEL_RUST_DEPS), $(MODULE_$(dep)_CRATE_NAME))
+DEP_CRATE_NAMES := $(foreach dep, $(KERNEL_RUST_DEPS), $(MODULE_$(dep)_CRATE_NAME))
+
+# compute paths of host (proc-macro) dependencies
+HOST_DEP_CRATE_NAMES = $(foreach dep, $(HOST_RUST_DEPS), $(MODULE_$(dep)_CRATE_NAME))
+MODULE_KERNEL_RUST_HOST_LIBS := $(foreach dep, $(HOST_DEP_CRATE_NAMES), $(TRUSTY_HOST_LIBRARY_BUILDDIR)/lib$(dep).so)
+MODULE_RLIBS += $(foreach dep, $(HOST_DEP_CRATE_NAMES), $(dep)=$(TRUSTY_HOST_LIBRARY_BUILDDIR)/lib$(dep).so)
# save dep crate names so we can topologically sort then for top-level rust build
MODULE_$(MODULE_CRATE_NAME)_CRATE_DEPS := $(DEP_CRATE_NAMES)
+ALL_KERNEL_HOST_CRATE_NAMES := $(ALL_KERNEL_HOST_CRATE_NAMES) $(HOST_DEP_CRATE_NAMES)
# change BUILDDIR so RSOBJS for kernel are distinct targets from userspace ones
OLD_BUILDDIR := $(BUILDDIR)
@@ -256,7 +282,7 @@ MODULE_KERNEL_RUST_LIBS := $(foreach dep, $(DEP_CRATE_NAMES), $(call TOBUILDDIR,
MODULE_RLIBS += $(foreach dep, $(DEP_CRATE_NAMES), $(dep)=$(call TOBUILDDIR,lib$(dep).rlib))
# include rust lib deps in lib deps
-MODULE_LIBRARIES += $(MODULE_KERNEL_RUST_LIBS)
+MODULE_LIBRARIES += $(MODULE_KERNEL_RUST_LIBS) $(MODULE_KERNEL_RUST_HOST_LIBS)
# determine MODULE_RSOBJS and MODULE_RUST_CRATE_TYPES for rust kernel modules
include make/rust.mk
@@ -266,6 +292,9 @@ ifneq ($(MODULE_RUST_CRATE_TYPES),rlib)
$(error rust crates for the kernel must be built as rlibs only, but $(MODULE) builds $(MODULE_RUST_CRATE_TYPES))
endif
+# accumulate list of all crates we built (for linking, so skip proc-macro crates)
+ALLMODULE_CRATE_NAMES := $(MODULE_CRATE_NAME) $(ALLMODULE_CRATE_NAMES)
+
# reset BUILDDIR
BUILDDIR := $(OLD_BUILDDIR)
@@ -311,8 +340,6 @@ endif
# track the module rlib for make clean
GENERATED += $(MODULE_RSOBJS)
-# accumulate list of all crates we built
-ALLMODULE_CRATE_NAMES := $(MODULE_CRATE_NAME) $(ALLMODULE_CRATE_NAMES)
else # not rust
# Archive the module's object files into a static library.
diff --git a/make/rust-toplevel.mk b/make/rust-toplevel.mk
index e3e6c0de..1a50c297 100644
--- a/make/rust-toplevel.mk
+++ b/make/rust-toplevel.mk
@@ -1,5 +1,8 @@
# build a top-level wrapper crate as a staticlib to link into lk.elf
+# collect paths for proc-macro deps with BUILDDIR for host libs
+WRAPPER_RUST_EXTERN_PATHS := $(foreach crate, $(ALL_KERNEL_HOST_CRATE_NAMES), $(crate)=$(TRUSTY_HOST_LIBRARY_BUILDDIR)/lib$(crate).so)
+
# change BUILDDIR so RSOBJS for kernel are distinct targets from userspace ones
OLD_BUILDDIR := $(BUILDDIR)
BUILDDIR := $(BUILDDIR)/kernellib
@@ -30,12 +33,12 @@ include $(SORTED_CRATE_NAMES_FILE)
# build "--extern foo=/path/to/foo" flags for rustc
-WRAPPER_RUST_EXTERN_PATHS := $(foreach crate, $(ALLMODULE_CRATE_NAMES_SORTED), $(crate)=$(call TOBUILDDIR,lib$(crate).rlib))
+WRAPPER_RUST_EXTERN_PATHS += $(foreach crate, $(ALLMODULE_CRATE_NAMES_SORTED), $(crate)=$(call TOBUILDDIR,lib$(crate).rlib))
WRAPPER_RUSTFLAGS += $(addprefix --extern ,$(WRAPPER_RUST_EXTERN_PATHS))
# generate a .rs source file for the wrapper crate
# we must not explicitly "extern crate" core or compiler_builtins
-CRATES_TO_IMPORT := $(filter-out core compiler_builtins,$(ALLMODULE_CRATE_NAMES_SORTED))
+CRATES_TO_IMPORT := $(filter-out core compiler_builtins,$(ALL_KERNEL_HOST_CRATE_NAMES) $(ALLMODULE_CRATE_NAMES_SORTED))
RUST_WRAPPER_SRC := \#![feature(panic_abort)] \#![no_std] \
$(foreach crate, $(CRATES_TO_IMPORT), extern crate $(crate);) \
\#[panic_handler] fn handle_panic(_: &core::panic::PanicInfo) -> ! {loop {}}