.PHONY: clean build_all MakeTmpDirectories CreateAndCleanBinDirectory CleanTmpDirectory PrintCompilerVersion PrintIncludePaths

# ------------------------------------------------------------------------------
# Set the default shell.
# This might be needed if cygwin, MinGW, etc. are installed in Windows path
# ------------------------------------------------------------------------------

ifeq ($(OS),Windows_NT)
SHELL  := CMD
endif

# ------------------------------------------------------------------------------
# Begin Expert build area using TYP_RULE: Watch out!
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# Define TYP_SPECIAL_BUILD_OR_REBUILD based on TYP_RULE.
# TYP_SPECIAL_BUILD_OR_REBUILD =
#  TYP_SPECIAL_BUILD_OR_REBUILD_NONE         (Normal case, nothing special.)
#  TYP_SPECIAL_BUILD_OR_REBUILD_DEVELOPER    (Speed optimized, use rebuild_developer or all_developer on command line.)
#  TYP_SPECIAL_BUILD_OR_REBUILD_DELIVERY     (Uses all of the build, makes RDM symbols and even executes QAC analysis.)
# ------------------------------------------------------------------------------

TYP_SPECIAL_BUILD_OR_REBUILD   = TYP_SPECIAL_BUILD_OR_REBUILD_NONE

ifeq ($(TYP_RULE),rebuild_delivery)
TYP_SPECIAL_BUILD_OR_REBUILD  := TYP_SPECIAL_BUILD_OR_REBUILD_DELIVERY
endif

ifeq ($(TYP_RULE),rebuild_developer)
TYP_SPECIAL_BUILD_OR_REBUILD  := TYP_SPECIAL_BUILD_OR_REBUILD_DEVELOPER
endif

ifeq ($(TYP_RULE),all_developer)
TYP_SPECIAL_BUILD_OR_REBUILD  := TYP_SPECIAL_BUILD_OR_REBUILD_DEVELOPER
endif

# ------------------------------------------------------------------------------
# End Expert build area using TYP_RULE
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# Get $(TYP_NAME) from Make.bat originally from Build.bat.
# Here, $(TYP_NAME) is something like x01AN012_App_default.
# ------------------------------------------------------------------------------
TYP_NAME     := $(TYP_NAME)


# ------------------------------------------------------------------------------
# See also Make_005_UserSettings.gmk
# Set the default MISRA type and the COVER type.
# Note that TYP_TEST and TYP_COVER are supplied directly in command line parameters to build.bat.
# TYP_MISRA can (in the future) be over-written with user-specific build options in Make_005_UserSettings.gmk
# ------------------------------------------------------------------------------
TYP_MISRA = QAC

# ------------------------------------------------------------------------------
# See also Make_005_UserSettings.gmk
# Set the default MISRA output format to "sql", which will be reset in the UserSettings file.
# This way the user will get the textual output, and as a consequence,
# if the UserSettings file is deleted on the server, then the format will be "sql".
# ------------------------------------------------------------------------------
MISRA_OUTPUT_SQL_FORMAT = SQL

# ------------------------------------------------------------------------------
# Punctuation
# ------------------------------------------------------------------------------
SPACE :=
SPACE +=

DOLLAR := $$
$(DOLLAR) := $$

SQUOTE := \'
$(SQUOTE) := \'

DQUOTE := \"
$(DQUOTE) := \"

HASH_MARK := \#
$(HASH_MARK) := \#

QUESTION_MARK := \?
$(QUESTION_MARK) := \?

COMMA := ,

COLON := :
$(COLON) := :

BACKSLASH := \\
$(BACKSLASH) := \\

# ------------------------------------------------------------------------------
# Additional included makefiles
# ------------------------------------------------------------------------------
include $(CURDIR)/../Make/Make_003_ReleaseSettings.gmk
-include $(CURDIR)/../Make/Make_005_UserSettings.gmk
include $(CURDIR)/../Make/Make_010_Paths.gmk
include $(CURDIR)/../Make/Make_020_Tools.gmk
include $(CURDIR)/../Make/Make_030_Flags.gmk
include $(CURDIR)/../Make/Make_050_Files.gmk
include $(CURDIR)/../Make/Make_070_Link.gmk
include $(CURDIR)/../Make/Make_100_HexManip.gmk
include $(CURDIR)/../Make/Make_110_PCLint.gmk
include $(CURDIR)/../Make/Make_120_Misra.gmk
include $(CURDIR)/../Make/Make_130_Cover.gmk
include $(CURDIR)/../Make/Make_150_Sizes.gmk
include $(CURDIR)/../Make/Make_180_PreBuild.gmk
include $(CURDIR)/../Make/Make_200_PostBuild.gmk
include $(CURDIR)/../Make/Make_500_Rules.gmk

# ------------------------------------------------------------------------------
# Helper files used in the build
# ------------------------------------------------------------------------------
FILE_BIN_NAME      = $(PATH_BIN_NAME)/$(TYP_NAME)

