CORES := $(shell nproc) PWD := $(shell pwd) LINUX_DIR := $(PWD)/components/linux MUSL_DIR := $(PWD)/components/musl BUSYBOX_DIR := $(PWD)/components/busybox LINUX_CFG := $(LINUX_DIR)/.config MUSL_CFG := $(MUSL_DIR)/config.mak BUSYBOX_CFG := $(BUSYBOX_DIR)/.config LINUX_OUT := $(LINUX_DIR)/arch/x86/boot/bzImage MUSL_OUT := $(MUSL_DIR)/lib/libc.so BUSYBOX_OUT := $(BUSYBOX_DIR)/busybox DOWNLOAD_SCRIPT := $(PWD)/scripts/download-components.sh CONFIGS_DIR := $(PWD)/configs MUSL_GCC := "${REALGCC:-gcc}" "$@" -specs "$(MUSL_DIR)/lib/musl-gcc.specs" .PHONY: all deps linux busybox clean all: dirs deps linux busybox dirs: mkdir -p initramfs/{etc,proc,sys,usr/{bin,lib},dev,tmp,mnt,root} ln -sf usr/bin initramfs/bin ln -sf usr/bin initramfs/sbin ln -sf usr/lib initramfs/lib ln -sf usr/lib initramfs/lib64 deps: @echo "Downloading dependencies..." @$(DOWNLOAD_SCRIPT) linux: $(LINUX_OUT) $(LINUX_OUT): $(LINUX_CFG) @echo "Building Linux kernel..." @$(MAKE) -C $(LINUX_DIR) -j $(CORES) $(LINUX_CFG): @echo "Copying Linux config..." @cp -r $(CONFIGS_DIR)/linux/. $(LINUX_DIR)/ musl: $(MUSL_OUT) $(MUSL_SPECS): $(MUSL_OUT) $(MUSL_OUT): $(MUSL_CFG) make -C components/musl -j $(CORES) $(MUSL_CFG): @echo "Configuring musl..." cd components/musl && ./configure --prefix=/usr busybox: musl $(BUSYBOX_OUT) $(BUSYBOX_OUT): $(BUSYBOX_CFG) @echo "Building BusyBox..." @$(MAKE) -C $(BUSYBOX_DIR) -j $(CORES) CC="$(MUSL_GCC)" $(BUSYBOX_CFG): @echo "Copying BusyBox config..." @cp -r $(CONFIGS_DIR)/busybox/. $(BUSYBOX_DIR)/ install: linux busybox @cp $(LINUX_OUT) cdroot/ $(MAKE) -C $(BUSYBOX_DIR) install CONFIG_PREFIX=$(PWD)/initramfs -j $(CORES) clean: @echo "Cleaning up build artifacts..." @$(MAKE) -C $(LINUX_DIR) clean @$(MAKE) -C $(BUSYBOX_DIR) clean