#!/usr/bin/env zsh # # Copyright (C) 2016 Dyne.org Foundation # # ARM SDK is designed, written and maintained by parazyd # # This source code is free software; you can redistribute it and/or # modify it under the terms of the GNU Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This source code is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Please refer # to the GNU Public License for more details. # # You should have received a copy of the GNU Public License along with # this source code; if not, write to: Free Software Foundation, Inc., # 675 Mass Ave, Cambridge, MA 02139, USA. # # Common functions for builds writebase="$strapdir" command -v dcfldd >/dev/null && DD=`command -v dcfldd` DD=${DD:-/bin/dd} write-hostname() { fn write-hostname print $os | sudo tee ${writebase}/etc/hostname notice "Wrote $writebase/etc/hostname" } write-fstab() { fn write-fstab notice "Writing fstab" cat < proc /proc proc nodev,noexec,nosuid 0 0 /dev/mmcblk0p2 / ext4 errors=remount-ro 0 1 /dev/mmcblk0p1 /boot vfat noauto 0 0 EOF } write-hosts-file() { fn write-hosts-file cat < /usr/sbin/policy-rc.d chmod +x /usr/sbin/policy-rc.d apt-get update apt-get --yes --force-yes install locales-all debconf-set-selections /debconf.set rm -f /debconf.set apt-get update apt-get -y install ${core_packages} echo "root:toor" | chpasswd sed -i -e 's/KERNEL\!=\"eth\*|/KERNEL\!=\"/' /lib/udev/rules.d/75-persistent-net-generator.rules rm -fv /etc/udev/rules.d/70-persistent-net.rules export DEBIAN_FRONTEND=noninteractive apt-get --yes --force-yes install ${base_packages} apt-get --yes --force-yes install ${system_packages} apt-get --yes --force-yes install ${extra_packages} apt-get --yes --force-yes dist-upgrade apt-get --yes --force-yes autoremove echo "Allowing SSH root login" sed -i -e 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config update-rc.d ssh enable rm -fv /usr/sbin/policy-rc.d rm -fv /usr/sbin/invoke-rc.d dpkg-divert --remove --rename /usr/sbin/invoke-rc.d rm -fv /third-stage EOF sudo chmod +x $writebase/third-stage notice "Wrote $writebase/third-stage" } ${device_name}-bootstrap() { fn ${device_name}-bootstrap notice "Bootstrapping $os base" mkdir -p ${workdir} cd ${workdir} sudo debootstrap --foreign --arch ${arch} ${release} ${strapdir} ${mirror} [[ $? = 0 ]] || { error "debootstrap failed" return 1 } # qemu-wrapper [[ $enable_qemu_wrapper = 1 ]] && { sudo cp $R/arm/qemu-wrapper ${strapdir}/usr/bin/ && notice "Copied qemu-wrapper" print ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/qemu-wrapper:' \ | sudo tee /proc/sys/fs/binfmt_misc/register } sudo cp -rfv ${qemu_bin} ${strapdir}/usr/bin/ && notice "Success bootstrapping base" [[ $? = 0 ]] || return 1 notice "Next step is "${device_name}-secondstage } ${device_name}-secondstage() { fn ${device_name}-secondstage notice "Bootstrapping $os second-stage" LANG=C sudo -E chroot ${strapdir} /debootstrap/debootstrap --second-stage [[ $? = 0 ]] || { error "debootstrap second-stage failed" return 1 } write-sources-list write-hostname write-hosts-file write-network-ifaces write-resolvconf write-debconf write-third-stage notice "Finished second-stage" notice "Next step is: ${device_name}-thirdstage" } ${device_name}-thirdstage() { fn ${device_name}-thirdstage notice "Bootstrapping $os third-stage" export LC_ALL=C export DEBIAN_FRONTEND=noninteractive sudo -E mount -t proc proc ${strapdir}/proc && notice "Mounted proc..." sudo -E mount -o bind /dev/ ${strapdir}/dev/ && notice "Mounted dev..." sudo -E mount -o bind /dev/pts ${strapdir}/dev/pts && notice "Mounted dev/pts..." notice "Chrooting..." LANG=C sudo -E chroot $strapdir /third-stage [[ $? = 0 ]] || { error "Failed at third-stage" return 1 } write-cleanup notice "Executing cleanup..." LANG=C sudo -E chroot ${strapdir} /cleanup [[ $? = 0 ]] || { error "Failed at cleanup" return 1 } copy-zram sudo umount ${strapdir}/dev/pts && notice "Unmounted dev/pts" sleep 5 sudo umount ${strapdir}/dev && notice "Unmounted dev" sleep 2 sudo umount ${strapdir}/proc && notice "Unmounted proc" sleep 2 notice "Finalized third-stage" notice "Next step is: ${device_name}-prepimg" } ${device_name}-prepimg() { fn ${device_name}-prepimg notice "Creating image file..." $DD if=/dev/zero \ of=${image_name}.img \ bs=1M count=$size notice "Partitioning..." if [[ $gpt == 1 ]]; then parted ${image_name}.img --script -- mklabel gpt cgpt create -z ${image_name}.img cgpt create ${image_name}.img cgpt add -i 1 -t kernel -b 8192 -s 32768 -l kernel -S 1 -T 5 -P 10 ${image_name}.img cgpt add -i 2 -t data -b 40960 -s `expr $(cgpt show ${image_name}.img \ | grep 'Sec GPT table' \ | awk '{print \$1}') - 40960` -l Root ${image_name}.img loopdevice=`sudo losetup -f --show ${workdir}/${image_name}.img` mappdevice=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1` notice "Loopdevice: $loopdevice" notice "Mapper device: $mappdevice" warn "Do not think of purple hippos" && sleep 5 mappdevice="/dev/mapper/${mappdevice}" bootpart=${mappdevice}p1 rootpart=${mappdevice}p2 notice "Formatting partitions..." mkfs.ext4 -L rootfs $rootpart mkdir -p ${workdir}/root sudo mount $rootpart ${workdir}/root && notice "Mounted root part" for i in $custmodules; do print $i | sudo tee -a ${strapdir}/etc/modules ; done else parted ${image_name}.img --script -- mklabel msdos parted ${image_name}.img --script -- mkpart primary ${parted_boot} parted ${image_name}.img --script -- mkpart primary ${parted_root} loopdevice=`sudo losetup -f --show ${workdir}/${image_name}.img` mappdevice=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1` notice "Loopdevice: $loopdevice" notice "Mapper device: $mappdevice" warn "Do not think of purple hippos" && sleep 5 mappdevice="/dev/mapper/${mappdevice}" bootpart=${mappdevice}p1 rootpart=${mappdevice}p2 notice "Formatting partitions..." sudo mkfs.vfat $bootpart sudo mkfs.ext4 $rootpart mkdir -p ${workdir}/bootp ${workdir}/root sudo mount $bootpart ${workdir}/bootp && notice "Mounted boot part" sudo mount $rootpart ${workdir}/root && notice "Mounted root part" print ${inittab} | sudo tee -a ${strapdir}/etc/inittab for i in $custmodules; do print $i | sudo tee -a ${strapdir}/etc/modules ; done fi notice "Finalized preparing image" notice "Next step is ${device_name}-build-kernel" } ${device_name}-pack-image() { fn ${device_name}-pack-image notice "Rechecking filesystem" sudo e2fsck -f ${mappdevice}p2 sudo resize2fs ${mappdevice}p2 sudo kpartx -dv $loopdevice [[ $? = 0 ]] || error "kpartx failed to remove $loopdevice" sudo losetup -d $loopdevice [[ $? = 0 ]] || error "losetup failed to remove $loopdevice" notice "Compressing image to xz" xz -zv ${image_name}.img notice "Generating sha256 for ${image_name}.img.xz" sha256sum ${image_name}.img.xz > ${image_name}.img.xz.sha [[ -d $R/arm/finished ]] || mkdir -p $R/arm/finished mv -v ${image_name}.img.xz $R/arm/finished/ mv -v ${image_name}.img.xz.sha $R/arm/finished/ cd $R sudo rm -r ${strapdir} sudo rm -r ${workdir} notice "Finished building ${image_name}" } get-kernel-firmware() { [[ -d $R/tmp/firmware ]] || git clone \ https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git $R/tmp/firmware rm -rf $R/tmp/firmware/.git } clean-kernel-leftovers() { notice "Cleaning up from kernel build..." sudo rm -r ${strapdir}/usr/src/kernel sudo rm ${strapdir}/usr/src/${device_name}.config #sudo rm ${strapdir}/usr/src/kernel-at-commit sudo chown root ${strapdir}/lib sudo chown -R root ${strapdir}/lib/modules sudo chown -R root ${strapdir}/lib/firmware cd ${workdir} } copy-kernel-config() { cd ${strapdir}/usr/src/kernel cp -v ${workdir}/../kernel-configs/${device_name}.config .config sudo cp -v ${workdir}/../kernel-configs/${device_name}.config ../${device_name}.config export ARCH=arm export CROSS_COMPILE=${compiler} } make-kernel-modules() { [[ -d ${strapdir}/lib/modules ]] || sudo mkdir -p ${strapdir}/lib/modules [[ -d ${strapdir}/lib/firmware ]] || sudo mkdir -p ${strapdir}/lib/firmware sudo chown -R $USER ${strapdir}/lib/modules sudo chown -R $USER ${strapdir}/lib/firmware make modules_install INSTALL_MOD_PATH=${strapdir} [[ $? = 0 ]] || { error "Failed installing kernel modules" return 1 } } copy-zram() { notice "Installing zram init" sudo cp ${workdir}/../extra/zram ${strapdir}/etc/init.d/zram sudo chmod +x ${strapdir}/etc/init.d/zram } ${device_name}-finalize() { fn ${device_name}-finalize clean-kernel-leftovers notice "Making you wait for nothing..." sudo rsync -HPavz -q ${strapdir}/* ${workdir}/root writebase="${workdir}/root" write-sources-list write-fstab cd ${workdir} sudo umount ${bootpart} && notice "Unmounted boot part" sudo umount ${rootpart} && notice "Unmounted root part" notice "Finalized build..." notice "Pack and finish with: ${device_name}-pack-image" } ${device_name}-build-all() { for i in bootstrap secondstage thirdstage prepimg build-kernel finalize pack-image; do ${device_name}-${i} [[ $? = 0 ]] || { error "Failed on ${device_name}-${i}" return 1 } done } [[ -f ${qemu_bin} ]] || warn "No ${qemu_bin}" notice "Loaded build script for ${device_name}" notice "Run '${device_name}-bootstrap' to build step by step" notice "Run '${device_name}-build-all' to build image automatically"