Makefile 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. BASEDIR = ../..
  2. CC = gcc
  3. LEXER = re2c
  4. PARSER = $(BASEDIR)/bin/lemon
  5. LEMON_SRC_DIR = $(BASEDIR)/ext/sqlite/tool
  6. INCLUDE_DIR = $(BASEDIR)/include
  7. CODEC_INCLUDE_DIR = $(INCLUDE_DIR)/volksdata/codec
  8. BUILDDIR = $(BASEDIR)/build
  9. CODEC_SRC = $(wildcard codec_*.c)
  10. PARSER_SRC = $(CODEC_SRC:codec_%=parser_%)
  11. ifneq ($(DEBUG), 0)
  12. CODEC_OBJ := $(CODEC_SRC:%.c=$(BUILDDIR)/%_dbg.o)
  13. else
  14. CODEC_OBJ := $(CODEC_SRC:%.c=$(BUILDDIR)/%.o)
  15. endif
  16. PARSER_OBJ := $(subst codec,parser,$(CODEC_OBJ))
  17. GRAMMAR_OBJ := $(subst codec,grammar,$(CODEC_OBJ))
  18. OBJ = $(GRAMMAR_OBJ) $(PARSER_OBJ) $(CODEC_OBJ)
  19. INCLUDE := -I$(INCLUDE_DIR) -I$(BASEDIR)/ext/tpl/src -I$(BASEDIR)/ext/hashmap \
  20. -I$(BASEDIR)/ext/log/src
  21. _CFLAGS := -std=gnu11 -Wall -fPIC $(INCLUDE)
  22. ifneq ($(DEBUG), 0)
  23. CFLAGS = $(_CFLAGS) -I$(BASEDIR)/test -O0 -g3 -DDEBUG
  24. else
  25. CFLAGS = $(_CFLAGS) -O3 -g0
  26. endif
  27. $(info CODEC_OBJ: $(CODEC_OBJ))
  28. $(info GRAMMAR_OBJ: $(GRAMMAR_OBJ))
  29. $(info PARSER_OBJ: $(PARSER_OBJ))
  30. $(info OBJ: $(OBJ))
  31. $(info CFLAGS: $(CFLAGS))
  32. .DEFAULT_GOAL := codec
  33. .PHONY: codec
  34. codec: $(OBJ)
  35. .PHONY: parsers
  36. parsers: $(PARSER_SRC)
  37. $(BUILDDIR)/%.o: %.c
  38. $(CC) $(CFLAGS) -c $^ -o $@
  39. $(BUILDDIR)/%_dbg.o: %.c
  40. $(CC) $(CFLAGS) -c $^ -o $@
  41. # Parser C sources.
  42. parser_%.c: lexer_%.re grammar_%.c ../codec.c
  43. $(LEXER) $< -o $@ -T --case-ranges
  44. .PRECIOUS: grammar_%.c $(CODEC_INCLUDE_DIR)/tokens_%.h
  45. # Parser generators.
  46. grammar_%.c $(CODEC_INCLUDE_DIR)/tokens_%.h: grammar_%.y
  47. mkdir -p $(BUILDDIR)
  48. $(PARSER) $< -p -T$(LEMON_SRC_DIR)/lempar.c -d$(BUILDDIR)
  49. mv $(BUILDDIR)/grammar_$*.h $(CODEC_INCLUDE_DIR)/tokens_$*.h
  50. mv $(BUILDDIR)/grammar_$*.c ./