summaryrefslogtreecommitdiff
path: root/scripts/Kbuild.include
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-07-10 23:20:03 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-07-10 23:20:03 +0800
commit48ef95c24e9ac3d11200b61af617a01b10b507d1 (patch)
tree57f0e26ab98e795b19839b6eece98ca58a4b702d /scripts/Kbuild.include
parentb9ff206e6bd3f4d67851263a6f2acb5f575cf3b0 (diff)
downloadlume-48ef95c24e9ac3d11200b61af617a01b10b507d1.tar.gz
lume-48ef95c24e9ac3d11200b61af617a01b10b507d1.tar.xz
build: introduce declarative non-recursive build graph
Diffstat (limited to 'scripts/Kbuild.include')
-rw-r--r--scripts/Kbuild.include136
1 files changed, 91 insertions, 45 deletions
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index 76466bd..7ccc03d 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -9,14 +9,7 @@
# - Q / KBUILD_VERBOSE : `make V=1` shows full commands,
# default V=0 prints a one-line summary
# - $(call cmd,<name>) : echo a quiet summary, then run cmd_<name>
-# - $(call if_changed,<name>) : currently a thin alias for $(cmd) —
-# no .cmd-file hashing yet (Linux's full
-# if_changed uses fixdep to detect both
-# recipe-text and header changes; LumeOS
-# relies on `-MMD -MP` for headers and
-# on `make clean` for flag changes).
-# - $(call kbuild-objs,...) : translate Kbuild-style `obj-y := foo.o`
-# entries into SRCS_C / SRCS_CC.
+# - $(call if_changed,<name>) : rebuild when inputs or the command change.
#
# Naming convention adopted from Linux: each command has both a
# `quiet_cmd_<name>` (single-line summary) and a `cmd_<name>` (full
@@ -49,11 +42,11 @@ echo-cmd = $(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))';)
cmd = @$(echo-cmd) $(cmd_$(1))
-# if_changed currently degenerates to `cmd` — full Linux semantics
-# require tracking the command-line via per-target .<file>.cmd files
-# and comparing on every rebuild, which needs fixdep. Until LumeOS
-# grows that infrastructure, `make clean` after editing CFLAGS suffices.
-if_changed = $(cmd)
+# Record a checksum of the exact argv next to each output. FORCE makes Make
+# reconsider the action; run-if-changed executes it only for a changed input or
+# command signature.
+if_changed = @scripts/build/run-if-changed.sh \
+ $(dir $@).$(notdir $@).cmd $@ '$($(quiet)cmd_$(1))' $^ -- $(cmd_$(1))
# --- Standard quiet_cmd_* / cmd_* templates ---------------------------
#
@@ -61,21 +54,99 @@ if_changed = $(cmd)
# name via $(call cmd,<name>). Add new pairs here as new recipe shapes
# show up (e.g., cmd_lz / cmd_gz / cmd_zstd for compressed Image targets).
- quiet_cmd_cc_o_c = CC $<
- cmd_cc_o_c = $(CC) $(CFLAGS_LIBC) -c $< -o $@
+ quiet_cmd_cc_o_c = CC $(PRIVATE_SOURCE)
+ cmd_cc_o_c = $(CC) $(CFLAGS_LIBC) $(PRIVATE_INCLUDES) $(PRIVATE_DEFINES) $(PRIVATE_CFLAGS) -c $(PRIVATE_SOURCE) -o $@
- quiet_cmd_cxx_o_cc = CXX $<
- cmd_cxx_o_cc = $(CXX) $(CXXFLAGS) -c $< -o $@
+ quiet_cmd_cxx_o_cc = CXX $(PRIVATE_SOURCE)
+ cmd_cxx_o_cc = $(CXX) $(CXXFLAGS) $(PRIVATE_INCLUDES) $(PRIVATE_DEFINES) $(PRIVATE_CXXFLAGS) -c $(PRIVATE_SOURCE) -o $@
- quiet_cmd_as_o_S = AS $<
- cmd_as_o_S = $(CC) $(ASFLAGS) -c $< -o $@
+ quiet_cmd_as_o_S = AS $(PRIVATE_SOURCE)
+ cmd_as_o_S = $(CC) $(ASFLAGS) $(PRIVATE_INCLUDES) $(PRIVATE_DEFINES) $(PRIVATE_ASFLAGS) -c $(PRIVATE_SOURCE) -o $@
quiet_cmd_cc_s_c = CC -S $<
- cmd_cc_s_c = $(CC) $(CFLAGS_LIBC) -S $< -o $@
+ cmd_cc_s_c = $(CC) $(CFLAGS_LIBC) -S $(PRIVATE_SOURCE) -o $@
+
+ quiet_cmd_gen_asm_offsets = GEN $@
+ cmd_gen_asm_offsets = scripts/build/generate-asm-offsets.sh $@ \
+ $(ASM_OFFSETS_S) $(ASM_OFFSETS_SED) $(ASM_OFFSETS_C)
+
+ quiet_cmd_autoconf = GEN $@
+ cmd_autoconf = scripts/build/generate-autoconf.sh $@ \
+ CONFIG_NR_CPUS $(CONFIG_NR_CPUS) value \
+ CONFIG_HZ $(CONFIG_HZ) value \
+ CONFIG_NR_PRIORITIES $(CONFIG_NR_PRIORITIES) value \
+ CONFIG_DEFAULT_PRIORITY $(CONFIG_DEFAULT_PRIORITY) value \
+ CONFIG_IDLE_PRIORITY $(CONFIG_IDLE_PRIORITY) value \
+ CONFIG_DEFAULT_TIMESLICE $(CONFIG_DEFAULT_TIMESLICE) value \
+ CONFIG_PAGE_SIZE $(CONFIG_PAGE_SIZE) value \
+ CONFIG_MAX_ORDER $(CONFIG_MAX_ORDER) value \
+ CONFIG_KERNEL_STACK_SIZE $(CONFIG_KERNEL_STACK_SIZE) value \
+ CONFIG_KASLR $(CONFIG_KASLR) bool \
+ CONFIG_KASLR_POLICY_ID $(CONFIG_KASLR_POLICY_ID) value \
+ CONFIG_KASLR_LOG_LEVEL $(CONFIG_KASLR_LOG_LEVEL) value \
+ CONFIG_STACK_CANARY $(CONFIG_STACK_CANARY) bool \
+ CONFIG_DEBUG $(CONFIG_DEBUG) bool \
+ CONFIG_DEBUG_LOCKS $(CONFIG_DEBUG_LOCKS) bool \
+ CONFIG_SELFTEST $(CONFIG_SELFTEST) bool \
+ CONFIG_KLOG $(CONFIG_KLOG) bool \
+ CONFIG_KERNEL_COMPRESSED $(CONFIG_KERNEL_COMPRESSED) bool
+
+ quiet_cmd_linker_script = LDS $@
+ cmd_linker_script = $(CC) -E -P -x c $(INCLUDES) $(PRIVATE_SOURCE) -o $@
+
+ quiet_cmd_initramfs = INITRAMFS $(INITRAMFS_SOURCE)
+ cmd_initramfs = scripts/build/generate-initramfs.sh $(GEN_INIT_CPIO) \
+ ./scripts/gen_initramfs.sh $@ \
+ $(CONFIG_INITRAMFS_ROOT_UID) $(CONFIG_INITRAMFS_ROOT_GID) \
+ $(INITRAMFS_SOURCE)
+
+ quiet_cmd_initramfs_obj = AS $@ (initramfs)
+ cmd_initramfs_obj = $(CC) $(ASFLAGS) \
+ -DINITRAMFS_IMAGE='"$(INITRAMFS_CPIO)"' \
+ -c $(PRIVATE_SOURCE) -o $@
quiet_cmd_objcopy_bin = OBJCOPY $@
cmd_objcopy_bin = $(OBJCOPY) -O binary $< $@
+ quiet_cmd_archive = AR $@
+ cmd_archive = scripts/build/archive.sh $@ $(AR) $(PRIVATE_ARCHIVE_OBJECTS)
+
+ quiet_cmd_host_tool = HOSTCC $@
+ cmd_host_tool = $(HOSTCC) $(HOSTCFLAGS) $(PRIVATE_HOST_CFLAGS) \
+ -o $@ $(PRIVATE_HOST_SOURCE)
+
+ quiet_cmd_host_cc_o_c = HOSTCC $(PRIVATE_SOURCE)
+ cmd_host_cc_o_c = $(HOSTCC) $(HOSTCFLAGS) -MMD -MP -c $(PRIVATE_SOURCE) -o $@
+
+ quiet_cmd_host_cxx_o_cc = HOSTCXX $(PRIVATE_SOURCE)
+ cmd_host_cxx_o_cc = $(HOSTCXX) $(HOSTCXXFLAGS) -MMD -MP -c $(PRIVATE_SOURCE) -o $@
+
+ quiet_cmd_host_archive = HOSTAR $@
+ cmd_host_archive = scripts/build/archive.sh $@ $(HOSTAR) $(PRIVATE_ARCHIVE_OBJECTS)
+
+ quiet_cmd_host_link = HOSTLD $@
+ cmd_host_link = $(HOSTCXX) $(HOSTCXXFLAGS) -o $@ \
+ $(PRIVATE_HOST_OBJECTS) $(PRIVATE_HOST_LIBS)
+
+ quiet_cmd_toolchain_probe = PROBE toolchain
+ cmd_toolchain_probe = scripts/build/probe-toolchain.sh $@ \
+ $(CC) $(CXX) $(LD) $(COMPILER_FAMILY) $(TARGET_TRIPLE) \
+ '$(GCC_TOOLCHAIN)' '$(GCC_SYSROOT)'
+
+ quiet_cmd_phys_cc_o_c = PHYSCC $(PRIVATE_SOURCE)
+ cmd_phys_cc_o_c = $(CC) $(PHYS_CFLAGS) -MMD -MP -c $(PRIVATE_SOURCE) -o $@
+
+ quiet_cmd_phys_cxx_o_cc = PHYSCXX $(PRIVATE_SOURCE)
+ cmd_phys_cxx_o_cc = $(CXX) $(PHYS_CXXFLAGS) -MMD -MP -c $(PRIVATE_SOURCE) -o $@
+
+ quiet_cmd_phys_as_o_S = PHYSAS $(PRIVATE_SOURCE)
+ cmd_phys_as_o_S = $(CC) $(PHYS_ASFLAGS) -MMD -MP -c $(PRIVATE_SOURCE) -o $@
+
+ quiet_cmd_link_vmlume = LD $@
+ cmd_link_vmlume = scripts/build/link-kernel.sh $@ $(SIZE) \
+ $(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ \
+ $(KERNEL_LINK_INPUTS) $(INITRAMFS_OBJ)
+
# Objcopy with custom flags via per-target OBJCOPYFLAGS variable —
# used by the .pi.o post-processing rule (--prefix-symbols=__pi_ etc.).
quiet_cmd_objcopy = OBJCOPY $@
@@ -83,28 +154,3 @@ if_changed = $(cmd)
quiet_cmd_ld_kernel = LD $@
cmd_ld_kernel = $(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ $^
-
-# --- kbuild-objs: obj-y -> SRCS_C / SRCS_CC ---------------------------
-#
-# Usage from a subdir Makefile (e.g. arch/riscv/kernel/pi/Makefile):
-#
-# obj-dir := arch/riscv/kernel/pi
-# obj-y := fdt_early.pi.o cmdline_early.pi.o archrandom_early.pi.o
-# $(eval $(call kbuild-objs,$(obj-dir),$(obj-y:.pi.o=.o)))
-#
-# For each <name>.o entry, looks up <dir>/<name>.cc first, then
-# <dir>/<name>.c, and appends to SRCS_CC / SRCS_C respectively.
-# Pure .pi.o entries should be passed through `:.pi.o=.o` first by the
-# caller so the .pi suffix doesn't confuse the source-file lookup.
-
-define _kbuild-find-src
-$(if $(wildcard $(1)/$(basename $(2)).cc),\
- $(eval SRCS_CC += $(1)/$(basename $(2)).cc),\
- $(if $(wildcard $(1)/$(basename $(2)).c),\
- $(eval SRCS_C += $(1)/$(basename $(2)).c),\
- $(error kbuild-objs: no $(1)/$(basename $(2)).{c,cc} for obj $(2))))
-endef
-
-define kbuild-objs
-$(foreach _obj,$(2),$(call _kbuild-find-src,$(1),$(_obj)))
-endef