diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2023-07-24 19:23:50 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2023-07-24 19:26:07 +0300 |
| commit | fdfdd03e3341d3b7d5e6a22a11a755a2c56eda1b (patch) | |
| tree | 8eb64c5c8a2b3db6c25c572cb1422e0069ffc3b4 /Makefile | |
| parent | 900831a55b9d1c74c5ff0de043ad5982270e2cbc (diff) | |
| download | kmi-fdfdd03e3341d3b7d5e6a22a11a755a2c56eda1b.tar.gz kmi-fdfdd03e3341d3b7d5e6a22a11a755a2c56eda1b.zip | |
split makefile into two parts
+ First part generates deps.mk, second part reads it.
Allows us to use both bmake and gmake with the same makefiles.
Only drawback seems to be that the first makefile considers all
individual files as 'finished' targets, meaning that it's more
difficult to do something like
make kernel.elf
though I haven't found this to be an issue.
Diffstat (limited to 'Makefile')
| -rw-r--r-- | Makefile | 146 |
1 files changed, 28 insertions, 118 deletions
@@ -1,138 +1,49 @@ -DO != echo -n > deps.mk +.PHONY: all +all: setup + $(MAKE) -f scripts/makefile -# this could be done better -RELEASE ?= 0 -OPTFLAGS != [ "$(RELEASE)" != "0" ] \ - && echo "-O3 -flto" \ - || echo "-O0" +# this kicks all unrecognised targets to the client script. +# note that trying to compile individual files, e.g. +# +# make kernel.elf +# +# will not work, you would need +# +# make -f scripts/makefile kernel.elf +# +# instead +.DEFAULT: setup + $(MAKE) -f scripts/makefile $< -DEBUG ?= 1 -DEBUGFLAGS != [ "$(DEBUG)" != "0" ] \ - && echo "-DDEBUG=1" \ - || echo "-DNDEBUG=1" - -GENERIC_UBOOT ?= 0 -UBOOTFLAGS != [ "$(GENERIC_UBOOT)" != "0" ] \ - && echo "-DGENERIC_UBOOT=1" - -ASSERT ?= 1 -ASSERTFLAGS != [ "$(ASSERT)" != "0" ] \ - && echo "-DASSERT=1" - -DEPFLAGS = -MT $@ -MMD -MP -MF $@.d -LINTFLAGS = -fsyntax-only -PREPROCESS = -E - -LLVM ?= 0 -LDFLAGS != [ "$(LLVM)" = "0" ] \ - && echo -static-libgcc -lgcc - -BUILD = build -ARCH_KERN_BUILD = $(BUILD)/kernel/arch/$(ARCH) -ARCH_INIT_BUILD = $(BUILD)/init/arch/$(ARCH) -ARCH_SOURCE = arch/$(ARCH) - -all: kmi.bin -# bmake requires us to run make depend to genereate deps.mk beforehand, -# so create an empty rule that lets the rest of the script do its job -depend: +.PHONY: +setup: + @echo -n > deps.mk + @./scripts/gen-deps -p KERNEL -c COMPILE_KERNEL -b kernel "${KERNEL_SOURCES}" + @./scripts/gen-deps -p INIT -c COMPILE_INIT -b init "${INIT_SOURCES}" # default values, overwrite if/when needed ARCH ?= riscv64 -CROSS_COMPILE ?= $(ARCH)-unknown-elf- - -OBJCOPY != [ "$(LLVM)" != "0" ] \ - && echo llvm-objcopy \ - || echo $(CROSS_COMPILE)objcopy - -COMPILER != [ "$(LLVM)" != "0" ] \ - && echo clang --target="$(CROSS_COMPILE)" \ - || echo $(CROSS_COMPILE)gcc - +ARCH_SOURCE = arch/$(ARCH) -KERNEL_SOURCES != echo common/*.c common/uapi/*.c lib/*.c # might consider renaming common, currently it refers to stuff common # to all arches but clearly there are bits that are common to init and kernel +KERNEL_SOURCES != echo common/*.c common/uapi/*.c lib/*.c INIT_SOURCES != echo lib/fdt*.c common/fdt.c common/string.c + CLEANUP := build deps.mk kernel.* init.* kmi.bin CLEANUP_CMD := -OBFLAGS := -ffreestanding -nostdlib -static -fno-pie -std=c17 -g -WARNFLAGS := -Wall -Wextra -Wvla -ARCH_CFLAGS := -D$(ARCH) - include arch/$(ARCH)/source.mk -COMPILE_FLAGS := $(CFLAGS) $(WARNFLAGS) $(OPTFLAGS) $(OBFLAGS) $(ASSERTFLAGS) \ - $(DEBUGFLAGS) $(UBOOTFLAGS) $(ARCH_CFLAGS) - -LINK_FLAGS := $(LDFLAGS) $(ARCH_LDFLAGS) - -INCLUDE_FLAGS := -I include -include config.h -include arch/$(ARCH)/config.h - -# This makes sure .bss is loaded into the binary -OBJCOPY_FLAGS ?= -Obinary -R .garbage \ - --set-section-flags .bss=alloc,load,contents - -COMPILE = $(COMPILER) \ - $(COMPILE_FLAGS) $(DEPFLAGS) $(INCLUDE_FLAGS) - -LINT = $(COMPILER) \ - $(COMPILE_FLAGS) $(LINTFLAGS) $(INCLUDE_FLAGS) - -GENELF = $(COMPILER) \ - $(COMPILE_FLAGS) $(INCLUDE_FLAGS) - -GENLINK = $(COMPILER) $(COMPILE_FLAGS) $(PREPROCESS) $(DEPFLAGS) $(INCLUDE_FLAGS) -STRIPLINK = sed -n '/^[^\#]/p' -KERN_SIZE = wc -c kernel.bin | awk '{print $$1}' -KERN_INFO = sed "s/<KERNEL_SIZE>/$$($(KERN_SIZE))/" - -KERNEL_LINK := arch/$(ARCH)/conf/kernel-link -INIT_LINK := arch/$(ARCH)/conf/init-link - -UBSAN ?= 0 -KERN_FLAGS != [ "$(UBSAN)" != "0" ] \ - && echo -fsanitize=undefined - -INIT_FLAGS := -fpic - -KERNEL_OBJECTS != ./scripts/gen-deps --kernel --compile "$(KERNEL_SOURCES)" -INIT_OBJECTS != ./scripts/gen-deps --init --compile "$(INIT_SOURCES)" -KERNEL_LD != ./scripts/gen-deps --kernel --link "$(KERNEL_LINK).S" -INIT_LD != ./scripts/gen-deps --init --link "$(INIT_LINK).S" - --include deps.mk - -$(INIT_LD): kernel.bin - -init.elf: $(INIT_OBJECTS) $(INIT_LD) - $(GENELF) $(INIT_FLAGS) -T $(INIT_LD) $(INIT_OBJECTS) -o init.elf $(LINK_FLAGS) - -kernel.elf: $(KERNEL_OBJECTS) $(KERNEL_LD) - $(GENELF) $(KERNEL_FLAGS) -T $(KERNEL_LD) $(KERNEL_OBJECTS) -o kernel.elf $(LINK_FLAGS) - -init.bin: init.elf - $(OBJCOPY) $(OBJCOPY_FLAGS) init.elf init.bin - -kernel.bin: kernel.elf - $(OBJCOPY) $(OBJCOPY_FLAGS) kernel.elf kernel.bin - -kmi.bin: init.bin kernel.bin - cat init.bin kernel.bin > kmi.bin - -.PHONY: -lint: $(INIT_OBJECTS:.o=.o.l) $(KERNEL_OBJECTS:.o=.o.l) - .PHONY: format format: find arch lib common include -iname '*.[ch]' |\ - xargs -n 10 -P 0 uncrustify -c uncrustify.conf --no-backup -F - + xargs uncrustify -c uncrustify.conf --no-backup -F - .PHONY: license license: find arch lib common include -iname '*.[ch]' |\ - xargs -n 10 -P 0 ./scripts/license + xargs ./scripts/license .PHONY: docs docs: @@ -140,12 +51,11 @@ docs: xargs ./scripts/warn-undocumented doxygen docs/doxygen.conf -# bmake didn't seem to have the -f flag on by default -RM ?= rm -f +RM = rm .PHONY: clean clean: - $(RM) -r $(CLEANUP) + $(RM) -rf $(CLEANUP) .PHONY: clean_run clean_run: @@ -153,7 +63,7 @@ clean_run: .PHONY: clean_docs clean_docs: - $(RM) -r docs/output + $(RM) -rf docs/output .PHONY: clean_all clean_all: clean clean_run clean_docs |
