|  | # 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 <asm-generic/$*.h>" > $@ | 
|  |  | 
|  | 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) |