Makefile 15.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
# Makefile for making ELF bootable images for booting on CHRP
# using Open Firmware.
#
# Geert Uytterhoeven	September 1997
#
# Based on coffboot by Paul Mackerras
# Simplified for ppc64 by Todd Inglett
#
# NOTE:	this code is built for 32 bit in ELF32 format even though
#	it packages a 64 bit kernel.  We do this to simplify the
#	bootloader and increase compatibility with OpenFirmware.
#
#	To this end we need to define BOOTCC, etc, as the tools
14 15
#	needed to build the 32 bit image.  That's normally the same
#	compiler for the rest of the kernel, with the -m32 flag added.
L
Linus Torvalds 已提交
16 17 18 19
#	To make it easier to setup a cross compiler,
#	CROSS32_COMPILE is setup as a prefix just like CROSS_COMPILE
#	in the toplevel makefile.

20
all: $(obj)/zImage
L
Linus Torvalds 已提交
21

22 23 24 25
BOOTCFLAGS    := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
		 -fno-strict-aliasing -Os -msoft-float -pipe \
		 -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \
		 -isystem $(shell $(CROSS32CC) -print-file-name=include)
26
BOOTAFLAGS	:= -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc
27

28 29 30 31
ifdef CONFIG_DEBUG_INFO
BOOTCFLAGS	+= -g
endif

32 33 34 35
ifeq ($(call cc-option-yn, -fstack-protector),y)
BOOTCFLAGS	+= -fno-stack-protector
endif

36
BOOTCFLAGS	+= -I$(obj) -I$(srctree)/$(obj)
L
Linus Torvalds 已提交
37

38 39
DTS_FLAGS	?= -p 1024

40 41
$(obj)/4xx.o: BOOTCFLAGS += -mcpu=405
$(obj)/ebony.o: BOOTCFLAGS += -mcpu=405
42
$(obj)/cuboot-hotfoot.o: BOOTCFLAGS += -mcpu=405
43 44
$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=405
$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=405
45
$(obj)/cuboot-acadia.o: BOOTCFLAGS += -mcpu=405
46
$(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
47
$(obj)/virtex405-head.o: BOOTAFLAGS += -mcpu=405
48

49

50 51
zlib       := inffast.c inflate.c inftrees.c
zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h
O
Olaf Hering 已提交
52 53
zliblinuxheader := zlib.h zconf.h zutil.h

54
$(addprefix $(obj)/,$(zlib) cuboot-c2k.o gunzip_util.o main.o prpmc2800.o): \
55
	$(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader))
56

57 58 59 60 61 62
libfdt       := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
libfdtheader := fdt.h libfdt.h libfdt_internal.h

$(addprefix $(obj)/,$(libfdt) libfdt-wrapper.o simpleboot.o): \
	$(addprefix $(obj)/,$(libfdtheader))

63
src-wlib := string.S crt0.S crtsavres.S stdio.c main.c \
64
		$(libfdt) libfdt-wrapper.c \
65
		ns16550.c serial.c simple_alloc.c div64.S util.S \
66
		gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
67
		4xx.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \
68
		cpm-serial.c stdlib.c mpc52xx-psc.c planetcore.c uartlite.c \
69
		fsl-soc.c mpc8xx.c pq2.c ugecon.c
70
src-plat := of.c cuboot-52xx.c cuboot-824x.c cuboot-83xx.c cuboot-85xx.c holly.c \
71
		cuboot-ebony.c cuboot-hotfoot.c treeboot-ebony.c prpmc2800.c \
72
		ps3-head.S ps3-hvcall.S ps3.c treeboot-bamboo.c cuboot-8xx.c \
73 74
		cuboot-pq2.c cuboot-sequoia.c treeboot-walnut.c \
		cuboot-bamboo.c cuboot-mpc7448hpc2.c cuboot-taishan.c \
R
Remi Machet 已提交
75
		fixed-head.S ep88xc.c ep405.c cuboot-c2k.c \
76
		cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
77
		cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c \
