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