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 /scripts | |
| 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 'scripts')
| -rwxr-xr-x | scripts/gen-deps | 79 | ||||
| -rw-r--r-- | scripts/makefile | 126 |
2 files changed, 154 insertions, 51 deletions
diff --git a/scripts/gen-deps b/scripts/gen-deps index 9a9ad6e..f45707c 100755 --- a/scripts/gen-deps +++ b/scripts/gen-deps @@ -1,60 +1,37 @@ #!/bin/sh -gencommon () { - lint="build/${path}/${s%.*}${1}.l" - dep="build/${path}/${s%.*}${1}.d" - obj="build/${path}/${s%.*}${1}" +PREFIX= +COMPILE=COMPILE +LINT=LINT +BUILD=build/ - echo "${dep}:" >> deps.mk - echo "-include ${dep}" >> deps.mk - echo "${obj}: ${s}" >> deps.mk -} - -genlink () { - gencommon ".ld" - if [ ${kern} ]; then - echo " \$(GENLINK) ${s} | \$(STRIPLINK) > ${obj}" >> deps.mk - else - echo " \$(GENLINK) ${s} | \$(STRIPLINK) | \$(KERN_INFO) > ${obj}" >> deps.mk; - fi -} - -genrule () { - gencommon "${1}" - echo " \$(COMPILE) ${flags} -c ${s} -o ${obj}" >> deps.mk - - echo "${lint}: ${s}" >> deps.mk - echo " \$(LINT) ${flags} -c ${s} -o /dev/null" >> deps.mk -} - -case "${1}" in - --kernel) - kern=1 - path=kernel - flags='$(KERN_FLAGS)' - ;; - --init) - path=init - flags='$(INIT_FLAGS)' - ;; -esac +while getopts "p:c:b:l:" opt; do + case "$opt" in + p) PREFIX="$OPTARG"_;; + c) COMPILE="$OPTARG";; + l) LINT="$OPTARG";; + b) BUILD=build/"$OPTARG";; + *) echo "unrecognised option -$OPTARG" >&2; exit 1;; + esac +done -case "${2}" in - --compile) - suffix=.o - func=genrule - ;; - --link) - suffix=.ld - func=genlink -esac +shift $((OPTIND - 1)) # create all subdirectories -mkdir -p $(echo "${3}" | xargs -n 1 dirname | uniq | sed 's|^|build/init/|g') -mkdir -p $(echo "${3}" | xargs -n 1 dirname | uniq | sed 's|^|build/kernel/|g') +mkdir -p $(echo "${@}" | tr ' ' '\n' | sed "s|[^/]*$||;s|^|${BUILD}/|" | uniq) -for s in ${3} +for s in ${@} do - ${func} ${suffix} - echo ${obj} + obj="${BUILD}/${s%.*}.o" + lint="${obj}.l" + dep="${obj}.d" + + echo "${PREFIX}OBJS += ${obj}" >> deps.mk + echo "${PREFIX}LINTS += ${lint}" >> deps.mk + echo "${dep}:" >> deps.mk + echo "-include ${dep}" >> deps.mk + echo "${obj}: ${s}" >> deps.mk + echo " \$(${COMPILE}) -c ${s} -o ${obj}" >> deps.mk + echo "${lint}: ${s}" >> deps.mk + echo " \$(${LINT}) -c ${s} -o /dev/null" >> deps.mk done diff --git a/scripts/makefile b/scripts/makefile new file mode 100644 index 0000000..762c5c9 --- /dev/null +++ b/scripts/makefile @@ -0,0 +1,126 @@ +# this could be done better +RELEASE ?= 0 +OPTFLAGS != [ "$(RELEASE)" != "0" ] \ + && echo "-O3 -flto" \ + || echo "-O0" + +DEBUG ?= 1 +DEBUGFLAGS != [ "$(DEBUG)" != "0" ] \ + && echo "-DDEBUG=1" \ + || echo "-DNDEBUG=1" + +GENERIC_UBOOT ?= 0 +UBOOTFLAGS != [ "$(GENERIC_UBOOT)" != "0" ] \ + && echo "-DGENERIC_UBOOT=1" \ + || echo + +ASSERT ?= 1 +ASSERTFLAGS != [ "$(ASSERT)" != "0" ] \ + && echo "-DASSERT=1" \ + || echo + +DEPFLAGS = -MT $@ -MMD -MP -MF $@.d +LINTFLAGS = -fsyntax-only +PREPROCESS = -E + +LLVM ?= 0 +LDFLAGS != [ "$(LLVM)" = "0" ] \ + && echo -static-libgcc -lgcc \ + || echo + +BUILD = build +ARCH_KERN_BUILD = $(BUILD)/kernel/arch/$(ARCH) +ARCH_INIT_BUILD = $(BUILD)/init/arch/$(ARCH) +ARCH_SOURCE = arch/$(ARCH) + +all: kmi.bin + +# 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 + + +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.S +INIT_LINK = arch/$(ARCH)/conf/init-link.S + +KERNEL_LD = build/kernel-link.ld +INIT_LD = build/init-link.ld + +UBSAN ?= 0 +KERN_FLAGS != [ "$(UBSAN)" != "0" ] \ + && echo -fsanitize=undefined \ + || echo + +INIT_FLAGS := -fpic + +COMPILE_KERNEL = $(COMPILE) $(KERN_FLAGS) +COMPILE_INIT = $(COMPILE) $(INIT_FLAGS) + +-include deps.mk + +-include $(KERNEL_LD).d +$(INIT_LD): kernel.bin +$(INIT_LD): $(INIT_LINK) + $(GENLINK) $(INIT_LINK) | $(STRIPLINK) | $(KERN_INFO) > $(INIT_LD) + +-include $(KERNEL_LD).d +$(KERNEL_LD): $(KERNEL_LINK) + $(GENLINK) $(KERNEL_LINK) | $(STRIPLINK) > $(KERNEL_LD) + +init.elf: $(INIT_OBJS) $(INIT_LD) + $(GENELF) $(INIT_FLAGS) -T $(INIT_LD) $(INIT_OBJS) -o init.elf $(LINK_FLAGS) + +kernel.elf: $(KERNEL_OBJS) $(KERNEL_LD) + $(GENELF) $(KERNEL_FLAGS) -T $(KERNEL_LD) $(KERNEL_OBJS) -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 + +# might lint some common things twice +.PHONY: +lint: $(INIT_LINTS) $(KERNEL_LINTS) |
