EXTERNAL_DIR=/yerba/external BUILD_DIR=/yerba/build LINUX_DIR=$(EXTERNAL_DIR)/linux LINUX_REPO=https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git BUSYBOX_DIR=$(EXTERNAL_DIR)/busybox BUSYBOX_REPO=https://git.busybox.net/busybox INITRAMFS_INIT=initramfs_init .PHONY: all kernel initramfs iso run clean all: iso $(EXTERNAL_DIR): @mkdir -p $(EXTERNAL_DIR) $(BUILD_DIR): @mkdir -p $(BUILD_DIR) $(LINUX_DIR): $(EXTERNAL_DIR) @echo "[yerba] cloning Linux kernel..." git clone --depth 1 $(LINUX_REPO) $(LINUX_DIR) kernel: $(LINUX_DIR) $(BUILD_DIR) @echo "[yerba] building kernel (default defconfig)..." $(MAKE) -C $(LINUX_DIR) defconfig $(MAKE) -C $(LINUX_DIR) -j$(shell nproc) bzImage cp $(LINUX_DIR)/arch/x86/boot/bzImage $(BUILD_DIR)/bzImage initramfs: busybox kernel @echo "[yerba] creating initramfs..." rm -rf $(BUILD_DIR)/initramfs mkdir -p $(BUILD_DIR)/initramfs/{bin,sbin,etc,proc,sys,dev} cp -a $(BUSYBOX_DIR)/_install/. $(BUILD_DIR)/initramfs/ cp initramfs_init $(BUILD_DIR)/initramfs/init chmod +x $(BUILD_DIR)/initramfs/init cd $(BUILD_DIR)/initramfs && find . | cpio -o -H newc | gzip > $(BUILD_DIR)/initramfs.cpio.gz $(BUSYBOX_DIR): $(EXTERNAL_DIR) @echo "[yerba] cloning BusyBox..." git clone --depth 1 $(BUSYBOX_REPO) $(BUSYBOX_DIR) busybox: $(BUSYBOX_DIR) $(BUILD_DIR) @echo "[yerba] building BusyBox..." rm $(BUSYBOX_DIR)/.config cp busybox_config $(BUSYBOX_DIR)/.config $(MAKE) -C $(BUSYBOX_DIR) -j$(shell nproc) $(MAKE) -C $(BUSYBOX_DIR) CONFIG_PREFIX=$(BUSYBOX_DIR)/_install install iso: kernel initramfs busybox @echo "[yerba] TODO: make this output an ISO when ready" @echo "[yerba] Kernel located at $(BUILD_DIR)/bzImage" @echo "[yerba] Initramfs located at $(BUILD_DIR)/initramfs.cpio.gz" clean: rm -rf $(EXTERNAL_DIR) $(BUILD_DIR) run: iso @echo "[yerba] booting in QEMU..." qemu-system-x86_64 -kernel $(BUILD_DIR)/bzImage -initrd $(BUILD_DIR)/initramfs.cpio.gz -nographic -append "console=ttyS0"