blob: 015ef05138b1cab252e1eaa984fda4788a3098b7 [file] [log] [blame] [edit]
#Tools
CXX = g++
AR = ar
LEXER_GEN = flex
PARSER_GEN = bison
#Whether this is a debug (symbols, no opt) or
# release (no symbols, opt) build. May be
# inherited from build environment. Can
# override by defining below.
#
# Can be 'debug' or 'release'
#BUILD_TYPE = release
# How verbose we want the make file
# 0: print nothing
# 1: print high-level message
# 2: print high-level message + detailed command
VERBOSITY = 1
#Verbosity Configuration
vecho_0 = true
vecho_1 = echo
vecho_2 = echo
vecho = $(vecho_$(VERBOSITY))
AT_0 := @
AT_1 := @
AT_2 :=
AT = $(AT_$(VERBOSITY))
#Final output files
EXE=sdc_parse_test
STATIC_LIB=libsdc_parse.a
#Flags
WARN_FLAGS = -Wall -Wpointer-arith -Wcast-qual -D__USE_FIXED_PROTOTYPES__ -ansi -pedantic -Wshadow -Wcast-align -D_POSIX_SOURCE -Wno-write-strings
DEP_FLAGS = -MMD -MP
DEBUG_FLAGS = -g -ggdb3 -g3 -O0 -fno-inline
OPT_FLAGS = -O3
ifneq (,$(findstring release, $(BUILD_TYPE)))
DEBUG_OPT_FLAGS := $(OPT_FLAGS)
else
DEBUG_OPT_FLAGS := $(DEBUG_FLAGS)
endif
INC_FLAGS = -I$(SRC_DIR) -I$(OBJ_DIR)
CFLAGS = $(DEP_FLAGS) $(WARN_FLAGS) $(DEBUG_OPT_FLAGS) $(INC_FLAGS)
#Objects
#.SUFFIXES: .o .c .y .l
SRC_DIR = src
OBJ_DIR = obj
main_src = $(SRC_DIR)/main.c
main_obj := $(patsubst %.c, %.o, $(main_src))
main_obj := $(foreach obj, $(main_obj), $(patsubst $(SRC_DIR)/%.o, $(OBJ_DIR)/%.o, $(obj)))
lib_src = $(SRC_DIR)/sdc_common.c $(SRC_DIR)/sdc.c
lib_obj := $(patsubst %.c, %.o, $(lib_src))
lib_obj := $(foreach obj, $(lib_obj), $(patsubst $(SRC_DIR)/%.o, $(OBJ_DIR)/%.o, $(obj)))
LEXER_SRC = $(SRC_DIR)/sdc_parse.l
LEXER_GEN_SRC = $(SRC_DIR)/sdc_parse.lex.c
LEXER_GEN_OBJ := $(LEXER_GEN_SRC:.c=.o)
LEXER_GEN_OBJ := $(foreach obj, $(LEXER_GEN_OBJ), $(patsubst $(SRC_DIR)/%.o, $(OBJ_DIR)/%.o, $(obj)))
PARSER_SRC = $(SRC_DIR)/sdc_parse.y
PARSER_GEN_SRC = $(SRC_DIR)/sdc_parse.tab.c
PARSER_GEN_OBJ := $(PARSER_GEN_SRC:.c=.o)
PARSER_GEN_OBJ := $(foreach obj, $(PARSER_GEN_OBJ), $(patsubst $(SRC_DIR)/%.o, $(OBJ_DIR)/%.o, $(obj)))
OBJECTS_LIB = $(lib_obj) $(LEXER_GEN_OBJ) $(PARSER_GEN_OBJ)
OBJECTS_EXE = $(main_obj) $(OBJECTS_LIB)
#Dependancies
DEP = $(OBJECTS_EXE:.o=.d)
#Rules
.PHONY: clean
all: $(OBJ_DIR) $(STATIC_LIB) $(EXE)
-include $(DEP)
#Not part of the default make, call 'make grammar' if you want to
grammar:
@$(vecho) "Re-generating parser and lexer. Clean with 'make clean_grammar'."
@$(vecho) "Generating Parser $(PARSER_SRC)..."
$(AT) $(PARSER_GEN) -d -o $(PARSER_GEN_SRC) $(PARSER_SRC)
@$(vecho) "Generating Lexer $(LEXER_SRC)..."
@#Avoid including "unistd.h" since it is unavailable on windows
$(AT) $(LEXER_GEN) --nounistd -o $(LEXER_GEN_SRC) $(LEXER_SRC)
$(EXE): $(OBJECTS_EXE)
@$(vecho) "Linking executable: $@"
$(AT) $(CXX) $(CFLAGS) -o $@ $(OBJECTS_EXE)
$(STATIC_LIB): $(OBJECTS_LIB)
@$(vecho) "Linking static library: $@"
$(AT) $(AR) rcs $@ $(OBJECTS_LIB)
$(LEXER_GEN_OBJ): $(LEXER_GEN_SRC) $(PARSER_GEN_SRC)
@$(vecho) "Compiling Lexer $<..."
@#Suppress warning about unused function produced by flex
$(AT) $(CXX) $(CFLAGS) -Wno-unused-function -c $< -o $@
$(PARSER_GEN_OBJ): $(PARSER_GEN_SRC)
@$(vecho) "Compiling Parser $<..."
$(AT) $(CXX) $(CFLAGS) -c $< -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
@$(vecho) "Compiling Source $<..."
$(AT) $(CXX) $(CFLAGS) -c $< -o $@
$(OBJ_DIR):
@ mkdir -p $@
clean:
rm -f $(OBJECTS_EXE)
rm -f $(DEP)
rm -rf $(OBJ_DIR)
rm -f $(EXE)
rm -f $(STATIC_LIB)
clean_grammar:
@$(vecho) "Removing generated parser and lexer. Regenerate with 'make grammar'."
rm -f $(LEXER_GEN_SRC)
rm -f $(PARSER_GEN_SRC)