mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	kbuild: add syscall table generation to scripts/Makefile.asm-headers
There are 11 copies of arch/*/kernel/syscalls/Makefile that all implement the same basic logic in a somewhat awkward way. I tried out various ways of unifying the existing copies and ended up with something that hooks into the logic for generating the redirections to asm-generic headers. This gives a nicer syntax of being able to list the generated files in $(syscall-y) inside of arch/*/include/asm/Kbuild instead of both $(generated-y) in that place and also in another Makefile. The configuration for which syscall.tbl file to use and which ABIs to enable is now done in arch/*/kernel/Makefile.syscalls. I have done patches for all architectures and made sure that the new generic rules implement a superset of all the architecture specific corner cases. ince the header file is not specific to asm-generic/*.h redirects now, I ended up renaming the file to scripts/Makefile.asm-headers. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
		
							parent
							
								
									b70f12e962
								
							
						
					
					
						commit
						fbb5c0606f
					
				
					 3 changed files with 99 additions and 59 deletions
				
			
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							|  | @ -1219,7 +1219,7 @@ remove-stale-files: | |||
| 	$(Q)$(srctree)/scripts/remove-stale-files | ||||
| 
 | ||||
| # Support for using generic headers in asm-generic
 | ||||
| asm-generic := -f $(srctree)/scripts/Makefile.asm-generic obj | ||||
| asm-generic := -f $(srctree)/scripts/Makefile.asm-headers obj | ||||
| 
 | ||||
| PHONY += asm-generic uapi-asm-generic | ||||
| asm-generic: uapi-asm-generic | ||||
|  |  | |||
|  | @ -1,58 +0,0 @@ | |||
| # SPDX-License-Identifier: GPL-2.0 | ||||
| # include/asm-generic contains a lot of files that are used | ||||
| # verbatim by several architectures. | ||||
| # | ||||
| # This Makefile reads the file arch/$(SRCARCH)/include/(uapi/)/asm/Kbuild | ||||
| # and for each file listed in this file with generic-y creates | ||||
| # a small wrapper file in arch/$(SRCARCH)/include/generated/(uapi/)/asm. | ||||
| 
 | ||||
| PHONY := all | ||||
| all: | ||||
| 
 | ||||
| src := $(srctree)/$(subst /generated,,$(obj)) | ||||
| 
 | ||||
| include $(srctree)/scripts/Kbuild.include | ||||
| -include $(kbuild-file) | ||||
| 
 | ||||
| # $(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)) | ||||
| 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),$(old-headers)) | ||||
| 
 | ||||
| quiet_cmd_wrap = WRAP    $@ | ||||
|       cmd_wrap = echo "\#include <asm-generic/$*.h>" > $@ | ||||
| 
 | ||||
| quiet_cmd_remove = REMOVE  $(unwanted) | ||||
|       cmd_remove = rm -f $(unwanted) | ||||
| 
 | ||||
| all: $(generic-y) | ||||
| 	$(if $(unwanted),$(call cmd,remove)) | ||||
| 	@: | ||||
| 
 | ||||
| $(obj)/%.h: $(srctree)/$(generic)/%.h | ||||
| 	$(call cmd,wrap) | ||||
| 
 | ||||
| # 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: $(PHONY) | ||||
							
								
								
									
										98
									
								
								scripts/Makefile.asm-headers
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								scripts/Makefile.asm-headers
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,98 @@ | |||
| # 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) | ||||
| 
 | ||||
| # 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 | ||||
| 
 | ||||
| FORCE: | ||||
| 
 | ||||
| .PHONY: $(PHONY) | ||||
		Loading…
	
		Reference in a new issue
	
	 Arnd Bergmann
						Arnd Bergmann