diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-03-25 22:37:33 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-03-25 22:37:33 +0200 |
commit | bf69f336c3fb680e31a5bb43450739b0b06d95e1 (patch) | |
tree | 2e14ca86442c5aafa40c3a436c0596327faaee85 | |
parent | makefile: add clang-tidy target (diff) | |
download | kernel.cpp-bf69f336c3fb680e31a5bb43450739b0b06d95e1.tar.xz |
makefile: make makefile recursive
-rw-r--r-- | drivers/makefile | 20 | ||||
-rw-r--r-- | libk/makefile | 39 | ||||
-rw-r--r-- | makefile | 67 | ||||
-rw-r--r-- | src/linker.ld (renamed from linker.ld) | 0 | ||||
-rw-r--r-- | src/makefile | 69 | ||||
-rw-r--r-- | toolchain.makefile | 15 |
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 @@ -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 |