1*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun# ==========================================================================
3*4882a593Smuzhiyun# Installing headers
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun# All headers under include/uapi, include/generated/uapi,
6*4882a593Smuzhiyun# arch/<arch>/include/uapi and arch/<arch>/include/generated/uapi are
7*4882a593Smuzhiyun# exported.
8*4882a593Smuzhiyun# They are preprocessed to remove __KERNEL__ section of the file.
9*4882a593Smuzhiyun#
10*4882a593Smuzhiyun# ==========================================================================
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunPHONY := __headers
13*4882a593Smuzhiyun__headers:
14*4882a593Smuzhiyun
15*4882a593Smuzhiyuninclude scripts/Kbuild.include
16*4882a593Smuzhiyun
17*4882a593Smuzhiyunsrc := $(srctree)/$(obj)
18*4882a593Smuzhiyungen := $(objtree)/$(subst include/,include/generated/,$(obj))
19*4882a593Smuzhiyundst := usr/include
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun-include $(src)/Kbuild
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun# $(filter %/, ...) is a workaround for GNU Make <= 4.2.1, where
24*4882a593Smuzhiyun# $(wildcard $(src)/*/) contains not only directories but also regular files.
25*4882a593Smuzhiyunsrc-subdirs := $(patsubst $(src)/%/,%,$(filter %/, $(wildcard $(src)/*/)))
26*4882a593Smuzhiyungen-subdirs := $(patsubst $(gen)/%/,%,$(filter %/, $(wildcard $(gen)/*/)))
27*4882a593Smuzhiyunall-subdirs := $(sort $(src-subdirs) $(gen-subdirs))
28*4882a593Smuzhiyun
29*4882a593Smuzhiyunsrc-headers := $(if $(src-subdirs), $(shell cd $(src) && find $(src-subdirs) -name '*.h'))
30*4882a593Smuzhiyunsrc-headers := $(filter-out $(no-export-headers), $(src-headers))
31*4882a593Smuzhiyungen-headers := $(if $(gen-subdirs), $(shell cd $(gen) && find $(gen-subdirs) -name '*.h'))
32*4882a593Smuzhiyungen-headers := $(filter-out $(no-export-headers), $(gen-headers))
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun# If the same header is exported from source and generated directories,
35*4882a593Smuzhiyun# the former takes precedence, but this should be warned.
36*4882a593Smuzhiyunduplicated := $(filter $(gen-headers), $(src-headers))
37*4882a593Smuzhiyun$(if $(duplicated), $(warning duplicated header export: $(duplicated)))
38*4882a593Smuzhiyun
39*4882a593Smuzhiyungen-headers := $(filter-out $(duplicated), $(gen-headers))
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun# Add dst path prefix
42*4882a593Smuzhiyunall-subdirs := $(addprefix $(dst)/, $(all-subdirs))
43*4882a593Smuzhiyunsrc-headers := $(addprefix $(dst)/, $(src-headers))
44*4882a593Smuzhiyungen-headers := $(addprefix $(dst)/, $(gen-headers))
45*4882a593Smuzhiyunall-headers := $(src-headers) $(gen-headers)
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun# Work out what needs to be removed
48*4882a593Smuzhiyunold-subdirs := $(wildcard $(all-subdirs))
49*4882a593Smuzhiyunold-headers := $(if $(old-subdirs),$(shell find $(old-subdirs) -name '*.h'))
50*4882a593Smuzhiyununwanted    := $(filter-out $(all-headers), $(old-headers))
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun# Create directories
53*4882a593Smuzhiyunexisting-dirs := $(sort $(dir $(old-headers)))
54*4882a593Smuzhiyunwanted-dirs   := $(sort $(dir $(all-headers)))
55*4882a593Smuzhiyunnew-dirs      := $(filter-out $(existing-dirs), $(wanted-dirs))
56*4882a593Smuzhiyun$(if $(new-dirs), $(shell mkdir -p $(new-dirs)))
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun# Rules
59*4882a593Smuzhiyunquiet_cmd_install = HDRINST $@
60*4882a593Smuzhiyun      cmd_install = $(CONFIG_SHELL) $(srctree)/scripts/headers_install.sh $< $@
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun$(src-headers): $(dst)/%.h: $(src)/%.h $(srctree)/scripts/headers_install.sh FORCE
63*4882a593Smuzhiyun	$(call if_changed,install)
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun$(gen-headers): $(dst)/%.h: $(gen)/%.h $(srctree)/scripts/headers_install.sh FORCE
66*4882a593Smuzhiyun	$(call if_changed,install)
67*4882a593Smuzhiyun
68*4882a593Smuzhiyunquiet_cmd_remove = REMOVE  $(unwanted)
69*4882a593Smuzhiyun      cmd_remove = rm -f $(unwanted)
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun__headers: $(all-headers)
72*4882a593Smuzhiyunifneq ($(unwanted),)
73*4882a593Smuzhiyun	$(call cmd,remove)
74*4882a593Smuzhiyunendif
75*4882a593Smuzhiyun	@:
76*4882a593Smuzhiyun
77*4882a593Smuzhiyunexisting-headers := $(filter $(old-headers), $(all-headers))
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun-include $(foreach f,$(existing-headers),$(dir $(f)).$(notdir $(f)).cmd)
80*4882a593Smuzhiyun
81*4882a593SmuzhiyunPHONY += FORCE
82*4882a593SmuzhiyunFORCE:
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun.PHONY: $(PHONY)
85