.PHONY: clean build_all MakeTmpDirectories CreateAndCleanBinDirectory CleanTmpDirectory PrintCompilerVersion PrintIncludePaths ExtractCompiler

# ------------------------------------------------------------------------------
# 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 G00Ps066_App_default.
# ------------------------------------------------------------------------------
TYP_NAME     := $(TYP_NAME)


# ------------------------------------------------------------------------------
# See also Make_005_UserSettings.gmk
# Set the default MISRA type.
# Common settings are QAC or PCLINT
# 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 = PCLINT


# ------------------------------------------------------------------------------
# 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 = $$
DQUOTE = \"
DQ     = "

COMMA  = ,

# ------------------------------------------------------------------------------
# Additional included makefiles
# ------------------------------------------------------------------------------
-include $(CURDIR)/../Make/Make_005_UserSettings.gmk
include $(CURDIR)/../Make/Make_010_Paths.gmk
include $(CURDIR)/../Make/Unix_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/Unix_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

# ------------------------------------------------------------------------------
# Basic Rules
# ------------------------------------------------------------------------------
MakeTmpDirectories:
	@$(GNUECHO) +++ making tmp directories
	@$(MKDIR) -p $(PATH_TMP_NAME_ERR)
	@$(MKDIR) -p $(PATH_TMP_NAME_LST)
	@$(MKDIR) -p $(PATH_TMP_NAME_OBJ)
	@$(MKDIR) -p $(PATH_TMP_NAME_QAC)

.ONESHELL:
ExtractCompiler:
ifeq ($(TYP_CC),ARM_GCC)
	if [ -f $(PATH_TOOLS_COMPILER_TGT)/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 ]
	then
		@$(GNUECHO) "+++ Unzipping ARM_GCC Compiler +++"
		cd $(PATH_TOOLS_COMPILER_TGT); bzip2 -d gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
	fi
	if [ -f $(PATH_TOOLS_COMPILER_TGT)/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar ]
	then
		@$(GNUECHO) "+++ Extracting ARM_GCC Compiler +++"
		cd $(PATH_TOOLS_COMPILER_TGT); tar xf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar
	fi
endif

CreateAndCleanBinDirectory:
	@$(GNUECHO) +++ cleaning bin directory
#	@$(RM) $(PATH_BIN_NAME)/*.*

CleanTmpDirectory:
	@$(GNUECHO) +++ cleaning tmp directories
	@$(GNUECHO)
	@$(RM) -rf $(PATH_TMP_NAME_ERR)
	@$(RM) -rf $(PATH_TMP_NAME_LST)
	@$(RM) -rf $(PATH_TMP_NAME_OBJ)
	@$(RM) -rf $(PATH_TMP_NAME_QAC)

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) $(CC)
	@$(GNUECHO)

PrintIncludePaths:
	@$(GNUECHO) "+++ creating compiler include path file $(INCLUDE_PATHS_FILE) +++"
	@$(GNUECHO)
	@$(GNUECHO) $(addsuffix \n,$(C_INC_PARAM))>>$(INCLUDE_PATHS_FILE)
	@$(GNUECHO) $(C_INC_PARAM)>>$(INCLUDE_PATHS_FILE)
	@$(GNUECHO)
	@$(GNUECHO) "+++ creating objects file $(LINK_OBJECTS_FILE) +++"
	@$(GNUECHO) $(addsuffix \n,$(FILES_TMP_OBJ))>>$(LINK_OBJECTS_FILE)
	@$(GNUECHO) $(FILES_TMP_OBJ)>>$(LINK_OBJECTS_FILE)
	@$(GNUECHO)

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 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 ExtractCompiler CreateAndCleanBinDirectory PrintRebuildType PrintCompilerVersion PrintIncludePaths PrintCompilerFlags PrintDebugInfo DoMisraPrepare PreBuild

MultiCore_Build_C         : LinkObjectFiles

SingleCore_Finalize       : HexManip ALSize PostBuild DoMisraFinalize
