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