summaryrefslogtreecommitdiffstats
path: root/scripts/Makefile.headersinst
blob: 22b17af0902f271e2c28c8486921b4b96aaf99b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# ==========================================================================
# 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 := scripts/unifdef -U__KERNEL__

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

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

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 $(wildcard...). 
GENASM := 1
archasm	   := $(subst include/asm,asm-$(ARCH),$(obj))
altarchasm := $(subst include/asm,asm-$(ALTARCH),$(obj))
KBUILDFILES := $(wildcard $(srctree)/include/$(archasm)/Kbuild $(srctree)/include/$(altarchasm)/Kbuild)
else
KBUILDFILES := $(srctree)/$(obj)/Kbuild
endif

include $(KBUILDFILES)

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.
# Unless $(BIASMDIR) is set, in which case we're probably doing
# a 'headers_install_all' build and we should keep the -$(ARCH)
# in the directory name.
ifeq ($(obj)$(ALTARCH),include/asm-$(ARCH)$(BIASMDIR))
     _dst := include/asm
endif

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

# stamp files for header checks
check-y		:= $(patsubst %,.check.%,$(header-y) $(objhdr-y))

# Work out what needs to be removed
oldheaders	:= $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$(wildcard $(INSTALL_HDR_PATH)/$(_dst)/*.h))
unwanted	:= $(filter-out $(header-y) $(objhdr-y),$(oldheaders))

oldcheckstamps	:= $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$(wildcard $(INSTALL_HDR_PATH)/$(_dst)/.check.*.h))
unwanted	+= $(filter-out $(check-y),$(oldcheckstamps))

# Prefix them all with full paths to $(INSTALL_HDR_PATH)
header-y 	:= $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(header-y))
objhdr-y 	:= $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(objhdr-y))
check-y 	:= $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(check-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 $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
      cmd_o_hdr_install   = cp $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,$(objtree)/$(obj)/%,$@) \
			    $(INSTALL_HDR_PATH)/$(_dst)

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

quiet_cmd_check		  = CHECK   $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/.check.%,$(_dst)/%,$@)
      cmd_check		  = $(CONFIG_SHELL) $(srctree)/scripts/hdrcheck.sh \
                              $(INSTALL_HDR_PATH)/include $(subst /.check.,/,$@) $@

quiet_cmd_remove	  = REMOVE  $(_dst)/$@
      cmd_remove	  = rm -f $(INSTALL_HDR_PATH)/$(_dst)/$@

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

quiet_cmd_gen		  = GEN     $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
      cmd_gen		  = \
FNAME=$(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$@);			\
STUBDEF=__ASM_STUB_`echo $$FNAME | tr a-z.- A-Z__`;			\
(echo "/* File autogenerated by 'make headers_install' */" ;		\
echo "\#ifndef $$STUBDEF" ;						\
echo "\#define $$STUBDEF" ;						\
echo "\# if $(ARCHDEF)" ;						\
if [ -r $(subst /$(_dst)/,/include/$(archasm)/,$@) ]; then		\
	echo "\#  include <$(archasm)/$$FNAME>" ;			\
else									\
	echo "\#  error $(archasm)/$$FNAME does not exist in"		\
			"the $(ARCH) architecture" ;			\
fi ;									\
echo "\# elif $(ALTARCHDEF)" ;						\
if [ -r $(subst /$(_dst)/,/include/$(altarchasm)/,$@) ]; then		\
	echo "\#  include <$(altarchasm)/$$FNAME>" ;			\
else									\
	echo "\#  error $(altarchasm)/$$FNAME 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 */" ;					\
) > $@

.PHONY: __headersinst __headerscheck

ifdef HDRCHECK
__headerscheck: $(subdir-y) $(check-y)
	@true

$(check-y) : $(INSTALL_HDR_PATH)/$(_dst)/.check.%.h : $(INSTALL_HDR_PATH)/$(_dst)/%.h 
	$(call cmd,check)

# Other dependencies for $(check-y)
include /dev/null $(wildcard $(check-y))

# ... but leave $(check-y) as .PHONY for now until those deps are actually correct.
.PHONY: $(check-y)

else
# Rules for installing headers
__headersinst: $(subdir-y) $(header-y) $(altarch-y) $(objhdr-y)
	@true

$(objhdr-y) $(subdir-y) $(header-y): | $(INSTALL_HDR_PATH)/$(_dst) $(unwanted)

$(INSTALL_HDR_PATH)/$(_dst):
	$(call cmd,mkdir)

.PHONY: $(unwanted)
$(unwanted):
	$(call cmd,remove)

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

else
$(objhdr-y): $(INSTALL_HDR_PATH)/$(_dst)/%.h: $(objtree)/$(obj)/%.h $(KBUILDFILES)
	$(call cmd,o_hdr_install)

$(header-y): $(INSTALL_HDR_PATH)/$(_dst)/%.h: $(srctree)/$(obj)/%.h $(KBUILDFILES)
	$(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) $(objhdr-y)
	$(Q)$(MAKE) $(hdrinst)=include/asm-$(ALTARCH) dst=include/asm-$(ALTARCH)
	$(Q)$(MAKE) $(hdrinst)=include/asm dst=include/asm$(BIASMDIR)

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