Makefile 8.03 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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
#	needed to build the 32 bit image.  These are normally HOSTCC,
#	but may be a third compiler if, for example, you are cross
#	compiling from an intel box.  Once the 64bit ppc gcc is
#	stable it will probably simply be a compiler switch to
#	compile for 32bit mode.
#	To make it easier to setup a cross compiler,
#	CROSS32_COMPILE is setup as a prefix just like CROSS_COMPILE
#	in the toplevel makefile.


HOSTCC		:= gcc
25
26
BOOTCFLAGS	:= $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem \
		   $(shell $(CROSS32CC) -print-file-name=include) -fPIC
27
BOOTAFLAGS	:= -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc
Linus Torvalds's avatar
Linus Torvalds committed
28
OBJCOPYFLAGS    := contents,alloc,load,readonly,data
29
OBJCOPY_COFF_ARGS := -O aixcoff-rs6000 --set-start 0x500000
30
OBJCOPY_MIB_ARGS  := -O aixcoff-rs6000 -R .stab -R .stabstr -R .comment
Linus Torvalds's avatar
Linus Torvalds committed
31

32
33
zlib       := inffast.c inflate.c inftrees.c
zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h
Olaf Hering's avatar
Olaf Hering committed
34
35
36
37
38
zliblinuxheader := zlib.h zconf.h zutil.h

$(addprefix $(obj)/,$(zlib) main.o): $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader))
#$(addprefix $(obj)/,main.o): $(addprefix $(obj)/,zlib.h)

39
src-boot := crt0.S string.S prom.c stdio.c main.c div64.S
Olaf Hering's avatar
Olaf Hering committed
40
src-boot += $(zlib)
Linus Torvalds's avatar
Linus Torvalds committed
41
42
43
src-boot := $(addprefix $(obj)/, $(src-boot))
obj-boot := $(addsuffix .o, $(basename $(src-boot)))

44
45
46
47
ifeq ($(call cc-option-yn, -fstack-protector),y)
BOOTCFLAGS	+= -fno-stack-protector
endif

Olaf Hering's avatar
Olaf Hering committed
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
BOOTCFLAGS	+= -I$(obj) -I$(srctree)/$(obj)

quiet_cmd_copy_zlib = COPY    $@
      cmd_copy_zlib = sed "s@__attribute_used__@@;s@<linux/\([^>]\+\).*@\"\1\"@" $< > $@

quiet_cmd_copy_zlibheader = COPY    $@
      cmd_copy_zlibheader = sed "s@<linux/\([^>]\+\).*@\"\1\"@" $< > $@
# stddef.h for NULL
quiet_cmd_copy_zliblinuxheader = COPY    $@
      cmd_copy_zliblinuxheader = sed "s@<linux/string.h>@\"string.h\"@;s@<linux/kernel.h>@<stddef.h>@;s@<linux/\([^>]\+\).*@\"\1\"@" $< > $@

$(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)

clean-files := $(zlib) $(zlibheader) $(zliblinuxheader)


Linus Torvalds's avatar
Linus Torvalds committed
71
72
73
74
75
76
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 $@ $<

Geoff Levand's avatar
Geoff Levand committed
77
quiet_cmd_bootld = BOOTLD  $@
78
      cmd_bootld = $(CROSS32LD) -T $(srctree)/$(src)/$(3) -o $@ $(2)
Geoff Levand's avatar
Geoff Levand committed
79

Linus Torvalds's avatar
Linus Torvalds committed
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
$(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c
	$(call if_changed_dep,bootcc)
$(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S
	$(call if_changed_dep,bootas)

#-----------------------------------------------------------
# ELF sections within the zImage bootloader/wrapper
#-----------------------------------------------------------
required := vmlinux.strip
initrd   := initrd

obj-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.o, $(section)))
src-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.c, $(section)))
gz-sec  = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section)))

95
96
97
hostprogs-y		:= addnote addRamDisk hack-coff