INCLUDE_PATHS_FILE    = $(PATH_TMP_NAME_OBJ)/_compile_paths.txt
INCLUDE_PATHS_FILE_VS = $(PATH_TMP_NAME_OBJ)/_compile_paths_vs.txt
LINK_OBJECTS_FILE     = $(PATH_TMP_NAME_OBJ)/_object_files.txt
SOLUTION_DIR          = $(DOLLAR)^(SolutionDir^)

# ------------------------------------------------------------------------------
# Basic Rules
# ------------------------------------------------------------------------------
MakeTmpDirectories:
	@$(GNUECHO) +++ making tmp directories
	@if not exist $(subst /,\,$(PATH_TMP_BASE))      $(MKDIR) $(subst /,\,$(PATH_TMP_BASE))
	@if not exist $(subst /,\,$(PATH_TMP_NAME))      $(MKDIR) $(subst /,\,$(PATH_TMP_NAME))
	@if not exist $(subst /,\,$(PATH_TMP_NAME_ERR))  $(MKDIR) $(subst /,\,$(PATH_TMP_NAME_ERR))
	@if not exist $(subst /,\,$(PATH_TMP_NAME_OBJ))  $(MKDIR) $(subst /,\,$(PATH_TMP_NAME_OBJ))
	@if not exist $(subst /,\,$(PATH_TMP_NAME_LST))  $(MKDIR) $(subst /,\,$(PATH_TMP_NAME_LST))
	@if not exist $(subst /,\,$(PATH_TMP_NAME_QAC))  $(MKDIR) $(subst /,\,$(PATH_TMP_NAME_QAC))
	 
