kbuild: re-implement Makefile.headersinst without recursion
[linux-block.git] / scripts / Makefile.headersinst
CommitLineData
b2441318 1# SPDX-License-Identifier: GPL-2.0
8d730cfb
DW
2# ==========================================================================
3# Installing headers
4#
fcc8487d 5# All headers under include/uapi, include/generated/uapi,
61562f98 6# arch/<arch>/include/uapi and arch/<arch>/include/generated/uapi are
fcc8487d
ND
7# exported.
8# They are preprocessed to remove __KERNEL__ section of the file.
8d730cfb
DW
9#
10# ==========================================================================
11
05d8cba4
MY
12PHONY := __headers
13__headers:
14
15include scripts/Kbuild.include
16
d5470d14
MY
17src := $(srctree)/$(obj)
18gen := $(objtree)/$(subst include/,include/generated/,$(obj))
19dst := usr/include
2f263d14 20
d5470d14 21-include $(src)/Kbuild
2f263d14 22
d5470d14
MY
23src-subdirs := $(patsubst $(src)/%/,%,$(wildcard $(src)/*/))
24gen-subdirs := $(patsubst $(gen)/%/,%,$(wildcard $(gen)/*/))
25all-subdirs := $(sort $(src-subdirs) $(gen-subdirs))
05d8cba4 26
d5470d14
MY
27src-headers := $(if $(src-subdirs), $(shell cd $(src) && find $(src-subdirs) -name '*.h'))
28src-headers := $(filter-out $(no-export-headers), $(src-headers))
29gen-headers := $(if $(gen-subdirs), $(shell cd $(gen) && find $(gen-subdirs) -name '*.h'))
30gen-headers := $(filter-out $(no-export-headers), $(gen-headers))
05d8cba4 31
d5470d14
MY
32# If the same header is exported from source and generated directories,
33# the former takes precedence, but this should be warned.
34duplicated := $(filter $(gen-headers), $(src-headers))
35$(if $(duplicated), $(warning duplicated header export: $(duplicated)))
05d8cba4 36
d5470d14 37gen-headers := $(filter-out $(duplicated), $(gen-headers))
05d8cba4 38
d5470d14
MY
39# Add dst path prefix
40all-subdirs := $(addprefix $(dst)/, $(all-subdirs))
41src-headers := $(addprefix $(dst)/, $(src-headers))
42gen-headers := $(addprefix $(dst)/, $(gen-headers))
43all-headers := $(src-headers) $(gen-headers)
8d730cfb 44
d5470d14
MY
45# Work out what needs to be removed
46old-subdirs := $(wildcard $(all-subdirs))
47old-headers := $(if $(old-subdirs),$(shell find $(old-subdirs) -name '*.h'))
48unwanted := $(filter-out $(all-headers), $(old-headers))
de789125 49
d5470d14
MY
50# Create directories
51existing-dirs := $(sort $(dir $(old-headers)))
52wanted-dirs := $(sort $(dir $(all-headers)))
53new-dirs := $(filter-out $(existing-dirs), $(wanted-dirs))
54$(if $(new-dirs), $(shell mkdir -p $(new-dirs)))
de789125 55
d5470d14 56# Rules
10b63956 57
d5470d14 58ifndef HDRCHECK
8d730cfb 59
d5470d14
MY
60quiet_cmd_install = HDRINST $@
61 cmd_install = $(CONFIG_SHELL) $(srctree)/scripts/headers_install.sh $(@D) $(<D) $(@F)
de789125 62
d5470d14
MY
63$(src-headers): $(dst)/%.h: $(src)/%.h $(srctree)/scripts/headers_install.sh FORCE
64 $(call if_changed,install)
68475359 65
d5470d14
MY
66$(gen-headers): $(dst)/%.h: $(gen)/%.h $(srctree)/scripts/headers_install.sh FORCE
67 $(call if_changed,install)
8d730cfb 68
7712401a 69quiet_cmd_remove = REMOVE $(unwanted)
d5470d14 70 cmd_remove = rm -f $(unwanted)
de789125 71
d5470d14
MY
72__headers: $(all-headers)
73ifneq ($(unwanted),)
74 $(call cmd,remove)
75endif
7712401a 76 @:
de789125 77
d5470d14
MY
78existing-headers := $(filter $(old-headers), $(all-headers))
79
80-include $(foreach f,$(existing-headers),$(dir $(f)).$(notdir $(f)).cmd)
de789125 81
68475359 82else
8d730cfb 83
d5470d14
MY
84quiet_cmd_check = HDRCHK $<
85 cmd_check = $(PERL) $(srctree)/scripts/headers_check.pl $(dst) $(SRCARCH) $<; touch $@
8d730cfb 86
d5470d14 87check-files := $(addsuffix .chk, $(all-headers))
de789125 88
d5470d14
MY
89$(check-files): $(dst)/%.chk : $(dst)/% $(srctree)/scripts/headers_check.pl
90 $(call cmd,check)
4e420aa9 91
d5470d14
MY
92__headers: $(check-files)
93 @:
8d730cfb 94
d5470d14 95endif
05d8cba4 96
7712401a 97PHONY += FORCE
d5470d14 98FORCE:
e474ed45
MY
99
100.PHONY: $(PHONY)