targets += zImage.vmode zImage.initrd.vmode zImage zImage.initrd \
98
	   zImage.coff zImage.initrd.coff miboot.image miboot.initrd.image \
99
100
101
	   $(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \
	   $(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \
	   $(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \
102
	   vmlinux.initrd dummy.o
Linus Torvalds's avatar
Linus Torvalds committed
103
104
105
106
107
extra-y			:= initrd.o

quiet_cmd_ramdisk = RAMDISK $@
      cmd_ramdisk = $(obj)/addRamDisk $(obj)/ramdisk.image.gz $< $@

Geoff Levand's avatar
Geoff Levand committed
108
quiet_cmd_stripvm = STRIP   $@
109
      cmd_stripvm = $(STRIP) -s -R .comment $< -o $@
Linus Torvalds's avatar
Linus Torvalds committed
110

111
vmlinux.strip: vmlinux
Linus Torvalds's avatar
Linus Torvalds committed
112
	$(call if_changed,stripvm)
113
$(obj)/vmlinux.initrd: vmlinux.strip $(obj)/addRamDisk $(obj)/ramdisk.image.gz
Linus Torvalds's avatar
Linus Torvalds committed
114
115
	$(call if_changed,ramdisk)

Geoff Levand's avatar
Geoff Levand committed
116
117
118
119
120
quiet_cmd_addsection = ADDSEC  $@
      cmd_addsection = $(CROSS32OBJCOPY) $@ \
		--add-section=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $@))=$(patsubst %.o,%.gz, $@) \
		--set-section-flags=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $@))=$(OBJCOPYFLAGS)

Geoff Levand's avatar
Geoff Levand committed
121
122
quiet_cmd_addnote = ADDNOTE $@
      cmd_addnote = $(obj)/addnote $@
Linus Torvalds's avatar
Linus Torvalds committed
123

124
125
126
127
quiet_cmd_gen-miboot = GEN     $@
      cmd_gen-miboot = $(OBJCOPY) $(OBJCOPY_MIB_ARGS) \
		       --add-section=$1=$(word 2, $^) $< $@

128
129
130
131
quiet_cmd_gencoff = COFF    $@
      cmd_gencoff = $(OBJCOPY) $(OBJCOPY_COFF_ARGS) $@ && \
		    $(obj)/hack-coff $@

132
$(call gz-sec, $(required)): $(obj)/kernel-%.gz: %
Linus Torvalds's avatar
Linus Torvalds committed
133
134
135
136
137
	$(call if_changed,gzip)

$(obj)/kernel-initrd.gz: $(obj)/ramdisk.image.gz
	cp -f $(obj)/ramdisk.image.gz $@

138
$(call src-sec, $(required) $(initrd)): $(obj)/kernel-%.c: $(obj)/kernel-%.gz
Geoff Levand's avatar
Geoff Levand committed
139
	@touch $@
Linus Torvalds's avatar
Linus Torvalds committed
140

