From fd30e99f93313bec0af3ff5ec3735d90dd025dce Mon Sep 17 00:00:00 2001 From: Kimplul Date: Fri, 24 May 2024 14:04:49 +0300 Subject: fix bmake compilation --- .gitignore | 2 +- Makefile | 73 +++++++++++++++++++++++------------------------------- gen/.gitkeep | 0 gen/source.mk | 5 ++++ include/ek/lower.h | 2 ++ include/ek/vec.h | 2 ++ scripts/gen-deps | 54 +++++++++++++++++++++------------------- scripts/makefile | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/actualize.c | 5 ++-- src/lower.c | 17 +++++++++---- src/source.mk | 8 +----- src/vec.c | 2 ++ 12 files changed, 156 insertions(+), 83 deletions(-) delete mode 100644 gen/.gitkeep create mode 100644 gen/source.mk create mode 100644 scripts/makefile 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 - -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 = - -all: ek - -# default values -CROSS_COMPILE ?= - -# common programs -CC = gcc - -SOURCES := +.PHONY: all +all: setup + $(MAKE) -f scripts/makefile + +# 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 $< + +.PHONY: +setup: + @echo -n > deps.mk + @./scripts/gen-deps -p EK -c COMPILE_EK -b ek "$(EK_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 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 #include #include @@ -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 #include #include -- cgit v1.3