# Copyright (c) 2021 Huawei Device Co., Ltd.
#
# HDF is dual licensed: you can use it either under the terms of
# the GPL, or the BSD license, at your option.
# See the LICENSE file in the root of this repository for complete details.
INCLUDES:=-I $(PWD)
CODEGEN_SOURCE_DIR:=$(PWD)\codegen
CODEGEN_SOURCE:=$(wildcard $(CODEGEN_SOURCE_DIR)/*.cpp)
CODEGEN_OBJ_DIR:=$(BUILD_DIR)\codegen
CODEGEN_OBJS:=$(addprefix $(CODEGEN_OBJ_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(CODEGEN_SOURCE))))
PARSER_SOURCE_DIR:=$(PWD)\parser
PARSER_SOURCE:=$(wildcard $(PARSER_SOURCE_DIR)/*.cpp)
PARSER_OBJS_DIR:=$(BUILD_DIR)\parser
PARSER_OBJS:=$(addprefix $(PARSER_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(PARSER_SOURCE))))
PREPROCESSOR_SOURCE_DIR := $(PWD)\preprocessor
PREPROCESSOR_SOURCE := $(wildcard $(PREPROCESSOR_SOURCE_DIR)/*.cpp)
PREPROCESSOR_OBJS_DIR := $(BUILD_DIR)\preprocessor
PREPROCESSOR_OBJS := $(addprefix $(PREPROCESSOR_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(PREPROCESSOR_SOURCE))))
LEXER_SOURCE_DIR := $(PWD)\lexer
LEXER_SOURCE := $(wildcard $(LEXER_SOURCE_DIR)/*.cpp)
LEXER_OBJS_DIR := $(BUILD_DIR)\lexer
LEXER_OBJS := $(addprefix $(LEXER_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(LEXER_SOURCE))))
AST_SOURCE_DIR:=$(PWD)\ast
AST_SOURCE:=$(wildcard $(AST_SOURCE_DIR)/*.cpp)
AST_OBJS_DIR:=$(BUILD_DIR)\ast
AST_OBJS:=$(addprefix $(AST_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(AST_SOURCE))))
UTIL_SOURCE_DIR:=$(PWD)\util
UTIL_SOURCE:=$(wildcard $(UTIL_SOURCE_DIR)/*.cpp)
UTIL_OBJS_DIR:=$(BUILD_DIR)\util
UTIL_OBJS:=$(addprefix $(UTIL_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(UTIL_SOURCE))))
MAIN_SOURCE:=$(wildcard *.cpp)
MAIN_OBJS:=$(addprefix $(BUILD_DIR)\, $(patsubst %.cpp, %.o, $(MAIN_SOURCE)))
all : $(TARGET)
$(TARGET) : $(UTIL_OBJS) $(AST_OBJS) $(LEXER_OBJS) $(PREPROCESSOR_OBJS) $(PARSER_OBJS) $(CODEGEN_OBJS) $(MAIN_OBJS)
$(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@
$(Q) echo $(TARGET):build successful.
$(BUILD_DIR)\\%.o : %.cpp
$(Q) if not exist $(BUILD_DIR) (mkdir $(BUILD_DIR))
$(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@
$(CODEGEN_OBJ_DIR)\\%.o : $(CODEGEN_SOURCE_DIR)\\%.cpp
$(Q) if not exist $(CODEGEN_OBJ_DIR) (mkdir $(CODEGEN_OBJ_DIR))
$(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@
$(PARSER_OBJS_DIR)\\%.o : $(PARSER_SOURCE_DIR)\\%.cpp
$(Q) if not exist $(PARSER_OBJS_DIR) (mkdir $(PARSER_OBJS_DIR))
$(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@
$(PREPROCESSOR_OBJS_DIR)\\%.o : $(PREPROCESSOR_SOURCE_DIR)\\%.cpp
$(Q) if not exist $(PREPROCESSOR_OBJS_DIR) (mkdir $(PREPROCESSOR_OBJS_DIR))
$(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@
$(LEXER_OBJS_DIR)\\%.o : $(LEXER_SOURCE_DIR)\\%.cpp
$(Q) if not exist $(LEXER_OBJS_DIR) (mkdir $(LEXER_OBJS_DIR))
$(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@
$(AST_OBJS_DIR)\\%.o : $(AST_SOURCE_DIR)\\%.cpp
$(Q) if not exist $(AST_OBJS_DIR) (mkdir $(AST_OBJS_DIR))
$(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@
$(UTIL_OBJS_DIR)\\%.o : $(UTIL_SOURCE_DIR)\\%.cpp
$(Q) if not exist $(UTIL_OBJS_DIR) (mkdir $(UTIL_OBJS_DIR))
$(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@
clean:
$(Q) if exist $(TARGET) (del $(TARGET))
$(Q) if exist $(BUILD_DIR) (rd /s /q $(BUILD_DIR))
.PHONY:all clean