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 17srcdir := $(srctree)/$(obj) 18 19# When make is run under a fakechroot environment, the function 20# $(wildcard $(srcdir)/*/.) doesn't only return directories, but also regular 21# files. So, we are using a combination of sort/dir/wildcard which works 22# with fakechroot. 23subdirs := $(patsubst $(srcdir)/%/,%,\ 24 $(filter-out $(srcdir)/,\ 25 $(sort $(dir $(wildcard $(srcdir)/*/))))) 26 27# Recursion 28__headers: $(subdirs) 29 30PHONY += $(subdirs) 31$(subdirs): 32 $(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(dst)/$@ 33 34# Skip header install/check for include/uapi and arch/$(SRCARCH)/include/uapi. 35# We have only sub-directories there. 36skip-inst := $(if $(filter %/uapi,$(obj)),1) 37 38ifeq ($(skip-inst),) 39 40# Kbuild file is optional 41kbuild-file := $(srctree)/$(obj)/Kbuild 42-include $(kbuild-file) 43 44installdir := $(INSTALL_HDR_PATH)/$(dst) 45gendir := $(objtree)/$(subst include/,include/generated/,$(obj)) 46header-files := $(notdir $(wildcard $(srcdir)/*.h)) 47header-files += $(notdir $(wildcard $(srcdir)/*.agh)) 48header-files := $(filter-out $(no-export-headers), $(header-files)) 49genhdr-files := $(notdir $(wildcard $(gendir)/*.h)) 50genhdr-files := $(filter-out $(header-files), $(genhdr-files)) 51 52# files used to track state of install/check 53install-file := $(installdir)/.install 54check-file := $(installdir)/.check 55 56# all headers files for this dir 57all-files := $(header-files) $(genhdr-files) 58output-files := $(addprefix $(installdir)/, $(all-files)) 59 60ifneq ($(mandatory-y),) 61missing := $(filter-out $(all-files),$(mandatory-y)) 62ifneq ($(missing),) 63$(error Some mandatory headers ($(missing)) are missing in $(obj)) 64endif 65endif 66 67# Work out what needs to be removed 68oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h)) 69unwanted := $(filter-out $(all-files),$(oldheaders)) 70 71# Prefix unwanted with full paths to $(INSTALL_HDR_PATH) 72unwanted-file := $(addprefix $(installdir)/, $(unwanted)) 73 74printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@)) 75 76quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\ 77 file$(if $(word 2, $(all-files)),s)) 78 cmd_install = \ 79 $(CONFIG_SHELL) $< $(installdir) $(srcdir) $(header-files); \ 80 $(CONFIG_SHELL) $< $(installdir) $(gendir) $(genhdr-files); \ 81 touch $@ 82 83quiet_cmd_remove = REMOVE $(unwanted) 84 cmd_remove = rm -f $(unwanted-file) 85 86quiet_cmd_check = CHECK $(printdir) ($(words $(all-files)) files) 87# Headers list can be pretty long, xargs helps to avoid 88# the "Argument list too long" error. 89 cmd_check = for f in $(all-files); do \ 90 echo "$(installdir)/$${f}"; done \ 91 | xargs \ 92 $(PERL) $< $(INSTALL_HDR_PATH)/include $(SRCARCH); \ 93 touch $@ 94 95ifndef HDRCHECK 96# Rules for installing headers 97__headers: $(install-file) 98 @: 99 100targets += $(install-file) 101$(install-file): scripts/headers_install.sh \ 102 $(addprefix $(srcdir)/,$(header-files)) \ 103 $(addprefix $(gendir)/,$(genhdr-files)) FORCE 104 $(if $(unwanted),$(call cmd,remove),) 105 $(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@))) 106 $(call if_changed,install) 107 108else 109__headers: $(check-file) 110 @: 111 112targets += $(check-file) 113$(check-file): scripts/headers_check.pl $(output-files) FORCE 114 $(call if_changed,check) 115 116endif 117 118cmd_files := $(wildcard \ 119 $(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd)) 120 121ifneq ($(cmd_files),) 122 include $(cmd_files) 123endif 124 125endif # skip-inst 126 127PHONY += FORCE 128FORCE: ; 129 130.PHONY: $(PHONY) 131