diff options
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) |
