1# SPDX-License-Identifier: GPL-2.0 2# ========================================================================== 3# Installing headers 4# 5# All headers under include/uapi, include/generated/uapi, 6# arch/<arch>/include/uapi and arch/<arch>/include/generated/uapi are 7# exported. 8# They are preprocessed to remove __KERNEL__ section of the file. 9# 10# ========================================================================== 11 12PHONY := __headers 13__headers: 14 15include scripts/Kbuild.include 16 17src := $(srctree)/$(obj) 18gen := $(objtree)/$(subst include/,include/generated/,$(obj)) 19dst := usr/include 20 21-include $(src)/Kbuild 22 23src-subdirs := $(patsubst $(src)/%/,%,$(wildcard $(src)/*/)) 24gen-subdirs := $(patsubst $(gen)/%/,%,$(wildcard $(gen)/*/)) 25all-subdirs := $(sort $(src-subdirs) $(gen-subdirs)) 26 27src-headers := $(if $(src-subdirs), $(shell cd $(src) && find $(src-subdirs) -name '*.h')) 28src-headers := $(filter-out $(no-export-headers), $(src-headers)) 29gen-headers := $(if $(gen-subdirs), $(shell cd $(gen) && find $(gen-subdirs) -name '*.h')) 30gen-headers := $(filter-out $(no-export-headers), $(gen-headers)) 31 32# If the same header is exported from source and generated directories, 33# the former takes precedence, but this should be warned. 34duplicated := $(filter $(gen-headers), $(src-headers)) 35$(if $(duplicated), $(warning duplicated header export: $(duplicated))) 36 37gen-headers := $(filter-out $(duplicated), $(gen-headers)) 38 39# Add dst path prefix 40all-subdirs := $(addprefix $(dst)/, $(all-subdirs)) 41src-headers := $(addprefix $(dst)/, $(src-headers)) 42gen-headers := $(addprefix $(dst)/, $(gen-headers)) 43all-headers := $(src-headers) $(gen-headers) 44 45# Work out what needs to be removed 46old-subdirs := $(wildcard $(all-subdirs)) 47old-headers := $(if $(old-subdirs),$(shell find $(old-subdirs) -name '*.h')) 48unwanted := $(filter-out $(all-headers), $(old-headers)) 49 50# Create directories 51existing-dirs := $(sort $(dir $(old-headers))) 52wanted-dirs := $(sort $(dir $(all-headers))) 53new-dirs := $(filter-out $(existing-dirs), $(wanted-dirs)) 54$(if $(new-dirs), $(shell mkdir -p $(new-dirs))) 55 56# Rules 57 58ifndef HDRCHECK 59 60quiet_cmd_install = HDRINST $@ 61 cmd_install = $(CONFIG_SHELL) $(srctree)/scripts/headers_install.sh $(@D) $(<D) $(@F) 62 63$(src-headers): $(dst)/%.h: $(src)/%.h $(srctree)/scripts/headers_install.sh FORCE 64 $(call if_changed,install) 65 66$(gen-headers): $(dst)/%.h: $(gen)/%.h $(srctree)/scripts/headers_install.sh FORCE 67 $(call if_changed,install) 68 69quiet_cmd_remove = REMOVE $(unwanted) 70 cmd_remove = rm -f $(unwanted) 71 72__headers: $(all-headers) 73ifneq ($(unwanted),) 74 $(call cmd,remove) 75endif 76 @: 77 78existing-headers := $(filter $(old-headers), $(all-headers)) 79 80-include $(foreach f,$(existing-headers),$(dir $(f)).$(notdir $(f)).cmd) 81 82else 83 84quiet_cmd_check = HDRCHK $< 85 cmd_check = $(PERL) $(srctree)/scripts/headers_check.pl $(dst) $(SRCARCH) $<; touch $@ 86 87check-files := $(addsuffix .chk, $(all-headers)) 88 89$(check-files): $(dst)/%.chk : $(dst)/% $(srctree)/scripts/headers_check.pl 90 $(call cmd,check) 91 92__headers: $(check-files) 93 @: 94 95endif 96 97PHONY += FORCE 98FORCE: 99 100.PHONY: $(PHONY) 101