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