diff --git a/Makefile b/Makefile index af617ff6..5c973a1c 100644 --- a/Makefile +++ b/Makefile @@ -10,22 +10,22 @@ all: $(BUILD)/harddrive.img live: -$(FUMOUNT) $(BUILD)/filesystem/ || true -$(FUMOUNT) /tmp/redbear_installer/ || true - rm -f $(BUILD)/redbear-live.iso - $(MAKE) $(BUILD)/redbear-live.iso + rm -f $(LIVE_ISO) $(LIVE_IMG) $(LIVE_BOOTLOADER) $(LIVE_IPXE) + $(MAKE) $(LIVE_ISO) -popsicle: $(BUILD)/redbear-live.iso - popsicle-gtk $(BUILD)/redbear-live.iso +popsicle: $(LIVE_ISO) + popsicle-gtk $(LIVE_ISO) image: -$(FUMOUNT) $(BUILD)/filesystem/ || true -$(FUMOUNT) /tmp/redbear_installer/ || true - rm -f $(BUILD)/harddrive.img $(BUILD)/redbear-live.iso + rm -f $(BUILD)/harddrive.img $(LIVE_ISO) $(LIVE_IMG) $(LIVE_BOOTLOADER) $(LIVE_IPXE) $(MAKE) all rebuild: -$(FUMOUNT) $(BUILD)/filesystem/ || true -$(FUMOUNT) /tmp/redbear_installer/ || true - rm -rf $(BUILD)/repo.tag $(BUILD)/harddrive.img $(BUILD)/redbear-live.iso + rm -rf $(BUILD)/repo.tag $(BUILD)/harddrive.img $(LIVE_ISO) $(LIVE_IMG) $(LIVE_BOOTLOADER) $(LIVE_IPXE) $(MAKE) all # To tell that it's not safe diff --git a/mk/config.mk b/mk/config.mk index 29f3bc9f..87249649 100644 --- a/mk/config.mk +++ b/mk/config.mk @@ -166,6 +166,12 @@ else export GNU_TARGET=$(ARCH)-unknown-redox endif BUILD=build/$(ARCH)/$(CONFIG_NAME) +LIVE_BUILD=build/$(ARCH) +LIVE_IMAGE_NAME=$(CONFIG_NAME) +LIVE_ISO=$(LIVE_BUILD)/$(LIVE_IMAGE_NAME).iso +LIVE_IMG=$(LIVE_BUILD)/$(LIVE_IMAGE_NAME).img +LIVE_BOOTLOADER=$(LIVE_BUILD)/$(LIVE_IMAGE_NAME)-bootloader-live.efi +LIVE_IPXE=$(LIVE_BUILD)/$(LIVE_IMAGE_NAME).ipxe MOUNT_DIR=$(BUILD)/filesystem FSTOOLS=build/fstools INSTALLER=$(FSTOOLS)/bin/redox_installer diff --git a/mk/disk.mk b/mk/disk.mk index 41132b5a..42a3edb7 100644 --- a/mk/disk.mk +++ b/mk/disk.mk @@ -17,21 +17,62 @@ else mv $@.partial $@ endif -$(BUILD)/redbear-live.iso: $(FSTOOLS) $(REPO_TAG) redbear.ipxe +$(LIVE_IMG): $(FSTOOLS) $(REPO_TAG) ifeq ($(FSTOOLS_IN_PODMAN),1) $(PODMAN_RUN) make $@ else - mkdir -p $(BUILD) + mkdir -p $(LIVE_BUILD) rm -rf $@ $@.partial -$(FUMOUNT) /tmp/redox_installer || true FILESYSTEM_SIZE=$(FILESYSTEM_SIZE) && \ if [ -z "$$FILESYSTEM_SIZE" ] ; then \ - FILESYSTEM_SIZE=$(shell $(INSTALLER) --filesystem-size -c $(FILESYSTEM_CONFIG)); \ + FILESYSTEM_SIZE=$(shell $(INSTALLER) --filesystem-size -c $(FILESYSTEM_CONFIG)); \ fi && \ truncate -s "$$FILESYSTEM_SIZE"m $@.partial - umask 002 && $(INSTALLER) $(INSTALLER_OPTS) -c $(FILESYSTEM_CONFIG) --write-bootloader="$(BUILD)/bootloader-live.efi" --live $@.partial + umask 002 && $(INSTALLER) $(INSTALLER_OPTS) -c $(FILESYSTEM_CONFIG) --write-bootloader="$(LIVE_BOOTLOADER)" --live $@.partial mv $@.partial $@ - cp redbear.ipxe $(BUILD)/redbear.ipxe +endif + +$(LIVE_ISO): $(LIVE_IMG) redbear.ipxe +ifeq ($(FSTOOLS_IN_PODMAN),1) + $(PODMAN_RUN) make $@ +else + mkdir -p $(LIVE_BUILD) + rm -rf $@ $@.partial + tmpdir="$$(mktemp -d)"; \ + esp_img="$$tmpdir/efiboot.img"; \ + trap 'rm -rf "$$tmpdir"' EXIT; \ + mkdir -p "$$tmpdir/EFI/BOOT"; \ + BOOTLOADER_LIVE_BIOS=""; \ + for path in recipes/core/bootloader/target/*/stage/usr/lib/boot/bootloader-live.bios repo/*/*/bootloader/*/usr/lib/boot/bootloader-live.bios; do \ + if [ -f "$$path" ]; then \ + BOOTLOADER_LIVE_BIOS="$$path"; \ + break; \ + fi; \ + done; \ + live_size="$$(stat -c%s "$(LIVE_IMG)")"; \ + esp_size="$$((live_size + 64 * 1024 * 1024))"; \ + truncate -s "$$esp_size" "$$esp_img"; \ + mkfs.fat -F 32 "$$esp_img" >/dev/null; \ + python3 local/scripts/fat_tool.py mkdir "$$esp_img" 0 EFI; \ + python3 local/scripts/fat_tool.py mkdir "$$esp_img" 0 EFI/BOOT; \ + python3 local/scripts/fat_tool.py cp-in "$$esp_img" 0 "$(LIVE_BOOTLOADER)" EFI/BOOT/BOOTX64.EFI; \ + python3 local/scripts/fat_tool.py cp-in "$$esp_img" 0 "$(LIVE_IMG)" redox-live.iso; \ + cp "$(LIVE_BOOTLOADER)" "$$tmpdir/EFI/BOOT/BOOTX64.EFI"; \ + cp redbear.ipxe "$$tmpdir/redbear.ipxe"; \ + if [ -n "$$BOOTLOADER_LIVE_BIOS" ]; then \ + cp "$$BOOTLOADER_LIVE_BIOS" "$$tmpdir/bootloader-live.bios"; \ + xorriso -as mkisofs -R -J -V "REDBEARLIVE" -o $@.partial \ + -b bootloader-live.bios -no-emul-boot \ + -eltorito-alt-boot -e efiboot.img -no-emul-boot \ + "$$tmpdir" >/dev/null; \ + else \ + xorriso -as mkisofs -R -J -V "REDBEARLIVE" -o $@.partial \ + -eltorito-alt-boot -e efiboot.img -no-emul-boot \ + "$$tmpdir" >/dev/null; \ + fi + mv $@.partial $@ + cp redbear.ipxe $(LIVE_IPXE) endif $(BUILD)/filesystem.img: $(FSTOOLS) $(REPO_TAG) @@ -84,9 +125,9 @@ ifeq ($(FSTOOLS_IN_PODMAN),1) $(PODMAN_RUN) make $@ else @mkdir -p $(MOUNT_DIR) - $(REDOXFS) $(BUILD)/redbear-live.iso $(MOUNT_DIR) + $(REDOXFS) $(LIVE_IMG) $(MOUNT_DIR) @sleep 2 - @echo "\033[1;36;49mredbear-live.iso mounted ($$(pgrep redoxfs))\033[0m" + @echo "\033[1;36;49m$(notdir $(LIVE_IMG)) mounted ($$(pgrep redoxfs))\033[0m" endif unmount: FORCE diff --git a/mk/qemu.mk b/mk/qemu.mk index 084ee1fc..e3cf3f29 100644 --- a/mk/qemu.mk +++ b/mk/qemu.mk @@ -35,13 +35,24 @@ else ifeq ($(ARCH),x86_64) FIRMWARE=$(firstword \ $(wildcard /usr/share/ovmf/OVMF.fd) \ $(wildcard /usr/share/OVMF/OVMF_CODE.fd) \ + $(wildcard /usr/share/OVMF/x64/OVMF_CODE.fd) \ + $(wildcard /usr/share/edk2/x64/OVMF.4m.fd) \ + $(wildcard /usr/share/edk2/x64/OVMF_CODE.4m.fd) \ + $(wildcard /usr/share/edk2-ovmf/x64/OVMF.4m.fd) \ + $(wildcard /usr/share/edk2-ovmf/x64/OVMF_CODE.4m.fd) \ ) ifeq ($(FIRMWARE),) PFLASH0=$(firstword \ $(wildcard /usr/share/qemu/edk2-x86_64-code.fd) \ + $(wildcard /usr/share/edk2/x64/OVMF_CODE.4m.fd) \ + $(wildcard /usr/share/edk2-ovmf/x64/OVMF_CODE.4m.fd) \ $(wildcard /run/libvirt/nix-ovmf/edk2-x86_64-code.fd) \ $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2s-x86_64-code.fd) \ ) + PFLASH1=$(firstword \ + $(wildcard /usr/share/edk2/x64/OVMF_VARS.4m.fd) \ + $(wildcard /usr/share/edk2-ovmf/x64/OVMF_VARS.4m.fd) \ + ) endif endif ifneq ($(usb),no) @@ -158,7 +169,8 @@ ifneq ($(QEMU_KERNEL),) endif ifeq ($(live),yes) - DISK=$(BUILD)/redbear-live.iso + DISK=$(LIVE_ISO) + disk?=cdrom else DISK=$(BUILD)/harddrive.img endif diff --git a/scripts/build-iso.sh b/scripts/build-iso.sh index 498e6e3c..e1b8d08f 100755 --- a/scripts/build-iso.sh +++ b/scripts/build-iso.sh @@ -2,14 +2,18 @@ # Build Red Bear OS live ISO # Usage: ./scripts/build-iso.sh [CONFIG_NAME] [ARCH] -# CONFIG_NAME - build config (default: redbear-full) +# CONFIG_NAME - build config (default: redbear-live) # ARCH - target architecture (default: x86_64) set -euo pipefail -CONFIG_NAME="${1:-redbear-full}" +CONFIG_NAME="${1:-redbear-live}" ARCH="${2:-x86_64}" +if [ -z "${CI:-}" ] && { [ ! -t 0 ] || [ ! -t 1 ]; }; then + export CI=1 +fi + echo "Building Red Bear OS ISO" echo " config: ${CONFIG_NAME}" echo " arch: ${ARCH}" @@ -17,4 +21,4 @@ echo " arch: ${ARCH}" make live CONFIG_NAME="${CONFIG_NAME}" ARCH="${ARCH}" echo "" -echo "Done: redbear-live.iso" +echo "Done: build/${ARCH}/${CONFIG_NAME}.iso"