78
		virtex405-head.S virtex.c redboot-83xx.c cuboot-sam440ep.c \
79
		cuboot-acadia.c cuboot-amigaone.c cuboot-kilauea.c
80
src-boot := $(src-wlib) $(src-plat) empty.c
O
Olaf Hering 已提交
81

L
Linus Torvalds 已提交
82 83
src-boot := $(addprefix $(obj)/, $(src-boot))
obj-boot := $(addsuffix .o, $(basename $(src-boot)))
84 85
obj-wlib := $(addsuffix .o, $(basename $(addprefix $(obj)/, $(src-wlib))))
obj-plat := $(addsuffix .o, $(basename $(addprefix $(obj)/, $(src-plat))))
O
Olaf Hering 已提交
86 87

quiet_cmd_copy_zlib = COPY    $@
A
Adrian Bunk 已提交
88
      cmd_copy_zlib = sed "s@__used@@;s@<linux/\([^>]*\).*@\"\1\"@" $< > $@
O
Olaf Hering 已提交
89 90

quiet_cmd_copy_zlibheader = COPY    $@
91
      cmd_copy_zlibheader = sed "s@<linux/\([^>]*\).*@\"\1\"@" $< > $@
O
Olaf Hering 已提交
92 93
# stddef.h for NULL
quiet_cmd_copy_zliblinuxheader = COPY    $@
94
      cmd_copy_zliblinuxheader = sed "s@<linux/string.h>@\"string.h\"@;s@<linux/kernel.h>@<stddef.h>@;s@<linux/\([^>]*\).*@\"\1\"@" $< > $@
O
Olaf Hering 已提交
95 96 97 98 99 100 101 102 103 104

$(addprefix $(obj)/,$(zlib)): $(obj)/%: $(srctree)/lib/zlib_inflate/%
	$(call cmd,copy_zlib)

$(addprefix $(obj)/,$(zlibheader)): $(obj)/%: $(srctree)/lib/zlib_inflate/%
	$(call cmd,copy_zlibheader)

$(addprefix $(obj)/,$(zliblinuxheader)): $(obj)/%: $(srctree)/include/linux/%
	$(call cmd,copy_zliblinuxheader)

105 106 107 108 109 110
quiet_cmd_copy_libfdt = COPY    $@
      cmd_copy_libfdt = cp $< $@

$(addprefix $(obj)/,$(libfdt) $(libfdtheader)): $(obj)/%: $(srctree)/scripts/dtc/libfdt/%
	$(call cmd,copy_libfdt)

111 112 113
$(obj)/empty.c:
	@touch $@

114
$(obj)/zImage.lds $(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds: $(obj)/%: $(srctree)/$(src)/%.S
115
	@cp $< $@
O
Olaf Hering 已提交
116

117
clean-files := $(zlib) $(zlibheader) $(zliblinuxheader) \
118
		$(libfdt) $(libfdtheader) \
119
		empty.c zImage.coff.lds zImage.ps3.lds zImage.lds
O
Olaf Hering 已提交
120

L
Linus Torvalds 已提交
121 122 123 124 125 126
quiet_cmd_bootcc = BOOTCC  $@
      cmd_bootcc = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTCFLAGS) -c -o $@ $<

quiet_cmd_bootas = BOOTAS  $@
      cmd_bootas = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $<

127
quiet_cmd_bootar = BOOTAR  $@
M
Milton Miller 已提交
128
      cmd_bootar = $(CROSS32AR) -cr $@.$$$$ $(filter-out FORCE,$^); mv $@.$$$$ $@
G
Geoff Levand 已提交
129

130 131
$(obj-libfdt): $(obj)/%.o: $(srctree)/scripts/dtc/libfdt/%.c FORCE
	$(call if_changed_dep,bootcc)
