aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2024-05-24 14:04:49 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2024-05-24 14:30:57 +0300
commitfd30e99f93313bec0af3ff5ec3735d90dd025dce (patch)
treea6ce5e8e0695bf6e692560713fd2c30a1fdedc3f
parent2026bf974cffb5d560287ba8d44ea3ecd9204853 (diff)
downloadek-fd30e99f93313bec0af3ff5ec3735d90dd025dce.tar.gz
ek-fd30e99f93313bec0af3ff5ec3735d90dd025dce.zip
fix bmake compilation
-rw-r--r--.gitignore2
-rw-r--r--Makefile67
-rw-r--r--gen/.gitkeep0
-rw-r--r--gen/source.mk5
-rw-r--r--include/ek/lower.h2
-rw-r--r--include/ek/vec.h2
-rwxr-xr-xscripts/gen-deps54
-rw-r--r--scripts/makefile69
-rw-r--r--src/actualize.c5
-rw-r--r--src/lower.c17
-rw-r--r--src/source.mk8
-rw-r--r--src/vec.c2
12 files changed, 153 insertions, 80 deletions
diff --git a/.gitignore b/.gitignore
index b4358dd..787cdd8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,5 +5,5 @@ gen
ek
*.t
*.log
-!gen/.gitkeep
+!gen/source.mk
!include/ek
diff --git a/Makefile b/Makefile
index a2c18cd..9bd13a7 100644
--- a/Makefile
+++ b/Makefile
@@ -1,67 +1,56 @@
-DO != echo -n > deps.mk
+.PHONY: all
+all: setup
+ $(MAKE) -f scripts/makefile
-DEBUGFLAGS != [ $(RELEASE) ] && echo "-flto=auto -O2 -DNODEBUG" || echo "-O0 -DDEBUG"
-CFLAGS = -Wall -Wextra -Wconversion -ggdb3
-DEPFLAGS = -MT $@ -MMD -MP -MF $@.d
-LINTFLAGS = -fsyntax-only
-INCLUDEFLAGS = -Iinclude
-COMPILEFLAGS =
-LINKFLAGS =
+# 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 $<
-all: ek
+.PHONY:
+setup:
+ @echo -n > deps.mk
+ @./scripts/gen-deps -p EK -c COMPILE_EK -b ek "$(EK_SOURCES)"
-# default values
-CROSS_COMPILE ?=
-
-# common programs
-CC = gcc
-
-SOURCES :=
+CLEANUP := build deps.mk ek
+CLEANUP_CMD :=
+EK_SOURCES :=
include src/source.mk
-COMPILE = $(CROSS_COMPILE)$(CC) $(DEBUGFLAGS)\
- $(CFLAGS) $(DEPFLAGS) $(COMPILEFLAGS) $(INCLUDEFLAGS)
-
-LINT = $(COMPILE) $(LINTFLAGS)
-
-OBJS != ./scripts/gen-deps --sources "$(SOURCES)"
-
-include deps.mk
-
-.PHONY: lint
-lint: $(OBJS:.o=.o.l)
-
.PHONY: format
format:
- find src include tests -iname '*.[ch]' |\
+ find src include -iname '*.[ch]' |\
xargs uncrustify -c uncrustify.conf --no-backup -F -
.PHONY: license
license:
- find src include tests -iname '*.[ch]' |\
+ find src include -iname '*.[ch]' |\
xargs ./scripts/license
.PHONY: docs
docs:
- find src include -iname '*.[ch]' |\
+ find src include -iname '*.[ch]' -not -path */gen/* |\
xargs ./scripts/warn-undocumented
doxygen docs/doxygen.conf
-.PHONY: check
-check: ek
- ./tests/check.sh
-
-ek: $(OBJS)
- $(COMPILE) $(OBJS) -o $@
+RM = rm
.PHONY: clean
clean:
- $(RM) -r build ek deps.mk
+ $(RM) -rf $(CLEANUP)
.PHONY: clean_docs
clean_docs:
- $(RM) -r docs/output
+ $(RM) -rf docs/output
.PHONY: clean_all
clean_all: clean clean_docs
diff --git a/gen/.gitkeep b/gen/.gitkeep
deleted file mode 100644
index e69de29..0000000
--- a/gen/.gitkeep
+++ /dev/null
diff --git a/gen/source.mk b/gen/source.mk
new file mode 100644
index 0000000..10295b2
--- /dev/null
+++ b/gen/source.mk
@@ -0,0 +1,5 @@
+gen/gen_parser.c: src/parser.y gen/gen_lexer.inc
+ bison -Wcounterexamples -o gen/gen_parser.c src/parser.y
+
+gen/gen_lexer.inc: src/lexer.l
+ flex -o gen/gen_lexer.inc src/lexer.l
diff --git a/include/ek/lower.h b/include/ek/lower.h
index d635178..9a27d1d 100644
--- a/include/ek/lower.h
+++ b/include/ek/lower.h
@@ -1,3 +1,5 @@
+/* SPDX-License-Identifier: copyleft-next-0.3.1 */
+
#ifndef EK_LOWER_H
#define EK_LOWER_H
diff --git a/include/ek/vec.h b/include/ek/vec.h
index 765f2da..08a608a 100644
--- a/include/ek/vec.h
+++ b/include/ek/vec.h
@@ -1,3 +1,5 @@
+/* SPDX-License-Identifier: copyleft-next-0.3.1 */
+
#ifndef VEC_H
#define VEC_H
diff --git a/scripts/gen-deps b/scripts/gen-deps
index 0feed7e..f45707c 100755
--- a/scripts/gen-deps
+++ b/scripts/gen-deps
@@ -1,35 +1,37 @@
#!/bin/sh
-gencommon () {
- lint="build/${s%.*}${1}.l"
- dep="build/${s%.*}${1}.d"
- obj="build/${s%.*}${1}"
+PREFIX=
+COMPILE=COMPILE
+LINT=LINT
+BUILD=build/
- echo "${dep}:" >> deps.mk
- echo "include ${dep}" >> deps.mk
- echo "${obj}: ${s}" >> deps.mk
-}
-
-genobjs () {
- gencommon ".o"
- echo "${obj}: ${s}" >> deps.mk
- echo " \$(COMPILE) -c $< -o \$@" >> deps.mk
-
- echo "${lint}: ${s}" >> deps.mk
- echo " \$(LINT) -c ${s} -o /dev/null" >> deps.mk
-}
+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 "${1}" in
- --sources)
- func=genobjs
- ;;
-esac
+shift $((OPTIND - 1))
# create all subdirectories
-mkdir -p $(echo "${2}" | xargs dirname | uniq | sed 's|^|build/|g')
+mkdir -p $(echo "${@}" | tr ' ' '\n' | sed "s|[^/]*$||;s|^|${BUILD}/|" | uniq)
-for s in ${2}
+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..d0c88aa
--- /dev/null
+++ b/scripts/makefile
@@ -0,0 +1,69 @@
+# 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"
+
+ASSERT ?= 1
+ASSERTFLAGS != [ "$(ASSERT)" != "0" ] \
+ && echo "-DASSERT=1" \
+ || echo
+
+DEPFLAGS = -MT $@ -MMD -MP -MF $@.d
+LINTFLAGS := -fsyntax-only
+PREPROCESS := -E
+
+LLVM ?= 0
+BUILD := build
+
+all: ek
+
+include gen/source.mk
+
+# default values, overwrite if/when needed
+CROSS_COMPILE :=
+
+OBJCOPY != [ "$(LLVM)" != "0" ] \
+ && echo llvm-objcopy \
+ || echo $(CROSS_COMPILE)objcopy
+
+COMPILER != [ "$(LLVM)" != "0" ] \
+ && echo clang --target="$(CROSS_COMPILE)" \
+ || echo $(CROSS_COMPILE)gcc
+
+
+OBFLAGS := -g
+WARNFLAGS := -Wall -Wextra
+
+COMPILE_FLAGS := $(CFLAGS) $(WARNFLAGS) $(OPTFLAGS) $(OBFLAGS) $(ASSERTFLAGS) \
+ $(DEBUGFLAGS)
+
+INCLUDE_FLAGS := -I include
+
+COMPILE = $(COMPILER) \
+ $(COMPILE_FLAGS) $(DEPFLAGS) $(INCLUDE_FLAGS)
+
+LINT = $(COMPILER) \
+ $(COMPILE_FLAGS) $(LINTFLAGS) $(INCLUDE_FLAGS)
+
+UBSAN ?= 0
+TRISCV_FLAGS != [ "$(UBSAN)" != "0" ] \
+ && echo -fsanitize=undefined \
+ || echo
+
+COMPILE_EK = $(COMPILE) $(EK_FLAGS)
+
+-include deps.mk
+
+ek: $(EK_OBJS)
+ $(COMPILE_EK) $(EK_OBJS) -o $@
+
+
+# might lint some common things twice
+.PHONY:
+lint: $(TRISCV_LINTS)
diff --git a/src/actualize.c b/src/actualize.c
index 0c9d09e..4f3bae6 100644
--- a/src/actualize.c
+++ b/src/actualize.c
@@ -2235,8 +2235,9 @@ static int actualize_init(struct act_state *state,
struct init_helper arg = vect_at(struct init_helper, init_args,
ai);
- struct init_helper mem = vect_at(struct init_helper, struct_members,
- ai);
+ struct init_helper mem = vect_at(struct init_helper,
+ struct_members,
+ ai);
/* not the best error message but works for now */
if (!same_id(arg.id, mem.id)) {
diff --git a/src/lower.c b/src/lower.c
index 58ffe7a..2209b8e 100644
--- a/src/lower.c
+++ b/src/lower.c
@@ -1,3 +1,5 @@
+/* SPDX-License-Identifier: copyleft-next-0.3.1 */
+
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
@@ -389,7 +391,8 @@ static void do_store(struct lower_state *s, struct retval *from,
int64_t addr = strtoll(o.s, 0, 0);
/* doesn't really take into account possible padding etc, should
* probably fix at some point */
- printf("%s >> %s %s %zi;\n", from->s, retval_type_str(*from), t.s, addr);
+ printf("%s >> %s %s %zi;\n", from->s, retval_type_str(*from), t.s,
+ addr);
}
static int lower_cast(struct lower_state *s, struct ast *e,
@@ -427,7 +430,8 @@ static int lower_const(struct lower_state *s, struct ast *c,
return 0;
}
-static int lower_deref_assign(struct lower_state *s, struct ast *d, struct retval *retval)
+static int lower_deref_assign(struct lower_state *s, struct ast *d,
+ struct retval *retval)
{
struct ast *base = unop_expr(d);
struct retval loc = retval_create();
@@ -441,7 +445,8 @@ static int lower_deref_assign(struct lower_state *s, struct ast *d, struct retva
return 0;
}
-static int lower_dot_assign(struct lower_state *s, struct ast *d, struct retval *retval)
+static int lower_dot_assign(struct lower_state *s, struct ast *d,
+ struct retval *retval)
{
struct ast *base = dot_expr(d);
struct retval loc = retval_create();
@@ -454,11 +459,13 @@ static int lower_dot_assign(struct lower_state *s, struct ast *d, struct retval
size_t offset = type_offsetof(base->t, dot_id(d));
if (d->t->k == TYPE_STRUCT) {
size_t size = type_size(base->t);
- printf("i27 %s%s = %s + %zd;\n", retval->s, dot_id(d), retval->s, offset);
+ printf("i27 %s%s = %s + %zd;\n", retval->s, dot_id(d),
+ retval->s, offset);
printf("%s%s <<* %zd %s;\n", retval->s, dot_id(d), size, loc.s);
}
else {
- struct retval r = build_retval(CONST_I27, build_str("%zd", offset));
+ struct retval r = build_retval(CONST_I27,
+ build_str("%zd", offset));
do_store(s, retval, &loc, &r);
retval_destroy(&r);
}
diff --git a/src/source.mk b/src/source.mk
index 9fad368..e6e5182 100644
--- a/src/source.mk
+++ b/src/source.mk
@@ -1,8 +1,2 @@
SRC_LOCAL != echo src/*.c
-SOURCES += $(SRC_LOCAL) gen/gen_parser.c
-
-gen/gen_parser.c: src/parser.y gen/gen_lexer.inc
- bison -Wcounterexamples -o gen/gen_parser.c src/parser.y
-
-gen/gen_lexer.inc: src/lexer.l
- flex -o gen/gen_lexer.inc src/lexer.l
+EK_SOURCES := $(EK_SOURCES) $(SRC_LOCAL) gen/gen_parser.c
diff --git a/src/vec.c b/src/vec.c
index 8e8d2ea..89c5500 100644
--- a/src/vec.c
+++ b/src/vec.c
@@ -1,3 +1,5 @@
+/* SPDX-License-Identifier: copyleft-next-0.3.1 */
+
#include <stdlib.h>
#include <assert.h>
#include <string.h>