# SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2026 Richard Qin # # scripts/Kbuild.include — shared Make helpers for LumeOS. # # Mirrors a small, useful subset of Linux's scripts/Kbuild.include. # Provides: # # - Q / KBUILD_VERBOSE : `make V=1` shows full commands, # default V=0 prints a one-line summary # - $(call cmd,) : echo a quiet summary, then run cmd_ # - $(call if_changed,) : rebuild when inputs or the command change. # # Naming convention adopted from Linux: each command has both a # `quiet_cmd_` (single-line summary) and a `cmd_` (full # command line). $(quiet) selects which prefix to display: # V=0 -> quiet := quiet_ -> echoes " CC foo.c" # V=1 -> quiet := -> echoes the full $(CC) $(CFLAGS) ... # ---------------------------------------------------------------------- # --- Verbosity --------------------------------------------------------- # Override at the command line: `make V=1`. Default V=0 = quiet. KBUILD_VERBOSE ?= $(V) KBUILD_VERBOSE ?= 0 ifeq ($(KBUILD_VERBOSE),1) Q := quiet := else Q := @ quiet := quiet_ endif # --- echo-cmd / cmd / if_changed --------------------------------------- # # echo-cmd prints the recipe's one-line summary (when quiet) or its full # command line (when verbose). Implementation uses $($(quiet)cmd_) # so the right form is picked up automatically. # # cmd is the workhorse: print summary, then execute the real command. echo-cmd = $(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))';) cmd = @$(echo-cmd) $(cmd_$(1)) # 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 --------------------------- # # Subdir Makefiles and the top-level Makefile can reference these by # name via $(call cmd,). 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 $(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 $(PRIVATE_SOURCE) cmd_cxx_o_cc = $(CXX) $(CXXFLAGS) $(PRIVATE_INCLUDES) $(PRIVATE_DEFINES) $(PRIVATE_CXXFLAGS) -c $(PRIVATE_SOURCE) -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 $(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 $@ cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ quiet_cmd_ld_kernel = LD $@ cmd_ld_kernel = $(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ $^