From: Amelia Coutard <eliottulio.coutard@gmail.com>
Date: Thu, 13 Oct 2022 23:17:24 +0000 (+0200)
Subject: Restructured build system, to allow for easier adding of separate programs later
X-Git-Url: https://git.ameliathe1st.gay/?a=commitdiff_plain;h=b7737793e390aef44bc7fd1d91e2c71559bfc239;p=voyage-au-centre-des-fichiers.git

Restructured build system, to allow for easier adding of separate programs later
---

diff --git a/.gitignore b/.gitignore
index a701a8f..60ebeb1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
 out
-deps
+dep
 isodir
-doxygen
+amycros.iso
diff --git a/Makefile b/Makefile
index 63b12d6..5b2df7f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,50 +1,33 @@
+# Written in 2022 by Amélia COUTARD <eliottulio.coutard@gmail.com>
+# To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this file to the public domain worldwide. This file is distributed without any warranty.
+# You should have received a copy of the CC0 Public Domain Dedication along with this file. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
+
+# So, about the license. I don't think I have a copyright on this file's code, but,
+# since I gave it the CC0 license in case I do, that doesn't matter either way.
+
 .PHONY: build qemu clean
 
-OUT_DIR ?= out/
-SRC_DIR ?= src/
-DEPS_DIR ?= deps/
+build: # Build as default target
 
 CXX := x86_64-elf-g++
 CXXFLAGS ?= -O2
 CXXFLAGS := $(CXXFLAGS) -Wall -Wextra -Werror -std=c++20 \
-	-ffreestanding -mcmodel=kernel -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -fno-exceptions -fno-rtti \
-	-isystem /usr/include -isystem /usr/include/c++/12.2.0 -isystem /usr/include/c++/12.2.0/x86_64-pc-linux-gnu
-
+            -mno-mmx -mno-sse -mno-sse2 -fno-exceptions -fno-rtti -ffreestanding
 LDFLAGS ?= -O2
-LDFLAGS := $(LDFLAGS) -Wall -Wextra -Werror -std=c++20 \
-	-ffreestanding -T linker.ld -z max-page-size=0x1000 \
-	-mno-red-zone -mcmodel=kernel # Normally has no effect, but is used to change the multilib libgcc, to use mcmodel=kernel and be able to use global constructors and destructors.
-LDLIBS := $(LDLIBS) -nostdlib -lgcc
-
-CPPOBJS := $(patsubst $(SRC_DIR)%,$(OUT_DIR)%.o,$(shell find $(SRC_DIR) -name '*.cpp'))
-ASMOBJS := $(patsubst $(SRC_DIR)%,$(OUT_DIR)%.o,$(shell find $(SRC_DIR) -name '*.S' -and -not -name 'crti.S' -and -not -name 'crtn.S'))
-OBJECTS := $(CPPOBJS) $(ASMOBJS)
-CRTI_OBJ := $(OUT_DIR)crti.S.o
-CRTBEGIN_OBJ := $(shell $(CXX) $(LDFLAGS) -print-file-name=crtbegin.o)
-CRTEND_OBJ := $(shell $(CXX) $(LDFLAGS) -print-file-name=crtend.o)
-CRTN_OBJ := $(OUT_DIR)crtn.S.o
-
-build: $(OUT_DIR)amycros.iso
-qemu: build
-	qemu-system-x86_64 -cdrom $(OUT_DIR)amycros.iso -serial stdio -cpu qemu64,pdpe1gb -no-reboot $(QEMUFLAGS)
+LDFLAGS := $(LDFLAGS) -Wall -Wextra -Werror -std=c++20 -ffreestanding
 
-$(OUT_DIR)amycros.iso: $(OUT_DIR)kernel.elf64 grub.cfg
-	mkdir -p isodir/boot/grub
-	cp $(OUT_DIR)kernel.elf64 isodir/boot
-	cp grub.cfg isodir/boot/grub
-	grub-mkrescue -o "$@" isodir
+TO_ISO :=
+TO_CLEAN :=
 
-clean:
-	-rm -rf $(DEPS_DIR) $(OUT_DIR) isodir
+include */module.mk
 
