arm_builder.sh 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/usr/bin/env bash
  2. set -eu
  3. PROGRAM="${1}"
  4. shift
  5. COMMAND="${*}"
  6. IMAGE="https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2020-02-14/2020-02-13-raspbian-buster-lite.zip"
  7. GOLANG="https://golang.org/dl/go1.16.2.linux-armv6l.tar.gz"
  8. REPO_DIR="${PWD}"
  9. TMP_DIR="/tmp/builder"
  10. MNT_DIR="${TMP_DIR}/mnt"
  11. if ! systemctl is-active systemd-binfmt.service >/dev/null 2>&1; then
  12. mkdir -p "/lib/binfmt.d"
  13. echo ':qemu-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\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:F' > /lib/binfmt.d/qemu-arm-static.conf
  14. systemctl restart systemd-binfmt.service
  15. fi
  16. mkdir -p "${TMP_DIR}"
  17. wget --show-progress -qcO "${TMP_DIR}/raspbian.zip" "${IMAGE}"
  18. gunzip -c "${TMP_DIR}/raspbian.zip" > "${TMP_DIR}/raspbian.img"
  19. truncate "${TMP_DIR}/raspbian.img" --size=+2G
  20. parted --script "${TMP_DIR}/raspbian.img" resizepart 2 100%
  21. LOOP_PATH="$(losetup --find --partscan --show "${TMP_DIR}/raspbian.img")"
  22. e2fsck -y -f "${LOOP_PATH}p2"
  23. resize2fs "${LOOP_PATH}p2"
  24. partprobe "${LOOP_PATH}"
  25. mkdir -p "${MNT_DIR}"
  26. mountpoint -q "${MNT_DIR}" && umount -R "${MNT_DIR}"
  27. mount -o rw "${LOOP_PATH}p2" "${MNT_DIR}"
  28. mount -o rw "${LOOP_PATH}p1" "${MNT_DIR}/boot"
  29. mount --bind /dev "${MNT_DIR}/dev/"
  30. mount --bind /sys "${MNT_DIR}/sys/"
  31. mount --bind /proc "${MNT_DIR}/proc/"
  32. mount --bind /dev/pts "${MNT_DIR}/dev/pts"
  33. mount | grep "${MNT_DIR}"
  34. df -h
  35. cp /usr/bin/qemu-arm-static "${MNT_DIR}/usr/bin"
  36. cp /etc/resolv.conf "${MNT_DIR}/etc/resolv.conf"
  37. mkdir -p "${MNT_DIR}/root/src/${PROGRAM}"
  38. mount --bind "${REPO_DIR}" "${MNT_DIR}/root/src/${PROGRAM}"
  39. cp "${MNT_DIR}/etc/ld.so.preload" "${MNT_DIR}/etc/_ld.so.preload"
  40. touch "${MNT_DIR}/etc/ld.so.preload"
  41. chroot "${MNT_DIR}" bin/bash -x <<EOF
  42. set -eu
  43. export LANG="C"
  44. export LC_ALL="C"
  45. export LC_CTYPE="C"
  46. export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin:/root/bin"
  47. wget --show-progress -qcO /tmp/golang.tar.gz "${GOLANG}"
  48. tar -C /usr/local -xzf /tmp/golang.tar.gz
  49. export GOROOT="/usr/local/go"
  50. export GOPATH="/root"
  51. apt-get -y update
  52. apt-get install wget libpcap-dev libusb-1.0-0-dev libnetfilter-queue-dev build-essential git
  53. cd "/root/src/${PROGRAM}"
  54. ${COMMAND}
  55. EOF
  56. echo "Build finished"