BASEDIR = ../.. CC = gcc LEXER = re2c PARSER = $(BASEDIR)/bin/lemon LEMON_SRC_DIR = $(BASEDIR)/ext/sqlite/tool INCLUDE_DIR = $(BASEDIR)/include CODEC_INCLUDE_DIR = $(INCLUDE_DIR)/volksdata/codec BUILDDIR = $(BASEDIR)/build CODEC_SRC = $(wildcard codec_*.c) PARSER_SRC = $(CODEC_SRC:codec_%=parser_%) ifneq ($(DEBUG), 0) CODEC_OBJ := $(CODEC_SRC:%.c=$(BUILDDIR)/%_dbg.o) else CODEC_OBJ := $(CODEC_SRC:%.c=$(BUILDDIR)/%.o) endif PARSER_OBJ := $(subst codec,parser,$(CODEC_OBJ)) GRAMMAR_OBJ := $(subst codec,grammar,$(CODEC_OBJ)) OBJ = $(GRAMMAR_OBJ) $(PARSER_OBJ) $(CODEC_OBJ) INCLUDE := -I$(INCLUDE_DIR) -I$(BASEDIR)/ext/tpl/src -I$(BASEDIR)/ext/hashmap \ -I$(BASEDIR)/ext/log/src _CFLAGS := -std=gnu11 -Wall -fPIC $(INCLUDE) ifneq ($(DEBUG), 0) CFLAGS = $(_CFLAGS) -I$(BASEDIR)/test -O0 -g3 -DDEBUG else CFLAGS = $(_CFLAGS) -O3 -g0 endif $(info CODEC_OBJ: $(CODEC_OBJ)) $(info GRAMMAR_OBJ: $(GRAMMAR_OBJ)) $(info PARSER_OBJ: $(PARSER_OBJ)) $(info OBJ: $(OBJ)) $(info CFLAGS: $(CFLAGS)) .DEFAULT_GOAL := codec .PHONY: codec codec: $(OBJ) .PHONY: parsers parsers: $(PARSER_SRC) $(BUILDDIR)/%.o: %.c $(CC) $(CFLAGS) -c $^ -o $@ $(BUILDDIR)/%_dbg.o: %.c $(CC) $(CFLAGS) -c $^ -o $@ # Parser C sources. parser_%.c: lexer_%.re grammar_%.c ../codec.c $(LEXER) $< -o $@ -T --case-ranges .PRECIOUS: grammar_%.c $(CODEC_INCLUDE_DIR)/tokens_%.h # Parser generators. grammar_%.c $(CODEC_INCLUDE_DIR)/tokens_%.h: grammar_%.y mkdir -p $(BUILDDIR) $(PARSER) $< -p -T$(LEMON_SRC_DIR)/lempar.c -d$(BUILDDIR) mv $(BUILDDIR)/grammar_$*.h $(CODEC_INCLUDE_DIR)/tokens_$*.h mv $(BUILDDIR)/grammar_$*.c ./