1# $NetBSD: Makefile.bootimage,v 1.26 2020/08/05 01:35:18 jmcneill 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# USE_MBR 38# set yes if target disk image requires MBR partition 39# (default: no) 40# USE_GPT 41# set yes if target disk image requires GPT partition 42# (default: no) 43# MBR_BOOTCODE 44# optional MBR bootcode which should be installed by fdisk(8) 45# (default: empty) 46# - specified MBR_BOOTCODE must exist in ${DESTDIR}/usr/mdec 47# - if MBR_BOOTCODE is not specified, 48# MBR_DEFAULT_BOOTCODE (default: mbr) will be used 49# if the target ${MACHINE} has the one in /usr/mdec 50# USE_SUNLABEL 51# set yes if target disk image requires Sun's label 52# (default: no) 53# INSTALLBOOT_AFTER_DISKLABEL (untested) 54# set yes if the target ${MACHINE} requires disklabel 55# to run installboot(8), like hp300 56# (default: empty) 57# IMAGEMB 58# target image size in MB 59# (default: 2048) 60# SWAPMB 61# swap size in target image in MB 62# (default: 128) 63# EFIMB 64# EFI partition size in target image in MB 65# (default: 128) 66# FATMB 67# FAT partition size in target image in MB 68# (default: 0) 69# KERN_SET 70# kernel set name which should be extracted into image 71# (default: kern-GENERIC) 72# SETS 73# binary sets that should be extracted into image 74# (default: modules base etc comp games man misc rescue tests 75# text xbase xcomp xetc xfont xserver) 76# SETS_DIR 77# directory path where binary sets are stored 78# (default: ${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets) 79# IMGFILE_EXTRA 80# list of additional files to be copied into images, 81# containing one or more tuples of the form: 82# FILE TARGETPATH 83# for installation image etc. 84# (default: empty) 85# IMGDIR_EXTRA 86# list of additional directories to be copied into images, 87# containing one or more tuples of the form: 88# DIR TARGETPATH 89# for installation image etc. 90# (default: empty) 91# XXX: currently permissions in IMGDIR_EXTRA are not handled 92# IMGDIR_EXCLUDE 93# pax(1) options to exclude files which should not copied 94# into TARGETPATH in IMGDIR_EXTRA 95# (default: empty) 96# FSTAB_IN 97# template file of /etc/fstab 98# (default: ${DISTRIBDIR}/common/bootimage/fstab.in) 99# SPEC_IN 100# default files of spec file for makefs(8) 101# (default: ${DISTRIBDIR}/common/bootimage/spec.in) 102# SPEC_EXTRA 103# additional files of spec file for makefs(8) 104# (default: empty) 105# IMGMAKEFSOPTIONS 106# options passed to makefs(8) to create root file system 107# (default: -o bsize=16384,fsize=2048,density=8192) 108# INSTALLBOOTOPTIONS 109# options passed to installboot(8), e.g., -o console=com0 110# (default: empty) 111# PRIMARY_BOOT 112# primary boot loader that should be installed into 113# the target image via installboot(8) 114# (default: empty) 115# SECONDARY_BOOT 116# secondary bootloader that should be put into the target image 117# (default: empty) 118# SECONDARY_BOOT_ARG 119# extra arguments that should be passed to installboot(8) 120# to specify the secondary bootloader 121# (default: empty) 122# DISKPROTO_IN 123# template file of disklabel -R 124# (default: ${DISTRIBDIR}/common/bootimage/diskproto.in 125# or ${DISTRIBDIR}/common/bootimage/diskproto.mbr.in) 126# EFIBOOT 127# EFI bootloader 128# (default: empty) 129# MBRFAT 130# MBR partition type value for FAT 131# (default: 6 ("16-bit FAT, more than 32M")) 132# FATMAKEFSOPTIONS 133# options passed to makefs(8) to create a FAT partition 134# (default: -o fat_type=16) 135# FATFILES 136# list of additional files to be copied into FAT partition 137# (default: empty) 138# IMAGEHOSTNAME 139# if set, sets the default hostname in rc.conf (default: empty) 140# 141 142.include <bsd.own.mk> # 143.include <bsd.endian.mk> # for TARGET_ENDIANNESS 144 145.include "${NETBSDSRCDIR}/distrib/common/Makefile.distrib" 146 147.if ${MKREPRO_TIMESTAMP:Uno} != "no" 148MAKEFS_TIMESTAMP=-T "${MKREPRO_TIMESTAMP}" 149GPT_TIMESTAMP=-T "${MKREPRO_TIMESTAMP}" 150PAX_TIMESTAMP=--timestamp "${MKREPRO_TIMESTAMP}" 151.endif 152 153.if empty(IMGBASE) 154.BEGIN: 155 @echo "Error: IMGBASE is not set" 156 @false 157.endif 158 159# should be defined elsewhere? 160CAT?= cat 161CHMOD?= chmod 162DD?= dd 163MKDIR?= mkdir -p 164RM?= rm 165 166# 167# common definitions for image 168# 169USE_MBR?= no 170USE_GPT?= no 171USE_GPTMBR?= no 172USE_SUNLABEL?= no 173INSTALLBOOT_AFTER_DISKLABEL?= no 174 175# 176# size parameters for image 177# 178IMAGEMB?= 2048 # 2048MB 179SWAPMB?= 128 # 128MB 180.if ${USE_GPT} == "no" 181EFIMB?= 0 182GPTSECTORS= 0 183.else 184EFIMB?= 128 # 128MB 185GPTSECTORS= 2048 186.endif 187FATMB?= 0 188 189# XXX: SWAPMB could be zero and expr(1) returns exit status 1 in that case 190IMAGESECTORS!= expr ${IMAGEMB} \* 1024 \* 1024 / 512 191SWAPSECTORS!= expr ${SWAPMB} \* 1024 \* 1024 / 512 || true 192EFISECTORS!= expr ${EFIMB} \* 1024 \* 1024 / 512 || true 193FATSECTORS!= expr ${FATMB} \* 1024 \* 1024 / 512 || true 194 195.if ${USE_MBR} == "no" && ${USE_GPT} == "no" 196LABELSECTORS?= 0 197.else 198#LABELSECTORS?= 63 # historical 199#LABELSECTORS?= 32 # 16KB aligned 200LABELSECTORS?= 2048 # 1MB aligned for modern flash devices 201.endif 202 203FSSECTORS!= expr ${IMAGESECTORS} - ${SWAPSECTORS} - ${LABELSECTORS} \ 204 - ${EFISECTORS} - ${GPTSECTORS} - ${FATSECTORS} 205FSSIZE!= expr ${FSSECTORS} \* 512 206 207# parameters for disklabel and MBR 208HEADS= 64 209SECTORS= 32 210CYLINDERS!= expr ${IMAGESECTORS} / \( ${HEADS} \* ${SECTORS} \) 211SECPERCYLINDERS!= expr ${HEADS} \* ${SECTORS} 212MBRHEADS= 255 213MBRSECTORS= 63 214MBRCYLINDERS!= expr ${IMAGESECTORS} / \( ${MBRHEADS} \* ${MBRSECTORS} \) 215MBRNETBSD= 169 216MBRFAT?= 6 # 16-bit FAT, more than 32M 217 218BSDPARTSECTORS!= expr ${IMAGESECTORS} - ${LABELSECTORS} \ 219 - ${EFISECTORS} - ${GPTSECTORS} - ${FATSECTORS} 220FSOFFSET!= expr ${LABELSECTORS} + ${EFISECTORS} + ${FATSECTORS} 221SWAPOFFSET!= expr ${LABELSECTORS} + ${FSSECTORS} \ 222 + ${EFISECTORS} + ${FATSECTORS} 223FATOFFSET= ${LABELSECTORS} 224 225# parameters for sunlabel 226FSCYLINDERS!= expr ${FSSECTORS} / \( ${HEADS} \* ${SECTORS} \) 227SWAPCYLINDERS!= expr ${SWAPSECTORS} / \( ${HEADS} \* ${SECTORS} \) || true 228 229.if ${USE_GPT} != "no" 230BOOTDISK_UUID=`${TOOL_GPT} ${GPT_TIMESSTAMP} ${WORKMBR} show -i 2 | ${TOOL_AWK} '/^GUID/ {print $$2}'` 231SWAPDISK_UUID=`${TOOL_GPT} ${GPT_TIMESSTAMP} ${WORKMBR} show -i 3 | ${TOOL_AWK} '/^GUID/ {print $$2}'` 232.endif 233 234# 235# definitions to create root fs 236# 237SETS_DEFAULT= modules base etc comp games man misc rescue tests text 238.if ${MKX11} != "no" 239SETS_DEFAULT+= xbase xcomp xetc xfont xserver 240.endif 241 242KERN_SET?= kern-GENERIC 243SETS?= ${SETS_DEFAULT} 244IMG_SETS= ${KERN_SET} ${SETS} 245SETS_DIR?= ${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets 246 247FSTAB_IN?= ${DISTRIBDIR}/common/bootimage/fstab.in 248SPEC_IN?= ${DISTRIBDIR}/common/bootimage/spec.in 249 250IMGMAKEFSOPTIONS?= -o bsize=16384,fsize=2048,density=8192 251FATMAKEFSOPTIONS?= -o fat_type=16 252 253WORKDIR?= work 254WORKSPEC?= work.spec 255WORKFSTAB?= work.fstab 256WORKRCCONF?= work.rc.conf 257WORKFS?= work.rootfs 258TARGETFS?= imgroot.fs 259COMPRESS_PROGRAM=${"${USE_XZ_SETS:Uno}"!="no":?${TOOL_XZ}:${TOOL_GZIP}} 260TAR_SUFF= ${"${USE_XZ_SETS:Uno}"!="no":?tar.xz:tgz} 261 262CLEANFILES+= ${WORKSPEC} ${WORKFSTAB} ${WORKRCCONF} ${WORKFS} 263CLEANFILES+= ${TARGETFS} 264 265# 266# definitions to create image 267# 268.if ${SWAPSECTORS} == 0 269. if ${USE_MBR} != "no" 270DISKPROTO_IN?= ${DISTRIBDIR}/common/bootimage/diskproto.noswap.mbr.in 271. else 272DISKPROTO_IN?= ${DISTRIBDIR}/common/bootimage/diskproto.noswap.in 273. endif 274.else 275. if ${USE_MBR} != "no" 276DISKPROTO_IN?= ${DISTRIBDIR}/common/bootimage/diskproto.mbr.in 277. else 278DISKPROTO_IN?= ${DISTRIBDIR}/common/bootimage/diskproto.in 279. endif 280.endif 281 282MBR_DEFAULT_BOOTCODE?= mbr 283 284WORKMBR?= work.mbr 285WORKMBRTRUNC?= work.mbr.truncated 286WORKSWAP?= work.swap 287WORKEFI?= work.efi 288WORKGPT?= work.gpt 289WORKLABEL?= work.diskproto 290WORKIMG?= work.img 291EFIWORKDIR?= work.efidir 292WORKFAT?= work.fat 293WORKFATDIR?= work.fatdir 294 295.if ${USE_GPT} != "no" 296${WORKFSTAB}: ${WORKMBR} 297.endif 298 299${WORKFSTAB}: 300 @echo Preparing /etc/fstab ... 301.if ${USE_GPT} != "no" 302. if ${SWAPSECTORS} != 0 303 ${TOOL_SED} \ 304 -e "s/ROOT.a/NAME=${BOOTDISK_UUID}/" \ 305 -e "s/ROOT.b/NAME=${SWAPDISK_UUID}/" \ 306 < ${FSTAB_IN} > ${WORKFSTAB} 307. else 308 ${TOOL_SED} \ 309 -e "s/ROOT.a/NAME=${BOOTDISK_UUID}/" \ 310 -e "/ROOT.b/d" \ 311 < ${FSTAB_IN} > ${WORKFSTAB} 312. endif 313.else 314. if ${SWAPSECTORS} != 0 315 ${TOOL_SED} < ${FSTAB_IN} > ${WORKFSTAB} 316. else 317 ${TOOL_SED} \ 318 -e "/ROOT.b/d" \ 319 < ${FSTAB_IN} > ${WORKFSTAB} 320. endif 321.endif 322 323# 324# create root file system for the image 325# 326${TARGETFS}: prepare_md_post ${WORKFSTAB} 327 @if [ ! -d ${RELEASEDIR}/${RELEASEMACHINEDIR} ]; then \ 328 echo "Missing ${RELEASEDIR}/${RELEASEMACHINEDIR}, aborting"; \ 329 false; \ 330 fi; 331 @${MKDIR} ${MKDIRPERM} ${WORKDIR} 332.for set in ${IMG_SETS} 333 @if [ ! -f ${SETS_DIR}/${set}.${TAR_SUFF} ]; then \ 334 echo "Missing ${SETS_DIR}/${set}.${TAR_SUFF}, aborting";\ 335 false; \ 336 fi 337 @echo Extracting ${set}.${TAR_SUFF} ... 338 @(cd ${WORKDIR}; ${TOOL_PAX} ${PAX_TIMESTAMP} -rn \ 339 --use-compress-program=${COMPRESS_PROGRAM:Q} \ 340 -f ${SETS_DIR}/${set}.${TAR_SUFF} .) 341.endfor 342.if defined(SECONDARY_BOOT) 343 @echo Copying secondary boot... 344 ${INSTALL} ${COPY} -m 0444 ${WORKDIR}/usr/mdec/${SECONDARY_BOOT} ${WORKDIR} 345.endif 346 ${INSTALL} ${COPY} -m 0644 ${WORKFSTAB} ${WORKDIR}/etc/fstab 347 @echo Setting rc_configured=YES in /etc/rc.conf ... 348 ${TOOL_SED} "s/rc_configured=NO/rc_configured=YES/" \ 349 < ${WORKDIR}/etc/rc.conf > ${WORKRCCONF} 350.if defined(IMAGEHOSTNAME) 351 @echo Setting hostname=${IMAGEHOSTNAME} in /etc/rc.conf ... 352 echo "hostname=${IMAGEHOSTNAME}" >> ${WORKRCCONF} 353.endif 354.if ${SWAPSECTORS} == 0 355 @echo Setting no_swap=YES in /etc/rc.conf ... 356 echo "no_swap=YES" >> ${WORKRCCONF} 357 @echo Setting savecore=NO in /etc/rc.conf ... 358 echo "savecore=NO" >> ${WORKRCCONF} 359.endif 360 ${INSTALL} ${COPY} -m 0644 ${WORKRCCONF} ${WORKDIR}/etc/rc.conf 361.if defined(IMGDIR_EXTRA) 362 @echo Copying extra dirs... 363.for _SRCDIR _TARGET in ${IMGDIR_EXTRA} 364 @if [ ! -d ${_SRCDIR} ]; then \ 365 echo "${_SRCDIR} is not directory, aborting"; \ 366 false; \ 367 fi 368 ${MKDIR} ${MKDIRPERM} ${WORKDIR}/${_TARGET} 369 (cd ${_SRCDIR} ; \ 370 ${TOOL_PAX} ${PAX_TIMESTAMP} -rw -pe -v \ 371 ${IMGDIR_EXCLUDE} \ 372 . ${.OBJDIR}/${WORKDIR}/${_TARGET} ) 373.endfor 374.endif 375.if defined(IMGFILE_EXTRA) 376 @echo Copying extra files... 377.for _SRC _TARGET in ${IMGFILE_EXTRA} 378 @if [ ! -f ${_SRC} ]; then \ 379 echo "${_SRC} in IMGFILE_EXTRA not found, aborting"; \ 380 false; \ 381 fi 382 @if [ -f ${_SRC} ]; then \ 383 echo ${INSTALL} ${COPY} -m 0644 ${_SRC} ${WORKDIR}/${_TARGET}; \ 384 ${INSTALL} ${COPY} -m 0644 ${_SRC} ${WORKDIR}/${_TARGET}; \ 385 fi 386.endfor 387.endif 388 @echo Preparing spec files for makefs... 389 ${RM} -f ${WORKSPEC} 390 cat ${WORKDIR}/etc/mtree/* | \ 391 ${TOOL_SED} -e 's/ size=[0-9]*//' > ${WORKSPEC} 392 ${HOST_SH} ${WORKDIR}/dev/MAKEDEV -s all ipty | \ 393 ${TOOL_SED} -e '/^\. type=dir/d' -e 's,^\.,./dev,' >> ${WORKSPEC} 394 cat ${SPEC_IN} >> ${WORKSPEC} 395.if defined(SECONDARY_BOOT) 396 echo "./${SECONDARY_BOOT} type=file uname=root gname=wheel mode=0444" \ 397 >> ${WORKSPEC} 398.endif 399.if defined(SPEC_EXTRA) 400 cat ${SPEC_EXTRA} >> ${WORKSPEC} 401.endif 402 @echo Creating rootfs... 403 # XXX /var/spool/ftp/hidden is unreadable 404 ${CHMOD} +r ${WORKDIR}/var/spool/ftp/hidden 405 ${TOOL_MAKEFS} -M ${FSSIZE} -m ${FSSIZE} \ 406 -B ${TARGET_ENDIANNESS} \ 407 -F ${WORKSPEC} -N ${WORKDIR}/etc \ 408 ${MAKEFS_TIMESTAMP} \ 409 ${IMGMAKEFSOPTIONS} \ 410 ${WORKFS} ${WORKDIR} 411.if !empty(PRIMARY_BOOT) && ${INSTALLBOOT_AFTER_DISKLABEL} == "no" 412 ${TOOL_INSTALLBOOT} -v -m ${MACHINE} ${INSTALLBOOTOPTIONS} ${WORKFS} \ 413 ${WORKDIR}/usr/mdec/${PRIMARY_BOOT} ${SECONDARY_BOOT_ARG} 414.endif 415 @echo done. 416 mv ${WORKFS} ${.TARGET} 417 418TARGET_BLOCKS= 419.if ${USE_MBR} != "no" || ${USE_GPT} != "no" 420TARGET_BLOCKS+= ${WORKMBRTRUNC} 421.endif 422.if ${USE_GPT} != "no" 423TARGET_BLOCKS+= ${WORKEFI} 424.endif 425.if ${FATSECTORS} != 0 426TARGET_BLOCKS+= ${WORKFAT} 427.endif 428TARGET_BLOCKS+= ${TARGETFS} 429.if ${SWAPSECTORS} != 0 430TARGET_BLOCKS+= ${WORKSWAP} 431.endif 432.if ${USE_GPT} != "no" 433TARGET_BLOCKS+= ${WORKGPT} 434.endif 435 436CLEANFILES+= ${WORKMBR} ${WORKMBRTRUNC} ${WORKSWAP} 437CLEANFILES+= ${WORKEFI} ${WORKGPT} 438CLEANFILES+= ${WORKFAT} 439CLEANFILES+= ${WORKLABEL}.tmp ${WORKLABEL} 440CLEANFILES+= ${WORKIMG} ${IMGBASE}.img 441 442${WORKSWAP}: 443.if ${SWAPSECTORS} == 0 444 printf "" > ${WORKSWAP} 445.else 446 ${DD} if=/dev/zero of=${WORKSWAP} seek=$$((${SWAPSECTORS} - 1)) count=1 447.endif 448 449${WORKMBRTRUNC}: ${WORKMBR} 450 ${DD} if=${WORKMBR} count=${LABELSECTORS} of=${WORKMBRTRUNC} 451 452${WORKLABEL}: 453 ${TOOL_SED} \ 454 -e "s/@@SECTORS@@/${SECTORS}/" \ 455 -e "s/@@HEADS@@/${HEADS}/" \ 456 -e "s/@@SECPERCYLINDERS@@/${SECPERCYLINDERS}/" \ 457 -e "s/@@CYLINDERS@@/${CYLINDERS}/" \ 458 -e "s/@@IMAGESECTORS@@/${IMAGESECTORS}/" \ 459 -e "s/@@FSSECTORS@@/${FSSECTORS}/" \ 460 -e "s/@@FSOFFSET@@/${FSOFFSET}/" \ 461 -e "s/@@SWAPSECTORS@@/${SWAPSECTORS}/" \ 462 -e "s/@@SWAPOFFSET@@/${SWAPOFFSET}/" \ 463 -e "s/@@BSDPARTSECTORS@@/${BSDPARTSECTORS}/" \ 464 -e "s/@@FATSECTORS@@/${FATSECTORS}/" \ 465 -e "s/@@FATOFFSET@@/${FATOFFSET}/" \ 466 < ${DISKPROTO_IN} > ${WORKLABEL}.tmp 467 mv ${WORKLABEL}.tmp ${WORKLABEL} 468 469${WORKEFI}: ${TARGETFS} 470 @echo create EFI system partition... 471 @${MKDIR} ${MKDIRPERM} ${EFIWORKDIR}/EFI/boot 472.for f in ${EFIBOOT} 473 ${INSTALL} ${COPY} -m 0644 ${f} ${EFIWORKDIR}/EFI/boot/`basename ${f}` 474.endfor 475 ${RM} -f ${WORKEFI} 476 ${TOOL_MAKEFS} -M ${EFIMB}m -m ${EFIMB}m \ 477 -B ${TARGET_ENDIANNESS} \ 478 ${MAKEFS_TIMESTAMP} \ 479 -t msdos -o F=32,c=1 \ 480 ${WORKEFI} ${EFIWORKDIR} 481 482${WORKFAT}: ${TARGETFS} ${FATFILES} 483 @echo create FAT partition for bootstrap files... 484 @${MKDIR} ${MKDIRPERM} ${WORKFATDIR} 485.if defined(FATFILES) 486 @echo Copying files for FAT partition... 487.for f in ${FATFILES} 488 @if [ ! -f ${f} ]; then \ 489 echo "${f} in FATFILES not found, aborting"; \ 490 false; \ 491 fi 492 ${INSTALL} ${COPY} -m 0644 ${f} ${WORKFATDIR} 493.endfor 494.endif 495 ${RM} -f ${WORKFAT} 496 ${TOOL_MAKEFS} -M ${FATMB}m -m ${FATMB}m \ 497 ${MAKEFS_TIMESTAMP} \ 498 -t msdos \ 499 ${FATMAKEFSOPTIONS} \ 500 ${WORKFAT} ${WORKFATDIR} 501 502${WORKMBR}: 503.if ${USE_GPT} != "no" 504 @echo creating GPT header and partition entries... 505 ${RM} -f ${WORKMBR} 506 ${DD} if=/dev/zero of=${WORKMBR} seek=$$((${IMAGESECTORS} - 1)) count=1 507 ${TOOL_GPT} ${GPT_TIMESSTAMP} ${WORKMBR} create 508 ${TOOL_GPT} ${GPT_TIMESSTAMP} ${WORKMBR} add -a 1m -s ${EFISECTORS} -t efi -l "EFI system" 509 ${TOOL_GPT} ${GPT_TIMESSTAMP} ${WORKMBR} add -a 1m -s ${FSSECTORS} -t ffs 510. if ${SWAPSECTORS} != 0 511 ${TOOL_GPT} ${GPT_TIMESSTAMP} ${WORKMBR} add -a 1m -s ${SWAPSECTORS} -t swap 512. endif 513.elif ${USE_MBR} != "no" 514 @echo creating MBR labels... 515 ${DD} if=/dev/zero of=${WORKMBR} seek=$$((${IMAGESECTORS} - 1)) count=1 516. if ${FATSECTORS} != 0 517 # create BSD partition 518 ${TOOL_FDISK} -f -i -u \ 519 -b ${MBRCYLINDERS}/${MBRHEADS}/${MBRSECTORS} \ 520 -1 -a -s ${MBRNETBSD}/${FSOFFSET}/${BSDPARTSECTORS} \ 521 -F ${WORKMBR} 522 # create FAT partition 523 ${TOOL_FDISK} -f -u \ 524 -b ${MBRCYLINDERS}/${MBRHEADS}/${MBRSECTORS} \ 525 -0 -s ${MBRFAT}/${FATOFFSET}/${FATSECTORS} \ 526 -F ${WORKMBR} 527. else 528 # create BSD partition 529 ${TOOL_FDISK} -f -i -u \ 530 -b ${MBRCYLINDERS}/${MBRHEADS}/${MBRSECTORS} \ 531 -0 -a -s ${MBRNETBSD}/${FSOFFSET}/${BSDPARTSECTORS} \ 532 -F ${WORKMBR} 533. endif 534. if empty(MBR_BOOTCODE) 535 @if [ -f ${WORKDIR}/usr/mdec/${MBR_DEFAULT_BOOTCODE} ]; then \ 536 echo ${TOOL_FDISK} -f \ 537 -i -c ${WORKDIR}/usr/mdec/${MBR_DEFAULT_BOOTCODE} \ 538 -F ${WORKMBR}; \ 539 ${TOOL_FDISK} -f \ 540 -i -c ${WORKDIR}/usr/mdec/${MBR_DEFAULT_BOOTCODE} \ 541 -F ${WORKMBR}; \ 542 fi 543. else 544 @if [ ! -f ${WORKDIR}/usr/mdec/${MBR_BOOTCODE} ]; then \ 545 echo "${MBR_BOOTCODE} is not found in DESTDIR/usr/mdec, aborting"; \ 546 false; \ 547 fi 548 ${TOOL_FDISK} -f -i -c ${WORKDIR}/usr/mdec/${MBR_BOOTCODE} \ 549 -F ${WORKMBR} 550. endif 551.endif 552 553${WORKGPT}: ${WORKMBR} 554 @echo create GPT image... 555 ${DD} if=${WORKMBR} of=${WORKGPT} skip=$$((${IMAGESECTORS} - 2048)) \ 556 count=2048 557 558.if ${USE_GPT} == "no" 559${IMGBASE}.img: ${WORKLABEL} 560.endif 561 562${IMGBASE}.img: ${TARGET_BLOCKS} 563 ${CAT} ${TARGET_BLOCKS} > ${WORKIMG} 564.if ${USE_GPT} != "no" 565.if ${USE_GPTMBR} != "no" 566 ${TOOL_GPT} ${GPT_TIMESSTAMP} ${WORKIMG} biosboot -i 2 \ 567 -c ${.OBJDIR}/${WORKDIR}/usr/mdec/gptmbr.bin 568.endif 569 ${TOOL_GPT} ${GPT_TIMESSTAMP} ${WORKIMG} set -a bootme -i 2 570.endif # USE_GPT != "no" 571.if ${USE_SUNLABEL} != "no" 572 @echo Creating sun disklabel... 573 printf 'V ncyl %d\nV nhead %d\nV nsect %d\na %d %d/0/0\nb %d %d/0/0\nW\n' \ 574 ${CYLINDERS} ${HEADS} ${SECTORS} \ 575 ${FSOFFSET} ${FSCYLINDERS} ${FSCYLINDERS} ${SWAPCYLINDERS} | \ 576 ${TOOL_SUNLABEL} -nq ${WORKIMG} 577.endif 578.if ${USE_GPT} == "no" 579 ${TOOL_DISKLABEL} -R -F ${WORKIMG} ${WORKLABEL} 580.if !empty(PRIMARY_BOOT) && ${INSTALLBOOT_AFTER_DISKLABEL} != "no" 581 ${TOOL_INSTALLBOOT} -v -m ${MACHINE} ${INSTALLBOOTOPTIONS} ${WORKIMG} \ 582 ${WORKDIR}/usr/mdec/${PRIMARY_BOOT} 583.endif 584.endif 585 mv ${WORKIMG} ${.TARGET} 586 587CLEANFILES+= ${IMGBASE}.img.gz ${IMGBASE}.img.gz.tmp 588 589${IMGBASE}.img.gz: ${IMGBASE}.img 590 ${TOOL_GZIP_N} -9c ${IMGBASE}.img > ${.TARGET}.tmp 591 mv ${.TARGET}.tmp ${.TARGET} 592 593clean: 594 @if [ -d ${WORKDIR}/var/spool/ftp/hidden ]; then \ 595 ${CHMOD} +r ${WORKDIR}/var/spool/ftp/hidden; \ 596 fi # XXX 597 ${RM} -fr ${WORKDIR} 598 ${RM} -fr ${EFIWORKDIR} 599 ${RM} -fr ${WORKFATDIR} 600 601prepare_md_post: .PHONY 602image_md_post: .PHONY 603image_md_pre: .PHONY 604 605.include <bsd.prog.mk> 606