1######################################################################### 2# ENHANCEMENTS # 3######################################################################### 4 5# New method e.g. 'make gui release'. A series of enhancement 6# targes may be specified which set make variables which enhance 7# the build in various ways. 8# 9# img is now the default (produces both the .iso and .img) 10# 11gui installer img nopkgs: 12 13######################################################################### 14# SETUP # 15######################################################################### 16 17DPORTS_PATH?= /usr/dports 18ISODIR?= /usr/release 19ISOROOT?= ${ISODIR}/root 20OBJSYS= ${.OBJDIR}/../sys 21GITHOST?= git.dragonflybsd.org 22 23MAKE_JOBS?= $$(sysctl -n hw.ncpu) 24 25# XXX makeshift fix to build the right kernel for the (target) architecture 26# We should configure this in the platform files somehow 27.if ${MACHINE_ARCH} == "i386" 28KERNCONF ?= GENERIC 29.else 30KERNCONF ?= X86_64_GENERIC 31.endif 32 33CHROOT_CMD?= /usr/sbin/chroot ${ISOROOT} sh -c 34 35# User may specify extra packages in addition to the defaults 36# 37DPORTS_EXTRA_PACKAGES?= 38 39# dports packages to be built and installed on the release ISO 40# 41# MISSING: csup 42# 43DPORTS_PACKAGES?= devel/git \ 44 dns/bind98 \ 45 net/isc-dhcp42-server \ 46 sysutils/cdrtools \ 47 ${DPORTS_EXTRA_PACKAGES} 48 49# dports options to use when building packages 50# 51DPORTS_OPTIONS+= -DBATCH 52.if !make(gui) 53DPORTS_OPTIONS.devel_git+= -DWITHOUT_CONTRIB -DWITHOUT_PERL 54.endif 55 56# Specify which root skeletons are required, and let the user include 57# their own. They are copied into ISODIR during the `customizeiso' 58# target; each overwrites the last. 59# 60REQ_ROOTSKELS= ${.CURDIR}/root 61ROOTSKELS?= ${REQ_ROOTSKELS} 62 63.if make(notyet) 64# LIST OF PACKAGES NOT INCLUDED DUE TO BUILD ISSUES: 65# chat/pidgin textproc/enchant dependency is broken 66# x11/rxvt-unicode broken configure 67# net/nmap tries to access openssl/md2.h which does not 68# exist. 69# sysutils/idesk dying on link __sync_fetch_and_add_4 70# 71ISOFILE?= ${ISODIR}/dfly-gui.iso 72IMGFILE?= ${ISODIR}/dfly-gui.img 73 74# NOTE: order important, do not sort package list 75# 76# Apps we want in the gui build but which have problems building: 77# chat/xchat link error on x86-64, something about ___progname 78# 79# 80.if !make(nopkgs) 81PKGSRC_PACKAGES+= meta-pkgs/modular-xorg-libs \ 82 meta-pkgs/modular-xorg-fonts \ 83 meta-pkgs/modular-xorg-apps \ 84 meta-pkgs/modular-xorg-drivers \ 85 x11/libXinerama \ 86 wm/fluxbox \ 87 wm/fvwm \ 88 www/firefox \ 89 print/xpdf \ 90 shells/zsh \ 91 editors/emacs \ 92 editors/vim \ 93 chat/irssi \ 94 x11/modular-xorg-server \ 95 x11/eterm \ 96 lang/perl5 \ 97 editors/nano \ 98 shells/bash \ 99 devel/exctags \ 100 archivers/zip \ 101 security/sudo \ 102 www/links-gui \ 103 net/wget \ 104 fonts/terminus-font \ 105 net/rsync \ 106 time/asclock \ 107 misc/screen \ 108 devel/scmgit-gitk 109.endif 110 111ROOTSKELS+= ${.CURDIR}/gui 112.endif 113 114ISOFILE ?= ${ISODIR}/dfly.iso 115IMGFILE ?= ${ISODIR}/dfly.img 116 117IMGMNT ?= ${ISODIR}/mnt 118 119# USB umass now probes starting at da8, so the usb stick is 120# probably sitting on da8. 121# 122IMGUSBDEV ?= da8 123 124# note: we use the '${NRLOBJDIR}/nrelease' construct, that is we add 125# the additional '/nrelease' manually, as a safety measure. 126# 127NRLOBJDIR?= /usr/obj 128 129######################################################################### 130# BASE ISO TARGETS # 131######################################################################### 132 133release: check clean buildworld1 buildkernel1 \ 134 buildiso srcs customizeiso mkiso mkimg 135 136quickrel: check clean buildworld2 buildkernel2 \ 137 buildiso srcs customizeiso mkiso mkimg 138 139realquickrel: check clean \ 140 buildiso srcs customizeiso mkiso mkimg 141 142restartpkgs: check customizeiso mkiso mkimg 143 144quick: quickrel 145 146realquick: realquickrel 147 148 149######################################################################### 150# CORE SUPPORT TARGETS # 151######################################################################### 152 153check: 154.if !exists(/usr/local/bin/mkisofs) && !exists(/usr/pkg/bin/mkisofs) 155 @echo 156 @echo "Your machine does not have cdrtools installed. You can install it with:" 157 @echo " pkg install cdrtools" 158.endif 159.if !defined(DPORTS_PATH) 160 @echo "Please set DPORTS_PATH to the dports tree that shall be used for" 161 @echo "package building. For example /usr/dports. See the Makefile" 162 @echo "in /usr if you are unfamiliar with dports." 163.endif 164.if !exists(/usr/local/bin/mkisofs) && !exists(/usr/pkg/bin/mkisofs) 165 @/usr/bin/false 166.endif 167.if !defined(DPORTS_PATH) 168 @/usr/bin/false 169.endif 170 171buildworld1 buildworld2: 172 cd ${.CURDIR}/..; \ 173 ${WORLD_CCVER:C/^..*$/WORLD_CCVER=/}${WORLD_CCVER} \ 174 make -j ${MAKE_JOBS} -DWANT_INSTALLER ${.TARGET:C/build(.*)2/quick\1/:C/1//} 175 176buildkernel1 buildkernel2: 177 cd ${.CURDIR}/..; \ 178 for kernconf in ${KERNCONF}; do \ 179 ${WORLD_CCVER:C/^..*$/WORLD_CCVER=/}${WORLD_CCVER} \ 180 make -j ${MAKE_JOBS} ${.TARGET:C/build(.*)2/quick\1/:C/1//} \ 181 KERNCONF=$${kernconf}; \ 182 done 183 184# note that we do not want to mess with any /usr/obj directories not related 185# to buildworld, buildkernel, or nrelease, so we must supply the proper 186# MAKEOBJDIRPREFIX for targets that are not run through the buildworld and 187# buildkernel mechanism. 188# 189# Unconditionally clean out ${ISOROOT} so a previous img build 190# does not blow up a future quick iso build 191# 192# We install with INSTALLSTRIPPEDMODULES to make things fit into the ISO. 193# We leave the kernel's debug variables intact. 194# 195buildiso: 196 -rm -rf ${ISOROOT} 197 -chflags -R noschg ${ISOROOT} 198 rm -rf ${ISOROOT} 199 mkdir -p ${ISOROOT} 200 if [ ! -d ${NRLOBJDIR}/nrelease ]; then mkdir -p ${NRLOBJDIR}/nrelease; fi 201 ( cd ${.CURDIR}/..; make -DWANT_INSTALLER DESTDIR=${ISOROOT} installworld ) 202 ( cd ${.CURDIR}/../etc; MAKEOBJDIRPREFIX=${NRLOBJDIR}/nrelease \ 203 make -m ${.CURDIR}/../share/mk DESTDIR=${ISOROOT} distribution ) 204 cpdup ${ISOROOT}/etc ${ISOROOT}/etc.hdd 205 cd ${.CURDIR}/..; \ 206 for kernconf in ${KERNCONF}; do \ 207 make DESTDIR=${ISOROOT} installkernel KERNCONF=$${kernconf}; \ 208 done 209 rm -rf ${ISOROOT}/boot/kernel.old 210 ln -s kernel ${ISOROOT}/boot/kernel/kernel.BOOTP 211 mtree -deU -f ${.CURDIR}/../etc/mtree/BSD.local.dist -p ${ISOROOT}/usr/local/ 212 mtree -deU -f ${.CURDIR}/../etc/mtree/BSD.var.dist -p ${ISOROOT}/var 213 dev_mkdb -f ${ISOROOT}/var/run/dev.db ${ISOROOT}/dev 214 215# The GUI build includes the pkgsrc tree (~1G+) while the nominal release 216# build does not. 217# 218# The GUI build includes full sources while the nominal release build 219# only includes kernel sources (~27MB). 220# 221srcs: 222.if !defined(WITHOUT_SRCS) 223.if make(notyet) 224 rm -f ${ISOROOT}/usr/src-sys.tgz 225 rm -f ${ISOROOT}/usr/src-sys.tar.bz2 226 cd ${ISOROOT}/usr && make pkgsrc-create-repo GITHOST=${GITHOST} 227 # NOTE: Adding the git gc --aggressive helps by significantly 228 # reducing the disk space required. 229 # 230 cd ${ISOROOT}/usr/pkgsrc && git gc --aggressive 231 cd ${ISOROOT}/usr && make src-create-repo GITHOST=${GITHOST} 232.else 233 rm -f ${ISOROOT}/usr/src-sys.tgz 234 rm -f ${ISOROOT}/usr/src-sys.tar.bz2 235 cd ${.CURDIR}/.. && tar --exclude .git -s '/^\./src/' \ 236 -cf - ./Makefile ./Makefile.inc1 ./sys | \ 237 bzip2 -9 > ${ISOROOT}/usr/src-sys.tar.bz2 238.endif 239.endif 240 241# Customize the ISO by copying rootskels in reverse priority order, 242# building packages, and doing other post-install tasks. 243# 244customizeiso: 245 # Copy the rootskels. Allow sources to be owned by someone other 246 # than root (as is common when checked out via git). 247 # 248.for ROOTSKEL in ${ROOTSKELS} 249 cpdup -X cpignore -o ${ROOTSKEL} ${ISOROOT} 250 @test -O ${.CURDIR} || echo "chowning copied files to root:wheel" 251 @test -O ${.CURDIR} || ((cd ${ROOTSKEL} && find .) | fgrep -v cpignore | (cd ${ISOROOT} && xargs chown root:wheel)) 252.endfor 253 pwd_mkdb -p -d ${ISOROOT}/etc ${ISOROOT}/etc/master.passwd 254.for UPGRADE_ITEM in Makefile \ 255 etc.${MACHINE_ARCH} \ 256 rc.d/Makefile \ 257 periodic/Makefile \ 258 periodic/daily/Makefile \ 259 periodic/security/Makefile \ 260 periodic/weekly/Makefile \ 261 periodic/monthly/Makefile 262 cp -R ${.CURDIR}/../etc/${UPGRADE_ITEM} ${ISOROOT}/etc/${UPGRADE_ITEM} 263.endfor 264 # 265 # Setup some things & mount dports tree. Use defensive umounts and 266 # rm -rf's to allow restarts. Allow /usr/dports to be read-only. 267 # 268 cp -p /etc/resolv.conf ${ISOROOT}/etc 269 ${CHROOT_CMD} "ldconfig -elf /usr/lib /usr/lib/gcc* /usr/lib/compat" 270 -@umount ${ISOROOT}/usr/distfiles 271 -@umount ${ISOROOT}/usr/dports 272 -@umount ${ISOROOT}/dev 273 rm -rf ${ISOROOT}/usr/obj/dports 274 # 275 # Mount /usr/dports, make sure /usr/distfiles is writable. 276 # Make /usr/dports read-only for safety, else a failed umount and 277 # our rm -rf will do bad things. 278 # 279 mkdir -p ${ISOROOT}/usr/dports 280 mkdir -p ${ISOROOT}/usr/distfiles 281 mount_null -o ro ${DPORTS_PATH} ${ISOROOT}/usr/dports 282 mount_null /dev ${ISOROOT}/dev 283 cp /etc/shells ${ISOROOT}/usr/distfiles/.test > /dev/null 2>&1 \ 284 || mount_null ${ISODIR}/distfiles ${ISOROOT}/usr/distfiles 285 # 286 # Build and install packages, skip packages already installed 287 # 288.for PKG in ${DPORTS_PACKAGES} 289 ${CHROOT_CMD} "cd /usr/dports/${PKG} && make ${DPORTS_OPTIONS} ${DPORTS_OPTIONS.${PKG:S/\//_/g}} install" 290.endfor 291.for PKG in ${DPORTS_PACKAGES} 292 ${CHROOT_CMD} "cd /usr/dports/${PKG} && make ${DPORTS_OPTIONS} clean" 293.endfor 294 # 295 # Remove packages which nothing depends on, add a whatis database 296 # for dports manual pages, create an initial locate database and 297 # clean up 298 # 299 ${CHROOT_CMD} "yes | pkg autoremove" 300 ${CHROOT_CMD} "makewhatis /usr/local/man" 301 -umount ${ISOROOT}/usr/distfiles 302 umount ${ISOROOT}/usr/dports 303 rm -rf ${ISOROOT}/usr/dports 304 rm -rf ${ISOROOT}/usr/obj/dports 305 rm -rf ${ISOROOT}/usr/distfiles 306 rm -f ${ISOROOT}/etc/resolv.conf 307 # 308 # Add a pkg.conf 309 # 310 cp -p ${ISOROOT}/usr/local/etc/pkg.conf.sample ${ISOROOT}/usr/local/etc/pkg.conf 311 # 312 # Finally, update the locate(8) database 313 # 314 ${CHROOT_CMD} /etc/periodic/weekly/310.locate 315 umount ${ISOROOT}/dev 316 # 317 # Recopy files that dports may have updated in /etc into /etc.hdd 318 # 319 cpdup ${ISOROOT}/etc/shells ${ISOROOT}/etc.hdd/shells 320 cpdup ${ISOROOT}/etc/group ${ISOROOT}/etc.hdd/group 321 322mkiso: 323 ( cd ${ISOROOT}; mkisofs -b boot/cdboot -no-emul-boot \ 324 -R -J -o ${ISOFILE} \ 325 -V "DragonFly `${.CURDIR}/../tools/gitrev.sh | cut -c -22`" . ) 326 327mkimg: 328 if [ ! -d ${IMGMNT} ]; then mkdir -p ${IMGMNT}; fi 329 -if [ -f ${ISODIR}/vn.which ]; then umount ${IMGMNT}; \ 330 vnconfig -u `cat ${ISODIR}/vn.which`; fi 331.ifdef IMGSIZE 332 @echo "STEP: use an image size of ${IMGSIZE} 512-byte sectors" 333 rm -f ${IMGFILE} 334 sz=`bc -e "((${IMGSIZE}) * 512)" -equit`; truncate -s $${sz} ${IMGFILE} 335.else 336 @echo "STEP: Determine required image size in 1GB steps" 337 @echo " Leave ~600MB of unused space" 338 sz=`du -ck ${ISOROOT} | tail -n 1 | cut -f 1`; \ 339 sz=`bc -e "(($${sz}) * 1.15 + 999999 + 600000) / 1000000" -equit | \ 340 cut -f1 -d.`; \ 341 sz=`bc -e "(($${sz}) * 953)" -equit | cut -f1 -d.`; \ 342 rm -f ${IMGFILE}; \ 343 truncate -s $${sz}M ${IMGFILE}; 344.endif 345 fdisk -IB -p ${IMGFILE} 346 @echo "STEP: determine free vn device" 347 vnconfig -l | grep "not in use" | head -n 1 | \ 348 cut -f 1 -d: > ${ISODIR}/vn.which 349 vnconfig -e -s labels `cat ${ISODIR}/vn.which` ${IMGFILE} 350 @echo "STEP: write standard disklabel" 351 disklabel -w -r `cat ${ISODIR}/vn.which`s1 auto 352 @echo "STEP: read disklabel back" 353 disklabel -r `cat ${ISODIR}/vn.which`s1 > ${IMGFILE}.label 354 @echo "STEP: determine number of sectors of whole disk" 355 secs=`tail -n 1 ${IMGFILE}.label | cut -f 3 -w`; \ 356 echo " a: $${secs} 0 4.2BSD" >> ${IMGFILE}.label; 357 @echo "STEP: write modified disklabel back" 358 disklabel -R -r `cat ${ISODIR}/vn.which`s1 ${IMGFILE}.label 359 rm ${IMGFILE}.label 360 @echo "STEP: write bootsector" 361 disklabel -B `cat ${ISODIR}/vn.which`s1 362 boot0cfg -B -o noupdate `cat ${ISODIR}/vn.which` 363 newfs /dev/`cat ${ISODIR}/vn.which`s1a 364 mount /dev/`cat ${ISODIR}/vn.which`s1a ${IMGMNT} 365 cpdup ${ISOROOT} ${IMGMNT} 366 @echo "STEP: fixup ${IMGMNT}/etc/fstab" 367 echo "/dev/${IMGUSBDEV}s1a / ufs rw,noatime 0 1" > ${IMGMNT}/etc/fstab 368 echo "dummy /tmp tmpfs rw 0 0" >> ${IMGMNT}/etc/fstab 369 echo "dummy /var/tmp tmpfs rw 0 0" >> ${IMGMNT}/etc/fstab 370 echo "dummy /var/run tmpfs rw 0 0" >> ${IMGMNT}/etc/fstab 371 echo "dummy /usr/obj tmpfs rw 0 0" >> ${IMGMNT}/etc/fstab 372 echo "proc /proc procfs rw 0 0" >> ${IMGMNT}/etc/fstab 373 @echo "STEP: fixup ${IMGMNT}/boot/loader.conf" 374 -fgrep -v kernel_options ${IMGMNT}/boot/loader.conf > ${IMGMNT}/boot/loader.conf.new 375 echo 'vfs.root.mountfrom="ufs:${IMGUSBDEV}s1a"' >> ${IMGMNT}/boot/loader.conf.new 376 mv ${IMGMNT}/boot/loader.conf.new ${IMGMNT}/boot/loader.conf 377 @echo "STEP: cleanup" 378 df ${IMGMNT} 379 sync 380 sleep 1 381 umount ${IMGMNT} 382 vnconfig -u `cat ${ISODIR}/vn.which` 383 rm -f ${ISODIR}/vn.which 384 rmdir ${IMGMNT} 385 @echo "STEP: done" 386 387clean: 388 sync 389 sleep 1 390 -umount ${ISOROOT}/usr/distfiles > /dev/null 2>&1 391 -umount ${ISOROOT}/usr/dports > /dev/null 2>&1 392 -umount ${ISOROOT}/dev > /dev/null 2>&1 393 -if [ -f ${ISODIR}/vn.which ]; then umount ${IMGMNT}; \ 394 vnconfig -u `cat ${ISODIR}/vn.which`; fi 395 if [ -d ${ISOROOT} ]; then chflags -R noschg ${ISOROOT}; fi 396 rm -rf ${ISOROOT} 397 rm -rf ${NRLOBJDIR}/nrelease 398 rm -f ${ISODIR}/.didbootstrap ${ISODIR}/vn.which 399 400realclean: clean 401 rm -rf ${OBJSYS}/${KERNCONF} 402 rm -rf ${ISODIR}/packages 403 rm -rf ${ISODIR}/distfiles 404 405help all: 406 @echo "make [gui] release - complete build from scratch" 407 @echo "make [gui] quick - attempt to do an incremental rebuild" 408 @echo "make [gui] realquick - attempt to restart after world & kernel" 409 @echo "make [gui] restartpkgs - attempt to restart at the pkg building stage" 410 @echo "" 411 @echo "DPORTS_EXTRA_PACKAGES may be used to add additional pkgs" 412 @echo "GITHOST may be used to override git.dragonflybsd.org" 413 @echo "IMGSIZE may be used to override the .img (in 512-byte sectors)" 414 415.PHONY: release quickrel realquickrel 416.PHONY: installer 417.PHONY: quick realquick 418.PHONY: check buildworld1 buildworld2 419.PHONY: buildkernel1 buildkernel2 buildiso customizeiso mkiso mkimg 420.PHONY: clean realclean help all srcs 421 422.include <bsd.prog.mk> 423