49208b6758
Commitfbb5c0606f
("kbuild: add syscall table generation to scripts/Makefile.asm-headers") started to generate syscall headers for architectures using generic syscalls. However, these headers are always rebuilt using GNU Make 4.4.1 or newer. When using GNU Make 4.4 or older, these headers are not rebuilt when the command to generate them is changed, despite the use of the if_changed macro. scripts/Makefile.asm-headers now uses FORCE, but it is not marked as .PHONY. To handle the command line change correctly, .*.cmd files must be included. Fixes:fbb5c0606f
("kbuild: add syscall table generation to scripts/Makefile.asm-headers") Reported-by: Linus Torvalds <torvalds@linux-foundation.org> Closes: https://lore.kernel.org/lkml/CAHk-=wibB7SvXnUftBgAt+4-3vEKRpvEgBeDEH=i=j2GvDitoA@mail.gmail.com/ Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Tested-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
106 lines
3.4 KiB
Makefile
106 lines
3.4 KiB
Makefile
# 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)
|