build-img 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/bin/sh
  2. # shellcheck source=./lib/lib.sh
  3. . "$(dirname "$(realpath "$0")")/lib/lib.sh"
  4. BASE_DIR="$(dirname "$(realpath "$0")")"
  5. KB=1024
  6. MB=$((1024 * KB))
  7. TARGET=
  8. IMAGE=
  9. MOUNTPOINT="$(mktemp -d)"
  10. usage() {
  11. cat >&2 <<EOF
  12. Usage: $0 -t <TARGET> -o <OUTPUT> [-h]
  13. Options
  14. -t The target building image for
  15. [available: riscv64 x86 loongarch64]
  16. -o Output image path
  17. -h Show help message
  18. EOF
  19. exit "$1"
  20. }
  21. ensure_mount_macos() {
  22. hdiutil detach "$MOUNTPOINT" > /dev/null 2>&1 || :
  23. hdiutil attach "$IMAGE" -mountpoint "$MOUNTPOINT"
  24. }
  25. ensure_mount_linux() {
  26. DEV=$(sudo losetup -f "$IMAGE" --show)
  27. sudo mount "$DEV" "$MOUNTPOINT"
  28. }
  29. ensure_mount() {
  30. if [ "$OS" = Darwin ]; then
  31. ensure_mount_macos
  32. return
  33. fi
  34. ensure_mount_linux
  35. }
  36. unmount_macos() {
  37. hdiutil detach "$MOUNTPOINT"
  38. }
  39. unmount_linux() {
  40. sudo umount "$MOUNTPOINT"
  41. sudo losetup -d "$DEV"
  42. }
  43. cleanup() {
  44. case "$OS" in
  45. Darwin)
  46. unmount_macos
  47. ;;
  48. *)
  49. unmount_linux
  50. ;;
  51. esac
  52. }
  53. set -eu
  54. while getopts "t:o:h" opt; do
  55. case "$opt" in
  56. t) TARGET="$OPTARG";;
  57. o) IMAGE="$OPTARG";;
  58. h) usage 0;;
  59. ?) usage 1;;
  60. esac
  61. done
  62. shift $((OPTIND - 1))
  63. [ -z "$TARGET" ] && die "ARCH is not set"
  64. [ -z "$IMAGE" ] && die "output image path is not set"
  65. echo "Build image with ARCH=$TARGET OUTPUT=$IMAGE MOUNTPOINT=$MOUNTPOINT"
  66. dd if=/dev/zero of="$IMAGE" bs=$((1 * MB)) count=$((1024 - 4))
  67. mkfs.fat -n SYSTEM "$IMAGE"
  68. ensure_mount
  69. trap cleanup EXIT
  70. for name in $(iter_files_sorted "$BASE_DIR/platform/$TARGET"); do
  71. ( . "$name" )
  72. done