aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.config5
-rw-r--r--Kconfig3
-rw-r--r--arch/i686/toolchain.mk (renamed from toolchain.makefile)9
-rw-r--r--common.mk15
-rw-r--r--drivers/makefile11
-rw-r--r--libk/makefile10
-rw-r--r--makefile37
-rw-r--r--src/makefile24
8 files changed, 72 insertions, 42 deletions
diff --git a/.config b/.config
index 1cfccc9..d948daa 100644
--- a/.config
+++ b/.config
@@ -1,7 +1,12 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Main menu
+#
#
# Build
#
+CONFIG_ARCH="i686"
CONFIG_EXTRA_CXX_FLAGS=""
CONFIG_OBJ_DIR="build"
# end of Build
diff --git a/Kconfig b/Kconfig
index 9b05045..ef3f82e 100644
--- a/Kconfig
+++ b/Kconfig
@@ -1,4 +1,7 @@
menu "Build"
+ config ARCH
+ string "Target architecture"
+ default "i686"
config EXTRA_CXX_FLAGS
string "Additional cxx flags"
config OBJ_DIR
diff --git a/toolchain.makefile b/arch/i686/toolchain.mk
index 9500449..c6349e8 100644
--- a/toolchain.makefile
+++ b/arch/i686/toolchain.mk
@@ -1,4 +1,7 @@
-# Toolchain
+# x86 toolchain
+# - 32-bit X86: Pentium-Pro and above
+#
+# To check targets supported by llvm, see 'llc --version'
TARGET := i686-elf
NM := llvm-nm
@@ -24,9 +27,9 @@ CXX_FLAGS := -std=c++20 -g -O3 -flto=full \
-Wconsumed
TEST_CXX := clang++
TEST_CXX_FLAGS := -std=c++20 -Wall -Wextra -Werror=pedantic
-CXX_INCLUDE := $(CURDIR)/libk $(CURDIR)/src $(CURDIR)/drivers
+CXX_INCLUDE := $(prefix)/libk $(prefix)/src $(prefix)/drivers
CXX_INCLUDE := $(addprefix -I, $(CXX_INCLUDE))
-SYSTEM_INCLUDE := $(CURDIR)/grub
+SYSTEM_INCLUDE := $(prefix)/grub
SYSTEM_INCLUDE := $(addprefix -isystem, $(SYSTEM_INCLUDE))
CXX_INCLUDE := $(CXX_INCLUDE) $(SYSTEM_INCLUDE)
diff --git a/common.mk b/common.mk
new file mode 100644
index 0000000..a07e718
--- /dev/null
+++ b/common.mk
@@ -0,0 +1,15 @@
+# directory of the current makefile
+prefix := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
+include $(prefix)/.config
+OBJ_DIR != echo $(prefix)/$(CONFIG_OBJ_DIR)
+CONFIG_BUILD_DEST != echo $(prefix)/$(CONFIG_OBJ_DIR)
+CONFIG_ARCH != echo $(CONFIG_ARCH)
+
+include $(prefix)/arch/$(CONFIG_ARCH)/toolchain.mk
+
+export AR AR_FLAGS AS AS_FLAGS NM SED \
+ CXX CXX_FLAGS CXX_INCLUDE TARGET \
+ TEST_CXX TEST_CXX_FLAGS \
+ LD LD_FLAGS
+
diff --git a/drivers/makefile b/drivers/makefile
index 6a80fec..65bf22d 100644
--- a/drivers/makefile
+++ b/drivers/makefile
@@ -1,11 +1,16 @@
+include ../common.mk
+
CXX_OBJ = cga.o serial.o keyboard.o
-CXX_OBJ := $(addprefix $(OBJ_DIR)/, $(CXX_OBJ))
+CXX_OBJ := $(addprefix $(OBJ_DIR)/libd/, $(CXX_OBJ))
CXX_DEP = $(CXX_OBJ:%.o=%.d)
CXX_JSON = $(CXX_OBJ:.o=.json)
HWH := drivers/hardware.h
autogen := $(autogen) $(HWH)
+.PHONY: all clean
+all: $(OBJ_DIR)/libd.a
+
$(HWH): .config
@echo " GEN $@"
@echo \/\* autogenerated hardware description \*\/ > $(HWH)
@@ -22,12 +27,12 @@ ifdef CONFIG_serial0_enable
endif
-include $(CXX_DEP)
-$(CXX_OBJ) : $(OBJ_DIR)/%.o : %.cc
+$(CXX_OBJ) : $(OBJ_DIR)/libd/%.o : %.cc
@mkdir -p $(@D)
@echo " CXX $<"
@$(CXX) -target $(TARGET) $(CXX_FLAGS) $(CXX_INCLUDE) -MMD -MJ$(subst .o,.json,$@) -c $< -o $@
-%/libd.a: $(CXX_OBJ)
+$(OBJ_DIR)/libd.a: $(CXX_OBJ)
@echo " AR $(@F)"
@$(AR) $(AR_FLAGS) rcs $@ $(CXX_OBJ)
diff --git a/libk/makefile b/libk/makefile
index eafa98c..7a0483d 100644
--- a/libk/makefile
+++ b/libk/makefile
@@ -1,12 +1,14 @@
+include ../common.mk
+
CXX_OBJ = string/integerview.o string/memory.o \
memory/allocator.o \
stdlib/abort.o stdlib/console.o stdlib/virtual.o
-CXX_OBJ := $(addprefix $(OBJ_DIR)/, $(CXX_OBJ))
+CXX_OBJ := $(addprefix $(OBJ_DIR)/libk/, $(CXX_OBJ))
CXX_DEP = $(CXX_OBJ:%.o=%.d)
CXX_JSON = $(CXX_OBJ:.o=.json)
TEST_CXX_OBJ = test/types.o test/string.o test/result.o test/quicksort.o
-TEST_CXX_OBJ := $(addprefix $(OBJ_DIR)/, $(TEST_CXX_OBJ))
+TEST_CXX_OBJ := $(addprefix $(OBJ_DIR)/libk/, $(TEST_CXX_OBJ))
TEST_CXX_DEP = $(TEST_CXX_OBJ:%.o=%.d)
.PHONY: all test clean
@@ -14,12 +16,12 @@ all: $(OBJ_DIR)/libk.a
test: $(TEST_CXX_OBJ)
-include $(CXX_DEP)
-$(CXX_OBJ) : $(OBJ_DIR)/%.o : %.cc
+$(CXX_OBJ) : $(OBJ_DIR)/libk/%.o : %.cc
@mkdir -p $(@D)
@echo " CXX $<"
@$(CXX) -target $(TARGET) $(CXX_FLAGS) $(CXX_INCLUDE) -MMD -MJ$(subst .o,.json,$@) -c $< -o $@
-%/libk.a: $(CXX_OBJ)
+$(OBJ_DIR)/libk.a: $(CXX_OBJ)
@echo " AR $(@F)"
@$(AR) $(AR_FLAGS) rcs $@ $(CXX_OBJ)
diff --git a/makefile b/makefile
index 6f49e6d..9d525d8 100644
--- a/makefile
+++ b/makefile
@@ -1,35 +1,30 @@
-include .config
-OBJ_DIR != echo $(CONFIG_OBJ_DIR)
-include toolchain.makefile
+include common.mk
-.PHONY: all libk libd clean test tidy todo run menuconfig
-all: $(OBJ_DIR)/src/glitch.elf
+.PHONY: all help libk libd clean test tidy todo run menuconfig
+all: $(OBJ_DIR)/glitch.elf
-LIBS := $(OBJ_DIR)/libk.a $(OBJ_DIR)/libd.a
-LD_FLAGS := $(LD_FLAGS) --library-path $(CURDIR)/$(OBJ_DIR)
+help:
+ @echo prefix $(prefix)
+ @echo "CONFIG_BUILD_DIR $(CONFIG_OBJ_DIR)"
+ @echo "CONFIG_ARCH $(CONFIG_ARCH)"
-export AR AR_FLAGS AS AS_FLAGS NM SED \
- CXX CXX_FLAGS CXX_INCLUDE TARGET \
- TEST_CXX TEST_CXX_FLAGS \
- LD LD_FLAGS
-
-$(OBJ_DIR)/src/glitch.elf: libk libd
- @make -C src OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/src $(CURDIR)/$(OBJ_DIR)/src/glitch.elf
+$(OBJ_DIR)/glitch.elf: libk libd
+ @make -C src
libk:
- @make -C libk OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/libk $(CURDIR)/$(OBJ_DIR)/libk.a
+ @make -C libk
libd:
- @make -C drivers OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/drivers $(CURDIR)/$(OBJ_DIR)/libd.a
+ @make -C drivers
compile_commands:
@make -C libk OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/libk compile_commands.json
clean:
- @rm -rf $(OBJ_DIR)/isodir $(LIBS)
- @make -C src OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/src clean
- @make -C libk OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/libk clean
- @make -C drivers OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/drivers clean
+ @rm -rf $(OBJ_DIR)/isodir
+ @make -C src clean
+ @make -C libk clean
+ @make -C drivers clean
@make -C tools/kconfig OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/kconfig clean
# testing
@@ -40,7 +35,7 @@ todo:
@grep TODO -r libk/ src/ drivers/
# disk image
-$(OBJ_DIR)/glitch.iso: $(OBJ_DIR)/src/glitch.elf grub/grub.cfg
+$(OBJ_DIR)/glitch.iso: $(OBJ_DIR)/glitch.elf grub/grub.cfg
@mkdir -p $(OBJ_DIR)/isodir/boot/grub
$(GRUB_FILE) --is-x86-multiboot2 $<
@cp $< $(OBJ_DIR)/isodir/boot/glitch.elf
diff --git a/src/makefile b/src/makefile
index d1e2147..731e948 100644
--- a/src/makefile
+++ b/src/makefile
@@ -1,5 +1,7 @@
+include ../common.mk
+
AS_OBJ = boot.o idt/stubs.o
-AS_OBJ := $(addprefix $(OBJ_DIR)/, $(AS_OBJ))
+AS_OBJ := $(addprefix $(OBJ_DIR)/glitch/, $(AS_OBJ))
CXX_OBJ = kernel.o \
kernel/dump_gdt.o kernel/dump_multiboot.o kernel/multiboot.o \
@@ -10,11 +12,15 @@ CXX_OBJ = kernel.o \
idt/exception.o idt/interruptgate.o idt/interrupthandler.o \
vmm.o \
scheduler.o scheduler/task.o
-CXX_OBJ := $(addprefix $(OBJ_DIR)/, $(CXX_OBJ))
+CXX_OBJ := $(addprefix $(OBJ_DIR)/glitch/, $(CXX_OBJ))
CXX_DEP = $(CXX_OBJ:%.o=%.d)
CXX_JSON = $(CXX_OBJ:.o=.json)
-cpu/irq.h: $(OBJ_DIR)/idt/stubs.o
+.PHONY: all test clean
+all: $(OBJ_DIR)/glitch.elf
+test: $(TEST_CXX_OBJ)
+
+cpu/irq.h: $(OBJ_DIR)/glitch/idt/stubs.o
@echo " GEN $@"
@echo '#pragma once' > $@
@echo 'extern "C" {' >> $@
@@ -24,28 +30,24 @@ cpu/irq.h: $(OBJ_DIR)/idt/stubs.o
autogen := $(autogen) cpu/irq.h
-.PHONY: all test clean
-all: $(OBJ_DIR)/kernel.a
-test: $(TEST_CXX_OBJ)
-
-$(AS_OBJ): $(OBJ_DIR)/%.o: %.S
+$(AS_OBJ): $(OBJ_DIR)/glitch/%.o: %.S
@mkdir -p $(@D)
@echo " AS $<"
@$(AS) -target $(TARGET) $(AS_FLAGS) $(CXX_INCLUDE) -c $^ -o $@
-include $(CXX_DEP)
-$(CXX_OBJ) : $(OBJ_DIR)/%.o : %.cc
+$(CXX_OBJ) : $(OBJ_DIR)/glitch/%.o : %.cc
@mkdir -p $(@D)
@echo " CXX $<"
@$(CXX) -target $(TARGET) $(CXX_FLAGS) $(CXX_INCLUDE) -MMD -MJ$(subst .o,.json,$@) -c $< -o $@
$(OBJ_DIR)/glitch.elf: $(autogen) $(AS_OBJ) $(CXX_OBJ) linker.ld
@echo " LD $(@F)"
- @$(LD) $(LD_FLAGS) -o $@ $(AS_OBJ) $(CXX_OBJ) -lk -ld
+ @$(LD) $(LD_FLAGS) --library-path $(OBJ_DIR) -o $@ $(AS_OBJ) $(CXX_OBJ) -lk -ld
# constexpr tests
-include $(TEST_CXX_DEP)
-$(TEST_CXX_OBJ): $(OBJ_DIR)/%.o : %.cc
+$(TEST_CXX_OBJ): $(OBJ_DIR)/glitch/%.o : %.cc
@mkdir -p $(@D)
@echo " TEST $<"
@$(TEST_CXX) -target $(TARGET) $(TEST_CXX_FLAGS) $(CXX_INCLUDE) -MMD -c $< -o $@