Skip to content

Commit

Permalink
Build all the deps in deps. Shortcut the busybox by downloading it in…
Browse files Browse the repository at this point in the history
…stead. Add logic to build to a zip instead of some hdd image. Parameterize the Makefile better. Start adding some docs in the Makefile.
  • Loading branch information
lpsantil committed Jun 28, 2022
1 parent 5607210 commit 10faf82
Showing 1 changed file with 116 additions and 11 deletions.
127 changes: 116 additions & 11 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,21 +1,36 @@
CC = i386-linux-musl-gcc
CFLAGS = -m32 -static -Os -Wall -Wextra
NASM = nasm
STRIP = i386-linux-musl-strip
CPU ?= i686
ARCH ?= $(CPU)-linux-musl
CC = $(ARCH)-gcc
CFLAGS ?= -m32 -static -Os -Wall -Wextra
NASM ?= nasm
STRIP ?= $(ARCH)-strip
CORES ?= $(shell nproc)
LINUX ?= 5.8.9
BUSYBOX ?= 1.35.0
DOSLINUX = 0.0.2

HDD_BASE = hdd.base.img
LINUX_BZIMAGE = linux-5.8.9/arch/x86/boot/bzImage
BUSYBOX_BIN = busybox-1.32.0/busybox_unstripped
HDD_BASE ?= hdd.base.img
LINUX_BZIMAGE = deps/linux-$(LINUX)/arch/x86/boot/bzImage
BUSYBOX_BIN = deps/busybox

LINUX_URL = https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-$(LINUX).tar.gz
BUSYBOX_URL = https://www.busybox.net/downloads/binaries/$(BUSYBOX)-i686-linux-musl/busybox

.PHONY: all
all: hdd.img

.PHONY: clean
clean:
rm -f hdd.img doslinux.com init/init init/*.o
rm -rfv hdd.img doslinux.com init/init init/*.o deps/* DSL.ZIP DOSLINUX/BZIMAGE DOSLINUX/INIT DOSLINUX/BUSYBOX DOSLINUX/DSL.COM DOSLINUX/ROOTFS/DOSLINUX.VER

ultraclean: clean
sudo rm -v /usr/local/bin/$(ARCH)-*

$(HDD_BASE):
dd if=/dev/zero of=$@ bs=1M count=500 status=progress

hdd.img: $(HDD_BASE) doslinux.com init/init $(LINUX_IMAGE) $(BUSYBOX_BIN)
cp $(HDD_BASE) hdd.img
hdd.img: $(HDD_BASE) doslinux.com init/init $(LINUX_BZIMAGE) $(BUSYBOX_BIN)
cp -v $(HDD_BASE) hdd.img
MTOOLSRC=mtoolsrc mmd C:/doslinux
MTOOLSRC=mtoolsrc mcopy doslinux.com C:/doslinux/dsl.com
MTOOLSRC=mtoolsrc mcopy init/init C:/doslinux/init
Expand All @@ -29,5 +44,95 @@ doslinux.com: doslinux.asm
init/init: init/init.o init/vm86.o init/panic.o init/kbd.o init/term.o
$(CC) $(CFLAGS) -o $@ $^

init/%.o: init/%.c init/*.h
init/%.o: init/%.c init/*.h /usr/local/bin/$(CC)
$(CC) $(CFLAGS) -o $@ -c $<

deps/musl-cross-make/Makefile:
cd deps && \
git clone --depth=1 https://github.com/richfelker/musl-cross-make.git

musl-cross-make-config-doslinux: Makefile
echo "TARGET = $(ARCH)" > $@
echo "OUTPUT = /usr/local" >> $@
# FIXME: This doesn't work the way musl-cross-make docs say it should
# echo "COMMON_CONFIG += CC=\"$(ARCH)-linux-musl-gcc -static --static\"" >> $@
# echo "COMMON_CONFIG += CXX=\"$(ARCH)-linux-musl-g++ -static --static\"" >> $@
echo "COMMON_CONFIG += CFLAGS=\"-g0 -Os -static --static\"" >> $@
echo "COMMON_CONFIG += CXXFLAGS=\"-g0 -Os -static --static\"" >> $@
echo "COMMON_CONFIG += LDFLAGS=\"-s\"" >> $@

deps/musl-cross-make/config.mak: musl-cross-make-config-doslinux deps/musl-cross-make/Makefile
cp -v musl-cross-make-config-doslinux $@

deps/musl-cross-make/build/local/$(ARCH)/obj_gcc/gcc/xgcc: deps/musl-cross-make/config.mak
cd deps/musl-cross-make && \
make -j$(CORES)

/usr/local/bin/$(CC): deps/musl-cross-make/build/local/$(ARCH)/obj_gcc/gcc/xgcc
cd deps/musl-cross-make && \
sudo make -j$(CORES) install

deps/linux-$(LINUX).tar.gz:
cd deps && \
wget $(LINUX_URL)

deps/linux-$(LINUX)/Makefile: deps/linux-$(LINUX).tar.gz
tar zxvf $< -C deps/
touch deps/linux-$(LINUX)/Makefile

deps/linux-$(LINUX)/.config: deps/linux-$(LINUX)/Makefile linux-config-doslinux
cp -v linux-config-doslinux $@

$(LINUX_BZIMAGE): deps/linux-$(LINUX)/.config
cd deps/linux-$(LINUX) && \
make -j$(CORES)

$(BUSYBOX_BIN):
cd deps && \
wget $(BUSYBOX_URL)

.PHONY: zipball
zipball: DSL.ZIP

DOSLINUX/ROOTFS/doslinux.ver: doslinux.ver
cp -v $< $@
DOSLINUX/DSL.COM: doslinux.com
cp -v $< $@
DOSLINUX/INIT: init/init
cp -v $< $@
DOSLINUX/BZIMAGE: $(LINUX_BZIMAGE)
cp -v $< $@
DOSLINUX/BUSYBOX: $(BUSYBOX_BIN)
cp -v $< $@

DSL.ZIP: DOSLINUX/ROOTFS/doslinux.ver DOSLINUX/BZIMAGE DOSLINUX/INIT DOSLINUX/BUSYBOX DOSLINUX/DSL.COM
zip -9vvr DSL.ZIP DOSLINUX/

######################################################################

.PHONY: showconfig
showconfig: ## Shows the configuration variables for this Makefile and their current values
showconfig: p-DOSLINUX p-CORES p-CPU p-ARCH p-CC p-NASM p-STRIP p-LINUX p-LINUX_BZIMAGE p-LINUX_URL p-BUSYBOX p-BUSYBOX_BIN p-BUSYBOX_URL p-HDD_BASE

.PHONY: gstat
gstat:
git status

.PHONY: gpush
gpush:
git commit
git push

define newline # a literal \n


endef
# Makefile debugging trick:
# call print-VARIABLE to see the runtime value of any variable
# (hardened a bit against some special characters appearing in the output)
p-%:
@echo '$*=$(subst ','\'',$(subst $(newline),\n,$($*)))'
.PHONY: p-*

help: ## This help target
@awk '/^[a-zA-Z0-9\-_+. ]*: ##/ { print; }' $(MAKEFILE_LIST)

0 comments on commit 10faf82

Please sign in to comment.