#   Zerocat Chipflasher --- Flash free firmware, kick the Management Engine.
#
#   Copyright (C) 2015, 2016  kai <kmx@posteo.net>
#   Copyright (C) 2016, 2017, 2018, 2020, 2021, 2022, 2023, 2026  Kai Mertens <kmx@posteo.net>
#
#   This file is part of Zerocat Chipflasher.
#
#   Zerocat Chipflasher is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by the Free
#   Software Foundation, either version 3 of the License, or (at your option) any
#   later version.
#
#   Zerocat Chipflasher is distributed in the hope that it will be useful, but
#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
#   FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
#   details.
#
#   You should have received a copy of the GNU General Public License
#   along with Zerocat Chipflasher.
#   If not, see <http://www.gnu.org/licenses/>.


#   Documentation
#   =============
#
#
#   Usage
#   -----
#
#
#       $ make help


# Shell
SHELL                         := /bin/sh


# White Space
EMPTY                         :=
SPACE                         := $(EMPTY) $(EMPTY)
COMMA                         := ,
M5                            := eeeee


# Titles
PROJECT_TITLE                 := Zerocat Chipflasher
PROJECT_BRIEF                 := Flash free firmware to BIOS chips, kick the Management Engine.
MAKEFILE_TITLE                := Build ‘connect’, the project’s host utility.


# Root Paths
ROOT_DOC                      := ../../doc/
ROOT_FW1_SRC                  := ../../firmware1/src/


# Tools
CP                            := cp
TOOL := $(CP)
MV                            := mv
TOOL += $(MV)
RM                            := rm
TOOL += $(RM)
CUT                           := cut
TOOL += $(CUT)
GIT                           := git
TOOL += $(GIT)
SED                           := sed
TOOL += $(SED)
SET                           := set
TOOL += $(SET)
ECHO                          := echo
TOOL += $(ECHO)
GCC                           := gcc
TOOL += $(GCC)


# Tool Flags
CP_FLAGS                      :=
MV_FLAGS                      :=
RM_FLAGS                      := -f
CUT_FLAGS                     := -d' '
GIT_FLAGS                     :=
SED_FLAGS                     := -E
SET_FLAGS                     := -f
ECHO_FLAGS                    :=
GCC_FLAGS                     := -Wall -fno-diagnostics-show-caret -fno-diagnostics-color
GCC_FLAGS_DEBUG               := -O0 -g -Wall


# Tool Check
CHECK=$(if $(strip $(shell command -v $(TOOL))),,$(error $(TOOL) -- No such tool))
$(foreach TOOL,$(TOOLS),$(CHECK))


# Project Numbers
include $(ROOT_DOC)project-numbers.mk


# Files
LIBCOMMON                     := $(wildcard $(ROOT_FW1_SRC)/libcommon/*)


# Tinned Cans: HEADER, HEADLINE, DONE
include $(ROOT_DOC)tinned-headers.mk


# Remove corrupted files
.DELETE_ON_ERROR :


# Suffixes, to be checked for old fashioned suffix rules
.SUFFIXES :


# Intermediate Targets
#~ .INTERMEDIATE :


# Secondary Targets, enable empty list for debugging
#~ .SECONDARY :


# Phony Targets
.PHONY :\
	all\
	slow-kick-timings\
	fast-kick2-timings\
	\
	hello\
	help\
	\
	clean


# Targets
#   default target
all : hello fast-kick2-timings connect
	@$(HEADLINE)\
	&& $(DONE);

#   display greeting, provided with all, clean and help
hello :
	@$(HEADER)\
	&& $(DONE);

#   display help information
help : hello
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "List of Targets"\
	&& $(ECHO) $(ECHO_FLAGS) "==============="\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Default Goal"\
	&& $(ECHO) $(ECHO_FLAGS) "------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "all"\
	&& $(ECHO) $(ECHO_FLAGS) "    same as connect, with hello greeter"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Help"\
	&& $(ECHO) $(ECHO_FLAGS) "----"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "hello"\
	&& $(ECHO) $(ECHO_FLAGS) "    greeter, provided with all, clean and help"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "help"\
	&& $(ECHO) $(ECHO_FLAGS) "    display this help information"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Configure"\
	&& $(ECHO) $(ECHO_FLAGS) "---------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "slow-kick-timings"\
	&& $(ECHO) $(ECHO_FLAGS) "    use slow timings for usage with ‘kick’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "fast-kick2-timings"\
	&& $(ECHO) $(ECHO_FLAGS) "    use fast timings for usage with ‘kick2’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Compile"\
	&& $(ECHO) $(ECHO_FLAGS) "-------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "connect"\
	&& $(ECHO) $(ECHO_FLAGS) "    build ‘connect’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Clean"\
	&& $(ECHO) $(ECHO_FLAGS) "-----"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean"\
	&& $(ECHO) $(ECHO_FLAGS) "    clean ‘connect’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(DONE);

#   configure slow timings for usage with kick
slow-kick-timings :
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "# ifndef __TIMINGS_H__" > timings.h\
	&& $(ECHO) $(ECHO_FLAGS) "#   define __TIMINGS_H__" >> timings.h\
	&& $(ECHO) $(ECHO_FLAGS) "#   define USE_SLOW_KICK_TIMINGS" >> timings.h\
	&& $(ECHO) $(ECHO_FLAGS) "# endif    //__TIMINGS_H__" >> timings.h\
	&& $(DONE);

#   configure fast timings for usage with kick2
fast-kick2-timings :
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "# ifndef __TIMINGS_H__" > timings.h\
	&& $(ECHO) $(ECHO_FLAGS) "#   define __TIMINGS_H__" >> timings.h\
	&& $(ECHO) $(ECHO_FLAGS) "//#   define USE_SLOW_KICK_TIMINGS" >> timings.h\
	&& $(ECHO) $(ECHO_FLAGS) "# endif    //__TIMINGS_H__" >> timings.h\
	&& $(DONE);

#   build `connect'
connect : connect.o
	@$(HEADLINE)\
	&& $(GCC) $(GCC_FLAGS) -o $(@) $(<)\
	&& $(DONE);

connect.o : connect.c identifier.h timings.h connect.h $(LIBCOMMON)
	@$(HEADLINE)\
	&& $(SED) $(SED_FLAGS) --in-place -e's,<VERSION>,$(PROJECT_NUMBER),g;' identifier.h\
	&& $(GCC) $(GCC_FLAGS) -c $(<)\
	&& $(DONE);

identifier.h : identifier.h.tmpl
	@$(HEADLINE)\
	&& $(CP) $(CP_FLAGS) $(<) $(@)\
	&& $(DONE);

clean : hello
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		connect\
		connect.o\
		identifier.h\
		timings.h\
	&& $(DONE);
