17e300d5080be33483c7661e7bdf3cc298039c6a
[openwrt.git] / target / linux / x86 / image / Makefile
1
2 # Copyright (C) 2006-2012 OpenWrt.org
3 #
4 # This is free software, licensed under the GNU General Public License v2.
5 # See /LICENSE for more information.
6 #
7 include $(TOPDIR)/rules.mk
8 include $(INCLUDE_DIR)/image.mk
9
10 export PATH=$(TARGET_PATH):/sbin
11
12 GRUB2_MODULES = at_keyboard biosdisk boot chain configfile ext2 linux ls part_msdos reboot serial vga
13 GRUB2_MODULES_ISO = at_keyboard biosdisk boot chain configfile iso9660 linux ls part_msdos reboot serial vga
14 GRUB_TERMINALS =
15 GRUB_SERIAL_CONFIG =
16 GRUB_TERMINAL_CONFIG =
17 GRUB_CONSOLE_CMDLINE =
18
19 ifneq ($(CONFIG_X86_GRUB_CONSOLE),)
20   GRUB_CONSOLE_CMDLINE += console=tty0
21   GRUB_TERMINALS += console
22 endif
23
24 ifneq ($(CONFIG_X86_GRUB_SERIAL),)
25   GRUB_CONSOLE_CMDLINE += console=$(call qstrip,$(CONFIG_X86_GRUB_SERIAL)),$(CONFIG_X86_GRUB_BAUDRATE)n8
26   GRUB_SERIAL_CONFIG := serial --unit=0 --speed=$(CONFIG_X86_GRUB_BAUDRATE) --word=8 --parity=no --stop=1
27   GRUB_TERMINALS += serial
28 endif
29
30 ifneq ($(GRUB_TERMINALS),)
31   ifneq ($(CONFIG_X86_USE_GRUB2),)
32     GRUB_TERMINAL_CONFIG := terminal_input $(GRUB_TERMINALS); terminal_output $(GRUB_TERMINALS)
33   else
34     GRUB_TERMINAL_CONFIG := terminal --timeout=2 $(GRUB_TERMINALS)
35   endif
36 endif
37
38 ROOTPART:=$(call qstrip,$(CONFIG_TARGET_ROOTFS_PARTNAME))
39
40 GRUB_TIMEOUT:=$(call qstrip,$(CONFIG_X86_GRUB_TIMEOUT))
41
42 ifneq ($(CONFIG_X86_GRUB_IMAGES),)
43
44   BOOTOPTS:=$(call qstrip,$(CONFIG_X86_GRUB_BOOTOPTS))
45
46   define Image/cmdline/ext4
47     root=$(ROOTPART) rootfstype=ext4 rootwait
48   endef
49
50   define Image/cmdline/jffs2-64k
51     block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=jffs2 rootwait
52   endef
53
54   define Image/cmdline/jffs2-128k
55     block2mtd.block2mtd=$(ROOTPART),131072,rootfs root=/dev/mtdblock0 rootfstype=jffs2 rootwait
56   endef
57
58   define Image/cmdline/squashfs
59     block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=squashfs rootwait
60   endef
61
62   define Image/Build/grub
63         # left here because the image builder doesnt need these
64         $(INSTALL_DIR) $(KDIR)/root.grub/boot/grub
65         $(CP) \
66                 $(KDIR)/stage1 \
67                 $(KDIR)/stage2 \
68                 $(KDIR)/e2fs_stage1_5 \
69                 $(KDIR)/root.grub/boot/grub/
70         $(CP) $(KDIR)/bzImage $(KDIR)/root.grub/boot/vmlinuz
71         sed \
72                 -e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
73                 -e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
74                 -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
75                 -e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
76                 ./menu.lst > $(KDIR)/root.grub/boot/grub/menu.lst
77         PADDING="$(CONFIG_TARGET_IMAGES_PAD)" PATH="$(TARGET_PATH)" ./gen_image_grub.sh \
78                 $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
79                 $(CONFIG_TARGET_KERNEL_PARTSIZE) $(KDIR)/root.grub \
80                 $(CONFIG_TARGET_ROOTFS_PARTSIZE) $(KDIR)/root.$(1)
81         $(call Image/Build/grub/$(1))
82   endef
83
84   define Image/Prepare/grub
85         # for the image builder
86         $(CP) \
87                 $(STAGING_DIR)/usr/lib/grub/i386-openwrt/stage1 \
88                 $(STAGING_DIR)/usr/lib/grub/i386-openwrt/stage2 \
89                 $(STAGING_DIR)/usr/lib/grub/i386-openwrt/stage2_eltorito \
90                 $(STAGING_DIR)/usr/lib/grub/i386-openwrt/e2fs_stage1_5 \
91                 $(KDIR)/
92   endef
93
94   define Image/Build/grub2
95         # left here because the image builder doesnt need these
96         $(INSTALL_DIR) $(KDIR)/root.grub/boot/grub $(KDIR)/grub2
97         $(CP) $(KDIR)/bzImage $(KDIR)/root.grub/boot/vmlinuz
98         grub-mkimage \
99                 -o $(KDIR)/grub2/core.img \
100                 -O i386-pc \
101                 -c ./grub-early.cfg \
102                 $(GRUB2_MODULES)
103         $(CP) $(STAGING_DIR_HOST)/lib/grub/i386-pc/*.img $(KDIR)/grub2/
104         echo '(hd0) $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img' > $(KDIR)/grub2/device.map
105         sed \
106                 -e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
107                 -e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
108                 -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
109                 -e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
110                 ./grub.cfg > $(KDIR)/root.grub/boot/grub/grub.cfg
111         PADDING="$(CONFIG_TARGET_IMAGES_PAD)" PATH="$(TARGET_PATH)" ./gen_image_generic.sh \
112                 $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
113                 $(CONFIG_TARGET_KERNEL_PARTSIZE) $(KDIR)/root.grub \
114                 $(CONFIG_TARGET_ROOTFS_PARTSIZE) $(KDIR)/root.$(1) \
115                 256
116         grub-bios-setup \
117                 --device-map="$(KDIR)/grub2/device.map" \
118                 -d "$(KDIR)/grub2" \
119                 -r "hd0,msdos1" \
120                 "$(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img"
121         $(call Image/Build/grub/$(1))
122   endef
123 endif
124
125 ROOTDELAY=10
126
127 ifneq ($(CONFIG_OLPC_BOOTSCRIPT_IMAGES),)
128
129   define Image/cmdline/ext4
130     root=$(ROOTPART) rootfstype=ext4 rootwait
131   endef
132
133   define Image/cmdline/jffs2-64k
134     block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=jffs2 rootdelay=$(ROOTDELAY)
135   endef
136
137   define Image/cmdline/jffs2-128k
138     block2mtd.block2mtd=$(ROOTPART),131072,rootfs root=/dev/mtdblock0 rootfstype=jffs2 rootdelay=$(ROOTDELAY)
139   endef
140
141   define Image/cmdline/squashfs
142     block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=squashfs rootdelay=$(ROOTDELAY)
143   endef
144
145   define Image/Build/bootscript
146         # left here because the image builder doesnt need these
147         $(INSTALL_DIR) $(KDIR)/root.bootscript/boot
148         $(CP) $(KDIR)/bzImage $(KDIR)/root.bootscript/boot/vmlinuz
149         sed -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1))) $(BOOTOPTS)#g' \
150                 ./olpc.fth > $(KDIR)/root.bootscript/boot/olpc.fth
151         PADDING="$(CONFIG_TARGET_IMAGES_PAD)" PATH="$(TARGET_PATH)" ./gen_image_olpc.sh \
152                 $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
153                 $(CONFIG_TARGET_KERNEL_PARTSIZE) $(KDIR)/root.bootscript \
154                 $(CONFIG_TARGET_ROOTFS_PARTSIZE) $(KDIR)/root.$(1)
155   endef
156
157 endif
158
159 define Image/Build/squashfs
160         $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
161 endef
162
163 ifdef CONFIG_X86_USE_GRUB2
164   define Image/Build/iso
165         $(INSTALL_DIR) $(KDIR)/root.grub/boot/grub $(KDIR)/grub2
166         $(CP) $(KDIR)/bzImage $(KDIR)/root.grub/boot/vmlinuz
167         grub-mkimage \
168                 -o $(KDIR)/grub2/eltorito.img \
169                 -O i386-pc \
170                 -c ./grub-early.cfg \
171                 $(GRUB2_MODULES_ISO)
172         cat \
173                 $(STAGING_DIR_HOST)/lib/grub/i386-pc/cdboot.img \
174                 $(KDIR)/grub2/eltorito.img \
175                 > $(KDIR)/root.grub/boot/grub/eltorito.img
176         sed \
177                 -e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
178                 -e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
179                 -e 's#@CMDLINE@#root=/dev/sr0 rootfstype=iso9660 rootwait $(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
180                 -e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
181                 ./grub-iso.cfg > $(KDIR)/root.grub/boot/grub/grub.cfg
182         $(CP) $(KDIR)/bzImage $(KDIR)/root.grub/boot/vmlinuz
183         mkisofs -R -b boot/grub/eltorito.img -no-emul-boot -boot-info-table \
184                 -o $(KDIR)/root.iso $(KDIR)/root.grub $(TARGET_DIR)
185   endef
186 else
187   define Image/Build/iso
188         $(INSTALL_DIR) $(KDIR)/root.grub/boot/grub
189         $(CP) \
190                 $(KDIR)/stage2_eltorito \
191                 $(KDIR)/root.grub/boot/grub/ 
192         sed \
193                 -e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
194                 -e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
195                 -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
196                 -e 's#(hd0,0)#(cd)#g' \
197                 ./menu.lst > $(KDIR)/root.grub/boot/grub/menu.lst
198         $(CP) $(KDIR)/bzImage $(KDIR)/root.grub/boot/vmlinuz 
199         mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table \
200                 -o $(KDIR)/root.iso $(KDIR)/root.grub 
201   endef
202 endif
203
204 ifneq ($(CONFIG_X86_VDI_IMAGES),)
205   define Image/Build/vdi
206     # left here because the image builder doesnt need these
207     ifeq ($(1),ext4)
208                 rm $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vdi || true
209                 qemu-img convert -f raw -O vdi \
210                         $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
211                         $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vdi
212                 # XXX: VBoxManage insists on setting perms to 0600
213                 chmod 0644 $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vdi
214     endif
215   endef
216 endif
217
218 ifneq ($(CONFIG_X86_VMDK_IMAGES),)
219   define Image/Build/vmdk
220     # left here because the image builder doesnt need these
221     ifeq ($(1),ext4)
222                 rm $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vmdk || true
223                 qemu-img convert -f raw -O vmdk \
224                         $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
225                         $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vmdk
226     endif
227   endef
228 endif
229
230 define Image/Build/gzip
231         gzip -f9 $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img
232         gzip -f9 $(BIN_DIR)/$(IMG_PREFIX)-rootfs-$(1).img
233 endef
234
235 ifneq ($(CONFIG_TARGET_IMAGES_GZIP),)
236   define Image/Build/gzip/ext4
237         $(call Image/Build/gzip,ext4)
238   endef
239   ifneq ($(CONFIG_TARGET_IMAGES_PAD),)
240     define Image/Build/gzip/squashfs
241         $(call Image/Build/gzip,squashfs)
242     endef
243     define Image/Build/gzip/jffs2-64k
244         $(call Image/Build/gzip,jffs2-64k)
245     endef
246     define Image/Build/gzip/jffs2-128k
247         $(call Image/Build/gzip,jffs2-128k)
248     endef
249   endif
250 endif
251
252 define Image/BuildKernel
253         $(CP) $(KDIR)/bzImage $(BIN_DIR)/$(IMG_PREFIX)-vmlinuz
254   ifneq ($(CONFIG_X86_ETHERBOOT_IMAGES),)
255         rm -f $(BIN_DIR)/$(IMG_PREFIX)-etherboot
256         $(STAGING_DIR_HOST)/bin/mkelfImage \
257                 --append=$(CONFIG_X86_ETHERBOOT_BOOTOPTS) \
258                 $(KDIR)/bzImage \
259                 $(BIN_DIR)/$(IMG_PREFIX)-etherboot
260   endif
261 endef
262
263 define Image/Prepare
264         $(CP) $(LINUX_DIR)/arch/x86/boot/bzImage $(KDIR)/bzImage
265         $(call Image/Prepare/bootscript)
266         $(call Image/Prepare/$(if $(CONFIG_X86_USE_GRUB2),grub2,grub))
267 endef
268
269 define Image/Build
270         $(call Image/Build/$(1))
271         $(call Image/Build/bootscript,$(1))
272   ifneq ($(1),iso)
273         $(call Image/Build/$(if $(CONFIG_X86_USE_GRUB2),grub2,grub),$(1))
274         $(call Image/Build/vdi,$(1))
275         $(call Image/Build/vmdk,$(1))
276   endif
277         $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-rootfs-$(1).img
278         $(CP) $(KDIR)/bzImage $(BIN_DIR)/$(IMG_PREFIX)-vmlinuz
279         $(call Image/Build/gzip/$(1))
280 endef
281
282 $(eval $(call BuildImage))