+build: amycros.iso
+qemu: build
+	qemu-system-x86_64 -cdrom amycros.iso -serial stdio -cpu qemu64,pdpe1gb -no-reboot $(QEMUFLAGS)
+clean:
+	-rm -rf $(TO_CLEAN) isodir amycros.iso
 
-$(OUT_DIR)kernel.elf64: $(OBJECTS) $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(CRTEND_OBJ) $(CRTN_OBJ) linker.ld
-	mkdir -p $(OUT_DIR)
-	$(CXX) $(LDFLAGS) -o "$@" $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(OBJECTS) $(CRTEND_OBJ) $(CRTN_OBJ) $(LDLIBS)
-
-$(OUT_DIR)%.o: $(SRC_DIR)%
-	mkdir -p $(@D)
-	mkdir -p $(dir $(DEPS_DIR)$*)
-	$(CXX) $(CXXFLAGS) -c "$<" -MMD -MT "$@" -MF "$(DEPS_DIR)$*.d" -o "$@"
-
--include deps/*.d
+amycros.iso: $(TO_ISO) grub.cfg
+	mkdir -p isodir/boot/grub
+	install -m 644 grub.cfg isodir/boot/grub/grub.cfg
+	grub-mkrescue -o "$@" isodir
diff --git a/linker.ld b/kernel/linker.ld
similarity index 100%
rename from linker.ld
rename to kernel/linker.ld
diff --git a/kernel/module.mk b/kernel/module.mk
new file mode 100644
index 0000000..eefe87c
--- /dev/null
+++ b/kernel/module.mk
@@ -0,0 +1,55 @@
+# Written in 2022 by Amélia COUTARD <eliottulio.coutard@gmail.com>
+# To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this file to the public domain worldwide. This file is distributed without any warranty.
+# You should have received a copy of the CC0 Public Domain Dedication along with this file. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
+
+# So, about the license. I don't think I have a copyright on this file's code, but,
+# since I gave it the CC0 license in case I do, that doesn't matter either way.
+
+SRC_DIR := kernel/src/
+OUT_DIR := kernel/out/
+DEP_DIR := kernel/dep/
+EXEC_NAME := kernel.elf64
+
+TO_ISO   += isodir/boot/$(EXEC_NAME)
+TO_CLEAN += $(OUT_DIR) $(DEP_DIR)
+
+OLD_CXXFLAGS := $(CXXFLAGS)
+OLD_LDFLAGS := $(LDFLAGS)
+CXXFLAGS := $(OLD_CXXFLAGS) -mcmodel=kernel -mno-red-zone \
+	-isystem /usr/include -isystem /usr/include/c++/12.2.0 \
+	-isystem /usr/include/c++/12.2.0/x86_64-pc-linux-gnu
+	# The previous two lines are a dirty hack.
+LDFLAGS := $(OLD_LDFLAGS) -T kernel/linker.ld -z max-page-size=0x1000 \
+	   -mno-red-zone -mcmodel=kernel
+
+CPPOBJS      := $(patsubst $(SRC_DIR)%,$(OUT_DIR)%.o,$(shell find $(SRC_DIR) -name '*.cpp'))
+ASMOBJS      := $(patsubst $(SRC_DIR)%,$(OUT_DIR)%.o,$(shell find $(SRC_DIR) -name '*.S' | grep -v crt))
+CRTI_OBJ     := $(OUT_DIR)crti.S.o
+CRTBEGIN_OBJ := $(shell $(CXX) $(LDFLAGS) -print-file-name=crtbegin.o)
+CRTEND_OBJ   := $(shell $(CXX) $(LDFLAGS) -print-file-name=crtend.o)
+CRTN_OBJ     := $(OUT_DIR)crtn.S.o
+OBJS := $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(CPPOBJS) $(ASMOBJS) $(CRTEND_OBJ) $(CRTN_OBJ)
+
+isodir/boot/$(EXEC_NAME): $(OUT_DIR)$(EXEC_NAME)
+	mkdir -p "$(@D)"
+	install -m 644 "$<" "$@"
+
+$(OUT_DIR)$(EXEC_NAME): OBJS := $(OBJS)
+$(OUT_DIR)$(EXEC_NAME): LDLIBS := -nostdlib -lgcc
+$(OUT_DIR)$(EXEC_NAME): LDFLAGS := $(LDFLAGS)
+$(OUT_DIR)$(EXEC_NAME): $(OBJS) kernel/linker.ld
+	mkdir -p "$(@D)"
+	$(CXX) $(LDFLAGS) -o "$@" $(OBJS) $(LDLIBS)
+
+
+$(OUT_DIR)%.o: DEP_DIR := $(DEP_DIR)
+$(OUT_DIR)%.o: CXXFLAGS := $(CXXFLAGS)
+$(OUT_DIR)%.o: $(SRC_DIR)%
+	mkdir -p $(@D)
+	mkdir -p $(dir $(DEP_DIR)$*)
+	$(CXX) $(CXXFLAGS) -c "$<" -MMD -MT "$@" -MF "$(DEP_DIR)$*.d" -o "$@"
+
+-include $(DEPS_DIR)*.d
+
+CXXFLAGS := $(OLD_CXXFLAGS)
+LDFLAGS := $(OLD_LDFLAGS)
diff --git a/src/boot.S b/kernel/src/boot.S
similarity index 100%
rename from src/boot.S
rename to kernel/src/boot.S
diff --git a/src/crti.S b/kernel/src/crti.S
similarity index 100%
rename from src/crti.S
rename to kernel/src/crti.S
diff --git a/src/crtn.S b/kernel/src/crtn.S
similarity index 100%
rename from src/crtn.S
rename to kernel/src/crtn.S
diff --git a/src/interrupts.S b/kernel/src/interrupts.S
similarity index 100%
rename from src/interrupts.S
rename to kernel/src/interrupts.S
diff --git a/src/interrupts.cpp b/kernel/src/interrupts.cpp
similarity index 100%
rename from src/interrupts.cpp
rename to kernel/src/interrupts.cpp
diff --git a/src/interrupts.hpp b/kernel/src/interrupts.hpp
similarity index 100%
rename from src/interrupts.hpp
rename to kernel/src/interrupts.hpp
diff --git a/src/kernel.cpp b/kernel/src/kernel.cpp
similarity index 100%
rename from src/kernel.cpp
rename to kernel/src/kernel.cpp
diff --git a/src/multiboot2.hpp b/kernel/src/multiboot2.hpp
similarity index 100%
rename from src/multiboot2.hpp
rename to kernel/src/multiboot2.hpp
diff --git a/src/paging.cpp b/kernel/src/paging.cpp
similarity index 100%
rename from src/paging.cpp
rename to kernel/src/paging.cpp
diff --git a/src/paging.hpp b/kernel/src/paging.hpp
similarity index 100%
rename from src/paging.hpp
rename to kernel/src/paging.hpp
diff --git a/src/phys_ptr.hpp b/kernel/src/phys_ptr.hpp
similarity index 100%
rename from src/phys_ptr.hpp
rename to kernel/src/phys_ptr.hpp
diff --git a/src/ring3.S b/kernel/src/ring3.S
similarity index 100%
rename from src/ring3.S
rename to kernel/src/ring3.S
diff --git a/src/ring3.cpp b/kernel/src/ring3.cpp
similarity index 100%
rename from src/ring3.cpp
rename to kernel/src/ring3.cpp
diff --git a/src/ring3.hpp b/kernel/src/ring3.hpp
similarity index 100%
rename from src/ring3.hpp
rename to kernel/src/ring3.hpp
diff --git a/src/serial.cpp b/kernel/src/serial.cpp
similarity index 100%
rename from src/serial.cpp
rename to kernel/src/serial.cpp
diff --git a/src/serial.hpp b/kernel/src/serial.hpp
similarity index 100%
rename from src/serial.hpp
rename to kernel/src/serial.hpp
diff --git a/src/utils.cpp b/kernel/src/utils.cpp
similarity index 100%
rename from src/utils.cpp
rename to kernel/src/utils.cpp
diff --git a/src/utils.hpp b/kernel/src/utils.hpp
similarity index 100%
rename from src/utils.hpp
rename to kernel/src/utils.hpp