diff options
-rw-r--r-- | Makefile | 115 | ||||
-rw-r--r-- | Makefile.all | 59 | ||||
-rw-r--r-- | Makefile.config | 35 | ||||
-rw-r--r-- | i686/toolchain.mk | 30 | ||||
-rw-r--r-- | rules.mk | 37 |
5 files changed, 180 insertions, 96 deletions
@@ -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 + @@ -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: ; |