# ==========================================================================
# Installing headers
#
# header-y files will be installed verbatim
# unifdef-y are the files where unifdef will be run before installing files
# objhdr-y are generated files that will be installed verbatim
#
# ==========================================================================

UNIFDEF := unifdef -U__KERNEL__

# Eliminate the contents of (and inclusions of) compiler.h
HDRSED  := sed 	-e "s/ inline / __inline__ /g" \
		-e "s/[[:space:]]__user[[:space:]]\+/ /g" \
		-e "s/(__user[[:space:]]\+/ (/g" \
		-e "s/[[:space:]]__force[[:space:]]\+/ /g" \
		-e "s/(__force[[:space:]]\+/ (/g" \
		-e "s/[[:space:]]__iomem[[:space:]]\+/ /g" \
		-e "s/(__iomem[[:space:]]\+/ (/g" \
		-e "s/[[:space:]]__attribute_const__[[:space:]]\+/\ /g" \
		-e "s/[[:space:]]__attribute_const__$$//" \
		-e "/^\#include <linux\/compiler.h>/d"

_dst := $(if $(dst),$(dst),$(obj))

.PHONY: __headersinst
__headersinst:


ifeq (,$(patsubst include/asm/%,,$(obj)/))
# For producing the generated stuff in include/asm for biarch builds, include
# both sets of Kbuild files; we'll generate anything which is mentioned in
# _either_ arch, and recurse into subdirectories which are mentioned in either
# arch. Since some directories may exist in one but not the other, we must
# use '-include'.
GENASM := 1
archasm	   := $(subst include/asm,asm-$(ARCH),$(obj))
altarchasm := $(subst include/asm,asm-$(ALTARCH),$(obj))
-include $(srctree)/include/$(archasm)/Kbuild
-include $(srctree)/include/$(altarchasm)/Kbuild
else
include $(srctree)/$(obj)/Kbuild
endif

include scripts/Kbuild.include

# If this is include/asm-$(ARCH) and there's no $(ALTARCH), then
# override $(_dst) so that we install to include/asm directly.
ifeq ($(obj)$(ALTARCH),include/asm-$(ARCH))
     _dst := include/asm
endif

header-y	:= $(sort $(header-y))
unifdef-y	:= $(sort $(unifdef-y))
subdir-y	:= $(patsubst %/,%,$(filter %/, $(header-y)))
header-y	:= $(filter-out %/, $(header-y))
header-y	:= $(filter-out $(unifdef-y),$(header-y))

ifdef ALTARCH
ifeq ($(obj),include/asm-$(ARCH))
altarch-y	:= altarch-dir
endif
endif

# Make the definitions visible for recursive make invocations
export ALTARCH
export ARCHDEF
export ALTARCHDEF

quiet_cmd_o_hdr_install   = INSTALL $(_dst)/$@
      cmd_o_hdr_install   = cp $(objtree)/$(obj)/$@ $(INSTALL_HDR_PATH)/$(_dst)

quiet_cmd_headers_install = INSTALL $(_dst)/$@
      cmd_headers_install = $(HDRSED) $(srctree)/$(obj)/$@		\
			    > $(INSTALL_HDR_PATH)/$(_dst)/$@

quiet_cmd_unifdef	  = UNIFDEF $(_dst)/$@
      cmd_unifdef	  = $(UNIFDEF) $(srctree)/$(obj)/$@ | $(HDRSED)	\
                            > $(INSTALL_HDR_PATH)/$(_dst)/$@ || :

quiet_cmd_check		  = CHECK   $(_dst)/$@
      cmd_check		  = $(srctree)/scripts/hdrcheck.sh		\
                              $(INSTALL_HDR_PATH)/include		\
			      $(INSTALL_HDR_PATH)/$(_dst)/$@

quiet_cmd_mkdir		  = MKDIR   $@
      cmd_mkdir		  = mkdir -p $(INSTALL_HDR_PATH)/$@

quiet_cmd_gen		  = GEN     $(_dst)/$@
      cmd_gen		  = \
STUBDEF=__ASM_STUB_`echo $@ | tr a-z. A-Z_`;				\
(echo "/* File autogenerated by 'make headers_install' */" ;		\
echo "\#ifndef $$STUBDEF" ;						\
echo "\#define $$STUBDEF" ;						\
echo "\# if $(ARCHDEF)" ;						\
if [ -r $(INSTALL_HDR_PATH)/include/$(archasm)/$@ ]; then		\
	echo "\#  include <$(archasm)/$@>" ;				\
else									\
	echo "\#  error $(archasm)/$@ does not exist in"		\
			"the $(ARCH) architecture" ;			\
fi ;									\
echo "\# elif $(ALTARCHDEF)" ;						\
if [ -r $(INSTALL_HDR_PATH)/include/$(altarchasm)/$@ ]; then		\
	echo "\#  include <$(altarchasm)/$@>" ;				\
else									\
	echo "\#  error $(altarchasm)/$@ does not exist in"		\
			"the $(ALTARCH) architecture" ;			\
fi ;									\
echo "\# else" ;							\
echo "\#  warning This machine appears to be"				\
		 "neither $(ARCH) nor $(ALTARCH)." ;			\
echo "\# endif" ;							\
echo "\#endif /* $$STUBDEF */" ;					\
) > $(INSTALL_HDR_PATH)/$(_dst)/$@

__headersinst: $(subdir-y) $(header-y) $(unifdef-y) $(altarch-y) $(objhdr-y)

.PHONY: $(header-y) $(unifdef-y) $(subdir-y)

ifdef HDRCHECK
# Rules for checking headers
$(objhdr-y) $(header-y) $(unifdef-y):
	$(call cmd,check)
else
# Rules for installing headers

$(objhdr-y) $(subdir-y) $(header-y) $(unifdef-y): $(_dst)

.PHONY: $(_dst)
$(_dst):
	$(call cmd,mkdir)

ifdef GENASM
$(objhdr-y) $(header-y) $(unifdef-y):
	$(call cmd,gen)

else
$(objhdr-y):
	$(call cmd,o_hdr_install)

$(header-y):
	$(call cmd,headers_install)

$(unifdef-y):
	$(call cmd,unifdef)
endif
endif

hdrinst := -rR -f $(srctree)/scripts/Makefile.headersinst obj

.PHONY: altarch-dir
# All the files in the normal arch dir must be created first, since we test
# for their existence.
altarch-dir: $(subdir-y) $(header-y) $(unifdef-y) $(objhdr-y)
	$(Q)$(MAKE) $(hdrinst)=include/asm-$(ALTARCH) dst=include/asm-$(ALTARCH)
	$(Q)$(MAKE) $(hdrinst)=include/asm dst=include/asm

# Recursion
$(subdir-y):
	$(Q)$(MAKE) $(hdrinst)=$(obj)/$@ dst=$(_dst)/$@ rel=../$(rel)
