1# ========================================================================== 2# Installing headers 3# 4# header-y - list files to be installed. They are preprocessed 5# to remove __KERNEL__ section of the file 6# objhdr-y - Same as header-y but for generated files 7# 8# ========================================================================== 9 10# called may set destination dir (when installing to asm/) 11_dst := $(if $(dst),$(dst),$(obj)) 12 13kbuild-file := $(srctree)/$(obj)/Kbuild 14include $(kbuild-file) 15 16_dst := $(if $(destination-y),$(destination-y),$(_dst)) 17 18include scripts/Kbuild.include 19 20install := $(INSTALL_HDR_PATH)/$(_dst) 21 22header-y := $(sort $(header-y)) 23subdirs := $(patsubst %/,%,$(filter %/, $(header-y))) 24header-y := $(filter-out %/, $(header-y)) 25 26# files used to track state of install/check 27install-file := $(install)/.install 28check-file := $(install)/.check 29 30# generic-y list all files an architecture uses from asm-generic 31# Use this to build a list of headers which require a wrapper 32wrapper-files := $(filter $(header-y), $(generic-y)) 33 34# all headers files for this dir 35header-y := $(filter-out $(generic-y), $(header-y)) 36all-files := $(header-y) $(objhdr-y) $(wrapper-files) 37input-files := $(addprefix $(srctree)/$(obj)/,$(header-y)) \ 38 $(addprefix $(objtree)/$(obj)/,$(objhdr-y)) 39output-files := $(addprefix $(install)/, $(all-files)) 40 41# Work out what needs to be removed 42oldheaders := $(patsubst $(install)/%,%,$(wildcard $(install)/*.h)) 43unwanted := $(filter-out $(all-files),$(oldheaders)) 44 45# Prefix unwanted with full paths to $(INSTALL_HDR_PATH) 46unwanted-file := $(addprefix $(install)/, $(unwanted)) 47 48printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@)) 49 50quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\ 51 file$(if $(word 2, $(all-files)),s)) 52 cmd_install = \ 53 $(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(header-y); \ 54 $(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(objhdr-y); \ 55 for F in $(wrapper-files); do \ 56 echo "\#include <asm-generic/$$F>" > $(install)/$$F; \ 57 done; \ 58 touch $@ 59 60quiet_cmd_remove = REMOVE $(unwanted) 61 cmd_remove = rm -f $(unwanted-file) 62 63quiet_cmd_check = CHECK $(printdir) ($(words $(all-files)) files) 64# Headers list can be pretty long, xargs helps to avoid 65# the "Argument list too long" error. 66 cmd_check = for f in $(all-files); do \ 67 echo "$(install)/$${f}"; done \ 68 | xargs \ 69 $(PERL) $< $(INSTALL_HDR_PATH)/include $(SRCARCH); \ 70 touch $@ 71 72PHONY += __headersinst __headerscheck 73 74ifndef HDRCHECK 75# Rules for installing headers 76__headersinst: $(subdirs) $(install-file) 77 @: 78 79targets += $(install-file) 80$(install-file): scripts/headers_install.pl $(input-files) FORCE 81 $(if $(unwanted),$(call cmd,remove),) 82 $(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@))) 83 $(call if_changed,install) 84 85else 86__headerscheck: $(subdirs) $(check-file) 87 @: 88 89targets += $(check-file) 90$(check-file): scripts/headers_check.pl $(output-files) FORCE 91 $(call if_changed,check) 92 93endif 94 95# Recursion 96hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj 97.PHONY: $(subdirs) 98$(subdirs): 99 $(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(_dst)/$@ 100 101targets := $(wildcard $(sort $(targets))) 102cmd_files := $(wildcard \ 103 $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) 104 105ifneq ($(cmd_files),) 106 include $(cmd_files) 107endif 108 109.PHONY: $(PHONY) 110PHONY += FORCE 111FORCE: ; 112