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