aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraqua <aqua@iserlohn-fortress.net>2023-02-05 10:16:20 +0200
committeraqua <aqua@iserlohn-fortress.net>2023-02-05 10:16:20 +0200
commita5de90c48a1800c865285945aadd019fa07c7ad8 (patch)
treea2e476f4950aa142019617779f8e0bce4a01305c
parentblake2: use makefiles instead of meson.build (diff)
downloadkernel-a5de90c48a1800c865285945aadd019fa07c7ad8.tar.xz
Split Makefile
- Makefile: configure, doc and test targets - Makefile.all: info, build and run targets - rules.mk: add base test targets
-rw-r--r--Makefile115
-rw-r--r--Makefile.all59
-rw-r--r--Makefile.config35
-rw-r--r--i686/toolchain.mk30
-rw-r--r--rules.mk37
5 files changed, 180 insertions, 96 deletions
diff --git a/Makefile b/Makefile
index fa37164..0e0474f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,81 +1,66 @@
-MAKE = make
-MAKEFLAGS += --no-print-directory
-SRC_ROOT := $(shell pwd)
+# =====================================================================
+# spdx-license-identifier: ISC
+# glitch top-level makefile
+# =====================================================================
-include Makefile.config
+MAKE := make
+MAKEID := $(shell ${MAKE} --version | head -n1)
+MAKEFLAGS += -rR --no-print-directory
-.PHONY: all doc run clean test FORCE
-all: glitch.elf
+ARCH := $(shell sed -nE "s/CONFIG_ARCH_(.+)=y/\1/p" .config)
+
+.PHONY: all help info run doc clean test valgrind
+all: Makefile.config
+ @${MAKE} -f Makefile.all
+
+help:
+ @echo "info: show current configuration"
+ @echo "all: build kernel image"
+ @echo "run: run kernel image in qemu"
+ @echo "test: run all tests"
+ @echo "valgrind: run all tests in valgrind"
+
+info: Makefile.config
+ @echo "- make:"
+ @echo " MAKE: ${MAKE}"
+ @echo " MAKEID: ${MAKEID}"
+ @echo " MAKEFLAGS: ${MAKEFLAGS}"
+ @${MAKE} -f Makefile.all $@
+
+run: Makefile.config
+ @${MAKE} -f Makefile.all $@
doc: FORCE
doxygen doxygen.config
-run: glitch.iso
- @qemu-system-i386 -cdrom glitch.iso -accel kvm -d cpu_reset -display gtk,zoom-to-fit=on
-
clean:
- @${MAKE} ARCH=${ARCH} -C lib clean
- @${MAKE} ARCH=${ARCH} -C ${ARCH} clean
- @${MAKE} ARCH=${ARCH} -C devices clean
- @${MAKE} ARCH=${ARCH} -C src clean
-
-info:
- @echo "* Build information *"
- @echo " ARCH ${ARCH}"
- @echo " MAKE $(shell ${MAKE} --version | head -n1)"
- @echo " CC $(shell ${CC} --version | head -n1)"
- @echo " ${CFLAGS}"
- @echo " CXX $(shell ${CXX} --version | head -n1)"
- @echo " ${CXXFLAGS}"
- @echo " LD $(shell ${LD} --version | head -n1)"
- @echo " ${LDFLAGS}"
+ @${MAKE} -C lib clean
+ @${MAKE} -C ${ARCH} clean
+ @${MAKE} -C devices clean
+ @${MAKE} -C src clean
test:
- @echo Looking for inline assembly
- @grep -rn 'asm' devices lib src
- @echo Running tests
- @make -C lib test
- @make -C src test
+ @echo " -> Looking for inline assembly in src/ and lib/"
+ @grep -rn 'asm' devices src lib
+ @echo " -> Running tests in src"
+ @make -C src test > /dev/null
+ @echo " -> Running tests in lib"
+ @make -C lib test > /dev/null
valgrind:
- @make -C lib valgrind
- @make -C src valgrind
-
-FORCE:
+ @echo " -> Running valgrind on tests in lib"
+ @make -C lib valgrind &> /dev/null
+ @echo " -> Running valgrind on tests in src"
+ @make -C src valgrind &> /dev/null
+# configure targets
.config: Kconfig
@alldefconfig
-Makefile.config: .config
- @cp .config Makefile.config
- @echo -e '\n# toolchain.mk' >> Makefile.config
- @cat $$(sed -nE "s/CONFIG_ARCH_(.+)=y/\1/p" .config)/toolchain.mk >> Makefile.config
-
-lib/libk.a: FORCE
- @${MAKE} -C lib libk.a
-i686/arch.a: FORCE
- @${MAKE} -C ${ARCH} arch.a
-devices/devs.a: FORCE
- @${MAKE} -C devices devs.a
-src/kernel.a: FORCE
- @${MAKE} -C src kernel.a
-
-glitch.elf: ${ARCH}/arch.a src/kernel.a devices/devs.a lib/libk.a
- @echo ' LD $@'
- @${LD} ${LDFLAGS} -T ${ARCH}/linker.ld -o $@ $^
- @echo -n ' B2b '
- @b2sum $@ | cut -d ' ' -f1
-
-glitch.iso: glitch.elf grub/grub.cfg
- @grub-file --is-x86-multiboot2 glitch.elf
- @mkdir -p isodir/boot/grub
- @mkdir -p isodir/boot/glitch
- @grub-script-check grub/grub.cfg
- @cp grub/grub.cfg isodir/boot/grub/grub.cfg
- @cp glitch.elf isodir/boot/glitch/glitch.elf
- @${STRIP} isodir/boot/glitch/glitch.elf
- @rm -f isodir/boot/glitch/checksums
- @sha512sum isodir/boot/glitch/* > isodir/boot/glitch/checksums
- @sed -i s/isodir// isodir/boot/glitch/checksums
- @grub-mkrescue -o glitch.iso isodir
+Makefile.config: .config ${ARCH}/toolchain.mk
+ @echo -e '## This is a generated file, manual edits might be lost' > Makefile.config
+ @echo -e '\n## .config' >> Makefile.config
+ @cat .config >> Makefile.config
+ @echo -e '\n## toolchain.mk' >> Makefile.config
+ @cat ${ARCH}/toolchain.mk >> Makefile.config
diff --git a/Makefile.all b/Makefile.all
new file mode 100644
index 0000000..efd7386
--- /dev/null
+++ b/Makefile.all
@@ -0,0 +1,59 @@
+# =====================================================================
+# spdx-license-identifier: ISC
+# glitch kernel binary and image generation
+# =====================================================================
+
+include Makefile.config
+
+LDFLAGS += -T ${ARCH}/linker.ld
+
+all: glitch.elf
+ @echo "built $^"
+
+.PHONY: run info
+run: glitch.iso
+ @${QEMU} -cdrom $^ -d cpu_reset -display gtk,zoom-to-fit=on
+
+info:
+ @echo "- target:"
+ @echo " ARCH: ${ARCH}"
+ @echo " CC: ${CC}"
+ @echo " CCID: ${CCID}"
+ @echo " CFLAGS: ${CFLAGS}"
+ @echo " CXX: ${CXX}"
+ @echo " CXXID: ${CXXID}"
+ @echo " CXXFLAGS: ${CXXFLAGS}"
+ @echo " LD: ${LD}"
+ @echo " LDID: ${LDID}"
+ @echo " LDFLAGS: ${LDFLAGS}"
+ @echo "- test:"
+ @echo " CXX: ${TEST_CXX}"
+ @echo " CXXFLAGS: ${TEST_CXXFLAGS}"
+ @echo " QEMU: ${QEMU}"
+
+# build targets
+glitch.elf: ${ARCH}/arch.a src/kernel.a devices/devs.a lib/libk.a
+
+glitch.iso: glitch.elf grub/grub.cfg
+ @grub-file --is-x86-multiboot2 glitch.elf
+ @mkdir -p isodir/boot/grub
+ @mkdir -p isodir/boot/glitch
+ @grub-script-check grub/grub.cfg
+ @cp grub/grub.cfg isodir/boot/grub/grub.cfg
+ @cp glitch.elf isodir/boot/glitch/glitch.elf
+ @i686-elf-strip isodir/boot/glitch/glitch.elf
+ @rm -f isodir/boot/glitch/checksums
+ @sha512sum isodir/boot/glitch/* > isodir/boot/glitch/checksums
+ @sed -i s/isodir// isodir/boot/glitch/checksums
+ @grub-mkrescue -o glitch.iso isodir
+
+lib/libk.a: FORCE
+ @${MAKE} -C lib libk.a
+i686/arch.a: FORCE
+ @${MAKE} -C ${ARCH} arch.a
+devices/devs.a: FORCE
+ @${MAKE} -C devices devs.a
+src/kernel.a: FORCE
+ @${MAKE} -C src kernel.a
+
+include rules.mk
diff --git a/Makefile.config b/Makefile.config
index 42aa510..bbff402 100644
--- a/Makefile.config
+++ b/Makefile.config
@@ -1,3 +1,6 @@
+## This is a generated file, manual edits might be lost
+
+## .config
#
# Toolchain
@@ -22,24 +25,40 @@ CONFIG_VGA_TEXT_MODE=y
CONFIG_KB_PS2=y
# end of Devices
-# toolchain.mk
+## toolchain.mk
ARCH=i686
# define compiler, linker, archiver and strip and their flags
# FIXME: cpp threadsafe statics
AS := i686-elf-as
+
CC := i686-elf-gcc
-CXX := i686-elf-g++
+CCID := $(shell ${CC} --version | head -n1)
CFLAGS := -Wall -Wextra -Wpedantic -Wshadow -Wconversion -fanalyzer -ffreestanding -std=gnu11 \
- -mgeneral-regs-only
-CFLAGS += $(shell echo ${CONFIG_CFLAGS})
+ -mgeneral-regs-only \
+ $(shell echo ${CONFIG_CFLAGS})
+
+CXX := i686-elf-g++
+CXXID := $(shell ${CXX} --version | head -n1)
CXXFLAGS := -Wall -Wextra -Wpedantic -Wshadow -Wconversion -ffreestanding -std=c++17 \
- -mgeneral-regs-only -fno-use-cxa-atexit -fno-threadsafe-statics -fno-exceptions -fno-rtti
-CXXFLAGS += $(shell echo ${CONFIG_CXXFLAGS})
+ -mgeneral-regs-only -fno-use-cxa-atexit -fno-threadsafe-statics -fno-exceptions -fno-rtti \
+ $(shell echo ${CONFIG_CXXFLAGS})
+
LD := i686-elf-ld
-LDFLAGS := -static -nostdlib
-LDFLAGS += $(shell echo ${CONFIG_LDFLAGS})
+LDID := $(shell ${LD} --version | head -n1)
+LDFLAGS := -static -nostdlib \
+ $(shell echo ${CONFIG_LDFLAGS})
+
AR := i686-elf-ar
ARFLAGS := -crus
+
STRIP := i686-elf-strip
+# define compiler and flags for test targets
+TEST_CXX := g++
+TEST_CXXFLAGS := -Wall -Wextra -Wpedantic -Werror=shadow -Werror=conversion -g -Og \
+ $(shell pkg-config --cflags --libs gtest gtest_main gmock)
+
+# emulator name and flags
+QEMU := qemu-system-i386 -accel kvm -machine pc
+
diff --git a/i686/toolchain.mk b/i686/toolchain.mk
index ae2fb35..e97443f 100644
--- a/i686/toolchain.mk
+++ b/i686/toolchain.mk
@@ -3,18 +3,34 @@ ARCH=i686
# define compiler, linker, archiver and strip and their flags
# FIXME: cpp threadsafe statics
AS := i686-elf-as
+
CC := i686-elf-gcc
-CXX := i686-elf-g++
+CCID := $(shell ${CC} --version | head -n1)
CFLAGS := -Wall -Wextra -Wpedantic -Wshadow -Wconversion -fanalyzer -ffreestanding -std=gnu11 \
- -mgeneral-regs-only
-CFLAGS += $(shell echo ${CONFIG_CFLAGS})
+ -mgeneral-regs-only \
+ $(shell echo ${CONFIG_CFLAGS})
+
+CXX := i686-elf-g++
+CXXID := $(shell ${CXX} --version | head -n1)
CXXFLAGS := -Wall -Wextra -Wpedantic -Wshadow -Wconversion -ffreestanding -std=c++17 \
- -mgeneral-regs-only -fno-use-cxa-atexit -fno-threadsafe-statics -fno-exceptions -fno-rtti
-CXXFLAGS += $(shell echo ${CONFIG_CXXFLAGS})
+ -mgeneral-regs-only -fno-use-cxa-atexit -fno-threadsafe-statics -fno-exceptions -fno-rtti \
+ $(shell echo ${CONFIG_CXXFLAGS})
+
LD := i686-elf-ld
-LDFLAGS := -static -nostdlib
-LDFLAGS += $(shell echo ${CONFIG_LDFLAGS})
+LDID := $(shell ${LD} --version | head -n1)
+LDFLAGS := -static -nostdlib \
+ $(shell echo ${CONFIG_LDFLAGS})
+
AR := i686-elf-ar
ARFLAGS := -crus
+
STRIP := i686-elf-strip
+# define compiler and flags for test targets
+TEST_CXX := g++
+TEST_CXXFLAGS := -Wall -Wextra -Wpedantic -Werror=shadow -Werror=conversion -g -Og \
+ $(shell pkg-config --cflags --libs gtest gtest_main gmock)
+
+# emulator name and flags
+QEMU := qemu-system-i386 -accel kvm -machine pc
+
diff --git a/rules.mk b/rules.mk
index 333e4f8..4e2730a 100644
--- a/rules.mk
+++ b/rules.mk
@@ -12,11 +12,11 @@ CXXFLAGS += -isysteminclude -I../lib -Drestrict=__restrict__ \
-Werror=shadow
# Suffix rules
+.SUFFIXES: .s .S .c .cpp .o
%.a:
@echo ' AR $@'
@${AR} ${ARFLAGS} $@ $(filter %.o,$^)
-.SUFFIXES: .s .S .c .o
.s.o:
@echo ' AS $^'
@$(AS) $(ASFLAGS) -c -o $@ $^
@@ -33,28 +33,33 @@ CXXFLAGS += -isysteminclude -I../lib -Drestrict=__restrict__ \
@echo ' CXX $^'
@$(CXX) $(CXXFLAGS) -c -o $@ $^
-# Test rules
-TEST_CXX := c++
-GTEST := $(shell pkg-config --cflags --libs gtest gtest_main)
-GMOCK := $(shell pkg-config --cflags --libs gmock)
+%.elf:
+ @echo ' LD $@'
+ @${LD} ${LDFLAGS} -o $@ $^
+ @echo -n ' B2b '
+ @b2sum $@ | cut -d' ' -f1
+# test rules
tst/test_%: tst/%.cc
@echo ' CXX TEST $@'
- @$(TEST_CXX) $< -o $@ $(GTEST) $(GMOCK)
+ @$(TEST_CXX) $(TEST_CXXFLAGS) $< -o $@
-.PHONY: test valgrind
-test: $(TESTS)
- $(foreach f,$^,./$f;)
+.PHONY: test.base valgrind.base clean.base FORCE
+test.base: $(TESTS)
+ @echo " -> Running tests in $(shell pwd | xargs basename)"
+ @$(foreach f,$^,echo " -> $f"; ./$f &&) echo "Done"
-valgrind: $(TESTS)
- $(foreach f,$^,valgrind --leak-check=full ./$f;)
+valgrind.base: $(TESTS)
+ @echo " -> Running valgrind on tests in $(shell pwd | xargs basename)"
+ @$(foreach f,$^,echo " -> $f"; valgrind --leak-check=full ./$f;)
-
-# clean target
-.PHONY: clean FORCE
-clean:
+clean.base: FORCE
+ @echo " -> Cleaning $(shell pwd | xargs basename)"
@$(foreach V,$(filter %.OBJS, ${.VARIABLES}), rm -rf $($(V)))
+ @rm -rf *.a
@rm -rf include
@rm -rf tst/test_*
-FORCE:
+%: %.base ;
+
+FORCE: ;