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