1# Makefile - manage a qemu system for testing 64 bit DragonFly builds 2# 3# This Makefile will patch and build qemu, do all necessary world and 4# kernel builds, and create a 64 bit root.img disk. 5# 6 7# require it to be specified 8SRCDIR ?= ${.CURDIR}/../.. 9QEMU ?= qemu-0.10.6 10ROOTSIZE ?= 2048M 11 12.if defined(WITHSDL) 13QEMU_SDL_OPT ?= --extra-cflags=-I/usr/pkg/include \ 14 --extra-ldflags=-L/usr/pkg/lib 15.else 16QEMU_SDL_OPT ?= --disable-sdl 17.endif 18 19all: help 20 21scratch: qemu world32 world64 kernel64 root64 install64 sysloader 22 @echo "Run the environment with:" 23 @echo "make QEMUDIR=${QEMUDIR} run" 24 25quickw: quickworld64 quickkernel64 reinstall64 reinstallkernel64 sysloader 26 @echo "Run the environment with:" 27 @echo "make QEMUDIR=${QEMUDIR} run" 28 29quick: quickkernel64 reinstallkernel64 30 @echo "Run the environment with:" 31 @echo "make QEMUDIR=${QEMUDIR} run" 32 33help: 34 @echo "Setup Instructions:" 35 @echo "" 36 @echo " setenv QEMUDIR target_dir" 37 @echo "" 38 @echo "Meta target components:" 39 @echo "" 40 @echo " help - this help" 41 @echo " clean - clean up" 42 @echo " scratch - build and install everything from scratch" 43 @echo " (this is absolutely everything, except gdb64)" 44 @echo " quick - incremental kernel build & reinstall" 45 @echo " quickw - incremental world & kernel build & reinstall" 46 @echo " run - run qemu with QEMUDIR/root.img - curses mode" 47 @echo " xrun - run qemu with QEMUDIR/root.img - X Window mode" 48 @echo " mount - mount QEMUDIR/root.img at QEMUDIR/root" 49 @echo " umount - unmount" 50 @echo " gdb64 - create /usr/loca/bin/gdb64 - debug 64 bit bins" 51 @echo "" 52 @echo "Individual target components:" 53 @echo "" 54 @echo " qemu - fetch, patch, and build qemu" 55 @echo " Specify WITHSDL=yes to build X support" 56 @echo " world32 - build the 32 bit world from scratch" 57 @echo " world64 - build the 64 bit world from scratch" 58 @echo " kernel64 - build the 64 bit kernel from scratch" 59 @echo " root64 - create a new, empty root.img" 60 @echo " install64 - install a 64 bit world & kernel" 61 @echo " into root.img" 62 @echo " quickworld64 - incremental rebuild world64" 63 @echo " quickkernel64 - incremental rebuild kernel64" 64 @echo " reinstall64 - reinstall world64 into root.img" 65 @echo " (just the installworld piece)" 66 @echo " reinstallkernel64 - reinstall kernel64 into root.img" 67 @echo " sysloader - reinstall 32-bit system loader" 68 @echo " (in case the 64 bit loader fails," 69 @echo " the 32 bit loader can be used)" 70 @echo "" 71 72# Unmount everything, de-configured VN, and clean up. 73# (check handles umounting/deconfiguring) 74# 75clean: check 76 rm -rf ${QEMUDIR}/${QEMU}.tar.gz ${QEMUDIR}/${QEMU} \ 77 ${QEMUDIR}/root.img ${QEMUDIR}/root 78 79# Build qemu for Intel 32 and 64 bit environments 80# 81# If configuring with sdl support from pkgsrc add the following 82# options to the configure command: 83# 84# --extra-cflags=-I/usr/pkg/include 85# --extra-ldflags=-L/usr/pkg/lib 86# 87qemu: checkq sdl 88.if !exists(${QEMUDIR}/${QEMU}.tar.gz) 89 cd ${QEMUDIR} && \ 90 fetch http://download.savannah.gnu.org/releases/qemu/${QEMU}.tar.gz 91.endif 92 rm -rf ${QEMUDIR}/${QEMU} 93 cd ${QEMUDIR} && tar xvzpf ${QEMU}.tar.gz 94 cd ${QEMUDIR}/${QEMU} && patch -p1 < ${.CURDIR}/qemu.patch 95 cd ${QEMUDIR}/${QEMU} && \ 96 ./configure --disable-gfx-check \ 97 ${QEMU_SDL_OPT} \ 98 --disable-kqemu \ 99 --enable-system \ 100 --disable-aio \ 101 --disable-kvm \ 102 --target-list=i386-softmmu,x86_64-softmmu 103 cd ${QEMUDIR}/${QEMU} && gmake 104 cd ${QEMUDIR}/${QEMU} && gmake install 105 106# SDL dependancies 107# 108sdl: 109.if defined(WITHSDL) 110 @echo "SDL enabled" 111 pkg_info libX11 > /dev/null 2>&1 || pkg_radd libX11 112 pkg_info SDL > /dev/null 2>&1 || pkg_radd SDL 113.else 114 @echo "SDL not enabled" 115.endif 116 117# Build the 32 and 64 bit worlds and the 64 bit kernel 118# 119# 120world32: checkq 121 cd ${SRCDIR} && make -j 4 buildworld 122 123world64: checkq 124 cd ${SRCDIR} && \ 125 make -j 4 TARGET_ARCH=x86_64 TARGET_PLATFORM=pc64 NO_GCC44=1 \ 126 buildworld 127 128kernel64: checkq 129 cd ${SRCDIR} && \ 130 make -j 4 TARGET_ARCH=x86_64 TARGET_PLATFORM=pc64 KERNCONF=X86_64_GENERIC \ 131 buildkernel 132 133# Quick build - just rebuild the kernel quickly 134# 135# 136quickworld64: checkq 137 cd ${SRCDIR} && \ 138 make -j 4 TARGET_ARCH=x86_64 TARGET_PLATFORM=pc64 NO_GCC44=1 \ 139 quickworld 140 141quickkernel64: checkq 142 cd ${SRCDIR} && \ 143 make TARGET_ARCH=x86_64 TARGET_PLATFORM=pc64 KERNCONF=X86_64_GENERIC \ 144 quickkernel 145 146# Build and mount an empty filesystem for the emulated root disk 147# 148# NOTE: root64 must umount when done because a later dependency may 149# have a dependency on mount. 150# 151root64: check 152 vnconfig -c -T -S ${ROOTSIZE} -s labels \ 153 `cat ${QEMUDIR}/vn.which` ${QEMUDIR}/root.img 154 dd if=/dev/zero of=/dev/`cat ${QEMUDIR}/vn.which` bs=32k count=4 155 fdisk -IB `cat ${QEMUDIR}/vn.which` 156 disklabel -r -w `cat ${QEMUDIR}/vn.which`s1 auto 157 disklabel `cat ${QEMUDIR}/vn.which`s1 > ${QEMUDIR}/label.tmp 158 echo 'a: * 0 4.2BSD' >> ${QEMUDIR}/label.tmp 159 disklabel -R `cat ${QEMUDIR}/vn.which`s1 ${QEMUDIR}/label.tmp 160 disklabel -B `cat ${QEMUDIR}/vn.which`s1 161 newfs /dev/`cat ${QEMUDIR}/vn.which`s1a 162 mkdir -p ${QEMUDIR}/root 163 vnconfig -u `cat ${QEMUDIR}/vn.which` > /dev/null 2>&1 164 165mount: check 166 vnconfig -c -s labels `cat ${QEMUDIR}/vn.which` ${QEMUDIR}/root.img 167 fsck -p /dev/`cat ${QEMUDIR}/vn.which`s1a 168 mount /dev/`cat ${QEMUDIR}/vn.which`s1a ${QEMUDIR}/root 169 @echo "Mounted ${QEMUDIR}/root" 170 171umount: check 172 173# Install a fresh 64 bit world & distribution, and kernel 174# 175# 176install64: mount 177 cd ${SRCDIR} && \ 178 make -j 4 TARGET_ARCH=x86_64 TARGET_PLATFORM=pc64 \ 179 DESTDIR=${QEMUDIR}/root NO_GCC44=1 installworld 180 cd ${SRCDIR}/etc && \ 181 make -j 4 TARGET_ARCH=x86_64 TARGET_PLATFORM=pc64 \ 182 DESTDIR=${QEMUDIR}/root distribution 183 echo '/dev/ad0s1a / ufs rw 1 1' > ${QEMUDIR}/root/etc/fstab 184 echo 'proc /proc procfs rw 0 0' >> ${QEMUDIR}/root/etc/fstab 185 echo 'vfs.root.mountfrom="ufs:ad0s1a"' > ${QEMUDIR}/root/boot/loader.conf 186 (egrep -v '^console' ${QEMUDIR}/root/etc/ttys; echo 'console "/usr/libexec/getty Pc" cons25 on secure') > ${QEMUDIR}/root/etc/ttys.new 187 mv -f ${QEMUDIR}/root/etc/ttys.new ${QEMUDIR}/root/etc/ttys 188 cd ${SRCDIR} && \ 189 make -j 4 TARGET_ARCH=x86_64 TARGET_PLATFORM=pc64 \ 190 DESTDIR=${QEMUDIR}/root KERNCONF=X86_64_GENERIC \ 191 installkernel 192 @echo "WARNING: 64 bit loader installed, if it doesn't work" 193 @echo " then use 'sysloader' to install the 32 bit one" 194 195# Quick reinstall - just install a new kernel on top of an existing image 196# 197# 198reinstall64: mount 199 @echo "NOTE: Installing native 32 bit loader into root.img." 200 @echo " This loader should still be able to boot the" 201 @echo " 64 bit kernel" 202 cd ${SRCDIR} && \ 203 make -j 4 TARGET_ARCH=x86_64 TARGET_PLATFORM=pc64 \ 204 DESTDIR=${QEMUDIR}/root NO_GCC44=1 installworld 205 206reinstallkernel64: mount 207 cd ${SRCDIR} && \ 208 make -j 4 TARGET_ARCH=x86_64 TARGET_PLATFORM=pc64 \ 209 DESTDIR=${QEMUDIR}/root KERNCONF=X86_64_GENERIC \ 210 installkernel 211 212sysloader: mount 213 cp /boot/loader ${QEMUDIR}/root/boot/loader 214 sync 215 216# Run qemu on our image in 64 bit mode. Make sure we are unmounted so 217# we do not compete against the emulated kernel when writing to root.img. 218# (check does this for us) 219# 220run: check 221 cd ${QEMUDIR} && qemu-system-x86_64 -curses -hda ${QEMUDIR}/root.img \ 222 -m 128 -no-fd-bootchk 223 224xrun: 225.if !defined(DISPLAY) 226 @(echo "Variable DISPLAY not set. Is X running?"; /usr/bin/false) 227.endif 228 cd ${QEMUDIR} && qemu-system-x86_64 -hda ${QEMUDIR}/root.img \ 229 -m 128 -no-fd-bootchk 230 231rungdb: check 232 @echo "RUN WITH: run -curses -hda root.img" 233 cd ${QEMUDIR} && gdb qemu-system-x86_64 234 235# build a gdb capable of debugging 64 bit binaries 236# 237gdb64: 238 cd /usr/src/gnu/usr.bin/gdb && (make clean; make TARGET_ARCH=x86_64) 239 cp /usr/obj/usr/src/gnu/usr.bin/gdb/gdb/gdb /usr/local/bin/gdb64 240 cd /usr/src/gnu/usr.bin/gdb && make clean 241 242# Make sure we are not mounted and the VN device is unconfigured, 243# 244# Find an unused VN device but do not do anything with it yet. 245# 246checkq: 247.if !defined(QEMUDIR) 248 @(echo "must specify QEMUDIR=target or as an environment variable"; /usr/bin/false) 249.endif 250.if exists(${QEMUDIR}) 251 @echo "${QEMUDIR} found" 252.else 253 mkdir -p ${QEMUDIR} 254.endif 255 256check: checkq 257.if exists(${QEMUDIR}/vn.which) 258 -umount ${QEMUDIR}/root > /dev/null 2>&1 259 -vnconfig -u `cat ${QEMUDIR}/vn.which` > /dev/null 2>&1 260 rm -f ${QEMUDIR}/vn.which 261.endif 262 (vnconfig -l | fgrep "not in use" > /dev/null) || \ 263 (echo "Cannot find unused VN"; /usr/bin/false) 264 vnconfig -l | fgrep "not in use" | \ 265 cut -f 1 -d : | head -1 > ${QEMUDIR}/vn.which 266 egrep '^vn' ${QEMUDIR}/vn.which > /dev/null || \ 267 (echo "VN device selection is bad"; /usr/bin/false) 268