aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2021-08-20 20:57:59 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2021-08-20 21:04:24 +0300
commit31c3c8dcb5ea281201b9c01140bceeadc80f7686 (patch)
tree5424805f919938e58e0a2c88c0e3d8f583fbcfd7
parent1175179058fa809c57d724cd2043c67edc511695 (diff)
downloadkmi-31c3c8dcb5ea281201b9c01140bceeadc80f7686.tar.gz
kmi-31c3c8dcb5ea281201b9c01140bceeadc80f7686.zip
New build system
-rw-r--r--Makefile51
-rw-r--r--README5
-rw-r--r--arch/riscv/conf/init-link.S (renamed from arch/riscv/init-link.S)0
-rw-r--r--arch/riscv/conf/kernel-link.S (renamed from arch/riscv/kernel-link.S)0
-rw-r--r--arch/riscv/conf/kernel.its (renamed from arch/riscv/kernel.its)0
-rw-r--r--arch/riscv/riscv-link.S22
-rw-r--r--arch/riscv/source.mk8
-rwxr-xr-xscripts/gen-deps43
-rwxr-xr-xscripts/mkobjs57
-rwxr-xr-xscripts/prepend11
10 files changed, 75 insertions, 122 deletions
diff --git a/Makefile b/Makefile
index ecfecec..dbf6456 100644
--- a/Makefile
+++ b/Makefile
@@ -1,40 +1,39 @@
-DO != echo > deps.mk
-CFLAGS := -fno-pie -ggdb3 -ffreestanding -nostdlib
-INCLUDE_DIRS := include
+DO != echo > deps.mk
+
+CFLAGS = -fno-pie -ggdb3 -ffreestanding -nostdlib
+DEPFLAGS = -MT $@ -MMD -MP -MF $@.d
all: apos.bin
-ARCH ?= riscv
-CROSS_COMPILE ?= riscv64-unknown-elf-
+ARCH ?= riscv
+CROSS_COMPILE ?= riscv64-unknown-elf-
# Common programs
-CC := gcc
-AR := ar
-CPP := cpp
-OBJCOPY ?= objcopy
-OBJCOPY_FLAGS ?= -Obinary
+CC := gcc
+AR := ar
+CPP := cpp
+OBJCOPY ?= objcopy
+OBJCOPY_FLAGS ?= -Obinary
KERNEL_SOURCES :=
-KERNEL_LINK :=
INIT_SOURCES :=
-INIT_LINK :=
-INCLUDE_DIRS := include
+CLEANUP := build deps.mk kernel.* init.* apos.bin
include arch/$(ARCH)/source.mk
-INCLUDE_FLAGS != ./scripts/prepend -I $(INCLUDE_DIRS)
-
-KERNEL_OBJECTS != ./scripts/mkobjs $(CROSS_COMPILE)$(CC) $(CFLAGS)\
- $(INCLUDE_FLAGS) --kern-files $(KERNEL_SOURCES)
+INCLUDE_FLAGS := -Iinclude -Iarch/$(ARCH)/include
-KERNEL_LD != ./scripts/mkobjs $(CROSS_COMPILE)$(CPP)\
- $(INCLUDE_FLAGS) --kern-lds $(KERNEL_LINK)
+COMPILE = $(CROSS_COMPILE)$(CC) $(CFLAGS) $(DEPFLAGS) $(INCLUDE_FLAGS)
+GENLINK = $(CROSS_COMPILE)$(CPP) $(DEPFLAGS) $(INCLUDE_FLAGS)
+STRIPLINK = sed -n '/^[^\#]/p'
-INIT_OBJECTS != ./scripts/mkobjs $(CROSS_COMPILE)$(CC) $(CFLAGS)\
- $(INCLUDE_FLAGS) --init-files $(INIT_SOURCES)
+KERNEL_LINK := arch/$(ARCH)/conf/kernel-link
+INIT_LINK := arch/$(ARCH)/conf/init-link
-INIT_LD != ./scripts/mkobjs $(CROSS_COMPILE)$(CPP)\
- $(INCLUDE_FLAGS) --init-lds $(INIT_LINK)
+KERNEL_OBJECTS != ./scripts/gen-deps --kern "$(KERNEL_SOURCES)"
+INIT_OBJECTS != ./scripts/gen-deps --init "$(INIT_SOURCES)"
+KERNEL_LD != ./scripts/gen-deps --link "$(KERNEL_LINK).S"
+INIT_LD != ./scripts/gen-deps --link "$(INIT_LINK).S"
include deps.mk
@@ -44,10 +43,10 @@ apos.bin: kernel.elf init.elf
cat init.bin kernel.bin > $@
kernel.elf: $(KERNEL_OBJECTS) $(KERNEL_LD)
- $(CROSS_COMPILE)$(CC) -T$(KERNEL_LD) $(CFLAGS) $(INCLUDE_FLAGS) $(KERNEL_OBJECTS) -o $@
+ $(COMPILE) -T$(KERNEL_LD) $(KERNEL_OBJECTS) -o $@
init.elf: $(INIT_OBJECTS) $(INIT_LD)
- $(CROSS_COMPILE)$(CC) -T$(INIT_LD) $(CFLAGS) $(INCLUDE_FLAGS) $(INIT_OBJECTS) -o $@
+ $(COMPILE) -T$(INIT_LD) $(INIT_OBJECTS) -o $@
clean:
- rm $(KERNEL_OBJECTS) $(INIT_OBJECTS) $(INIT_LD) $(KERNEL_LD) kernel.bin kernel.elf init.bin init.elf apos.bin
+ $(RM) -r $(CLEANUP)
diff --git a/README b/README
new file mode 100644
index 0000000..f668f3d
--- /dev/null
+++ b/README
@@ -0,0 +1,5 @@
+Requirements for a new arch:
++ arch/$(ARCH)/conf/init-link.S
++ arch/$(ARCH)/conf/init-kernel.S
++ arch/$(ARCH)/source.mk
+ -> populate KERNEL_SOURCES, INIT_SOURCES and CLEANUP if required
diff --git a/arch/riscv/init-link.S b/arch/riscv/conf/init-link.S
index db18822..db18822 100644
--- a/arch/riscv/init-link.S
+++ b/arch/riscv/conf/init-link.S
diff --git a/arch/riscv/kernel-link.S b/arch/riscv/conf/kernel-link.S
index 873c7de..873c7de 100644
--- a/arch/riscv/kernel-link.S
+++ b/arch/riscv/conf/kernel-link.S
diff --git a/arch/riscv/kernel.its b/arch/riscv/conf/kernel.its
index f984d40..f984d40 100644
--- a/arch/riscv/kernel.its
+++ b/arch/riscv/conf/kernel.its
diff --git a/arch/riscv/riscv-link.S b/arch/riscv/riscv-link.S
deleted file mode 100644
index 0950850..0000000
--- a/arch/riscv/riscv-link.S
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <apos/link.lds.h>
-#include <vmap.h>
-
-OUTPUT_ARCH(riscv)
-ENTRY(_start)
-
-SECTIONS {
- . = ABSOLUTE(PM_KERN);
- .init ALIGN(4K) : AT(0) {
- *(.init.start);
- *(.init.text);
- *(.init.data);
- . = ALIGN(4K);
- }
-
- . = ABSOLUTE(VM_KERN);
- .text ALIGN(4K) : AT(SIZEOF(.init)) {
- *(.text.start);
- *(.text.text);
- *(.text.data);
- }
-}
diff --git a/arch/riscv/source.mk b/arch/riscv/source.mk
index 8bd67ee..626ecd2 100644
--- a/arch/riscv/source.mk
+++ b/arch/riscv/source.mk
@@ -1,9 +1,5 @@
-KERNEL_LOCAL != ./scripts/prepend arch/riscv/ main.c
+KERNEL_LOCAL != echo arch/riscv/*.[cS]
KERNEL_SOURCES += $(KERNEL_LOCAL)
-INIT_LOCAL != ./scripts/prepend arch/riscv/init/ init.c head.S
+INIT_LOCAL != echo arch/riscv/init/*.[cS]
INIT_SOURCES += $(INIT_LOCAL)
-
-INCLUDE_DIRS += arch/riscv/include
-KERNEL_LINK := arch/riscv/kernel-link.S
-INIT_LINK := arch/riscv/init-link.S
diff --git a/scripts/gen-deps b/scripts/gen-deps
new file mode 100755
index 0000000..b764deb
--- /dev/null
+++ b/scripts/gen-deps
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+gencommon () {
+ dep="build/${s%.*}${1}.d"
+ obj="build/${s%.*}${1}"
+
+ mkdir -p $(dirname ${dep})
+
+ echo "${dep}:" >> deps.mk
+ echo "include ${dep}" >> deps.mk
+ echo "${obj}: ${s}" >> deps.mk
+
+}
+genlink () {
+ gencommon ".ld"
+ echo " \$(GENLINK) $< | \$(STRIPLINK) > \$@" >> deps.mk
+}
+
+genrule () {
+ gencommon "${1}"
+ echo " \$(COMPILE) -c \$< -o \$@" >> deps.mk
+}
+
+case "${1}" in
+ --kern)
+ suffix=.k.o
+ func=genrule
+ ;;
+ --init)
+ suffix=.i.o
+ func=genrule
+ ;;
+ --link)
+ suffix=.ld
+ func=genlink
+ ;;
+esac
+
+for s in ${2}
+do
+ ${func} ${suffix}
+ echo ${obj}
+done
diff --git a/scripts/mkobjs b/scripts/mkobjs
deleted file mode 100755
index 188465b..0000000
--- a/scripts/mkobjs
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/sh
-
-genobj () {
- path=$(dirname "$1")/
- obj=$(echo "$1" | sed "s/\\.[cS]/.${command_suffix}.o/")
- $cc_command -MM -MP $n | \
- sed "s|\\(.*\)\\.o|${path}\\1.${command_suffix}.o|" >> deps.mk
-
- echo "$obj: $n" >> deps.mk
- echo " $cc_command -c $1 -o $obj" >> deps.mk
-
- cc_objs="$cc_objs $obj"
-}
-
-genlink () {
- link=$(echo "$1" | sed 's/\.S/.ld/')
- echo "$link: $1" >> deps.mk
- echo " $cc_command $1 | sed -n '/^[^#]/p' > $link" >> deps.mk
-
- cc_objs="$cc_objs $link"
-}
-
-for n in "$@"
-do
- case "$n" in
- --kern-files)
- command_suffix=k
- command_func=genobj
- continue
- ;;
-
- --kern-lds)
- command_func=genlink
- continue
- ;;
-
- --init-files)
- command_suffix=i
- command_func=genobj
- continue
- ;;
-
- --init-lds)
- command_func=genlink
- continue
- ;;
- esac
-
- if [ "$command_func" = "" ]
- then
- cc_command="$cc_command $n"
- else
- $command_func "$n"
- fi
-done
-
-echo "$cc_objs"
diff --git a/scripts/prepend b/scripts/prepend
deleted file mode 100755
index ef10da1..0000000
--- a/scripts/prepend
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-prep="$1"
-shift
-
-for n in "$@"
-do
- ret="$ret $prep$n"
-done
-
-echo "$ret"