88{
99 cat 1>&2 << _USAGE_
1010Usage: $progname [-s service] [-m megabytes] [-i image] [-x set]
11- [-k kernel] [-o] [-c URL]
11+ [-k kernel] [-o] [-c URL] [-d]
1212 Create a root image
1313 -s service service name, default "rescue"
1414 -r rootdir hand crafted root directory to use
@@ -18,6 +18,7 @@ Usage: $progname [-s service] [-m megabytes] [-i image] [-x set]
1818 -k kernel kernel to copy in the image
1919 -c URL URL to a script to execute as finalizer
2020 -o read-only root filesystem
21+ -d enable debug mode (verbose output)
2122_USAGE_
2223 exit 1
2324}
@@ -28,7 +29,7 @@ rsynclite()
2829 (cd $1 && tar cfp - .)| (cd $2 && tar xfp -)
2930}
3031
31- options=" s:m:i:r:x:k:c:oh "
32+ options=" s:m:i:r:x:k:c:odh "
3233
3334while getopts " $options " opt
3435do
4142 k) kernel=" $OPTARG " ;;
4243 c) curlsh=" $OPTARG " ;;
4344 o) rofs=y;;
45+ d) debug=y;;
4446 h) usage;;
4547 * ) usage;;
4648 esac
4749done
4850
51+ # Enable debug mode if requested
52+ if [ -n " $debug " ]; then
53+ set -x # Print commands as they execute
54+ set -v # Print shell input lines as they are read
55+ fi
56+
4957export ARCH PKGVERS
5058
5159arch=${ARCH:- " amd64" }
@@ -110,20 +118,21 @@ if [ -z "$is_netbsd" -a -f "service/${svc}/NETBSD_ONLY" ]; then
110118 exit 1
111119fi
112120
113- [ -n " $is_darwin " -o -n " $ is_unknown" ] && \
121+ [ -n " $is_unknown " ] && \
114122 echo " ${progname} : OS is not supported" && exit 1
115123
116- if [ -n " $is_linux " ]; then
117- u=M
124+ if [ -n " $is_darwin " ]; then
125+ # Use temporary directory to stage files
126+ stagedir=$( mktemp -d)
127+ mnt=$stagedir
118128else
119- u=m
129+ # Use platform-independent dd syntax that works with both GNU and BSD dd
130+ # bs=1048576 (1MB in bytes) works on all platforms
131+ dd if=/dev/zero of=./${img} bs=1048576 count=${megs}
132+ mkdir -p mnt
133+ mnt=$( pwd) /mnt
120134fi
121135
122- dd if=/dev/zero of=./${img} bs=1${u} count=${megs}
123-
124- mkdir -p mnt
125- mnt=$( pwd) /mnt
126-
127136if [ -n " $is_linux " ]; then
128137 mke2fs -O none $img
129138 mount -o loop $img $mnt
@@ -133,6 +142,8 @@ elif [ -n "$is_freebsd" ]; then
133142 newfs -o time -O2 /dev/${vnd}
134143 mount -o noatime /dev/${vnd} $mnt
135144 mountfs=" ffs"
145+ elif [ -n " $is_darwin " ]; then
146+ mountfs=" staged" # Special flag for macOS staging mode
136147else # NetBSD (and probably OpenBSD)
137148 vnd=$( vndconfig -l| grep -m1 ' not' | cut -f1 -d:)
138149 vndconfig $vnd $img
155166 do
156167 # don't prepend sets path if this is a full path
157168 case $s in * /* ) ;; * ) s=" sets/${arch} /${s} " ;; esac
158- echo -n " extracting ${s} .. "
169+ printf " extracting ${s} .. "
159170 $TAR xfp ${s} -C ${mnt} / || exit 1
160171 echo done
161172 done
164175# additional packages
165176[ -n " $ADDPKGS " ] && for pkg in ${ADDPKGS} ; do
166177 eval $( $TAR xfp $pkg -O +BUILD_INFO| grep ^LOCALBASE)
167- echo -n " extracting $pkg to ${LOCALBASE} .. "
178+ printf " extracting $pkg to ${LOCALBASE} .. "
168179 mkdir -p ${mnt} /${LOCALBASE}
169180 $TAR xfp ${pkg} -C ${mnt} /${LOCALBASE} || exit 1
170181 echo done
@@ -181,6 +192,7 @@ rsynclite service/common/ ${mnt}/etc/include/
181192
182193[ -n " $kernel " ] && cp -f $kernel ${mnt} /
183194
195+ BACK=$PWD
184196cd $mnt
185197
186198if [ " $svc " = " rescue" ]; then
207219
208220# newer NetBSD versions use tmpfs for /dev, sailor copies MAKEDEV from /dev
209221# backup MAKEDEV so imgbuilder rc can copy it
210- cp dev/MAKEDEV etc/
211- # unionfs with ext2 leads to i/o error
212- sed -ie ' s/-o union//g' dev/MAKEDEV
222+ if [ -f dev/MAKEDEV ]; then
223+ cp -f dev/MAKEDEV etc/
224+ # unionfs with ext2 leads to i/o error
225+ # Use portable sed approach that works with both GNU and BSD sed
226+ sed ' s/-o union//g' dev/MAKEDEV > dev/MAKEDEV.tmp && rm -f dev/MAKEDEV && mv dev/MAKEDEV.tmp dev/MAKEDEV
227+ fi
213228# record wanted pkgsrc version
214229echo " PKGVERS=$PKGVERS " > etc/pkgvers
215230
216231# proceed with caution
217232[ -n " $curlsh " ] && curl -sSL " $CURLSH " | /bin/sh
218233
219- cd ..
234+ cd $BACK
235+
236+ if [ -n " $is_darwin " ]; then
237+ # macOS: Convert staged files to qemu image
238+ (cd $mnt && $TAR cf - .) > ${img} .tar
239+ echo " Created ${img} .tar"
220240
221- umount $mnt
241+ # Clean up staging directory
242+ rm -rf $mnt
222243
223- [ -n " $is_freebsd " ] && mdconfig -d -u $vnd
224- [ -z " $is_linux " ] && [ -z " $is_freebsd " ] && vndconfig -u $vnd
244+ echo " macOS build complete!"
245+ if [ -f " $qcow_img " ]; then
246+ echo " Created qemu image: $qcow_img "
247+ fi
248+ else
249+ umount $mnt
250+ [ -z " $is_linux " ] && vndconfig -u $vnd
251+ [ -n " $is_freebsd " ] && mdconfig -d -u $vnd
252+ [ -z " $is_linux " ] && [ -z " $is_freebsd " ] && vndconfig -u $vnd
253+ fi
225254
226255exit 0
0 commit comments