aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--Dockerfile4
-rw-r--r--Makefile59
-rw-r--r--docker-compose.yml7
-rw-r--r--initramfs_init10
5 files changed, 82 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cbc90a8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+external/
+build/
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..6e03a4b
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,4 @@
+FROM ubuntu:22.04
+
+RUN apt-get update && apt-get install -y build-essential gcc make wget libssl-dev xorriso git bison flex libelf-dev bc libssl-dev dwarves binutils cpio zstd && apt-get clean
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c48c396
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,59 @@
+EXTERNAL_DIR=external
+BUILD_DIR=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..."
+ $(MAKE) -C $(BUSYBOX_DIR) defconfig
+ $(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"
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..cd86a66
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,7 @@
+services:
+ builder:
+ build: .
+ volumes:
+ - .:/yerba
+ working_dir: /yerba
+ command: make iso
diff --git a/initramfs_init b/initramfs_init
new file mode 100644
index 0000000..0479358
--- /dev/null
+++ b/initramfs_init
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+mount -t proc none /proc
+mount -t sysfs none /sys
+mount -t devtmpfs none /dev
+
+echo "Welcome to Yerba Linux!"
+echo "You are now in a minimal BusyBox environment."
+
+exec /bin/sh