| .. | .. |
|---|
| 14 | 14 | |
|---|
| 15 | 15 | include scripts/Kbuild.include |
|---|
| 16 | 16 | |
|---|
| 17 | | -srcdir := $(srctree)/$(obj) |
|---|
| 17 | +src := $(srctree)/$(obj) |
|---|
| 18 | +gen := $(objtree)/$(subst include/,include/generated/,$(obj)) |
|---|
| 19 | +dst := usr/include |
|---|
| 18 | 20 | |
|---|
| 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. |
|---|
| 23 | | -subdirs := $(patsubst $(srcdir)/%/,%,\ |
|---|
| 24 | | - $(filter-out $(srcdir)/,\ |
|---|
| 25 | | - $(sort $(dir $(wildcard $(srcdir)/*/))))) |
|---|
| 21 | +-include $(src)/Kbuild |
|---|
| 26 | 22 | |
|---|
| 27 | | -# Recursion |
|---|
| 28 | | -__headers: $(subdirs) |
|---|
| 23 | +# $(filter %/, ...) is a workaround for GNU Make <= 4.2.1, where |
|---|
| 24 | +# $(wildcard $(src)/*/) contains not only directories but also regular files. |
|---|
| 25 | +src-subdirs := $(patsubst $(src)/%/,%,$(filter %/, $(wildcard $(src)/*/))) |
|---|
| 26 | +gen-subdirs := $(patsubst $(gen)/%/,%,$(filter %/, $(wildcard $(gen)/*/))) |
|---|
| 27 | +all-subdirs := $(sort $(src-subdirs) $(gen-subdirs)) |
|---|
| 29 | 28 | |
|---|
| 30 | | -PHONY += $(subdirs) |
|---|
| 31 | | -$(subdirs): |
|---|
| 32 | | - $(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(dst)/$@ |
|---|
| 29 | +src-headers := $(if $(src-subdirs), $(shell cd $(src) && find $(src-subdirs) -name '*.h')) |
|---|
| 30 | +src-headers := $(filter-out $(no-export-headers), $(src-headers)) |
|---|
| 31 | +gen-headers := $(if $(gen-subdirs), $(shell cd $(gen) && find $(gen-subdirs) -name '*.h')) |
|---|
| 32 | +gen-headers := $(filter-out $(no-export-headers), $(gen-headers)) |
|---|
| 33 | 33 | |
|---|
| 34 | | -# Skip header install/check for include/uapi and arch/$(SRCARCH)/include/uapi. |
|---|
| 35 | | -# We have only sub-directories there. |
|---|
| 36 | | -skip-inst := $(if $(filter %/uapi,$(obj)),1) |
|---|
| 34 | +# If the same header is exported from source and generated directories, |
|---|
| 35 | +# the former takes precedence, but this should be warned. |
|---|
| 36 | +duplicated := $(filter $(gen-headers), $(src-headers)) |
|---|
| 37 | +$(if $(duplicated), $(warning duplicated header export: $(duplicated))) |
|---|
| 37 | 38 | |
|---|
| 38 | | -ifeq ($(skip-inst),) |
|---|
| 39 | +gen-headers := $(filter-out $(duplicated), $(gen-headers)) |
|---|
| 39 | 40 | |
|---|
| 40 | | -# Kbuild file is optional |
|---|
| 41 | | -kbuild-file := $(srctree)/$(obj)/Kbuild |
|---|
| 42 | | --include $(kbuild-file) |
|---|
| 43 | | - |
|---|
| 44 | | -installdir := $(INSTALL_HDR_PATH)/$(dst) |
|---|
| 45 | | -gendir := $(objtree)/$(subst include/,include/generated/,$(obj)) |
|---|
| 46 | | -header-files := $(notdir $(wildcard $(srcdir)/*.h)) |
|---|
| 47 | | -header-files += $(notdir $(wildcard $(srcdir)/*.agh)) |
|---|
| 48 | | -header-files := $(filter-out $(no-export-headers), $(header-files)) |
|---|
| 49 | | -genhdr-files := $(notdir $(wildcard $(gendir)/*.h)) |
|---|
| 50 | | -genhdr-files := $(filter-out $(header-files), $(genhdr-files)) |
|---|
| 51 | | - |
|---|
| 52 | | -# files used to track state of install/check |
|---|
| 53 | | -install-file := $(installdir)/.install |
|---|
| 54 | | -check-file := $(installdir)/.check |
|---|
| 55 | | - |
|---|
| 56 | | -# all headers files for this dir |
|---|
| 57 | | -all-files := $(header-files) $(genhdr-files) |
|---|
| 58 | | -output-files := $(addprefix $(installdir)/, $(all-files)) |
|---|
| 59 | | - |
|---|
| 60 | | -ifneq ($(mandatory-y),) |
|---|
| 61 | | -missing := $(filter-out $(all-files),$(mandatory-y)) |
|---|
| 62 | | -ifneq ($(missing),) |
|---|
| 63 | | -$(error Some mandatory headers ($(missing)) are missing in $(obj)) |
|---|
| 64 | | -endif |
|---|
| 65 | | -endif |
|---|
| 41 | +# Add dst path prefix |
|---|
| 42 | +all-subdirs := $(addprefix $(dst)/, $(all-subdirs)) |
|---|
| 43 | +src-headers := $(addprefix $(dst)/, $(src-headers)) |
|---|
| 44 | +gen-headers := $(addprefix $(dst)/, $(gen-headers)) |
|---|
| 45 | +all-headers := $(src-headers) $(gen-headers) |
|---|
| 66 | 46 | |
|---|
| 67 | 47 | # Work out what needs to be removed |
|---|
| 68 | | -oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h)) |
|---|
| 69 | | -unwanted := $(filter-out $(all-files),$(oldheaders)) |
|---|
| 48 | +old-subdirs := $(wildcard $(all-subdirs)) |
|---|
| 49 | +old-headers := $(if $(old-subdirs),$(shell find $(old-subdirs) -name '*.h')) |
|---|
| 50 | +unwanted := $(filter-out $(all-headers), $(old-headers)) |
|---|
| 70 | 51 | |
|---|
| 71 | | -# Prefix unwanted with full paths to $(INSTALL_HDR_PATH) |
|---|
| 72 | | -unwanted-file := $(addprefix $(installdir)/, $(unwanted)) |
|---|
| 52 | +# Create directories |
|---|
| 53 | +existing-dirs := $(sort $(dir $(old-headers))) |
|---|
| 54 | +wanted-dirs := $(sort $(dir $(all-headers))) |
|---|
| 55 | +new-dirs := $(filter-out $(existing-dirs), $(wanted-dirs)) |
|---|
| 56 | +$(if $(new-dirs), $(shell mkdir -p $(new-dirs))) |
|---|
| 73 | 57 | |
|---|
| 74 | | -printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@)) |
|---|
| 58 | +# Rules |
|---|
| 59 | +quiet_cmd_install = HDRINST $@ |
|---|
| 60 | + cmd_install = $(CONFIG_SHELL) $(srctree)/scripts/headers_install.sh $< $@ |
|---|
| 75 | 61 | |
|---|
| 76 | | -quiet_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 | | - |
|---|
| 83 | | -quiet_cmd_remove = REMOVE $(unwanted) |
|---|
| 84 | | - cmd_remove = rm -f $(unwanted-file) |
|---|
| 85 | | - |
|---|
| 86 | | -quiet_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 | | - |
|---|
| 95 | | -ifndef HDRCHECK |
|---|
| 96 | | -# Rules for installing headers |
|---|
| 97 | | -__headers: $(install-file) |
|---|
| 98 | | - @: |
|---|
| 99 | | - |
|---|
| 100 | | -targets += $(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 $@))) |
|---|
| 62 | +$(src-headers): $(dst)/%.h: $(src)/%.h $(srctree)/scripts/headers_install.sh FORCE |
|---|
| 106 | 63 | $(call if_changed,install) |
|---|
| 107 | 64 | |
|---|
| 108 | | -else |
|---|
| 109 | | -__headers: $(check-file) |
|---|
| 65 | +$(gen-headers): $(dst)/%.h: $(gen)/%.h $(srctree)/scripts/headers_install.sh FORCE |
|---|
| 66 | + $(call if_changed,install) |
|---|
| 67 | + |
|---|
| 68 | +quiet_cmd_remove = REMOVE $(unwanted) |
|---|
| 69 | + cmd_remove = rm -f $(unwanted) |
|---|
| 70 | + |
|---|
| 71 | +__headers: $(all-headers) |
|---|
| 72 | +ifneq ($(unwanted),) |
|---|
| 73 | + $(call cmd,remove) |
|---|
| 74 | +endif |
|---|
| 110 | 75 | @: |
|---|
| 111 | 76 | |
|---|
| 112 | | -targets += $(check-file) |
|---|
| 113 | | -$(check-file): scripts/headers_check.pl $(output-files) FORCE |
|---|
| 114 | | - $(call if_changed,check) |
|---|
| 77 | +existing-headers := $(filter $(old-headers), $(all-headers)) |
|---|
| 115 | 78 | |
|---|
| 116 | | -endif |
|---|
| 117 | | - |
|---|
| 118 | | -cmd_files := $(wildcard \ |
|---|
| 119 | | - $(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd)) |
|---|
| 120 | | - |
|---|
| 121 | | -ifneq ($(cmd_files),) |
|---|
| 122 | | - include $(cmd_files) |
|---|
| 123 | | -endif |
|---|
| 124 | | - |
|---|
| 125 | | -endif # skip-inst |
|---|
| 79 | +-include $(foreach f,$(existing-headers),$(dir $(f)).$(notdir $(f)).cmd) |
|---|
| 126 | 80 | |
|---|
| 127 | 81 | PHONY += FORCE |
|---|
| 128 | | -FORCE: ; |
|---|
| 82 | +FORCE: |
|---|
| 129 | 83 | |
|---|
| 130 | 84 | .PHONY: $(PHONY) |
|---|