15acaa081SBen Gras#!/bin/bash 25acaa081SBen Grasset -e 38a3677deSKees Jongenburger#set -x 4149ed6cfSKees Jongenburger 5*eb1e5bf0SKees Jongenburger# 6*eb1e5bf0SKees Jongenburger# Source settings if present 7*eb1e5bf0SKees Jongenburger# 8*eb1e5bf0SKees Jongenburgerif [ -e .settings ] 9*eb1e5bf0SKees Jongenburgerthen 10*eb1e5bf0SKees Jongenburger echo "Sourcing settings from .settings" 11*eb1e5bf0SKees Jongenburger # Display the content (so we can check in the build logs 12*eb1e5bf0SKees Jongenburger # what the settings contain. 13*eb1e5bf0SKees Jongenburger cat .settings | sed "s,^,CONTENT ,g" 14*eb1e5bf0SKees Jongenburger . .settings 15*eb1e5bf0SKees Jongenburgerfi 16*eb1e5bf0SKees Jongenburger 175acaa081SBen Gras: ${ARCH=evbearm-el} 18149ed6cfSKees Jongenburger: ${OBJ=../obj.${ARCH}} 195acaa081SBen Gras: ${CROSS_TOOLS=${OBJ}/"tooldir.`uname -s`-`uname -r`-`uname -m`"/bin} 205acaa081SBen Gras: ${CROSS_PREFIX=${CROSS_TOOLS}/arm-elf32-minix-} 21881ff3f6SLionel Sambuc: ${JOBS=1} 225acaa081SBen Gras: ${DESTDIR=${OBJ}/destdir.$ARCH} 235180c3cfSLionel Sambuc: ${FSTAB=${DESTDIR}/etc/fstab} 24881ff3f6SLionel Sambuc: ${BUILDVARS=} 25881ff3f6SLionel Sambuc: ${BUILDSH=build.sh} 26881ff3f6SLionel Sambuc 278a3677deSKees Jongenburger# 288a3677deSKees Jongenburger# Directory where to store temporary file system images 298a3677deSKees Jongenburger# 308a3677deSKees Jongenburger: ${IMG_DIR=${OBJ}/img} 315acaa081SBen Gras: ${IMG=minix_arm_sd.img} 328a3677deSKees Jongenburger: ${MLO=MLO} 338a3677deSKees Jongenburger: ${UBOOT=u-boot.img} 345e5ea947SKees Jongenburger 355e5ea947SKees Jongenburger 365e5ea947SKees Jongenburger# beagleboard-xm 376364989eSKees Jongenburger: ${BASE_URL=http://www.minix3.org/arm/beagleboard-xm} 385e5ea947SKees Jongenburger: ${FLAG=-DDM37XX} 395e5ea947SKees Jongenburger: ${CONSOLE=tty02} 405e5ea947SKees Jongenburger 415e5ea947SKees Jongenburger 425e5ea947SKees Jongenburger#beaglebone (and black) 436364989eSKees Jongenburger#: ${BASE_URL=http://www.minix3.org/arm/beaglebone} 445e5ea947SKees Jongenburger#: ${FLAG=-DAM335X} 455e5ea947SKees Jongenburger#: ${CONSOLE=tty00} 465acaa081SBen Gras 475180c3cfSLionel Sambucif [ ! -f ${BUILDSH} ] 485180c3cfSLionel Sambucthen echo "Please invoke me from the root source dir, where ${BUILDSH} is." 495acaa081SBen Gras exit 1 505acaa081SBen Grasfi 515acaa081SBen Gras 524ab5b32eSKees Jongenburgerexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH 534ab5b32eSKees Jongenburger 548a3677deSKees Jongenburgerfor needed in sfdisk mcopy dd wget mkfs.vfat 558a3677deSKees Jongenburgerdo 568a3677deSKees Jongenburger if ! which $needed 2>&1 > /dev/null 578a3677deSKees Jongenburger then 588a3677deSKees Jongenburger echo "**Skipping image creation: missing tool '$needed'" 598a3677deSKees Jongenburger exit 1 608a3677deSKees Jongenburger fi 618a3677deSKees Jongenburgerdone 628a3677deSKees Jongenburger 638a3677deSKees Jongenburger# 648a3677deSKees Jongenburger# Artifacts from this script are stored in the IMG_DIR 658a3677deSKees Jongenburger# 668a3677deSKees Jongenburgermkdir -p $IMG_DIR 678a3677deSKees Jongenburger 688a3677deSKees Jongenburger# 698a3677deSKees Jongenburger# Download the stage 1 bootloader and u-boot 708a3677deSKees Jongenburger# 718a3677deSKees Jongenburgerfor i in ${MLO} ${UBOOT} 728a3677deSKees Jongenburgerdo 738a3677deSKees Jongenburger if [ ! -f ${IMG_DIR}/${i} ] 748a3677deSKees Jongenburger then 756364989eSKees Jongenburger if ! wget -O ${IMG_DIR}/$i ${BASE_URL}/$i 768a3677deSKees Jongenburger then 778a3677deSKees Jongenburger echo "Failed to download $i" 788a3677deSKees Jongenburger rm -f ${IMG_DIR}/$i 798a3677deSKees Jongenburger exit 1 805acaa081SBen Gras fi 815acaa081SBen Gras 825acaa081SBen Gras fi 838a3677deSKees Jongenburgerdone 845acaa081SBen Gras 858a3677deSKees Jongenburger# 868a3677deSKees Jongenburger# Call build.sh using a sloppy file list so we don't need to remove the installed /etc/fstag 878a3677deSKees Jongenburger# 885e5ea947SKees Jongenburgerexport CPPFLAGS=${FLAG} 89881ff3f6SLionel Sambucsh ${BUILDSH} -V SLOPPY_FLIST=yes -V MKBINUTILS=yes -V MKGCCCMDS=yes -j ${JOBS} -m ${ARCH} -O ${OBJ} -D ${DESTDIR} ${BUILDVARS} -U -u distribution 905acaa081SBen Gras 918a3677deSKees Jongenburger# 928a3677deSKees Jongenburger# This script creates a bootable image and should at some point in the future 938a3677deSKees Jongenburger# be replaced by makefs. 948a3677deSKees Jongenburger# 958a3677deSKees Jongenburger# All sized are written in 512 byte blocks 968a3677deSKees Jongenburger# 978a3677deSKees Jongenburger# we create a disk image of about 2 gig's 988a3677deSKees Jongenburger# 998a3677deSKees Jongenburger# The size of the extended partition where we store 1008a3677deSKees Jongenburger# /root /home and /usr in separate sub partitions is 1018a3677deSKees Jongenburger# about 1 gig 1028a3677deSKees Jongenburger# 103881ff3f6SLionel Sambuc: ${IMG_SIZE=$((2**31 / 512))} 104881ff3f6SLionel Sambuc: ${FAT_SIZE=$((20480))} 105881ff3f6SLionel Sambuc: ${EXTENDED_SIZE=$((2**30 / 512))} 106881ff3f6SLionel Sambuc: ${ROOT_SIZE=$((2**26 / 512))} 107881ff3f6SLionel Sambuc: ${HOME_SIZE=$((2**27 / 512))} 108881ff3f6SLionel Sambuc: ${USR_SIZE=$((2**29 / 512))} 1095acaa081SBen Gras 1108a3677deSKees Jongenburger# 1118a3677deSKees Jongenburger# create a fstab entry in /etc this is normally done during the 1128a3677deSKees Jongenburger# setup phase on x86 1138a3677deSKees Jongenburger# 1145180c3cfSLionel Sambuccat >${FSTAB} <<END_FSTAB 1155acaa081SBen Gras/dev/c0d0p1s0 / mfs rw 0 1 1165acaa081SBen Gras/dev/c0d0p1s1 /home mfs rw 0 2 1178a3677deSKees Jongenburger/dev/c0d0p1s2 /usr mfs rw 0 2 1185acaa081SBen GrasEND_FSTAB 1195acaa081SBen Gras 1205180c3cfSLionel Sambucrm -f ${DESTDIR}/SETS.* 1215acaa081SBen Gras 1225180c3cfSLionel Sambuc${CROSS_TOOLS}/nbpwd_mkdb -V 0 -p -d ${DESTDIR} ${DESTDIR}/etc/master.passwd 1235acaa081SBen Gras 12499c52474SKees Jongenburger# 1258a3677deSKees Jongenburger# Now given the sizes above use DD to create separate files representing 1268a3677deSKees Jongenburger# the partitions we are going to use. 12799c52474SKees Jongenburger# 1287e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/fat.img bs=512 count=1 seek=$(($FAT_SIZE -1)) 2>/dev/null 1297e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/root.img bs=512 count=1 seek=$(($ROOT_SIZE -1)) 2>/dev/null 1307e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/home.img bs=512 count=1 seek=$(($HOME_SIZE -1)) 2>/dev/null 1317e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/usr.img bs=512 count=1 seek=$(($USR_SIZE -1)) 2>/dev/null 1325acaa081SBen Gras 1338a3677deSKees Jongenburger# 1348a3677deSKees Jongenburger# Create the empty image where we later will but the partitions in 1358a3677deSKees Jongenburger# 1368a3677deSKees Jongenburgerdd if=/dev/zero of=${IMG} bs=512 count=1 seek=$(($IMG_SIZE -1)) 1375acaa081SBen Gras 1388a3677deSKees Jongenburger# 1398a3677deSKees Jongenburger# Do some math to determine the start addresses of the partitions. 1408a3677deSKees Jongenburger# 1418a3677deSKees JongenburgerFAT_START=2048 1428a3677deSKees JongenburgerEXTENDED_START=$(($FAT_START + $FAT_SIZE)) 1438a3677deSKees JongenburgerEXTENDED_SIZE=$(($ROOT_SIZE + $HOME_SIZE + $USR_SIZE + 3)) 1448a3677deSKees JongenburgerROOT_START=$(($EXTENDED_START + 1)) 1458a3677deSKees JongenburgerHOME_START=$(($ROOT_START + $ROOT_SIZE + 1)) 1468a3677deSKees JongenburgerUSR_START=$(($HOME_START + $HOME_SIZE + 1)) 1475acaa081SBen Gras 1488a3677deSKees Jongenburger# 1498a3677deSKees Jongenburger# Generate the partitions using sfdisk to partition the 1508a3677deSKees Jongenburger# 1517e2c8b51SKees Jongenburgersfdisk --no-reread -q ${IMG} 1>/dev/null <<END_SFDISK 1528a3677deSKees Jongenburger# partition table of test.img 1538a3677deSKees Jongenburgerunit: sectors 1545acaa081SBen Gras 1558a3677deSKees Jongenburgertest.img1 : start= $FAT_START, size= $FAT_SIZE, Id= c, bootable 1568a3677deSKees Jongenburgertest.img2 : start= $EXTENDED_START, size= $EXTENDED_SIZE, Id= 5 1578a3677deSKees Jongenburgertest.img3 : start= 0, size= 0, Id= 0 1588a3677deSKees Jongenburgertest.img4 : start= 0, size= 0, Id= 0 1598a3677deSKees Jongenburgertest.img5 : start= $ROOT_START, size= $ROOT_SIZE, Id=81 1608a3677deSKees Jongenburgertest.img6 : start= $HOME_START, size= $HOME_SIZE, Id=81 1618a3677deSKees Jongenburgertest.img7 : start= $USR_START, size= $USR_SIZE, Id=81 1628a3677deSKees JongenburgerEND_SFDISK 1635acaa081SBen Gras 1648a3677deSKees Jongenburger# 1658a3677deSKees Jongenburger# Format the fat partition and put the bootloaders 1668a3677deSKees Jongenburger# uEnv and the kernel command line in the FAT partition 1678a3677deSKees Jongenburger# 1688a3677deSKees Jongenburgermkfs.vfat ${IMG_DIR}/fat.img 1695180c3cfSLionel Sambuc 170167c4d97SKees Jongenburger# 171167c4d97SKees Jongenburger# Create a uEnv.txt file 172167c4d97SKees Jongenburger# -n default to network boot 173167c4d97SKees Jongenburger# -p add a prefix to the network booted files (e.g. xm/" 174ad68d15eSKees Jongenburger./releasetools/gen_uEnv.txt.sh > ${IMG_DIR}/uEnv.txt 175167c4d97SKees Jongenburger 176167c4d97SKees Jongenburger# 1775e5ea947SKees Jongenburger# Generate the MINIX command line 178167c4d97SKees Jongenburger# 179167c4d97SKees Jongenburger# options: 180167c4d97SKees Jongenburger# -c set console e.g. tty02 or tty00 1815e5ea947SKees Jongenburger# -v set verbosity e.g. 0 to 3 1825e5ea947SKees Jongenburger./releasetools/gen_cmdline.txt.sh -c ${CONSOLE} > ${IMG_DIR}/cmdline.txt 183167c4d97SKees Jongenburger 1848a3677deSKees Jongenburgerecho "Copying configuration kernel and boot modules" 1858a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${IMG_DIR}/$MLO ::MLO 1868a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${IMG_DIR}/$UBOOT ::u-boot.img 187ad68d15eSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${IMG_DIR}/uEnv.txt ::uEnv.txt 188167c4d97SKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${IMG_DIR}/cmdline.txt ::cmdline.txt 1895180c3cfSLionel Sambuc 1900aeb7d85SKees Jongenburger# 1910aeb7d85SKees Jongenburger# For tftp booting 1920aeb7d85SKees Jongenburger# 193ad68d15eSKees Jongenburgercp ${IMG_DIR}/uEnv.txt ${OBJ}/ 194167c4d97SKees Jongenburgercp ${IMG_DIR}/cmdline.txt ${OBJ}/ 1950aeb7d85SKees Jongenburger 1968a3677deSKees Jongenburger# 1978a3677deSKees Jongenburger# Do some last processing of the kernel and servers before also putting 1988a3677deSKees Jongenburger# them on the FAT 1998a3677deSKees Jongenburger# 2005acaa081SBen Gras${CROSS_PREFIX}objcopy ${OBJ}/kernel/kernel -O binary ${OBJ}/kernel.bin 2018a3677deSKees Jongenburger 2028a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${OBJ}/kernel.bin ::kernel.bin 2035acaa081SBen Gras 2045acaa081SBen Grasfor f in vm rs pm sched vfs ds mfs pfs init 2055acaa081SBen Grasdo 2065180c3cfSLionel Sambuc cp ${OBJ}/servers/${f}/${f} ${OBJ}/${f}.elf 2075180c3cfSLionel Sambuc ${CROSS_PREFIX}strip -s ${OBJ}/${f}.elf 2088a3677deSKees Jongenburger mcopy -bsp -i ${IMG_DIR}/fat.img ${OBJ}/${f}.elf ::${f}.elf 2095acaa081SBen Grasdone 2105acaa081SBen Gras 2115acaa081SBen Grasfor f in tty memory log 2125acaa081SBen Grasdo 2135180c3cfSLionel Sambuc cp ${OBJ}/drivers/${f}/${f} ${OBJ}/${f}.elf 2145180c3cfSLionel Sambuc ${CROSS_PREFIX}strip -s ${OBJ}/${f}.elf 2158a3677deSKees Jongenburger mcopy -bsp -i ${IMG_DIR}/fat.img ${OBJ}/${f}.elf ::${f}.elf 2165acaa081SBen Grasdone 2175acaa081SBen Gras 2188a3677deSKees Jongenburger# 2198a3677deSKees Jongenburger# make the different file system. this part is *also* hacky. We first convert 2208a3677deSKees Jongenburger# the METALOG.sanitised using mtree into a input METALOG containing uids and 2218a3677deSKees Jongenburger# gids. 2228a3677deSKees Jongenburger# Afther that we do some magic processing to add device nodes (also missing from METALOG) 2238a3677deSKees Jongenburger# and convert the METALOG into a proto file that can be used by mkfs.mfs 2248a3677deSKees Jongenburger# 2258a3677deSKees Jongenburgerecho "creating the file systems" 2268a3677deSKees Jongenburger 2278a3677deSKees Jongenburger# 2288a3677deSKees Jongenburger# read METALOG and use mtree to conver the user and group names into uid and gids 2298a3677deSKees Jongenburger# FIX put "input somwhere clean" 2308a3677deSKees Jongenburger# 2318a3677deSKees Jongenburgercat ${DESTDIR}/METALOG.sanitised | ${CROSS_TOOLS}/nbmtree -N ${DESTDIR}/etc -C > ${IMG_DIR}/input 2328a3677deSKees Jongenburger 2338a3677deSKees Jongenburger# add fstab 2348a3677deSKees Jongenburgerecho "./etc/fstab type=file uid=0 gid=0 mode=0755 size=747 time=1365060731.000000000" >> ${IMG_DIR}/input 2358a3677deSKees Jongenburger 2368a3677deSKees Jongenburger# fill root.img (skipping /usr entries while keeping the /usr directory) 2378a3677deSKees Jongenburgercat ${IMG_DIR}/input | grep -v "^./usr/" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR} -o ${IMG_DIR}/root.in 238881ff3f6SLionel Sambuc 2398a3677deSKees Jongenburger# 2408a3677deSKees Jongenburger# add device nodes somewhere in the middle of the proto file. Better would be to add the entries in the 2418a3677deSKees Jongenburger# original METALOG 2428a3677deSKees Jongenburger# grab the first part 2438a3677deSKees Jongenburgergrep -B 10000 "^ dev" ${IMG_DIR}/root.in > ${IMG_DIR}/root.proto 2448a3677deSKees Jongenburger# add the device nodes from the ramdisk 2458a3677deSKees Jongenburgercat ${OBJ}/drivers/ramdisk/proto.dev >> ${IMG_DIR}/root.proto 2468a3677deSKees Jongenburger# and add the rest of the file 2478a3677deSKees Jongenburgergrep -A 10000 "^ dev" ${IMG_DIR}/root.in | tail -n +2 >> ${IMG_DIR}/root.proto 2488a3677deSKees Jongenburgerrm ${IMG_DIR}/root.in 2498a3677deSKees Jongenburger 2508a3677deSKees Jongenburger# 2518a3677deSKees Jongenburger# Create proto files for /usr and /home using toproto. 2528a3677deSKees Jongenburger# 2538a3677deSKees Jongenburgercat ${IMG_DIR}/input | grep "^\./usr/\|^. " | sed "s,\./usr,\.,g" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR}/usr -o ${IMG_DIR}/usr.proto 2548a3677deSKees Jongenburgercat ${IMG_DIR}/input | grep "^\./home/\|^. " | sed "s,\./home,\.,g" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR}/home -o ${IMG_DIR}/home.proto 2558a3677deSKees Jongenburger 2568a3677deSKees Jongenburger# 257881ff3f6SLionel Sambuc# Generate /root, /usr and /home partition images. 258881ff3f6SLionel Sambuc# 259881ff3f6SLionel Sambuc${CROSS_TOOLS}/nbmkfs.mfs -b $((${ROOT_SIZE} / 8)) ${IMG_DIR}/root.img ${IMG_DIR}/root.proto 260881ff3f6SLionel Sambuc${CROSS_TOOLS}/nbmkfs.mfs -b $((${USR_SIZE} / 8)) ${IMG_DIR}/usr.img ${IMG_DIR}/usr.proto 261881ff3f6SLionel Sambuc${CROSS_TOOLS}/nbmkfs.mfs -b $((${HOME_SIZE} / 8)) ${IMG_DIR}/home.img ${IMG_DIR}/home.proto 2628a3677deSKees Jongenburger 2638a3677deSKees Jongenburger# 2648a3677deSKees Jongenburger# Merge the partitions into a single image. 2658a3677deSKees Jongenburger# 2668a3677deSKees Jongenburgerecho "Merging file systems" 2678a3677deSKees Jongenburgerdd if=${IMG_DIR}/fat.img of=${IMG} seek=$FAT_START conv=notrunc 2688a3677deSKees Jongenburgerdd if=${IMG_DIR}/root.img of=${IMG} seek=$ROOT_START conv=notrunc 2698a3677deSKees Jongenburgerdd if=${IMG_DIR}/home.img of=${IMG} seek=$HOME_START conv=notrunc 2708a3677deSKees Jongenburgerdd if=${IMG_DIR}/usr.img of=${IMG} seek=$USR_START conv=notrunc 271