Makefile.bootimage revision 1.3
1# $NetBSD: Makefile.bootimage,v 1.3 2012/01/22 16:56:22 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 127# should be defined elsewhere? 128CAT?= cat 129CHMOD?= chmod 130CP?= cp 131DD?= dd 132MKDIR?= mkdir -p 133RM?= rm 134 135# 136# common definitions for image 137# 138BOOTDISK?= sd0 139USE_MBR?= no 140USE_SUNLABEL?= no 141INSTALLBOOT_AFTER_DISKLABEL?= no 142 143# 144# size parameters for image 145# 146IMAGEMB?= 2048 # 2048MB 147SWAPMB?= 128 # 128MB 148 149# XXX: SWAPMB could be zero and expr(1) returns exit status 1 in that case 150IMAGESECTORS!= expr ${IMAGEMB} \* 1024 \* 1024 / 512 151SWAPSECTORS!= expr ${SWAPMB} \* 1024 \* 1024 / 512 || true 152 153.if ${USE_MBR} == "no" 154LABELSECTORS?= 0 155.else 156#LABELSECTORS?= 63 # historical 157#LABELSECTORS?= 32 # 16KB aligned 158LABELSECTORS?= 2048 # 1MB aligned for modern flash devices 159.endif 160 161FSSECTORS!= expr ${IMAGESECTORS} - ${SWAPSECTORS} - ${LABELSECTORS} 162FSSIZE!= expr ${FSSECTORS} \* 512 163 164# parameters for disklabel and MBR 165HEADS= 64 166SECTORS= 32 167CYLINDERS!= expr ${IMAGESECTORS} / \( ${HEADS} \* ${SECTORS} \) 168SECPERCYLINDERS!= expr ${HEADS} \* ${SECTORS} 169MBRHEADS= 255 170MBRSECTORS= 63 171MBRCYLINDERS!= expr ${IMAGESECTORS} / \( ${MBRHEADS} \* ${MBRSECTORS} \) 172MBRNETBSD= 169 173 174BSDPARTSECTORS!= expr ${IMAGESECTORS} - ${LABELSECTORS} 175FSOFFSET= ${LABELSECTORS} 176SWAPOFFSET!= expr ${LABELSECTORS} + ${FSSECTORS} 177 178# parameters for sunlabel 179FSCYLINDERS!= expr ${FSSECTORS} / \( ${HEADS} \* ${SECTORS} \) 180SWAPCYLINDERS!= expr ${SWAPSECTORS} / \( ${HEADS} \* ${SECTORS} \) || true 181 182 183# 184# definitions to create root fs 185# 186SETS_DEFAULT= modules base etc comp games man misc tests text 187.if ${MKX11} != "no" 188SETS_DEFAULT+= xbase xcomp xetc xfont xserver 189.endif 190 191KERN_SET?= kern-GENERIC 192SETS?= ${SETS_DEFAULT} 193IMG_SETS= ${KERN_SET} ${SETS} 194SETS_DIR?= ${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets 195 196FSTAB_IN?= ${DISTRIBDIR}/common/bootimage/fstab.in 197SPEC_IN?= ${DISTRIBDIR}/common/bootimage/spec.in 198 199IMGMAKEFSOPTIONS?= -o bsize=16384,fsize=2048,density=8192 200 201WORKDIR?= work 202WORKSPEC?= work.spec 203WORKFSTAB?= work.fstab 204WORKRCCONF?= work.rc.conf 205WORKFS?= work.rootfs 206TARGETFS?= imgroot.fs 207 208CLEANFILES+= ${WORKSPEC} ${WORKFSTAB} ${WORKRCCONF} ${WORKFS} 209CLEANFILES+= ${TARGETFS} 210 211# 212# create root file system for the image 213# 214${TARGETFS}: prepare_md_post 215 @if [ ! -d ${RELEASEDIR}/${RELEASEMACHINEDIR} ]; then \ 216 echo "Missing ${RELEASEDIR}/${RELEASEMACHINEDIR}, aborting"; \ 217 false; \ 218 fi; 219 @${MKDIR} ${WORKDIR} 220.for set in ${IMG_SETS} 221 @if [ ! -f ${SETS_DIR}/${set}.tgz ]; then \ 222 echo "Missing ${SETS_DIR}/${set}.tgz, aborting"; \ 223 false; \ 224 fi 225 @echo Extracting ${set}.tgz ... 226 @(cd ${WORKDIR}; ${TOOL_PAX} -rnz -f ${SETS_DIR}/${set}.tgz .) 227.endfor 228.if defined(SECONDARY_BOOT) 229 @echo Copying secondary boot... 230 ${CP} -f ${WORKDIR}/usr/mdec/${SECONDARY_BOOT} ${WORKDIR} 231.endif 232 @echo Preparing /etc/fstab ... 233 ${TOOL_SED} "s/@@BOOTDISK@@/${BOOTDISK}/" < ${FSTAB_IN} > ${WORKFSTAB} 234 ${CP} ${WORKFSTAB} ${WORKDIR}/etc/fstab 235 @echo Setting rc_configured=YES in /etc/rc.conf ... 236 ${TOOL_SED} "s/rc_configured=NO/rc_configured=YES/" \ 237 < ${WORKDIR}/etc/rc.conf > ${WORKRCCONF} 238 ${CP} ${WORKRCCONF} ${WORKDIR}/etc/rc.conf 239.if defined(IMGDIR_EXTRA) 240 @echo Copying extra dirs... 241.for _SRCDIR _TARGET in ${IMGDIR_EXTRA} 242 @if [ ! -d ${_SRCDIR} ]; then \ 243 echo "${_SRCDIR} is not directory, aborting"; \ 244 false; \ 245 fi 246 ${MKDIR} ${WORKDIR}/${_TARGET} 247 (cd ${_SRCDIR} ; \ 248 ${TOOL_PAX} -rw -pe -v \ 249 ${IMGDIR_EXCLUDE} \ 250 . ${.OBJDIR}/${WORKDIR}/${_TARGET} ) 251.endfor 252.endif 253.if defined(IMGFILE_EXTRA) 254 @echo Copying extra files... 255.for _SRC _TARGET in ${IMGFILE_EXTRA} 256 @if [ ! -f ${_SRC} ]; then \ 257 echo "${_SRC} in IMGFILE_EXTRA not found, aborting"; \ 258 false; \ 259 fi 260 @if [ -f ${_SRC} ]; then \ 261 echo ${CP} ${_SRC} ${WORKDIR}/${_TARGET}; \ 262 ${CP} ${_SRC} ${WORKDIR}/${_TARGET}; \ 263 fi 264.endfor 265.endif 266 @echo Preparing spec files for makefs... 267 ${RM} -f ${WORKSPEC} 268 cat ${WORKDIR}/etc/mtree/* | \ 269 ${TOOL_SED} -e 's/ size=[0-9]*//' > ${WORKSPEC} 270 ${HOST_SH} ${WORKDIR}/dev/MAKEDEV -s all | \ 271 ${TOOL_SED} -e '/^\. type=dir/d' -e 's,^\.,./dev,' >> ${WORKSPEC} 272 cat ${SPEC_IN} >> ${WORKSPEC} 273.if defined(SECONDARY_BOOT) 274 echo "./${SECONDARY_BOOT} type=file uname=root gname=wheel mode=0444" \ 275 >> ${WORKSPEC} 276.endif 277.if defined(SPEC_EXTRA) 278 cat ${SPEC_EXTRA} >> ${WORKSPEC} 279.endif 280 @echo Createing rootfs... 281 # XXX /var/spool/ftp/hidden is unreadable 282 ${CHMOD} +r ${WORKDIR}/var/spool/ftp/hidden 283 ${TOOL_MAKEFS} -M ${FSSIZE} -m ${FSSIZE} \ 284 -B ${TARGET_ENDIANNESS} \ 285 -F ${WORKSPEC} -N ${WORKDIR}/etc \ 286 ${IMGMAKEFSOPTIONS} \ 287 ${WORKFS} ${WORKDIR} 288.if !empty(PRIMARY_BOOT) && ${INSTALLBOOT_AFTER_DISKLABEL} == "no" 289 ${TOOL_INSTALLBOOT} -vm ${MACHINE} ${WORKFS} \ 290 ${WORKDIR}/usr/mdec/${PRIMARY_BOOT} ${SECONDARY_BOOT_ARG} 291.endif 292 @echo done. 293 mv ${WORKFS} ${.TARGET} 294 295# 296# definitions to create image 297# 298.if ${USE_MBR} != "no" 299DISKPROTO_IN?= ${DISTRIBDIR}/common/bootimage/diskproto.mbr.in 300.else 301DISKPROTO_IN?= ${DISTRIBDIR}/common/bootimage/diskproto.in 302.endif 303 304OMIT_SWAPIMG?= no 305 306WORKMBR?= work.mbr 307WORKSWAP?= work.swap 308WORKLABEL?= work.diskproto 309WORKIMG?= work.img 310 311CLEANFILES+= ${WORKMBR} ${WORKSWAP} 312CLEANFILES+= ${WORKLABEL}.tmp ${WORKLABEL} 313CLEANFILES+= ${WORKIMG} ${IMGBASE}.img 314 315${WORKLABEL}: 316 ${TOOL_SED} \ 317 -e "s/@@SECTORS@@/${SECTORS}/" \ 318 -e "s/@@HEADS@@/${HEADS}/" \ 319 -e "s/@@SECPERCYLINDERS@@/${SECPERCYLINDERS}/" \ 320 -e "s/@@CYLINDERS@@/${CYLINDERS}/" \ 321 -e "s/@@IMAGESECTORS@@/${IMAGESECTORS}/" \ 322 -e "s/@@FSSECTORS@@/${FSSECTORS}/" \ 323 -e "s/@@FSOFFSET@@/${FSOFFSET}/" \ 324 -e "s/@@SWAPSECTORS@@/${SWAPSECTORS}/" \ 325 -e "s/@@SWAPOFFSET@@/${SWAPOFFSET}/" \ 326 -e "s/@@BSDPARTSECTORS@@/${BSDPARTSECTORS}/" \ 327 < ${DISKPROTO_IN} > ${WORKLABEL}.tmp 328 mv ${WORKLABEL}.tmp ${WORKLABEL} 329 330${IMGBASE}.img: ${TARGETFS} ${WORKLABEL} 331.if ${LABELSECTORS} != "0" 332 @echo creating MBR labels... 333 ${DD} if=/dev/zero of=${WORKMBR} seek=$$((${IMAGESECTORS} - 1)) count=1 334 ${TOOL_FDISK} -f -u \ 335 -b ${MBRCYLINDERS}/${MBRHEADS}/${MBRSECTORS} \ 336 -0 -a -s ${MBRNETBSD}/${FSOFFSET}/${BSDPARTSECTORS} \ 337 -i -c ${WORKDIR}/usr/mdec/mbr \ 338 -F ${WORKMBR} 339 ${DD} if=${WORKMBR} count=${LABELSECTORS} | \ 340 ${CAT} - ${TARGETFS} > ${WORKIMG} 341.else 342 ${CP} ${TARGETFS} ${WORKIMG} 343.endif 344.if ${OMIT_SWAPIMG} == "no" 345 ${DD} if=/dev/zero of=${WORKSWAP} seek=$$((${SWAPSECTORS} - 1)) count=1 346 ${CAT} ${WORKSWAP} >> ${WORKIMG} 347.endif 348.if ${USE_SUNLABEL} != "no" 349 @echo Creating sun disklabel... 350 printf 'V ncyl %d\nV nhead %d\nV nsect %d\na %d %d/0/0\nb %d %d/0/0\nW\n' \ 351 ${CYLINDERS} ${HEADS} ${SECTORS} \ 352 ${FSOFFSET} ${FSCYLINDERS} ${FSCYLINDERS} ${SWAPCYLINDERS} | \ 353 ${TOOL_SUNLABEL} -nq ${WORKIMG} 354.endif 355 ${TOOL_DISKLABEL} -R -F ${WORKIMG} ${WORKLABEL} 356.if !empty(PRIMARY_BOOT) && ${INSTALLBOOT_AFTER_DISKLABEL} != "no" 357 ${TOOL_INSTALLBOOT} -vm ${MACHINE} ${WORKIMG} \ 358 ${WORKDIR}/usr/mdec/${PRIMARY_BOOT} 359.endif 360 mv ${WORKIMG} ${.TARGET} 361 362 363CLEANFILES+= ${IMGBASE}.img.gz ${IMGBASE}.img.gz.tmp 364 365${IMGBASE}.img.gz: ${IMGBASE}.img 366 ${TOOL_GZIP} -9c ${IMGBASE}.img > ${.TARGET}.tmp 367 mv ${.TARGET}.tmp ${.TARGET} 368 369clean: 370 @if [ -d ${WORKDIR}/var/spool/ftp/hidden ]; then \ 371 ${CHMOD} +r ${WORKDIR}/var/spool/ftp/hidden; \ 372 fi # XXX 373 ${RM} -fr ${WORKDIR} 374 375prepare_md_post: .PHONY 376image_md_post: .PHONY 377image_md_pre: .PHONY 378 379.include <bsd.prog.mk> 380