From 6eefbd0e736c3334e9b1b8141feb0430a5f247c1 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Tue, 30 Mar 2021 22:49:06 +0300 Subject: Makefile: build targets properly from subdirs --- .config | 5 +++++ Kconfig | 3 +++ arch/i686/toolchain.mk | 42 ++++++++++++++++++++++++++++++++++++++++++ common.mk | 15 +++++++++++++++ drivers/makefile | 11 ++++++++--- libk/makefile | 10 ++++++---- makefile | 37 ++++++++++++++++--------------------- src/makefile | 24 +++++++++++++----------- toolchain.makefile | 39 --------------------------------------- 9 files changed, 108 insertions(+), 78 deletions(-) create mode 100644 arch/i686/toolchain.mk create mode 100644 common.mk delete mode 100644 toolchain.makefile 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/arch/i686/toolchain.mk b/arch/i686/toolchain.mk new file mode 100644 index 0000000..c6349e8 --- /dev/null +++ b/arch/i686/toolchain.mk @@ -0,0 +1,42 @@ +# x86 toolchain +# - 32-bit X86: Pentium-Pro and above +# +# To check targets supported by llvm, see 'llc --version' +TARGET := i686-elf + +NM := llvm-nm +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++ +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 \ + -Werror=date-time \ + -Werror=shadow-all \ + -Wold-style-cast -Wconversion \ + -Wconsumed +TEST_CXX := clang++ +TEST_CXX_FLAGS := -std=c++20 -Wall -Wextra -Werror=pedantic +CXX_INCLUDE := $(prefix)/libk $(prefix)/src $(prefix)/drivers +CXX_INCLUDE := $(addprefix -I, $(CXX_INCLUDE)) +SYSTEM_INCLUDE := $(prefix)/grub +SYSTEM_INCLUDE := $(addprefix -isystem, $(SYSTEM_INCLUDE)) +CXX_INCLUDE := $(CXX_INCLUDE) $(SYSTEM_INCLUDE) + +# +GRUB_MKRESCUE := grub-mkrescue +GRUB_FILE := grub-file +GRUB_SCRIPT := grub-script-check + +EMU := qemu-system-i386 -cdrom + 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 $@ diff --git a/toolchain.makefile b/toolchain.makefile deleted file mode 100644 index 9500449..0000000 --- a/toolchain.makefile +++ /dev/null @@ -1,39 +0,0 @@ -# Toolchain -TARGET := i686-elf - -NM := llvm-nm -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++ -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 \ - -Werror=date-time \ - -Werror=shadow-all \ - -Wold-style-cast -Wconversion \ - -Wconsumed -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 -GRUB_FILE := grub-file -GRUB_SCRIPT := grub-script-check - -EMU := qemu-system-i386 -cdrom - -- cgit v1.2.1