.. | .. |
---|
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) |
---|