81 lines
2.2 KiB
Makefile
81 lines
2.2 KiB
Makefile
.POSIX:
|
|
|
|
COMMON ?= common.h
|
|
DOC_OUT = README.html
|
|
LD ?= ld
|
|
LINKER_SCRIPT ?= linker.ld
|
|
# Use gcc so that the preprocessor will run first.
|
|
GAS ?= gcc
|
|
GAS_EXT ?= .S
|
|
NASM_EXT ?= .asm
|
|
OBJ_EXT ?= .o
|
|
OUT_EXT ?= .img
|
|
QEMU ?= qemu-system-i386
|
|
RUN ?= bios_hello_world
|
|
TMP_EXT ?= .tmp
|
|
|
|
OUTS := $(sort $(foreach IN_EXT,$(NASM_EXT) $(GAS_EXT),$(patsubst %$(IN_EXT),%$(OUT_EXT),$(wildcard *$(IN_EXT)))))
|
|
RUN_FILE := $(RUN)$(OUT_EXT)
|
|
|
|
.PRECIOUS: %$(OBJ_EXT)
|
|
.PHONY: all clean doc run
|
|
|
|
all: $(OUTS)
|
|
|
|
%$(OUT_EXT): %$(OBJ_EXT) $(LINKER_SCRIPT)
|
|
@# Failed attempt at getting debug symbols.
|
|
@#$(LD) -melf_i386 -o '$(@:$(OUT_EXT)=.elf)' -T '$(LINKER_SCRIPT)' '$<'
|
|
$(LD) --oformat binary -o '$@' -T '$(LINKER_SCRIPT)' '$<'
|
|
|
|
%$(OBJ_EXT): %$(GAS_EXT) $(COMMON)
|
|
$(GAS) -c -g -o '$@' '$<'
|
|
|
|
%$(OUT_EXT): %$(NASM_EXT)
|
|
nasm -f bin -o '$@' '$<'
|
|
|
|
# So that directories without a common.h can reuse this.
|
|
$(COMMON):
|
|
|
|
clean:
|
|
rm -fr '$(DOC_OUT)' *$(OBJ_EXT) *$(OUT_EXT) *$(TMP_EXT)
|
|
|
|
run: $(RUN_FILE)
|
|
$(QEMU) -drive 'file=$(RUN_FILE),format=raw' -smp 2 -soundhw pcspk
|
|
|
|
debug: $(RUN_FILE)
|
|
$(QEMU) -hda '$(RUN_FILE)' -S -s &
|
|
gdb -x gdb.gdb
|
|
|
|
bochs: $(RUN_FILE)
|
|
# Supposes size is already multiples of 512.
|
|
# We force that with our linker script,
|
|
# and `grub-mkrescue` also seems to respect it as well.
|
|
CYLINDERS="$$(($$(stat -c '%s' '$(RUN_FILE)') / 512))" && \
|
|
bochs -qf /dev/null \
|
|
'ata0-master: type=disk, path="$(RUN_FILE)", mode=flat, cylinders='"$$CYLINDERS"', heads=1, spt=1' \
|
|
'boot: disk' \
|
|
'display_library: sdl' \
|
|
'megs: 128'
|
|
|
|
BIG_IMG_DIR := big_img$(TMP_EXT)
|
|
BOOT_DIR := $(BIG_IMG_DIR)/boot
|
|
GRUB_DIR := $(BOOT_DIR)/grub
|
|
big$(OUT_EXT): all
|
|
rm -rf '$(BIG_IMG_DIR)'
|
|
mkdir -p '$(GRUB_DIR)'
|
|
for out in $(OUTS); do\
|
|
printf "menuentry \"$${out%.*}\" {\n chainloader /boot/$$out\n}\n" >> '$(GRUB_DIR)/grub.cfg';\
|
|
cp "$$out" '$(BOOT_DIR)';\
|
|
done
|
|
# TODO why does this fail to boot properly?
|
|
#make -C multiboot/hello-world
|
|
#mkdir -p '$(BOOT_DIR)/multiboot'
|
|
#printf "menuentry \"multiboot/hello-world\" {\n chainloader /boot/multiboot/hello-world.img\n}\n" >> '$(GRUB_DIR)/grub.cfg';\
|
|
#cp multiboot/hello-world/main.img '$(BOOT_DIR)/multiboot/hello-world.img'
|
|
grub-mkrescue -o '$@' '$(BIG_IMG_DIR)'
|
|
|
|
doc: $(DOC_OUT)
|
|
|
|
$(DOC_OUT): README.adoc
|
|
asciidoctor -o $@ -v $<
|