141
$(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c
Linus Torvalds's avatar
Linus Torvalds committed
142
	$(call if_changed_dep,bootcc)
Geoff Levand's avatar
Geoff Levand committed
143
	$(call cmd,addsection)
Linus Torvalds's avatar
Linus Torvalds committed
144

145
$(obj)/zImage.vmode $(obj)/zImage.coff: obj-boot += $(call obj-sec, $(required))
146
$(obj)/zImage.vmode: $(call obj-sec, $(required)) $(obj-boot) $(srctree)/$(src)/zImage.lds
147
	$(call cmd,bootld,$(obj-boot),zImage.lds)
Geoff Levand's avatar
Geoff Levand committed
148

149
$(obj)/zImage.initrd.vmode $(obj)/zImage.initrd.coff: obj-boot += $(call obj-sec, $(required) $(initrd))
150
$(obj)/zImage.initrd.vmode: $(call obj-sec, $(required) $(initrd)) $(obj-boot) $(srctree)/$(src)/zImage.lds
151
152
	$(call cmd,bootld,$(obj-boot),zImage.lds)

153
154
# For 32-bit powermacs, build the COFF and miboot images
# as well as the ELF images.
155
156
coffimage-$(CONFIG_PPC_PMAC)-$(CONFIG_PPC32) := $(obj)/zImage.coff
coffrdimg-$(CONFIG_PPC_PMAC)-$(CONFIG_PPC32) := $(obj)/zImage.initrd.coff
157
158
mibootimg-$(CONFIG_PPC_PMAC)-$(CONFIG_PPC32) := $(obj)/miboot.image
mibrdimg-$(CONFIG_PPC_PMAC)-$(CONFIG_PPC32)  := $(obj)/miboot.initrd.image
Geoff Levand's avatar
Geoff Levand committed
159

160
161
$(obj)/zImage: $(obj)/zImage.vmode $(obj)/addnote $(coffimage-y-y) \
			$(mibootimg-y-y)
Geoff Levand's avatar
Geoff Levand committed
162
	@cp -f $< $@
Linus Torvalds's avatar
Linus Torvalds committed
163
164
	$(call if_changed,addnote)

165
166
$(obj)/zImage.initrd: $(obj)/zImage.initrd.vmode $(obj)/addnote \
			$(coffrdimg-y-y) $(mibrdimg-y-y)
Geoff Levand's avatar
Geoff Levand committed
167
	@cp -f $< $@
Linus Torvalds's avatar
Linus Torvalds committed
168
169
	$(call if_changed,addnote)

170
171
$(obj)/zImage.coff: $(call obj-sec, $(required)) $(obj-boot) \
			$(srctree)/$(src)/zImage.coff.lds $(obj)/hack-coff
172
173
174
175
176
177
178
179
	$(call cmd,bootld,$(obj-boot),zImage.coff.lds)
	$(call cmd,gencoff)

$(obj)/zImage.initrd.coff: $(call obj-sec, $(required) $(initrd)) $(obj-boot) \
			   $(srctree)/$(src)/zImage.coff.lds $(obj)/hack-coff
	$(call cmd,bootld,$(obj-boot),zImage.coff.lds)
	$(call cmd,gencoff)

180
181
182
183
184
185
$(obj)/miboot.image: $(obj)/dummy.o $(obj)/vmlinux.gz
	$(call cmd,gen-miboot,image)

$(obj)/miboot.initrd.image: $(obj)/miboot.image $(images)/ramdisk.image.gz
	$(call cmd,gen-miboot,initrd)

186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#-----------------------------------------------------------
# build u-boot images
#-----------------------------------------------------------
quiet_cmd_mygzip = GZIP $@
cmd_mygzip = gzip -f -9 < $< > $@.$$$$ && mv $@.$$$$ $@

quiet_cmd_objbin = OBJCOPY $@
      cmd_objbin = $(OBJCOPY) -O binary $< $@

quiet_cmd_uimage = UIMAGE $@
      cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A ppc -O linux -T kernel \
               -C gzip -a 00000000 -e 00000000 -n 'Linux-$(KERNELRELEASE)' \
               -d $< $@

MKIMAGE		:= $(srctree)/scripts/mkuboot.sh
targets		+= uImage
extra-y		+= vmlinux.bin vmlinux.gz

$(obj)/vmlinux.bin: vmlinux FORCE
	$(call if_changed,objbin)

$(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE
	$(call if_changed,mygzip)

$(obj)/uImage: $(obj)/vmlinux.gz
	$(Q)rm -f $@
212
	$(call cmd,uimage)
213
214
215
	@echo -n '  Image: $@ '
	@if [ -f $@ ]; then echo 'is ready' ; else echo 'not made'; fi

Linus Torvalds's avatar
Linus Torvalds committed
216
217
218
install: $(CONFIGURE) $(BOOTIMAGE)
	sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" "$(BOOTIMAGE)"

219
clean-files += $(addprefix $(objtree)/, $(obj-boot) vmlinux.strip)