aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2021-03-25 22:37:33 +0200
committerAqua-sama <aqua@iserlohn-fortress.net>2021-03-25 22:37:33 +0200
commitbf69f336c3fb680e31a5bb43450739b0b06d95e1 (patch)
tree2e14ca86442c5aafa40c3a436c0596327faaee85
parentmakefile: add clang-tidy target (diff)
downloadkernel.cpp-bf69f336c3fb680e31a5bb43450739b0b06d95e1.tar.xz
makefile: make makefile recursive
-rw-r--r--drivers/makefile20
-rw-r--r--libk/makefile39
-rw-r--r--makefile67
-rw-r--r--src/linker.ld (renamed from linker.ld)0
-rw-r--r--src/makefile69
-rw-r--r--toolchain.makefile15
6 files changed, 139 insertions, 71 deletions
diff --git a/drivers/makefile b/drivers/makefile
index 9405f0b..6a80fec 100644
--- a/drivers/makefile
+++ b/drivers/makefile
@@ -1,6 +1,7 @@
-CXX_OBJ += drivers/cga.o \
- drivers/serial.o \
- drivers/keyboard.o
+CXX_OBJ = cga.o serial.o keyboard.o
+CXX_OBJ := $(addprefix $(OBJ_DIR)/, $(CXX_OBJ))
+CXX_DEP = $(CXX_OBJ:%.o=%.d)
+CXX_JSON = $(CXX_OBJ:.o=.json)
HWH := drivers/hardware.h
autogen := $(autogen) $(HWH)
@@ -19,3 +20,16 @@ ifdef CONFIG_serial0_enable
@echo $(CONFIG_SERIAL0_CLASS) serial0\; >> $(HWH)
@echo constexpr bool serial0_console = true\; >> $(HWH)
endif
+
+-include $(CXX_DEP)
+$(CXX_OBJ) : $(OBJ_DIR)/%.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)
+ @echo " AR $(@F)"
+ @$(AR) $(AR_FLAGS) rcs $@ $(CXX_OBJ)
+
+clean:
+ @rm -f $(CXX_OBJ) $(CXX_TEST_OBJ) $(OBJ_DIR)/libd.a
diff --git a/libk/makefile b/libk/makefile
index b2a91c1..9063f72 100644
--- a/libk/makefile
+++ b/libk/makefile
@@ -1,5 +1,38 @@
-CXX_OBJ += libk/string/string.o libk/string/integerview.o \
- libk/stdlib/abort.o libk/stdlib/console.o libk/stdlib/memory.o
+CXX_OBJ = string/string.o string/integerview.o \
+ stdlib/abort.o stdlib/console.o stdlib/memory.o
+CXX_OBJ := $(addprefix $(OBJ_DIR)/, $(CXX_OBJ))
+CXX_DEP = $(CXX_OBJ:%.o=%.d)
+CXX_JSON = $(CXX_OBJ:.o=.json)
-CXX_TEST_OBJ += libk/test/types.o libk/test/string.o libk/test/result.o libk/test/quicksort.o
+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_DEP = $(TEST_CXX_OBJ:%.o=%.d)
+.PHONY: all test clean
+all: $(OBJ_DIR)/libk.a
+test: $(TEST_CXX_OBJ)
+
+-include $(CXX_DEP)
+$(CXX_OBJ) : $(OBJ_DIR)/%.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)
+ @echo " AR $(@F)"
+ @$(AR) $(AR_FLAGS) rcs $@ $(CXX_OBJ)
+
+# constexpr tests
+-include $(TEST_CXX_DEP)
+$(TEST_CXX_OBJ): $(OBJ_DIR)/%.o : %.cc
+ @mkdir -p $(@D)
+ @echo " TEST $<"
+ @$(TEST_CXX) -target $(TARGET) $(TEST_CXX_FLAGS) $(CXX_INCLUDE) -MMD -c $< -o $@
+
+compile_commands.json: $(CXX_JSON)
+ @echo [ > $@
+ @cat $(CXX_JSON) >> $@
+ @echo ] >> $@
+
+clean:
+ @rm -f $(CXX_OBJ) $(CXX_TEST_OBJ) $(OBJ_DIR)/libk.a
diff --git a/makefile b/makefile
index 58bce7f..742db3d 100644
--- a/makefile
+++ b/makefile
@@ -2,64 +2,43 @@ include .config
OBJ_DIR != echo $(CONFIG_OBJ_DIR)
include toolchain.makefile
-.PHONY: default clean test tidy todo run menuconfig
-all: $(OBJ_DIR)/glitch.elf
+.PHONY: all clean test tidy todo run menuconfig
+all: $(OBJ_DIR)/src/glitch.elf
-include libk/makefile
-include src/makefile
-include drivers/makefile
+LIBS := $(OBJ_DIR)/libk.a $(OBJ_DIR)/libd.a
+LD_FLAGS := $(LD_FLAGS) --library-path $(CURDIR)/$(OBJ_DIR)
-AS_OBJ := $(addprefix $(OBJ_DIR)/, $(AS_OBJ))
-CXX_SRC := $(CXX_OBJ:%.o=%.cc)
-CXX_OBJ := $(addprefix $(OBJ_DIR)/, $(CXX_OBJ))
-CXX_DEP = $(CXX_OBJ:%.o=%.d)
-CXX_JSON = $(CXX_OBJ:.o=.json)
-CXX_TEST_OBJ := $(addprefix $(OBJ_DIR)/, $(CXX_TEST_OBJ))
-CXX_INCLUDE := $(addprefix -I, $(CXX_INCLUDE))
-SYSTEM_INCLUDE := $(addprefix -isystem, $(SYSTEM_INCLUDE))
+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: $(LIBS)
+ @make -C src OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/src $(CURDIR)/$(OBJ_DIR)/src/glitch.elf
+$(OBJ_DIR)/libk.a:
+ @make -C libk OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/libk $(CURDIR)/$(OBJ_DIR)/libk.a
+$(OBJ_DIR)/libd.a:
+ @make -C drivers OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/drivers $(CURDIR)/$(OBJ_DIR)/libd.a
-$(OBJ_DIR)/glitch.elf: $(autogen) $(AS_OBJ) $(CXX_OBJ) linker.ld
- @echo " LD $@"
- @$(LD) $(LD_FLAGS) -o $@ $(AS_OBJ) $(CXX_OBJ)
-
-$(AS_OBJ): $(OBJ_DIR)/%.o: %.S
- @mkdir -p $(@D)
- @echo " AS $<"
- @$(AS) -target $(TARGET) $(AS_FLAGS) $(SYSTEM_INCLUDE) -c $^ -o $@
-
--include $(CXX_DEP)
-$(OBJ_DIR)/%.o $(OBJ_DIR)%.json : %.cc
- @mkdir -p $(@D)
- @echo " CXX $<"
- @$(CXX) -target $(TARGET) $(CXX_FLAGS) $(CXX_INCLUDE) $(SYSTEM_INCLUDE) -MMD -MJ$(subst .o,.json,$@) -c $< -o $@
-
-$(CXX_TEST_OBJ): $(OBJ_DIR)/%.o : %.cc
- @mkdir -p $(@D)
- @echo " TEST $<"
- @$(TEST_CXX) -target $(TARGET) $(CXX_TEST_FLAGS) $(CXX_INCLUDE) -MMD -c $< -o $@
-
-compile_commands.json: $(CXX_JSON)
- @echo [ > $@
- @cat $(CXX_JSON) >> $@
- @echo ] >> $@
+compile_commands:
+ @make -C libk OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/libk compile_commands.json
clean:
- @rm -rf $(autogen) $(AS_OBJ) $(CXX_OBJ) $(CXX_DEP) $(CXX_TEST_OBJ) $(OBJ_DIR)/glitch.elf $(OBJ_DIR)/isodir
- @rm -f $(CXX_JSON) compile_commands.json
+ @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
@make -C tools/kconfig OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/kconfig clean
-tidy: compile_commands.json
- $(foreach x, $(CXX_SRC), $(shell clang-tidy $x))
-
# testing
-test: $(CXX_TEST_OBJ)
+test:
+ @make -C libk OBJ_DIR=$(CURDIR)/$(OBJ_DIR)/libk test
todo:
@grep TODO -r libk/ src/ drivers/
# disk image
-$(OBJ_DIR)/glitch.iso: $(OBJ_DIR)/glitch.elf grub/grub.cfg
+$(OBJ_DIR)/glitch.iso: $(OBJ_DIR)/src/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/linker.ld b/src/linker.ld
index 8eba287..8eba287 100644
--- a/linker.ld
+++ b/src/linker.ld
diff --git a/src/makefile b/src/makefile
index 6e8545d..96507ce 100644
--- a/src/makefile
+++ b/src/makefile
@@ -1,18 +1,21 @@
-AS_OBJ += src/boot.o \
- src/idt/stubs.o
-
-CXX_OBJ += src/kernel.o \
- src/kernel/dump_gdt.o src/kernel/dump_multiboot.o src/kernel/multiboot.o \
- src/cpu/cpu.o \
- src/gdt.o \
- src/gdt/segmentdescriptor.o \
- src/idt.o \
- src/idt/exception.o src/idt/interruptgate.o src/idt/interrupthandler.o \
- src/vmm.o \
- src/allocator.o \
- src/scheduler.o src/scheduler/task.o
-
-src/cpu/irq.h: $(OBJ_DIR)/src/idt/stubs.o
+AS_OBJ = boot.o idt/stubs.o
+AS_OBJ := $(addprefix $(OBJ_DIR)/, $(AS_OBJ))
+
+CXX_OBJ = kernel.o \
+ kernel/dump_gdt.o kernel/dump_multiboot.o kernel/multiboot.o \
+ cpu/cpu.o \
+ gdt.o \
+ gdt/segmentdescriptor.o \
+ idt.o \
+ idt/exception.o idt/interruptgate.o idt/interrupthandler.o \
+ vmm.o \
+ allocator.o \
+ scheduler.o scheduler/task.o
+CXX_OBJ := $(addprefix $(OBJ_DIR)/, $(CXX_OBJ))
+CXX_DEP = $(CXX_OBJ:%.o=%.d)
+CXX_JSON = $(CXX_OBJ:.o=.json)
+
+cpu/irq.h: $(OBJ_DIR)/idt/stubs.o
@echo " GEN $@"
@echo '#pragma once' > $@
@echo 'extern "C" {' >> $@
@@ -20,4 +23,38 @@ src/cpu/irq.h: $(OBJ_DIR)/src/idt/stubs.o
@for x in $^; do $(NM) $$x -g | $(SED) -nr 's/[0-9a-f]{8} T (.+)/void \1();/p'; done >> $@
@echo '}' >> $@
-autogen := $(autogen) src/cpu/irq.h
+autogen := $(autogen) cpu/irq.h
+
+.PHONY: all test clean
+all: $(OBJ_DIR)/kernel.a
+test: $(TEST_CXX_OBJ)
+
+$(AS_OBJ): $(OBJ_DIR)/%.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
+ @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 $@"
+ @$(LD) $(LD_FLAGS) -o $@ $(AS_OBJ) $(CXX_OBJ) -lk -ld
+
+# constexpr tests
+-include $(TEST_CXX_DEP)
+$(TEST_CXX_OBJ): $(OBJ_DIR)/%.o : %.cc
+ @mkdir -p $(@D)
+ @echo " TEST $<"
+ @$(TEST_CXX) -target $(TARGET) $(TEST_CXX_FLAGS) $(CXX_INCLUDE) -MMD -c $< -o $@
+
+compile_commands.json: $(CXX_JSON)
+ @echo [ > $@
+ @cat $(CXX_JSON) >> $@
+ @echo ] >> $@
+
+clean:
+ @rm -f $(AS_OBJ) $(CXX_OBJ) $(CXX_TEST_OBJ) $(OBJ_DIR)/glitch.elf
diff --git a/toolchain.makefile b/toolchain.makefile
index dc6194e..9500449 100644
--- a/toolchain.makefile
+++ b/toolchain.makefile
@@ -7,12 +7,14 @@ SED := sed
AS := clang
AS_FLAGS := -nostdlib -Wall -Wextra
+AR := llvm-ar
+AR_FLAGS := --format=gnu
+
LD := ld.lld
LD_FLAGS := -nostdlib -T linker.ld
-CXX := clang++
-TEST_CXX := clang++
-CXX_FLAGS := -std=c++20 -g -O3 -flto=full \
+CXX := clang++
+CXX_FLAGS := -std=c++20 -g -O3 -flto=full \
-static -ffreestanding -fno-common -nostdinc -nostdinc++ \
-fno-use-cxa-atexit -fno-rtti -fno-exceptions -fno-non-call-exceptions \
-Wall -Wextra -Werror=pedantic \
@@ -20,10 +22,13 @@ CXX_FLAGS := -std=c++20 -g -O3 -flto=full \
-Werror=shadow-all \
-Wold-style-cast -Wconversion \
-Wconsumed
-CXX_TEST_FLAGS := -std=c++20 -Wall -Wextra -Werror=pedantic
+TEST_CXX := clang++
+TEST_CXX_FLAGS := -std=c++20 -Wall -Wextra -Werror=pedantic
CXX_INCLUDE := $(CURDIR)/libk $(CURDIR)/src $(CURDIR)/drivers
-
+CXX_INCLUDE := $(addprefix -I, $(CXX_INCLUDE))
SYSTEM_INCLUDE := $(CURDIR)/grub
+SYSTEM_INCLUDE := $(addprefix -isystem, $(SYSTEM_INCLUDE))
+CXX_INCLUDE := $(CXX_INCLUDE) $(SYSTEM_INCLUDE)
#
GRUB_MKRESCUE := grub-mkrescue