linux/scripts/Makefile.headersinst
<<
>>
Prefs
   1# ==========================================================================
   2# Installing headers
   3#
   4# header-y  - list files to be installed. They are preprocessed
   5#             to remove __KERNEL__ section of the file
   6# genhdr-y  - Same as header-y but in a generated/ directory
   7#
   8# ==========================================================================
   9
  10# generated header directory
  11gen := $(if $(gen),$(gen),$(subst include/,include/generated/,$(obj)))
  12
  13kbuild-file := $(srctree)/$(obj)/Kbuild
  14include $(kbuild-file)
  15
  16# called may set destination dir (when installing to asm/)
  17_dst := $(if $(destination-y),$(destination-y),$(if $(dst),$(dst),$(obj)))
  18
  19old-kbuild-file := $(srctree)/$(subst uapi/,,$(obj))/Kbuild
  20ifneq ($(wildcard $(old-kbuild-file)),)
  21include $(old-kbuild-file)
  22endif
  23
  24include scripts/Kbuild.include
  25
  26installdir    := $(INSTALL_HDR_PATH)/$(subst uapi/,,$(_dst))
  27
  28header-y      := $(sort $(header-y))
  29subdirs       := $(patsubst %/,%,$(filter %/, $(header-y)))
  30header-y      := $(filter-out %/, $(header-y))
  31
  32# files used to track state of install/check
  33install-file  := $(installdir)/.install
  34check-file    := $(installdir)/.check
  35
  36# generic-y list all files an architecture uses from asm-generic
  37# Use this to build a list of headers which require a wrapper
  38wrapper-files := $(filter $(header-y), $(generic-y))
  39
  40srcdir        := $(srctree)/$(obj)
  41gendir        := $(objtree)/$(gen)
  42
  43oldsrcdir     := $(srctree)/$(subst /uapi,,$(obj))
  44
  45# all headers files for this dir
  46header-y      := $(filter-out $(generic-y), $(header-y))
  47all-files     := $(header-y) $(genhdr-y) $(wrapper-files)
  48output-files  := $(addprefix $(installdir)/, $(all-files))
  49
  50input-files1  := $(foreach hdr, $(header-y), \
  51                   $(if $(wildcard $(srcdir)/$(hdr)), \
  52                        $(wildcard $(srcdir)/$(hdr))) \
  53                   )
  54input-files1-name := $(notdir $(input-files1))
  55input-files2  := $(foreach hdr, $(header-y), \
  56                   $(if  $(wildcard $(srcdir)/$(hdr)),, \
  57                        $(if $(wildcard $(oldsrcdir)/$(hdr)), \
  58                                $(wildcard $(oldsrcdir)/$(hdr)), \
  59                                $(error Missing UAPI file $(srcdir)/$(hdr))) \
  60                   ))
  61input-files2-name := $(notdir $(input-files2))
  62input-files3  := $(foreach hdr, $(genhdr-y), \
  63                   $(if $(wildcard $(gendir)/$(hdr)), \
  64                        $(wildcard $(gendir)/$(hdr)), \
  65                        $(error Missing generated UAPI file $(gendir)/$(hdr)) \
  66                   ))
  67input-files3-name := $(notdir $(input-files3))
  68
  69# Work out what needs to be removed
  70oldheaders    := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h))
  71unwanted      := $(filter-out $(all-files),$(oldheaders))
  72
  73# Prefix unwanted with full paths to $(INSTALL_HDR_PATH)
  74unwanted-file := $(addprefix $(installdir)/, $(unwanted))
  75
  76printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@))
  77
  78quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
  79                            file$(if $(word 2, $(all-files)),s))
  80      cmd_install = \
  81        $(CONFIG_SHELL) $< $(installdir) $(srcdir) $(input-files1-name); \
  82        $(CONFIG_SHELL) $< $(installdir) $(oldsrcdir) $(input-files2-name); \
  83        $(CONFIG_SHELL) $< $(installdir) $(gendir) $(input-files3-name); \
  84        for F in $(wrapper-files); do                                   \
  85                echo "\#include <asm-generic/$$F>" > $(installdir)/$$F;    \
  86        done;                                                           \
  87        touch $@
  88
  89quiet_cmd_remove = REMOVE  $(unwanted)
  90      cmd_remove = rm -f $(unwanted-file)
  91
  92quiet_cmd_check = CHECK   $(printdir) ($(words $(all-files)) files)
  93# Headers list can be pretty long, xargs helps to avoid
  94# the "Argument list too long" error.
  95      cmd_check = for f in $(all-files); do                          \
  96                  echo "$(installdir)/$${f}"; done                      \
  97                  | xargs                                            \
  98                  $(PERL) $< $(INSTALL_HDR_PATH)/include $(SRCARCH); \
  99                  touch $@
 100
 101PHONY += __headersinst __headerscheck
 102
 103ifndef HDRCHECK
 104# Rules for installing headers
 105__headersinst: $(subdirs) $(install-file)
 106        @:
 107
 108targets += $(install-file)
 109$(install-file): scripts/headers_install.sh $(input-files1) $(input-files2) $(input-files3) FORCE
 110        $(if $(unwanted),$(call cmd,remove),)
 111        $(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
 112        $(call if_changed,install)
 113
 114else
 115__headerscheck: $(subdirs) $(check-file)
 116        @:
 117
 118targets += $(check-file)
 119$(check-file): scripts/headers_check.pl $(output-files) FORCE
 120        $(call if_changed,check)
 121
 122endif
 123
 124# Recursion
 125.PHONY: $(subdirs)
 126$(subdirs):
 127        $(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(_dst)/$@
 128
 129targets := $(wildcard $(sort $(targets)))
 130cmd_files := $(wildcard \
 131             $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
 132
 133ifneq ($(cmd_files),)
 134        include $(cmd_files)
 135endif
 136
 137.PHONY: $(PHONY)
 138PHONY += FORCE
 139FORCE: ;
 140