M
Milton Miller 已提交
132
$(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c FORCE
133
	$(Q)mkdir -p $(dir $@)
L
Linus Torvalds 已提交
134
	$(call if_changed_dep,bootcc)
M
Milton Miller 已提交
135
$(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S FORCE
136
	$(Q)mkdir -p $(dir $@)
L
Linus Torvalds 已提交
137 138
	$(call if_changed_dep,bootas)

M
Milton Miller 已提交
139 140
$(obj)/wrapper.a: $(obj-wlib) FORCE
	$(call if_changed,bootar)
L
Linus Torvalds 已提交
141

142
hostprogs-y	:= addnote addRamDisk hack-coff mktree
L
Linus Torvalds 已提交
143

M
Milton Miller 已提交
144
targets		+= $(patsubst $(obj)/%,%,$(obj-boot) wrapper.a)
145
extra-y		:= $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \
146
		   $(obj)/zImage.lds $(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds
147

148 149
dtstree		:= $(srctree)/$(src)/dts

150
wrapper		:=$(srctree)/$(src)/wrapper
151
wrapperbits	:= $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree) \
M
Milton Miller 已提交
152
			$(wrapper) FORCE
L
Linus Torvalds 已提交
153

154 155
#############
# Bits for building various flavours of zImage
L
Linus Torvalds 已提交
156

157
ifneq ($(CROSS32_COMPILE),)
158
CROSSWRAP := -C "$(CROSS32_COMPILE)"
159 160
else
ifneq ($(CROSS_COMPILE),)
161
CROSSWRAP := -C "$(CROSS_COMPILE)"
162 163
endif
endif
L
Linus Torvalds 已提交
164

165
# args (to if_changed): 1 = (this rule), 2 = platform, 3 = dts 4=dtb 5=initrd
166
quiet_cmd_wrap	= WRAP    $@
167 168
      cmd_wrap	=$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
		$(if $3, -s $3)$(if $4, -d $4)$(if $5, -i $5) vmlinux
169

170 171 172
image-$(CONFIG_PPC_PSERIES)		+= zImage.pseries
image-$(CONFIG_PPC_MAPLE)		+= zImage.pseries
image-$(CONFIG_PPC_IBM_CELL_BLADE)	+= zImage.pseries
173
image-$(CONFIG_PPC_PS3)			+= dtbImage.ps3
I
Ishizaki Kou 已提交
174
image-$(CONFIG_PPC_CELLEB)		+= zImage.pseries
175
image-$(CONFIG_PPC_CELL_QPACE)		+= zImage.pseries
176
image-$(CONFIG_PPC_CHRP)		+= zImage.chrp
177
image-$(CONFIG_PPC_EFIKA)		+= zImage.chrp
178
image-$(CONFIG_PPC_PMAC)		+= zImage.pmac
179
image-$(CONFIG_PPC_HOLLY)		+= dtbImage.holly
180
image-$(CONFIG_PPC_PRPMC2800)		+= dtbImage.prpmc2800
181
image-$(CONFIG_PPC_ISERIES)		+= zImage.iseries
182 183
image-$(CONFIG_DEFAULT_UIMAGE)		+= uImage

184 185 186 187 188
#
# Targets which embed a device tree blob
#
# Theses are default targets to build images which embed device tree blobs.
# They are only required on boards which do not have FDT support in firmware.
189
# Boards with newish u-boot firmware can use the uImage target above
190 191 192
#

# Board ports in arch/powerpc/platform/40x/Kconfig
193
image-$(CONFIG_EP405)			+= dtbImage.ep405
194
image-$(CONFIG_HOTFOOT)			+= cuImage.hotfoot
195
image-$(CONFIG_WALNUT)			+= treeImage.walnut
196
image-$(CONFIG_ACADIA)			+= cuImage.acadia
197 198

# Board ports in arch/powerpc/platform/44x/Kconfig
199
image-$(CONFIG_EBONY)			+= treeImage.ebony cuImage.ebony
J
Josh Boyer 已提交
200
image-$(CONFIG_BAMBOO)			+= treeImage.bamboo cuImage.bamboo
201
image-$(CONFIG_SAM440EP)		+= cuImage.sam440ep
202
image-$(CONFIG_SEQUOIA)			+= cuImage.sequoia
203
image-$(CONFIG_RAINIER)			+= cuImage.rainier
204
image-$(CONFIG_TAISHAN)			+= cuImage.taishan
205
image-$(CONFIG_KATMAI)			+= cuImage.katmai
206
image-$(CONFIG_WARP)			+= cuImage.warp
207
image-$(CONFIG_YOSEMITE)		+= cuImage.yosemite
208

209
# Board ports in arch/powerpc/platform/8xx/Kconfig
210 211
image-$(CONFIG_MPC86XADS)		+= cuImage.mpc866ads
image-$(CONFIG_MPC885ADS)		+= cuImage.mpc885ads
212
image-$(CONFIG_PPC_EP88XC)		+= dtbImage.ep88xc
213
image-$(CONFIG_PPC_ADDER875)		+= cuImage.adder875-uboot \
214
					   dtbImage.adder875-redboot
215 216

# Board ports in arch/powerpc/platform/52xx/Kconfig
217 218 219
image-$(CONFIG_PPC_LITE5200)		+= cuImage.lite5200 lite5200.dtb
image-$(CONFIG_PPC_LITE5200)		+= cuImage.lite5200b lite5200b.dtb
image-$(CONFIG_PPC_MEDIA5200)		+= cuImage.media5200 media5200.dtb
220 221 222 223

# Board ports in arch/powerpc/platform/82xx/Kconfig
image-$(CONFIG_MPC8272_ADS)		+= cuImage.mpc8272ads
image-$(CONFIG_PQ2FADS)			+= cuImage.pq2fads
224
image-$(CONFIG_EP8248E)			+= dtbImage.ep8248e
225 226 227 228 229 230 231 232

# Board ports in arch/powerpc/platform/83xx/Kconfig
image-$(CONFIG_MPC832x_MDS)		+= cuImage.mpc832x_mds
image-$(CONFIG_MPC832x_RDB)		+= cuImage.mpc832x_rdb
image-$(CONFIG_MPC834x_ITX)		+= cuImage.mpc8349emitx \
					   cuImage.mpc8349emitxgp
image-$(CONFIG_MPC834x_MDS)		+= cuImage.mpc834x_mds
image-$(CONFIG_MPC836x_MDS)		+= cuImage.mpc836x_mds
233
image-$(CONFIG_ASP834x)			+= dtbImage.asp834x-redboot
234 235 236 237 238 239 240 241 242 243 244 245

# Board ports in arch/powerpc/platform/85xx/Kconfig
image-$(CONFIG_MPC8540_ADS)		+= cuImage.mpc8540ads
image-$(CONFIG_MPC8560_ADS)		+= cuImage.mpc8560ads
image-$(CONFIG_MPC85xx_CDS)		+= cuImage.mpc8541cds \
					   cuImage.mpc8548cds \
					   cuImage.mpc8555cds
image-$(CONFIG_MPC85xx_MDS)		+= cuImage.mpc8568mds
image-$(CONFIG_MPC85xx_DS)		+= cuImage.mpc8544ds \
					   cuImage.mpc8572ds
image-$(CONFIG_TQM8540)			+= cuImage.tqm8540
image-$(CONFIG_TQM8541)			+= cuImage.tqm8541
246
image-$(CONFIG_TQM8548)			+= cuImage.tqm8548
247 248
image-$(CONFIG_TQM8555)			+= cuImage.tqm8555
image-$(CONFIG_TQM8560)			+= cuImage.tqm8560
249 250
image-$(CONFIG_SBC8548)			+= cuImage.sbc8548
image-$(CONFIG_SBC8560)			+= cuImage.sbc8560
251
image-$(CONFIG_KSI8560)			+= cuImage.ksi8560
252 253 254 255

# Board ports in arch/powerpc/platform/embedded6xx/Kconfig
image-$(CONFIG_STORCENTER)		+= cuImage.storcenter
image-$(CONFIG_MPC7448HPC2)		+= cuImage.mpc7448hpc2
R
Remi Machet 已提交
256
image-$(CONFIG_PPC_C2K)			+= cuImage.c2k
257

258 259 260
# Board port in arch/powerpc/platform/amigaone/Kconfig
image-$(CONFIG_AMIGAONE)		+= cuImage.amigaone

261 262
# For 32-bit powermacs, build the COFF and miboot images
# as well as the ELF images.
263 264 265 266
ifeq ($(CONFIG_PPC32),y)
image-$(CONFIG_PPC_PMAC)	+= zImage.coff zImage.miboot
endif

267 268 269
# Allow extra targets to be added to the defconfig
image-y	+= $(subst ",,$(CONFIG_EXTRA_TARGETS))

M
Milton Miller 已提交
270
initrd-  := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-))
271
initrd-y := $(patsubst zImage%, zImage.initrd%, \
272
		$(patsubst dtbImage%, dtbImage.initrd%, \
273 274
		$(patsubst simpleImage%, simpleImage.initrd%, \
		$(patsubst treeImage%, treeImage.initrd%, $(image-y)))))
275
initrd-y := $(filter-out $(image-y), $(initrd-y))
M
Milton Miller 已提交
276
targets	+= $(image-y) $(initrd-y)
277

278 279 280 281 282
$(addprefix $(obj)/, $(initrd-y)): $(obj)/ramdisk.image.gz

# Don't put the ramdisk on the pattern rule; when its missing make will try
# the pattern rule with less dependencies that also matches (even with the
# hard dependency listed).
283 284
$(obj)/zImage.initrd.%: vmlinux $(wrapperbits)
	$(call if_changed,wrap,$*,,,$(obj)/ramdisk.image.gz)
285

286 287 288
$(obj)/zImage.%: vmlinux $(wrapperbits)
	$(call if_changed,wrap,$*)

289
# dtbImage% - a dtbImage is a zImage with an embedded device tree blob
290 291
$(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(obj)/%.dtb
	$(call if_changed,wrap,$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
292

293 294
$(obj)/dtbImage.%: vmlinux $(wrapperbits) $(obj)/%.dtb
	$(call if_changed,wrap,$*,,$(obj)/$*.dtb)
295

296 297 298 299 300
# This cannot be in the root of $(src) as the zImage rule always adds a $(obj)
# prefix
$(obj)/vmlinux.strip: vmlinux
	$(STRIP) -s -R .comment $< -o $@

301 302
# The iseries hypervisor won't take an ET_DYN executable, so this
# changes the type (byte 17) in the file to ET_EXEC (2).
303 304
$(obj)/zImage.iseries: vmlinux
	$(STRIP) -s -R .comment $< -o $@
305
	printf "\x02" | dd of=$@ conv=notrunc bs=1 seek=17
306

307 308 309
$(obj)/uImage: vmlinux $(wrapperbits)
	$(call if_changed,wrap,uboot)

310 311 312
$(obj)/cuImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
	$(call if_changed,wrap,cuboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)

313 314
$(obj)/cuImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
	$(call if_changed,wrap,cuboot-$*,,$(obj)/$*.dtb)
315

316 317 318 319 320 321
$(obj)/simpleImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
	$(call if_changed,wrap,simpleboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)

$(obj)/simpleImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
	$(call if_changed,wrap,simpleboot-$*,,$(obj)/$*.dtb)

322 323
$(obj)/treeImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
	$(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
324

325 326 327 328
$(obj)/treeImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
	$(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb)

# Rule to build device tree blobs
329 330 331 332
DTC = $(objtree)/scripts/dtc/dtc

$(obj)/%.dtb: $(dtstree)/%.dts
	$(DTC) -O dtb -o $(obj)/$*.dtb -b 0 $(DTS_FLAGS) $(dtstree)/$*.dts
333

334 335 336 337 338
# If there isn't a platform selected then just strip the vmlinux.
ifeq (,$(image-y))
image-y := vmlinux.strip
endif

339 340 341 342 343
$(obj)/zImage:		$(addprefix $(obj)/, $(image-y))
	@rm -f $@; ln $< $@
$(obj)/zImage.initrd:	$(addprefix $(obj)/, $(initrd-y))
	@rm -f $@; ln $< $@

A
Akinobu Mita 已提交
344
install: $(CONFIGURE) $(addprefix $(obj)/, $(image-y))
345
	sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" $^
346

347
# anything not in $(targets)
348 349 350
clean-files += $(image-) $(initrd-) cuImage.* dtbImage.* treeImage.* \
	zImage zImage.initrd zImage.chrp zImage.coff zImage.holly \
	zImage.iseries zImage.miboot zImage.pmac zImage.pseries \
351
	simpleImage.* otheros.bld *.dtb
352 353 354 355 356 357

# clean up files cached by wrapper
clean-kernel := vmlinux.strip vmlinux.bin
clean-kernel += $(addsuffix .gz,$(clean-kernel))
# If not absolute clean-files are relative to $(obj).
clean-files += $(addprefix $(objtree)/, $(clean-kernel))
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405

WRAPPER_OBJDIR := /usr/lib/kernel-wrapper
WRAPPER_DTSDIR := /usr/lib/kernel-wrapper/dts
WRAPPER_BINDIR := /usr/sbin
INSTALL := install

extra-installed		:= $(patsubst $(obj)/%, $(DESTDIR)$(WRAPPER_OBJDIR)/%, $(extra-y))
hostprogs-installed	:= $(patsubst %, $(DESTDIR)$(WRAPPER_BINDIR)/%, $(hostprogs-y))
wrapper-installed	:= $(DESTDIR)$(WRAPPER_BINDIR)/wrapper
dts-installed		:= $(patsubst $(obj)/dts/%, $(DESTDIR)$(WRAPPER_DTSDIR)/%, $(wildcard $(obj)/dts/*.dts))

all-installed		:= $(extra-installed) $(hostprogs-installed) $(wrapper-installed) $(dts-installed)

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

quiet_cmd_install	  = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,%,$@)
      cmd_install	  = $(INSTALL)  -m0644 $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,$(obj)/%,$@) $@

quiet_cmd_install_dts	  = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,dts/%,$@)
      cmd_install_dts	  = $(INSTALL)  -m0644 $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,$(srctree)/$(obj)/dts/%,$@) $@

quiet_cmd_install_exe	  = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,%,$@)
      cmd_install_exe	  = $(INSTALL)  -m0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(obj)/%,$@) $@

quiet_cmd_install_wrapper = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,%,$@)
      cmd_install_wrapper = $(INSTALL)  -m0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(srctree)/$(obj)/%,$@) $@ ;\
				sed -i $@ -e 's%^object=.*%object=$(WRAPPER_OBJDIR)%' \
					  -e 's%^objbin=.*%objbin=$(WRAPPER_BINDIR)%' \


$(DESTDIR)$(WRAPPER_OBJDIR) $(DESTDIR)$(WRAPPER_DTSDIR) $(DESTDIR)$(WRAPPER_BINDIR):
	$(call cmd,mkdir)

$(extra-installed)	: $(DESTDIR)$(WRAPPER_OBJDIR)/% : $(obj)/% | $(DESTDIR)$(WRAPPER_OBJDIR)
	$(call cmd,install)

$(hostprogs-installed)  : $(DESTDIR)$(WRAPPER_BINDIR)/% : $(obj)/% | $(DESTDIR)$(WRAPPER_BINDIR)
	$(call cmd,install_exe)

$(dts-installed)	: $(DESTDIR)$(WRAPPER_DTSDIR)/% : $(srctree)/$(obj)/dts/% | $(DESTDIR)$(WRAPPER_DTSDIR)
	$(call cmd,install_dts)

$(wrapper-installed): $(DESTDIR)$(WRAPPER_BINDIR) $(srctree)/$(obj)/wrapper | $(DESTDIR)$(WRAPPER_BINDIR)
	$(call cmd,install_wrapper)

$(obj)/bootwrapper_install: $(all-installed)