1 # Makefile - manage a qemu system for testing 64 bit DragonFly builds
3 # This Makefile will patch and build qemu, do all necessary world and
4 # kernel builds, and create a 64 bit root.img disk.
7 # require it to be specified
8 SRCDIR ?
= ${.CURDIR
}/..
/..
13 QEMU_SDL_OPT ?
= --extra-cflags
=-I
/usr
/pkg
/include \
14 --extra-ldflags
=-L
/usr
/pkg
/lib
16 QEMU_SDL_OPT ?
= --disable-sdl
21 scratch
: qemu world32 world64 kernel64 root64 install64 sysloader
22 @echo
"Run the environment with:"
23 @echo
"make QEMUDIR=${QEMUDIR} run"
25 quickw
: quickworld64 quickkernel64 reinstall64 reinstallkernel64 sysloader
26 @echo
"Run the environment with:"
27 @echo
"make QEMUDIR=${QEMUDIR} run"
29 quick
: quickkernel64 reinstallkernel64
30 @echo
"Run the environment with:"
31 @echo
"make QEMUDIR=${QEMUDIR} run"
34 @echo
"Setup Instructions:"
36 @echo
" setenv QEMUDIR target_dir"
38 @echo
"Meta target components:"
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"
52 @echo
"Individual target components:"
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)"
72 # Unmount everything, de-configured VN, and clean up.
73 # (check handles umounting/deconfiguring)
76 rm -rf
${QEMUDIR}/${QEMU}.
tar.gz
${QEMUDIR}/${QEMU} \
77 ${QEMUDIR}/root.img
${QEMUDIR}/root
79 # Build qemu for Intel 32 and 64 bit environments
81 # If configuring with sdl support from pkgsrc add the following
82 # options to the configure command:
84 # --extra-cflags=-I/usr/pkg/include
85 # --extra-ldflags=-L/usr/pkg/lib
88 .if
!exists
(${QEMUDIR}/${QEMU}.
tar.gz
)
90 fetch http
://download.savannah.gnu.org
/releases
/qemu
/${QEMU}.
tar.gz
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 \
102 --target-list
=i386-softmmu
,x86_64-softmmu
103 cd
${QEMUDIR}/${QEMU} && gmake
104 cd
${QEMUDIR}/${QEMU} && gmake
install
111 pkg_info libX11
> /dev
/null
2>&1 || pkg_radd libX11
112 pkg_info SDL
> /dev
/null
2>&1 || pkg_radd SDL
114 @echo
"SDL not enabled"
117 # Build the 32 and 64 bit worlds and the 64 bit kernel
121 cd
${SRCDIR} && make
-j
4 buildworld
125 make
-j
4 TARGET_ARCH
=x86_64 TARGET_PLATFORM
=pc64 NO_ALTCOMPILER
=1 \
130 make
-j
4 TARGET_ARCH
=x86_64 TARGET_PLATFORM
=pc64 KERNCONF
=X86_64_GENERIC \
133 # Quick build - just rebuild the kernel quickly
138 make
-j
4 TARGET_ARCH
=x86_64 TARGET_PLATFORM
=pc64 NO_ALTCOMPILER
=1 \
141 quickkernel64
: checkq
143 make TARGET_ARCH
=x86_64 TARGET_PLATFORM
=pc64 KERNCONF
=X86_64_GENERIC \
146 # Build and mount an empty filesystem for the emulated root disk
148 # NOTE: root64 must umount when done because a later dependency may
149 # have a dependency on mount.
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
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"
173 # Install a fresh 64 bit world & distribution, and kernel
178 make
-j
4 TARGET_ARCH
=x86_64 TARGET_PLATFORM
=pc64 \
179 DESTDIR
=${QEMUDIR}/root NO_ALTCOMPILER
=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
189 make
-j
4 TARGET_ARCH
=x86_64 TARGET_PLATFORM
=pc64 \
190 DESTDIR
=${QEMUDIR}/root KERNCONF
=X86_64_GENERIC \
192 @echo
"WARNING: 64 bit loader installed, if it doesn't work"
193 @echo
" then use 'sysloader' to install the 32 bit one"
195 # Quick reinstall - just install a new kernel on top of an existing image
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"
203 make
-j
4 TARGET_ARCH
=x86_64 TARGET_PLATFORM
=pc64 \
204 DESTDIR
=${QEMUDIR}/root NO_ALTCOMPILER
=1 installworld
206 reinstallkernel64
: mount
208 make
-j
4 TARGET_ARCH
=x86_64 TARGET_PLATFORM
=pc64 \
209 DESTDIR
=${QEMUDIR}/root KERNCONF
=X86_64_GENERIC \
213 cp
/boot
/loader
${QEMUDIR}/root
/boot
/loader
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)
221 cd
${QEMUDIR} && qemu-system-x86_64
-curses
-hda
${QEMUDIR}/root.img \
222 -m
128 -no-fd-bootchk
225 .if
!defined
(DISPLAY
)
226 @
(echo
"Variable DISPLAY not set. Is X running?"; /usr
/bin
/false
)
228 cd
${QEMUDIR} && qemu-system-x86_64
-hda
${QEMUDIR}/root.img \
229 -m
128 -no-fd-bootchk
232 @echo
"RUN WITH: run -curses -hda root.img"
233 cd
${QEMUDIR} && gdb qemu-system-x86_64
235 # build a gdb capable of debugging 64 bit binaries
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
242 # Make sure we are not mounted and the VN device is unconfigured,
244 # Find an unused VN device but do not do anything with it yet.
247 .if
!defined
(QEMUDIR
)
248 @
(echo
"must specify QEMUDIR=target or as an environment variable"; /usr
/bin
/false
)
250 .if exists
(${QEMUDIR})
251 @echo
"${QEMUDIR} found"
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
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
)