CreateAndCleanBinDirectory:
	@$(GNUECHO) +++ cleaning bin directory
	@if not exist $(subst /,\,$(PATH_BIN_BASE))      $(MKDIR) $(subst /,\,$(PATH_BIN_BASE))
	@if not exist $(subst /,\,$(PATH_BIN_NAME))      $(MKDIR) $(subst /,\,$(PATH_BIN_NAME))
	@if exist $(subst /,\,$(PATH_BIN_NAME)/*.*) $(QDEL) $(subst /,\,$(PATH_BIN_NAME)/*.*)  > NUL  2> NUL

CleanTmpDirectory:
	@$(GNUECHO) +++ cleaning tmp directories
	@$(GNUECHO)
	@-$(QDEL) $(subst /,\,$(PATH_TMP_NAME_ERR)/*.*) > NUL  2> NUL
	@-$(QDEL) $(subst /,\,$(PATH_TMP_NAME_LST)/*.*) > NUL  2> NUL
	@-$(QDEL) $(subst /,\,$(PATH_TMP_NAME_OBJ)/*.*) > NUL  2> NUL
	@-$(QDEL) $(subst /,\,$(PATH_TMP_NAME_QAC)/*.*) > NUL  2> NUL

PrintRebuildType:
	@$(GNUECHO)
	@$(GNUECHO) +++ print rebuild type +++
	@$(GNUECHO) TYP_SPECIAL_BUILD_OR_REBUILD $(TYP_SPECIAL_BUILD_OR_REBUILD)
	@$(GNUECHO)

PrintCompilerVersion:
	@$(GNUECHO)
	@$(GNUECHO) +++ print GNUmake version +++
	@$(MAKE) -v
	@$(GNUECHO)
	@$(GNUECHO) +++ print compiler version +++
	@$(RULE_SHOW_COMPILER_VERSION_CMD)
	@$(GNUECHO)

PrintIncludePaths:
	@$(GNUECHO) +++ print compiler include paths (for VisualStudio browsing) +++
	@$(GNUECHO) $(subst $(SPACE),,$(addsuffix ;,$(subst $(CURDIR)/,$(DOLLAR)(SolutionDir),$(C_INCLUDES))))
	@$(GNUECHO)
	@$(GNUECHO) +++ print compiler include paths (as used by the compiler) +++
	@$(GNUECHO) $(C_INC_PARAM)
	@$(GNUECHO)
	@$(GNUECHO) +++ creating compiler include path file $(subst \,/,$(INCLUDE_PATHS_FILE)) +++
	@$(GNUECHO)
	@$(GNUECHO) > $(INCLUDE_PATHS_FILE)
	@FOR %%A IN ($(subst \,/,$(C_INC_PARAM))) DO echo %%A>>$(subst /,\,$(INCLUDE_PATHS_FILE))
	@$(GNUECHO)
	@$(GNUECHO) +++ creating objects file $(subst \,/,$(LINK_OBJECTS_FILE)) +++
	@$(GNUECHO) > $(LINK_OBJECTS_FILE)
	@FOR %%A IN ($(subst \,/,$(FILES_TMP_OBJ))) DO echo %%A>>$(subst /,\,$(LINK_OBJECTS_FILE))

	@$(GNUECHO)
#	@$(GNUECHO) FILES_SRC_GEN = $(FILES_SRC_GEN)
#	@$(GNUECHO) FILES_SRC_HAL = $(FILES_SRC_HAL)
#	@$(GNUECHO) FILES_SRC_CDD = $(FILES_SRC_CDD)
#	@$(GNUECHO) FILES_SRC_SWC = $(FILES_SRC_SWC)
#	@$(GNUECHO) FILES_SRC_CUST = $(FILES_SRC_CUST)
#	@$(GNUECHO) FILES_SRC_MCAL = $(FILES_SRC_MCAL)
#	@$(GNUECHO) C_SRC_CUST_MCAL1 = $(C_SRC_CUST_MCAL)

	@$(GNUECHO) FILES_SRC_ALL_FROM_MAKEFILES = $(FILES_SRC_ALL_FROM_MAKEFILES)  
#	@$(GNUECHO) FILES_TMP_OBJ = $(FILES_TMP_OBJ)  
#	@$(GNUECHO) VPATH1 $(VPATH)


ifeq ($(TYP_SPECIAL_BUILD_OR_REBUILD),TYP_SPECIAL_BUILD_OR_REBUILD_DEVELOPER)
else
	@$(GNUECHO) +++ print compiler include paths (for VisualStudio browsing) +++
	@$(GNUECHO) > $(INCLUDE_PATHS_FILE_VS)
	@FOR %%A IN ($(subst /,\,$(subst $(CURDIR)/,$(SOLUTION_DIR),$(C_INCLUDES)))) DO echo|set /p DummyText="%%A;">>$(subst /,\,$(INCLUDE_PATHS_FILE_VS))
	@$(GNUECHO) >> $(INCLUDE_PATHS_FILE_VS)
	@$(CAT) $(INCLUDE_PATHS_FILE_VS)
	@$(GNUECHO)
	@$(GNUECHO) +++ print compiler include paths (as used by the compiler) +++
	@$(CAT) $(INCLUDE_PATHS_FILE)
	@$(GNUECHO)
	@$(GNUECHO) +++ print compiler definitions (for VisualStudio browsing) +++
	@$(GNUECHO) $(addsuffix ;,$(C_DEFINES) $(C_DEFINES_TOOL_INTERNAL))
	@$(GNUECHO)
	@$(GNUECHO) +++ print compiler definitions (as used by the compiler) +++
	@$(GNUECHO) $(C_DEF_PARAM)
endif

PrintCompilerFlags:
	@$(GNUECHO)
	@$(GNUECHO) +++ print compiler CFLAGS_DEFAULT (for code review) +++
	@$(GNUECHO) $(CFLAGS_DEFAULT)
	@$(GNUECHO)
	@$(GNUECHO) +++ print compiler CPPFLAGS (for code review) +++
	@$(GNUECHO) $(CPPFLAGS)
	@$(GNUECHO)
	@$(GNUECHO) +++ print assembler AFLAGS (for code review) +++
	@$(GNUECHO) $(AFLAGS)
	@$(GNUECHO)
	@$(GNUECHO) +++ print linker LDFLAGS (for code review) +++
	@$(GNUECHO) $(LDFLAGS)
	@$(GNUECHO)

PrintDebugInfo:
	@$(GNUECHO) Additional debug information:
	@$(GNUECHO) PATH_SRC_CUST_VAR_BUILD : $(PATH_SRC_CUST_VAR_BUILD)
	@$(GNUECHO) PATH_SRC_CUST           : $(PATH_SRC_CUST)
	@$(GNUECHO) PATH_SRC_CUST_SWC/SwcExample/Api: $(PATH_SRC_CUST_SWC)/SwcExample/Api
	@$(GNUECHO)
	@$(GNUECHO) ENV_MAKE_CDD            : $(ENV_MAKE_CDD)
	@$(GNUECHO) PATH_SRC_CDD            : $(PATH_SRC_CDD)
	@$(GNUECHO) FILES_SRC_CDD           : $(FILES_SRC_CDD)
	@$(GNUECHO)
	@$(GNUECHO) ENV_MAKE_SWC            : $(ENV_MAKE_SWC)
	@$(GNUECHO) PATH_SRC_CUST_SWC       : $(PATH_SRC_CUST_SWC)
	@$(GNUECHO) PATH_SRC_SWC            : $(PATH_SRC_SWC) This is empty, and should be empty.
	@$(GNUECHO) FILES_SRC_SWC           : $(FILES_SRC_SWC)
	@$(GNUECHO)
	@$(GNUECHO) PATH_SRC_CUST           : $(PATH_SRC_CUST)
	@$(GNUECHO) ENV_MAKE_CUST_VAR_BUILD : $(ENV_MAKE_CUST_VAR_BUILD)
	@$(GNUECHO) C_DEFINES : $(C_DEFINES)
	@$(GNUECHO)
	@$(GNUECHO) FILES_COVER             : $(FILES_COVER)
	@$(GNUECHO)


# ------------------------------------------------------------------------------
# Rules: Main
# ------------------------------------------------------------------------------
SingleCore_Clean          : CleanTmpDirectory

SingleCore_Prepare        : MakeTmpDirectories CreateAndCleanBinDirectory PrintRebuildType PrintCompilerVersion PrintCompilerFlags PrintIncludePaths PrintDebugInfo DoMisraPrepare PreBuild

MultiCore_Build_C         : LinkObjectFiles

SingleCore_Finalize       : HexManip ALSize PostBuild DoMisraFinalize
