aboutsummaryrefslogtreecommitdiffstats
path: root/makefile
diff options
context:
space:
mode:
Diffstat (limited to 'makefile')
-rw-r--r--makefile131
1 files changed, 118 insertions, 13 deletions
diff --git a/makefile b/makefile
index 5f938f3..20b02d4 100644
--- a/makefile
+++ b/makefile
@@ -1,13 +1,118 @@
-
-
-bin/c_lexer :
- echo "No current build commands for C lexer."
- exit 1
-
-bin/c_parser :
- echo "No current build commands for C parser."
- exit 1
-
-bin/c_compiler :
- echo "No current build commands for C compile."
- exit 1
+CC := g++ # this is the main compiler
+# CC := clang --analyze # and comment out the linker last line
+
+CFLAGS := -g -Wall -Wextra -Wpedantic -std=c++11
+
+LEXINC := -Ic_lexer/include
+LEXBUILDDIR := c_lexer/build
+LEXSRCDIR := c_lexer/src
+
+PARINC := -Ic_parser/include
+PARBUILDDIR := c_parser/build
+PARSRCDIR := c_parser/src
+
+COMPINC := -Ic_compiler/include
+COMPBUILDDIR := c_compiler/build
+COMPSRCDIR := c_compiler/src
+
+all : bin/c_lexer bin/c_parser
+
+# Make the c_lexer
+bin/c_lexer : $(LEXBUILDDIR)/main.o $(LEXBUILDDIR)/c_lexer.o $(LEXBUILDDIR)/c_lexer.yy.o
+ @echo "Linking..."
+ @echo " mkdir -p bin"; mkdir -p bin
+ @echo " $(CC) $^ -o $@"; $(CC) $^ -o $@
+
+$(LEXBUILDDIR)/%.o : $(LEXSRCDIR)/%.cpp
+ @echo "Building sources..."
+ @echo " mkdir -p $(LEXBUILDDIR)"; mkdir -p $(LEXBUILDDIR)
+ @echo " $(CC) $(CFLAGS) $(LEXINC) -c -o $@ $<"; $(CC) $(CFLAGS) $(LEXINC) -c -o $@ $<
+
+$(LEXBUILDDIR)/%.yy.o : $(LEXSRCDIR)/%.yy.cpp
+ @echo "Building lex..."
+ @echo " mkdir -p $(LEXBUILDDIR)"; mkdir -p $(LEXBUILDDIR)
+ @echo " $(CC) $(CFLAGS) $(LEXINC) -c -o $@ $<"; $(CC) $(CFLAGS) $(LEXINC) -c -o $@ $<
+
+$(LEXSRCDIR)/c_lexer.yy.cpp : $(LEXSRCDIR)/c_lexer.flex
+ @echo "Creating flex"
+ @echo " flex -o $@ $<"; flex -o $@ $<
+
+# Make the c_parser
+bin/c_parser : $(PARBUILDDIR)/parser_main.o $(PARBUILDDIR)/c_parser.tab.o $(PARBUILDDIR)/c_lexer.yy.o
+ @echo "Linking..."
+ @echo " mkdir -p bin"; mkdir -p bin
+ @echo " $(CC) $^ -o $@"; $(CC) $^ -o $@
+
+$(PARBUILDDIR)/%.o : $(PARSRCDIR)/%.cpp
+ @echo "Building sources..."
+ @echo " mkdir -p $(PARBUILDDIR)"; mkdir -p $(PARBUILDDIR)
+ @echo " $(CC) $(CFLAGS) $(PARINC) -c -o $@ $<"; $(CC) $(CFLAGS) $(PARINC) -c -o $@ $<
+
+$(PARBUILDDIR)/%.yy.o : $(PARSRCDIR)/%.yy.cpp
+ @echo "Building lex..."
+ @echo " mkdir -p $(PARBUILDDIR)"; mkdir -p $(PARBUILDDIR)
+ @echo " $(CC) $(CFLAGS) $(PARINC) -c -o $@ $<"; $(CC) $(CFLAGS) $(PARINC) -c -o $@ $<
+
+$(PARBUILDDIR)/c_parser.tab.o : $(PARSRCDIR)/c_parser.tab.cpp
+ @echo "Building yacc..."
+ @echo " mkdir -p $(PARBUILDDIR)"; mkdir -p $(PARBUILDDIR)
+ @echo " $(CC) $(CFLAGS) $(PARINC) -c -o $@ $<"; $(CC) $(CFLAGS) $(PARINC) -c -o $@ $<
+
+$(PARSRCDIR)/c_lexer.yy.cpp : $(PARSRCDIR)/c_lexer.flex
+ @echo "Creating lex..."
+ @echo " flex -o $@ $<"; flex -o $@ $<
+
+$(PARSRCDIR)/c_parser.tab.cpp $(PARSRCDIR)/c_parser.tab.hpp : $(PARSRCDIR)/c_parser.y
+ @echo "Creating yacc..."
+ @echo " bison -v -d $< -o $(PARSRCDIR)/c_parser.tab.cpp"; bison -v -d $< -o $(PARSRCDIR)/c_parser.tab.cpp
+
+# Make the c_parser
+bin/c_compiler: $(COMPBUILDDIR)/compiler_main.o $(COMPBUILDDIR)/statement.o \
+ $(COMPBUILDDIR)/function.o $(COMPBUILDDIR)/expression.o \
+ $(COMPBUILDDIR)/translation_unit.o \
+ $(COMPBUILDDIR)/declaration.o $(COMPBUILDDIR)/type.o \
+ $(COMPBUILDDIR)/c_parser.tab.o $(COMPBUILDDIR)/c_lexer.yy.o
+ @echo "Linking..."
+ @echo " mkdir -p bin"; mkdir -p bin
+ @echo " $(CC) $^ -o $@"; $(CC) $^ -o $@
+
+$(COMPBUILDDIR)/%.o : $(COMPSRCDIR)/%.cpp
+ @echo "Building sources..."
+ @echo " mkdir -p $(COMPBUILDDIR)"; mkdir -p $(COMPBUILDDIR)
+ @echo " $(CC) $(CFLAGS) $(COMPINC) -c -o $@ $<"; $(CC) $(CFLAGS) $(COMPINC) -c -o $@ $<
+
+$(COMPBUILDDIR)/%.yy.o : $(COMPSRCDIR)/%.yy.cpp
+ @echo "Building lex..."
+ @echo " mkdir -p $(COMPBUILDDIR)"; mkdir -p $(COMPBUILDDIR)
+ @echo " $(CC) $(CFLAGS) $(COMPINC) -c -o $@ $<"; $(CC) $(CFLAGS) $(COMPINC) -c -o $@ $<
+
+$(COMPBUILDDIR)/c_parser.tab.o : $(COMPSRCDIR)/c_parser.tab.cpp
+ @echo "Building yacc..."
+ @echo " mkdir -p $(COMPBUILDDIR)"; mkdir -p $(COMPBUILDDIR)
+ @echo " $(CC) $(CFLAGS) $(COMPINC) -c -o $@ $<"; $(CC) $(CFLAGS) $(COMPINC) -c -o $@ $<
+
+$(COMPSRCDIR)/c_lexer.yy.cpp : $(COMPSRCDIR)/c_lexer.flex
+ @echo "Creating lex..."
+ @echo " flex -o $@ $<"; flex -o $@ $<
+
+$(COMPSRCDIR)/c_parser.tab.cpp $(COMPSRCDIR)/c_parser.tab.hpp : $(COMPSRCDIR)/c_parser.y
+ @echo "Creating yacc..."
+ @echo " bison -v -d $< -o $(COMPSRCDIR)/c_parser.tab.cpp"; bison -v -d $< -o $(COMPSRCDIR)/c_parser.tab.cpp
+
+clean :
+ @echo "Cleaning..."
+ rm -rf bin
+ rm -rf $(LEXBUILDDIR)
+ rm -f $(LEXSRCDIR)/c_lexer.yy.cpp
+ rm -rf $(PARBUILDDIR)
+ rm -f $(PARSRCDIR)/c_lexer.yy.cpp
+ rm -f $(PARSRCDIR)/c_parser.tab.cpp
+ rm -f $(PARSRCDIR)/c_parser.tab.hpp
+ rm -f $(PARSRCDIR)/c_parser.output
+ rm -rf $(COMPBUILDDIR)
+ rm -f $(COMPSRCDIR)/c_lexer.yy.cpp
+ rm -f $(COMPSRCDIR)/c_parser.tab.cpp
+ rm -f $(COMPSRCDIR)/c_parser.tab.hpp
+ rm -f $(COMPSRCDIR)/c_parser.output
+
+.PHONY : clean