Makefile.bootimage revision 1.1
1# $NetBSD: Makefile.bootimage,v 1.1 2012/01/22 03:53:30 tsutsui Exp $ 2# 3# Copyright (c) 2009, 2010, 2011 Izumi Tsutsui. All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions 7# are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 25# 26# Makefile to create a bootable FS image for USB flash or emulators 27# 28 29# 30# Required variables: 31# RELEASEDIR 32# Should be defined in nbmake-${MACHINE} 33# IMGBASE 34# Basename of the image 35# 36# Optional variables: 37# BOOTDISK 38# device name of target bootable disk specified in /etc/fstab 39# (default: sd0) 40# USE_MBR 41# set yes if target disk image requires MBR partition 42# (defautl: no) 43# USE_SUNLABEL 44# set yes if target disk image requires Sun's label 45# (default: no) 46# INSTALLBOOT_AFTER_DISKLABEL (untested) 47# set yes if the target ${MACHINE} requires disklabel 48# to run installboot(8), like hp300 49# (default: empty) 50# IMAGEMB 51# target image size in MB 52# (default: 2048) 53# SWAPMB 54# swap size in target image in MB 55# (default: 128) 56# KERN_SET 57# kernel set name which should be extracted into image 58# (default: kern-GENERIC) 59# SETS 60# binary sets that should be extracted into image 61# (default: modules base etc comp games man misc tests text 62# xbase xcomp xetc xfont xserver) 63# SETS_DIR 64# directory path where binary sets are stored 65# (default: ${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets) 66# IMGFILE_EXTRA 67# list of additional files to be copied into images, 68# containing one or more tuples of the form: 69# FILE TARGETPATH 70# for installation image etc. 71# (default: empty) 72# IMGDIR_EXTRA 73# list of additional directories to be copied into images, 74# containing one or more tuples of the form: 75# DIR TARGETPATH 76# for installation image etc. 77# (default: empty) 78# XXX: currently permittions in IMGDIR_EXTRA are not handled 79# IMGDIR_EXCLUDE 80# pax(1) options to exclude files which should not copied 81# into TARGETPATH in IMGDIR_EXTRA 82# (default: empty) 83# FSTAB_IN 84# template file of /etc/fstab 85# (default: ${DISTRIBDIR}/common/bootimage/fstab.in) 86# SPEC_IN 87# default files of spec file for makefs(8) 88# (default: ${DISTRIBDIR}/common/bootimage/spec.in) 89# SPEC_EXTRA 90# additional files of spec file for makefs(8) 91# (default: empty) 92# IMGMAKEFSOPTIONS 93# options passed to makefs(8) to create root file system 94# (default: -o bsize=16384,fsize=2048,density=8192) 95# PRIMARY_BOOT 96# primary boot loader that should be installed into 97# the target image via installboot(8) 98# (default: empty) 99# SECONDARY_BOOT 100# secondary bootloader that should be put into the target image 101# (default: empty) 102# SECONDARY_BOOT_ARG 103# extra arguments that should be passed to installboot(8) 104# to specify the secondary bootloader 105# (default: empty) 106# DISKPROTO_IN 107# template file of disklabel -R 108# (default: ${DISTRIBDIR}/common/bootimage/diskproto.in 109# or ${DISTRIBDIR}/common/bootimage/diskproto.mbr.in) 110# OMIT_SWAPIMG 111# no need to put swap partition into image (for USB stick) 112# (default: no) 113# 114 115.include <bsd.sys.mk> # for HOST_SH 116.include <bsd.own.mk> # 117.include <bsd.endian.mk> # for TARGET_ENDIANNESS 118 119.include "${NETBSDSRCDIR}/distrib/common/Makefile.distrib" 120 121.if empty(IMGBASE) 122.BEGIN: 123 @echo "Error: IMGBASE is not set" 124 @false 125.endif 126.if empty(RELEASEDIR) 127.BEGIN: 128 @echo "Error: RELEASEDIR is not set" 129 @false 130.endif 131 132# should be defined elsewhere? 133CAT?= cat 134CHMOD?= chmod 135CP?= cp 136DD?= dd 137MKDIR?= mkdir -p 138RM?= rm 139 140# 141# common definitions for image 142# 143BOOTDISK?= sd0 144USE_MBR?= no 145USE_SUNLABEL?= no 146INSTALLBOOT_AFTER_DISKLABEL?= no 147 148# 149# size parameters for image 150# 151IMAGEMB?= 2048 # 2048MB 152SWAPMB?= 128 # 128MB 153 154IMAGESECTORS!= expr ${IMAGEMB} \* 1024 \* 1024 / 512 155SWAPSECTORS!= expr ${SWAPMB} \* 1024 \* 1024 / 512 156 157.if ${USE_MBR} == "no" 158LABELSECTORS?= 0 159.else 160#LABELSECTORS?= 63 # historical 161#LABELSECTORS?= 32 # 16KB aligned 162LABELSECTORS?= 2048 # 1MB aligned for modern flash devices 163.endif 164 165FSSECTORS!= expr ${IMAGESECTORS} - ${SWAPSECTORS} - ${LABELSECTORS} 166FSSIZE!= expr ${FSSECTORS} \* 512 167 168# parameters for disklabel and MBR 169HEADS= 64 170SECTORS= 32 171CYLINDERS!= expr ${IMAGESECTORS} / \( ${HEADS} \* ${SECTORS} \) 172SECPERCYLINDERS!= expr ${HEADS} \* ${SECTORS} 173MBRHEADS= 255 174MBRSECTORS= 63 175MBRCYLINDERS!= expr ${IMAGESECTORS} / \( ${MBRHEADS} \* ${MBRSECTORS} \) 176MBRNETBSD= 169 177 178BSDPARTSECTORS!= expr ${IMAGESECTORS} - ${LABELSECTORS} 179FSOFFSET= ${LABELSECTORS} 180SWAPOFFSET!= expr ${LABELSECTORS} + ${FSSECTORS} 181 182# parameters for sunlabel 183FSCYLINDERS!= expr ${FSSECTORS} / \( ${HEADS} \* ${SECTORS} \) 184SWAPCYLINDERS!= expr ${SWAPSECTORS} / \( ${HEADS} \* ${SECTORS} \) 185 186 187# 188# definitions to create root fs 189# 190SETS_DEFAULT= modules base etc comp games man misc tests text 191.if ${MKX11} != "no" 192SETS_DEFAULT+= xbase xcomp xetc xfont xserver 193.endif 194 195KERN_SET?= kern-GENERIC 196SETS?= ${SETS_DEFAULT} 197IMG_SETS= ${KERN_SET} ${SETS} 198SETS_DIR?= ${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets 199 200FSTAB_IN?= ${DISTRIBDIR}/common/bootimage/fstab.in 201SPEC_IN?= ${DISTRIBDIR}/common/bootimage/spec.in 202 203IMGMAKEFSOPTIONS?= -o bsize=16384,fsize=2048,density=8192 204 205WORKDIR?= work 206WORKSPEC?= work.spec 207WORKFSTAB?= work.fstab 208WORKRCCONF?= work.rc.conf 209WORKFS?= work.rootfs 210TARGETFS?= imgroot.fs 211 212CLEANFILES+= ${WORKSPEC} ${WORKFSTAB} ${WORKRCCONF} ${WORKFS} 213CLEANFILES+= ${TARGETFS} 214 215# 216# create root file system for the image 217# 218${TARGETFS}: prepare_md_post 219 @if [ ! -d ${RELEASEDIR}/${RELEASEMACHINEDIR} ]; then \ 220 echo "Missing ${RELEASEDIR}/${RELEASEMACHINEDIR}, aborting"; \ 221 false; \ 222 fi; 223 @${MKDIR} ${WORKDIR} 224.for set in ${IMG_SETS} 225 @if [ ! -f ${SETS_DIR}/${set}.tgz ]; then \ 226 echo "Missing ${SETS_DIR}/${set}.tgz, aborting"; \ 227 false; \ 228 fi 229 @echo Extracting ${set}.tgz ... 230 @(cd ${WORKDIR}; ${TOOL_PAX} -rnz -f ${SETS_DIR}/${set}.tgz .) 231.endfor 232.if defined(SECONDARY_BOOT) 233 @echo Copying secondary boot... 234 ${CP} -f ${WORKDIR}/usr/mdec/${SECONDARY_BOOT} ${WORKDIR} 235.endif 236 @echo Preparing /etc/fstab ... 237 ${TOOL_SED} "s/@@BOOTDISK@@/${BOOTDISK}/" < ${FSTAB_IN} > ${WORKFSTAB} 238 ${CP} ${WORKFSTAB} ${WORKDIR}/etc/fstab 239 @echo Setting rc_configured=YES in /etc/rc.conf ... 240 ${TOOL_SED} "s/rc_configured=NO/rc_configured=YES/" \ 241 < ${WORKDIR}/etc/rc.conf > ${WORKRCCONF} 242 ${CP} ${WORKRCCONF} ${WORKDIR}/etc/rc.conf 243.if defined(IMGDIR_EXTRA) 244 @echo Copying extra dirs... 245.for _SRCDIR _TARGET in ${IMGDIR_EXTRA} 246 @if [ ! -d ${_SRCDIR} ]; then \ 247 echo "${_SRCDIR} is not directory, aborting"; \ 248 false; \ 249 fi 250 ${MKDIR} ${WORKDIR}/${_TARGET} 251 (cd ${_SRCDIR} ; \ 252 ${TOOL_PAX} -rw -pe -v \ 253 ${IMGDIR_EXCLUDE} \ 254 . ${.OBJDIR}/${WORKDIR}/${_TARGET} ) 255.endfor 256.endif 257.if defined(IMGFILE_EXTRA) 258 @echo Copying extra files... 259.for _SRC _TARGET in ${IMGFILE_EXTRA} 260 @if [ ! -f ${_SRC} ]; then \ 261 echo "${_SRC} in IMGFILE_EXTRA not found, aborting"; \ 262 false; \ 263 fi 264 @if [ -f ${_SRC} ]; then \ 265 echo ${CP} ${_SRC} ${WORKDIR}/${_TARGET}; \ 266 ${CP} ${_SRC} ${WORKDIR}/${_TARGET}; \ 267 fi 268.endfor 269.endif 270 @echo Preparing spec files for makefs... 271 ${RM} -f ${WORKSPEC} 272 cat ${WORKDIR}/etc/mtree/* | \ 273 ${TOOL_SED} -e 's/ size=[0-9]*//' > ${WORKSPEC} 274 ${HOST_SH} ${WORKDIR}/dev/MAKEDEV -s all | \ 275 ${TOOL_SED} -e '/^\. type=dir/d' -e 's,^\.,./dev,' >> ${WORKSPEC} 276 cat ${SPEC_IN} >> ${WORKSPEC} 277.if defined(SECONDARY_BOOT) 278 echo "./${SECONDARY_BOOT} type=file uname=root gname=wheel mode=0444" \ 279 >> ${WORKSPEC} 280.endif 281.if defined(SPEC_EXTRA) 282 cat ${SPEC_EXTRA} >> ${WORKSPEC} 283.endif 284 @echo Createing rootfs... 285 # XXX /var/spool/ftp/hidden is unreadable 286 ${CHMOD} +r ${WORKDIR}/var/spool/ftp/hidden 287 ${TOOL_MAKEFS} -M ${FSSIZE} -m ${FSSIZE} \ 288 -B ${TARGET_ENDIANNESS} \ 289 -F ${WORKSPEC} -N ${WORKDIR}/etc \ 290 ${IMGMAKEFSOPTIONS} \ 291 ${WORKFS} ${WORKDIR} 292.if !empty(PRIMARY_BOOT) && ${INSTALLBOOT_AFTER_DISKLABEL} == "no" 293 ${TOOL_INSTALLBOOT} -vm ${MACHINE} ${WORKFS} \ 294 ${WORKDIR}/usr/mdec/${PRIMARY_BOOT} ${SECONDARY_BOOT_ARG} 295.endif 296 @echo done. 297 mv ${WORKFS} ${.TARGET} 298 299# 300# definitions to create image 301# 302.if ${USE_MBR} != "no" 303DISKPROTO_IN?= ${DISTRIBDIR}/common/bootimage/diskproto.mbr.in 304.else 305DISKPROTO_IN?= ${DISTRIBDIR}/common/bootimage/diskproto.in 306.endif 307 308OMIT_SWAPIMG?= no 309 310WORKMBR?= work.mbr 311WORKSWAP?= work.swap 312WORKLABEL?= work.diskproto 313WORKIMG?= work.img 314 315CLEANFILES+= ${WORKMBR} ${WORKSWAP} 316CLEANFILES+= ${WORKLABEL}.tmp ${WORKLABEL} 317CLEANFILES+= ${WORKIMG} ${IMGBASE}.img 318 319${WORKLABEL}: 320 ${TOOL_SED} \ 321 -e "s/@@SECTORS@@/${SECTORS}/" \ 322 -e "s/@@HEADS@@/${HEADS}/" \ 323 -e "s/@@SECPERCYLINDERS@@/${SECPERCYLINDERS}/" \ 324 -e "s/@@CYLINDERS@@/${CYLINDERS}/" \ 325 -e "s/@@IMAGESECTORS@@/${IMAGESECTORS}/" \ 326 -e "s/@@FSSECTORS@@/${FSSECTORS}/" \ 327 -e "s/@@FSOFFSET@@/${FSOFFSET}/" \ 328 -e "s/@@SWAPSECTORS@@/${SWAPSECTORS}/" \ 329 -e "s/@@SWAPOFFSET@@/${SWAPOFFSET}/" \ 330 -e "s/@@BSDPARTSECTORS@@/${BSDPARTSECTORS}/" \ 331 < ${DISKPROTO_IN} > ${WORKLABEL}.tmp 332 mv ${WORKLABEL}.tmp ${WORKLABEL} 333 334${IMGBASE}.img: ${TARGETFS} ${WORKLABEL} 335.if ${LABELSECTORS} != "0" 336 @echo creating MBR labels... 337 ${DD} if=/dev/zero of=${WORKMBR} seek=$$((${IMAGESECTORS} - 1)) count=1 338 ${TOOL_FDISK} -f -u \ 339 -b ${MBRCYLINDERS}/${MBRHEADS}/${MBRSECTORS} \ 340 -0 -a -s ${MBRNETBSD}/${FSOFFSET}/${BSDPARTSECTORS} \ 341 -i -c ${WORKDIR}/usr/mdec/mbr \ 342 -F ${WORKMBR} 343 ${DD} if=${WORKMBR} count=${LABELSECTORS} | \ 344 ${CAT} - ${TARGETFS} > ${WORKIMG} 345.else 346 ${CP} ${TARGETFS} ${WORKIMG} 347.endif 348.if ${OMIT_SWAPIMG} == "no" 349 ${DD} if=/dev/zero of=${WORKSWAP} seek=$$((${SWAPSECTORS} - 1)) count=1 350 ${CAT} ${WORKSWAP} >> ${WORKIMG} 351.endif 352.if ${USE_SUNLABEL} != "no" 353 @echo Creating sun disklabel... 354 printf 'V ncyl %d\nV nhead %d\nV nsect %d\na %d %d/0/0\nb %d %d/0/0\nW\n' \ 355 ${CYLINDERS} ${HEADS} ${SECTORS} \ 356 ${FSOFFSET} ${FSCYLINDERS} ${FSCYLINDERS} ${SWAPCYLINDERS} | \ 357 ${TOOL_SUNLABEL} -nq ${WORKIMG} 358.endif 359 ${TOOL_DISKLABEL} -R -F ${WORKIMG} ${WORKLABEL} 360.if !empty(PRIMARY_BOOT) && ${INSTALLBOOT_AFTER_DISKLABEL} != "no" 361 ${TOOL_INSTALLBOOT} -vm ${MACHINE} ${WORKIMG} \ 362 ${WORKDIR}/usr/mdec/${PRIMARY_BOOT} 363.endif 364 mv ${WORKIMG} ${.TARGET} 365 366 367CLEANFILES+= ${IMGBASE}.img.gz ${IMGBASE}.img.gz.tmp 368 369${IMGBASE}.img.gz: ${IMGBASE}.img 370 ${TOOL_GZIP} -9c ${IMGBASE}.img > ${.TARGET}.tmp 371 mv ${.TARGET}.tmp ${.TARGET} 372 373clean: 374 @if [ -d ${WORKDIR}/var/spool/ftp/hidden ]; then \ 375 ${CHMOD} +r ${WORKDIR}/var/spool/ftp/hidden; \ 376 fi # XXX 377 ${RM} -fr ${WORKDIR} 378 379prepare_md_post: .PHONY 380image_md_post: .PHONY 381image_md_pre: .PHONY 382 383.include <bsd.prog.mk> 384