# SPDX-License-Identifier: GPL-2.0 # include/asm-generic contains a lot of files that are used # verbatim by several architectures. # # This Makefile generates arch/$(SRCARCH)/include/generated/(uapi/)/asm # headers from multiple sources: # - a small wrapper to include the corresponding asm-generic/*.h # is generated for each file listed as generic-y # - uapi/asm/unistd_*.h files listed as syscalls-y are generated from # syscall.tbl with the __NR_* macros # - Corresponding asm/syscall_table_*.h are generated from the same input PHONY := all all: src := $(srctree)/$(subst /generated,,$(obj)) syscall_abis_32 += common,32 syscall_abis_64 += common,64 syscalltbl := $(srctree)/scripts/syscall.tbl syshdr-args := --emit-nr # let architectures override $(syscall_abis_%) and $(syscalltbl) -include $(srctree)/arch/$(SRCARCH)/kernel/Makefile.syscalls include $(srctree)/scripts/Kbuild.include -include $(kbuild-file) syshdr := $(srctree)/scripts/syscallhdr.sh systbl := $(srctree)/scripts/syscalltbl.sh # $(generic)/Kbuild lists mandatory-y. Exclude um since it is a special case. ifneq ($(SRCARCH),um) include $(srctree)/$(generic)/Kbuild endif redundant := $(filter $(mandatory-y) $(generated-y), $(generic-y)) redundant += $(foreach f, $(generic-y), $(if $(wildcard $(src)/$(f)),$(f))) redundant := $(sort $(redundant)) $(if $(redundant),\ $(warning redundant generic-y found in $(src)/Kbuild: $(redundant))) # If arch does not implement mandatory headers, fallback to asm-generic ones. mandatory-y := $(filter-out $(generated-y), $(mandatory-y)) generic-y += $(foreach f, $(mandatory-y), $(if $(wildcard $(src)/$(f)),,$(f))) generic-y := $(addprefix $(obj)/, $(generic-y)) syscall-y := $(addprefix $(obj)/, $(syscall-y)) generated-y := $(addprefix $(obj)/, $(generated-y)) # Remove stale wrappers when the corresponding files are removed from generic-y old-headers := $(wildcard $(obj)/*.h) unwanted := $(filter-out $(generic-y) $(generated-y) $(syscall-y),$(old-headers)) quiet_cmd_wrap = WRAP $@ cmd_wrap = echo "\#include " > $@ quiet_cmd_remove = REMOVE $(unwanted) cmd_remove = rm -f $(unwanted) quiet_cmd_syshdr = SYSHDR $@ cmd_syshdr = $(CONFIG_SHELL) $(syshdr) \ $(if $(syshdr-args-$*),$(syshdr-args-$*),$(syshdr-args)) \ $(if $(syscall_compat),--prefix "compat$*_") \ --abis $(subst $(space),$(comma),$(strip $(syscall_abis_$*))) \ $< $@ quiet_cmd_systbl = SYSTBL $@ cmd_systbl = $(CONFIG_SHELL) $(systbl) \ $(if $(systbl-args-$*),$(systbl-args-$*),$(systbl-args)) \ --abis $(subst $(space),$(comma),$(strip $(syscall_abis_$*))) \ $< $@ all: $(generic-y) $(syscall-y) $(if $(unwanted),$(call cmd,remove)) @: $(obj)/%.h: $(srctree)/$(generic)/%.h $(call cmd,wrap) $(obj)/unistd_%.h: $(syscalltbl) $(syshdr) FORCE $(call if_changed,syshdr) $(obj)/unistd_compat_%.h: syscall_compat:=1 $(obj)/unistd_compat_%.h: $(syscalltbl) $(syshdr) FORCE $(call if_changed,syshdr) $(obj)/syscall_table_%.h: $(syscalltbl) $(systbl) FORCE $(call if_changed,systbl) targets := $(syscall-y) # Create output directory. Skip it if at least one old header exists # since we know the output directory already exists. ifeq ($(old-headers),) $(shell mkdir -p $(obj)) endif PHONY += FORCE FORCE: existing-targets := $(wildcard $(sort $(targets))) -include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) .PHONY: $(PHONY)