#   Copyright (C) 2017, 2018, 2020, 2021, 2022, 2023, 2024, 2025  Kai Mertens <kmx@posteo.net>
#
#   This source describes Hardware of a Free Design for the Zerocat Chipflasher
#   Project and is licensed under the CERN-OHL-S v2.
#
#   You may redistribute and modify this source and make products using it under
#   the terms of the CERN-OHL-S v2 (https://ohwr.org/cern_ohl_s_v2.txt) or any
#   later version.
#
#   This source is distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING
#   OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR
#   PURPOSE. Please see the CERN-OHL-S v2 for applicable conditions.
#
#   Source location:   git://zerocat.org/zerocat/projects/chipflasher.git
#
#   As per CERN-OHL-S v2 section 4, should You produce hardware based on this
#   source, You must where practicable maintain the Source Location visible on
#   the external case of the Chipflasher Device or other products you make using
#   this source.


#   Documentation
#   =============
#
#
#   Usage
#   -----
#
#
#       $ make
#       $ make gerbv
#       $ make clean


# Shell
SHELL                         := /bin/sh


# White Space
EMPTY                         :=
SPACE                         := $(EMPTY) $(EMPTY)
COMMA                         := ,
SQUOTE                        := '
HASH                          := $(shell echo '#';)
M5                            := ooooo
TAB1                          := $(SPACE)$(SPACE)$(SPACE)$(SPACE)


# Utilities
CD                            := $(shell command -v cd;)
CD_FLAGS                      :=
$(if $(strip $(CD)),,         $(error Cannot find cd utility))

CP                            := $(shell command -v cp;)
CP_FLAGS                      :=
$(if $(strip $(CP)),,         $(error Cannot find cp utility))

LS                            := $(shell command -v ls;)
LS_FLAGS                      :=
$(if $(strip $(LS)),,         $(error Cannot find ls utility))

MV                            := $(shell command -v mv;)
MV_FLAGS                      :=
$(if $(strip $(MV)),,         $(error Cannot find mv utility))

RM                            := $(shell command -v rm;)
RM_FLAGS                      := -f
$(if $(strip $(RM)),,         $(error Cannot find rm utility))

CAT                           := $(shell command -v cat;)
CAT_FLAGS                     :=
$(if $(strip $(CAT)),,        $(error Cannot find cat utility))

CUT                           := $(shell command -v cut;)
CUT_FLAGS                     := -d' '
$(if $(strip $(CUT)),,        $(error Cannot find cut utility))

GIT                           := $(shell command -v git;)
GIT_FLAGS                     :=
$(if $(strip $(GIT)),,        $(error Cannot find git utility))

SED                           := $(shell command -v sed;)
SED_FLAGS                     := -E
$(if $(strip $(SED)),,        $(error Cannot find sed utility))

SET                           := $(shell command -v set;)
SET_FLAGS                     := -f
$(if $(strip $(SET)),,        $(error Cannot find set utility))

SEQ                           := $(shell command -v seq;)
SEQ_FLAGS                     := -w
$(if $(strip $(SEQ)),,        $(error Cannot find seq utility))

ZIP                           := $(shell command -v zip;)
ZIP_FLAGS                     := -D
$(if $(strip $(ZIP)),,        $(error Cannot find zip utility))

ECHO                          := $(shell command -v echo;)
ECHO_FLAGS                    :=
$(if $(strip $(ECHO)),,       $(error Cannot find echo utility))

GREP                          := $(shell command -v grep;)
GREP_FLAGS                    :=
$(if $(strip $(GREP)),,       $(error Cannot find grep utility))

SORT                          := $(shell command -v sort;)
SORT_FLAGS                    :=
$(if $(strip $(SORT)),,       $(error Cannot find sort utility))

UNIQ                          := $(shell command -v uniq;)
UNIQ_FLAGS                    :=
$(if $(strip $(UNIQ)),,       $(error Cannot find uniq utility))

#   Note ‘mkdir -p’ might not be supported.
MKDIR                         := $(shell command -v mkdir;)
MKDIR_FLAGS                   :=
$(if $(strip $(MKDIR)),,      $(error Cannot find mkdir utility))

MKTEMP                        := $(shell command -v mktemp;)
MKTEMP_FLAGS                  :=
$(if $(strip $(MKTEMP)),,     $(error Cannot find mktemp utility))

MARKDOWN                      := $(shell command -v markdown;)
MARKDOWN_FLAGS                :=
$(if $(strip $(MARKDOWN)),,   $(error Cannot find markdown utility))

GAF                           := $(shell command -v gaf;)
GAF_FLAGS                     :=
$(if $(strip $(GAF)),,        $(error Cannot find gaf utility))

PCB                           := $(shell command -v pcb;)
PCB_FLAGS                     :=
$(if $(strip $(PCB)),,        $(error Cannot find pcb utility))

GUIX                          := $(shell command -v guix;)
GUIX_FLAGS                    :=
$(if $(strip $(GUIX)),,       $(error Cannot find guix utility))

GERBV                         := $(shell command -v gerbv;)
GERBV_FLAGS                   :=
$(if $(strip $(GERBV)),,      $(error Cannot find gerbv utility))

FFMPEG                        := $(shell command -v ffmpeg;)
FFMPEG_FLAGS                  := -y
$(if $(strip $(FFMPEG)),,     $(error Cannot find ffmpeg utility))

GSCHEM                        := $(shell command -v gschem;)
GSCHEM_FLAGS                  :=
$(if $(strip $(GSCHEM)),,     $(error Cannot find gschem utility))

GNETLIST                      := $(shell command -v gnetlist;)
GNETLIST_FLAGS                :=
$(if $(strip $(GNETLIST)),,   $(error Cannot find gnetlist utility))

GSCH2PCB                      := $(shell command -v gsch2pcb;)
GSCH2PCB_FLAGS                :=
$(if $(strip $(GSCH2PCB)),,   $(error Cannot find gsch2pcb utility))

INKSCAPE                      := $(shell command -v inkscape;)
INKSCAPE_FLAGS                :=
$(if $(strip $(INKSCAPE)),,   $(error Cannot find inkscape utility))
INKSCAPE_TESTED               := Inkscape 1.3.2
INKSCAPE_VERSION              := $(strip\
	$(shell\
		$(INKSCAPE) $(INKSCAPE_FLAGS)\
			--version;\
	)\
)
$(if $(findstring $(INKSCAPE_TESTED),$(INKSCAPE_VERSION)),,$(error Wrong inkscape version))

LIBRECAD                      := $(shell command -v librecad;)
LIBRECAD_FLAGS                :=
$(if $(strip $(LIBRECAD)),,   $(error Cannot find librecad utility))

OPENSCAD                      := $(shell command -v openscad;)
OPENSCAD_FLAGS                :=
$(if $(strip $(OPENSCAD)),,   $(error Cannot find openscad utility))

IM_CONVERT                    := $(shell command -v convert;)
IM_CONVERT_FLAGS              :=
$(if $(strip $(IM_CONVERT)),, $(error Cannot find convert utility))

IM_MOGRIFY                    := $(shell command -v mogrify;)
IM_MOGRIFY_FLAGS              :=
$(if $(strip $(IM_MOGRIFY)),, $(error Cannot find mogrify utility))


# Root Paths
ROOT_HW                       := ../hardware/
ROOT_LIBRECAD                 := ./librecad/
ROOT_OPENSCAD                 := ./openscad/
ROOT_GSCHEM                   := ./gschem/
ROOT_SYMBOLS                  := ./gschem/symbols/
ROOT_PCB                      := ./pcb/
ROOT_FOOTPRINTS               := ./pcb/footprints/
ROOT_ARTWORK                  := ./artwork/


# Sources
GSCHEM_ATTRIBS                := $(ROOT_GSCHEM)attribs
GNETLIST_RULE                 := $(ROOT_GSCHEM)rules-drc.scm
GSCHEM_SYMBOLS                := $(wildcard $(ROOT_SYMBOLS)*.sym)

#   Sources SPI Flash Pinouts, common resource
SPIFLASH_SCH                  := $(strip\
	$(shell\
		$(ECHO) $(ECHO_FLAGS)\
			$(ROOT_GSCHEM)spiflash-page01.sch;\
	)\
)

#   Sources Cable, common resource
CABLE_SCH                     := $(strip\
	$(shell\
		$(ECHO) $(ECHO_FLAGS)\
			$(ROOT_GSCHEM)cable-page{01,02,03}.sch;\
	)\
)

#   Sources Power Switch, common resource
POWERSWITCH_SCH               := $(strip\
	$(shell\
		$(ECHO) $(ECHO_FLAGS)\
			$(ROOT_GSCHEM)powerswitch-page01.sch;\
	)\
)

#   Sources Slider Switches, common resource
SLIDERSWITCH_SCH              := $(strip\
	$(shell\
		$(ECHO) $(ECHO_FLAGS)\
			$(ROOT_GSCHEM)sliderswitch-page{01,02}.sch;\
	)\
)

#   Sources Chipflasher
CHIPFLASHER_DXF               := $(strip\
	$(wildcard $(ROOT_LIBRECAD)chipflasher-panel.dxf)\
)
CHIPFLASHER_SCH               := $(strip\
	$(shell\
		$(ECHO) $(ECHO_FLAGS)\
			$(ROOT_GSCHEM)chipflasher-page{01,02,03,04,05,06,07,08,09}.sch;\
	)\
)
CHIPFLASHER_PCB               := $(ROOT_PCB)chipflasher-pcb.pcb
CHIPFLASHER_SVG               := $(ROOT_ARTWORK)chipflasher-label.svg

#   Sources DevKit
DEVKIT_DXF                    := $(strip\
	$(wildcard $(ROOT_LIBRECAD)devkit-panel.dxf)\
)
DEVKIT_SCH                    := $(wildcard $(ROOT_GSCHEM)devkit-page*.sch)
DEVKIT_PCB                    :=
DEVKIT_SVG                    := $(ROOT_ARTWORK)devkit-label.svg


# Files
TARGETS_GSCHEM_AUTO1          := $(addprefix $(ROOT_GSCHEM)$(SQUOTE)$(HASH), $(addsuffix $(HASH)$(SQUOTE),$(notdir $(SPIFLASH_SCH) $(CABLE_SCH) $(POWERSWITCH_SCH) $(CHIPFLASHER_SCH) $(DEVKIT_SCH))))
TARGETS_GSCHEM_AUTO2          := $(addsuffix ~,$(SPIFLASH_SCH) $(CABLE_SCH) $(POWERSWITCH_SCH) $(CHIPFLASHER_SCH) $(DEVKIT_SCH))
TARGETS_GSCHEM_AUTO3          := $(addsuffix ~,$(GSCHEM_SYMBOLS))
SPIFLASH_DRC                  := $(ROOT_GSCHEM)spiflash.drc
SPIFLASH_BOM_HTML             := $(patsubst %.sch,%.bom.html,$(SPIFLASH_SCH))
SPIFLASH_SCHEMATIC_PDF        := $(ROOT_GSCHEM)spiflash-schematic.pdf
SPIFLASH_PNG                  := $(addsuffix .png,$(SPIFLASH_SCH))
SPIFLASH_IMG                  := $(SPIFLASH_PNG)
CABLE_DRC                     := $(ROOT_GSCHEM)cable.drc
CABLE_BOM_HTML                := $(patsubst %.sch,%.bom.html,$(CABLE_SCH))
CABLE_SCHEMATIC_PDF           := $(ROOT_GSCHEM)cable-schematic.pdf
CABLE_PNG                     := $(addsuffix .png,$(CABLE_SCH))
CABLE_IMG                     := $(CABLE_PNG)
POWERSWITCH_DRC               := $(ROOT_GSCHEM)powerswitch.drc
POWERSWITCH_BOM_HTML          := $(patsubst %.sch,%.bom.html,$(POWERSWITCH_SCH))
POWERSWITCH_SCHEMATIC_PDF     := $(ROOT_GSCHEM)powerswitch-schematic.pdf
POWERSWITCH_PNG               := $(addsuffix .png,$(POWERSWITCH_SCH))
POWERSWITCH_IMG               := $(POWERSWITCH_PNG)
SLIDERSWITCH_DRC              := $(ROOT_GSCHEM)sliderswitch.drc
SLIDERSWITCH_BOM_HTML         := $(patsubst %.sch,%.bom.html,$(SLIDERSWITCH_SCH))
SLIDERSWITCH_SCHEMATIC_PDF    := $(ROOT_GSCHEM)sliderswitch-schematic.pdf
SLIDERSWITCH_PNG              := $(addsuffix .png,$(SLIDERSWITCH_SCH))
SLIDERSWITCH_IMG              := $(SLIDERSWITCH_PNG)
CHIPFLASHER_DRC               := $(ROOT_GSCHEM)chipflasher.drc
CHIPFLASHER_BOM               := $(patsubst %.sch,%.bom,$(CHIPFLASHER_SCH))
CHIPFLASHER_BOM_MD            := $(addsuffix .md,$(CHIPFLASHER_BOM))
CHIPFLASHER_BOM_HTML          := $(patsubst %.bom.md,%.bom.html,$(CHIPFLASHER_BOM_MD))
CHIPFLASHER_SCHEMATIC_PDF     := $(ROOT_GSCHEM)chipflasher-schematic.pdf
CHIPFLASHER_PNG               := $(addsuffix .png,$(CHIPFLASHER_SCH)) $(subst .pcb,.top.png,$(CHIPFLASHER_PCB)) $(subst .pcb,.bottom.png,$(CHIPFLASHER_PCB))
CHIPFLASHER_IMG               := $(CHIPFLASHER_PNG)
CHIPFLASHER_AUX               := $(CHIPFLASHER_BOM)
CHIPFLASHER_MARKDOWN          := $(CHIPFLASHER_BOM_MD)
DEVKIT_DRC                    := $(ROOT_GSCHEM)devkit.drc
DEVKIT_BOM                    := $(patsubst %.sch,%.bom,$(DEVKIT_SCH))
DEVKIT_BOM_MD                 := $(addsuffix .md,$(DEVKIT_BOM))
DEVKIT_BOM_HTML               := $(patsubst %.bom.md,%.bom.html,$(DEVKIT_BOM_MD))
DEVKIT_SCHEMATIC_PDF          := $(ROOT_GSCHEM)devkit-schematic.pdf
DEVKIT_PNG                    := $(addsuffix .png,$(DEVKIT_SCH)) $(addsuffix .top.png,$(DEVKIT_PCB)) $(addsuffix .bottom.png,$(DEVKIT_PCB))
DEVKIT_IMG                    := $(DEVKIT_PNG)
DEVKIT_AUX                    := $(DEVKIT_BOM)
DEVKIT_MARKDOWN               := $(DEVKIT_BOM_MD)


# Project Numbers
BOARD_NUMBER                  := $(strip\
	$(shell\
		$(SET) $(SET_FLAGS)\
		&& $(GIT) $(GIT_FLAGS)\
			describe\
				--long\
				--always\
				--match board-v*\
		| $(SED) $(SED_FLAGS)\
			-e 's/(.*)(-g)([0-9a-f]*)/\1-\3/;'\
				-\
	;)\
)
PROJECT_NUMBER                := $(strip\
	$(shell\
		$(SET) $(SET_FLAGS)\
		&& $(GIT) $(GIT_FLAGS)\
			describe\
				--long\
				--always\
				--match v*\
		| $(SED) $(SED_FLAGS)\
			-e 's/(.*)(-g)([0-9a-f]*)/\1-\3/;'\
				-\
	;)\
)
PROJECT_BRANCH                := $(strip\
	$(shell\
		$(GIT) $(GIT_FLAGS)\
			branch\
		| $(SED) $(SED_FLAGS)\
			-e '/^\*/!d; s/^\* //;'\
				-\
	;)\
)
PROJECT_COMMIT                := $(strip\
	$(shell\
		$(SET) $(SET_FLAGS)\
		&& $(GIT) $(GIT_FLAGS)\
			describe\
				--long\
				--always\
		| $(SED) $(SED_FLAGS)\
			-e 's/^.*-g//;'\
				-\
	;)\
)


# Settings
MAKEFILE_TITLE                := Generate Hardware Files and Auxiliaries
PROJECT_TITLE                 := Zerocat Chipflasher
PROJECT_BRIEF                 := Flash free firmware, kick the Management Engine.
PROJECT_REPO                  := git://zerocat.org/zerocat/projects/chipflasher.git
TOKEN_BOARD_NUMBER            := <Board-Version>
GERBER_PREAMP                 := $(subst .pcb,,$(CHIPFLASHER_PCB))
INFO_CHECKOUT                 = "Zerocat Chipflasher -- checkout for $@: $${checkout}"
GUIX_REPO_META                := https://git.guix.gnu.org/guix.git
GUIX_REPO_SAVANNAH            := https://git.savannah.gnu.org/git/guix.git


# Tinned Cans: HEADER
define HEADER                 =
$(strip\
	$(ECHO) $(ECHO_FLAGS)    ""\
	&& $(ECHO) $(ECHO_FLAGS) "$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)"\
	&& $(ECHO) $(ECHO_FLAGS) "$(M5) $(PROJECT_TITLE)"\
	&& $(ECHO) $(ECHO_FLAGS) "$(M5) – $(PROJECT_BRIEF)"\
	&& $(ECHO) $(ECHO_FLAGS) "$(M5) $(MAKEFILE_TITLE)"\
	&& $(ECHO) $(ECHO_FLAGS) "$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)"\
)
endef


# Tinned Cans: HEADLINE
define HEADLINE               =
$(strip\
	$(ECHO) $(ECHO_FLAGS)    "$(M5) Process target “$@” $(M5)$(M5)"\
)
endef


# Tinned Cans: DONE
define DONE                   =
$(strip\
	$(ECHO) $(ECHO_FLAGS)    "... end of target “$@”."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
)
endef


# Tinned Cans: TITLEBLOCK
define TITLEBLOCK             =
$(strip\
	authors="$(strip\
		$(shell\
			$(GIT) log --format="%al, " --follow -- $<\
			| $(SORT) $(SORT_FLAGS)\
			| $(UNIQ) $(UNIQ_FLAGS);\
		)\
	)"\
	&& $(SED) $(SED_FLAGS)\
		-e 's#\$$TITLE#$(PROJECT_TITLE)#;'\
		-e 's#\$$SUBTITLE#$(PROJECT_BRIEF)#;'\
		-e 's,\$$GITREPO,$(PROJECT_REPO),;'\
		-e 's,\$$FILENAME,$(notdir $<),;'\
		-e 's,\$$PAGES,'"$${pages}"',;'\
		-e 's,\$$PAGE,'"$${page}"',;'\
		-e 's/\$$GITREF/$(PROJECT_NUMBER) ($(PROJECT_BRANCH))/;'\
		-e 's/\$$AUTHORS/'"$${authors%\,*}"'/;'\
			$<\
				> $@\
)
endef


# Tinned Cans: SEDSCR_DISABLE_UNUSED
define SEDSCR_DISABLE_UNUSED  =
$(strip\
	-e'/^[\t ]*[\"]?propeller-load/s,^,\;temporarily disabled\: ,; # disable to address race condition ...'\
)
endef


# Tinned Cans: SEDSCR_RESTORE_UNUSED
define SEDSCR_RESTORE_UNUSED  =
$(strip\
	-e'/propeller-load/s,^\;temporarily disabled\: ,,; # ... restore'\
)
endef


# Tinned Cans: SEDSCR_TRUNC_REV
define SEDSCR_TRUNC_REV       =
$(strip\
	-e'/^[\t]*-e .s....GITREF./s, \(\$$\(.*\)\),,; # make revision shorter, remove branch info'\
)
endef


# Tinned Cans: AMENDMENT_V2
define AMENDMENT_V2           =
$(strip\
	{\
		fileout="$@/amendment.txt"\
		&& $(ECHO) $(ECHO_FLAGS)    "# PCB Amendment for $@" > $${fileout}\
		&& $(ECHO) $(ECHO_FLAGS) "" >> $${fileout}\
		&& $(ECHO) $(ECHO_FLAGS) "* Use socket for R10, change value to 100 Ohm" >> $${fileout}\
		&& $(ECHO) $(ECHO_FLAGS) "* Use socket for R23, change value to 1000 Ohm" >> $${fileout}\
		&& $(ECHO) $(ECHO_FLAGS) "* Change C11 from 100nF RCY100 to 10µF 16V Tantalum RCY100P, connect minus to ground" >> $${fileout}\
		&& $(ECHO) $(ECHO_FLAGS) "* Change C12 and C13 from 100nF 20% RCY100 to 100nF 10% X7R RCY100" >> $${fileout}\
		&& $(ECHO) $(ECHO_FLAGS) "* Change C2 and C4 from 1nF 20% RCY200 to 2.2nF 10% X7R RCY200" >> $${fileout}\
		&& $(ECHO) $(ECHO_FLAGS) "" >> $${fileout}\
	;}\
)
endef


# Tinned Cans: HTML_HEAD
define HTML_HEAD               =
$(strip\
	$(ECHO) $(ECHO_FLAGS)    "<head>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=3.0, user-scalable=1\">" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  <meta name=\"referrer\" content=\"origin\">" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  <title>$(PROJECT_TITLE): Hardware - $@</title>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  <style type=\"text/css\">" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "    @charset "ISO-8859-1";" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "    @media all {" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      html > body {" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        font-family:var(--font-mono, monospace);" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        font-size:large;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        line-height:140%;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-top:3em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-bottom:5em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-left:5em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-right:8em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        max-width:56em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      h1,h2,h3,h4,h5,h6 {" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        line-height:200%;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-top:2em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-bottom:2em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "    }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "    @media all and (max-width:540px) {" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      html > body {" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-left:.6em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "        margin-right:.6em;" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "      ul { margin-left:-2em; }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "    }" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "  </style>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</head>" >> $@\
)
endef


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


# Intermediate Targets
.INTERMEDIATE :\
	$(subst .sch,.titleblock.sch,$(SPIFLASH_SCH) $(CABLE_SCH) $(POWERSWITCH_SCH) $(CHIPFLASHER_SCH) $(DEVKIT_SCH))\
	$(subst .sch,.bom.md,$(CHIPFLASHER_SCH) $(DEVKIT_SCH))


# Secondary Targets
#~ .SECONDARY :                  # Uncomment for debugging


# Phony Targets
.PHONY :\
	all\
	\
	hello\
	help\
	settings\
	\
	docu\
	\
	spiflash\
	cable\
	powerswitch\
	sliderswitch\
	\
	devkit-label\
	devkit-panel\
	devkit\
	\
	chipflasher-device\
	chipflasher-label\
	chipflasher-panel\
	chipflasher\
	\
	gerbv\
	gerber\
	gerber-archive\
	gerber-archive-preview\
	gerber-aisler\
	gerber-aisler-archive\
	\
	check\
	synchronize\
	animation-images\
	\
	chipflasher-board-edition-1\
	clean-chipflasher-board-edition-1\
	\
	testboard-v2-0-2\
	clean-testboard-v2-0-2\
	\
	chipflasher-v2\
	clean-chipflasher-v2\
	\
	chipflasher-v2-1\
	clean-chipflasher-v2-1\
	\
	chipflasher-ng\
	clean-chipflasher-ng\
	\
	chipflasher-devkit\
	clean-chipflasher-devkit\
	\
	clean-animation-files\
	clean-synchronize\
	clean-gerber\
	clean-archives\
	clean-archive-previews\
	clean-backups\
	clean-chipflasher\
	clean-devkit\
	clean-powerswitch\
	clean-sliderswitch\
	clean-cable\
	clean-spiflash\
	clean-docu\
	\
	clean-but-device\
	clean


# Targets
#   Generate all selected targets.
#   Attention, chipflasher targets will run the clean target of their context!
all : hello\
	clean-but-device\
		chipflasher-board-edition-1\
			chipflasher-devkit\
				chipflasher-ng\
					testboard-v2-0-2\
						chipflasher-v2\
							docu\
								spiflash
	@$(HEADLINE)\
	&& $(DONE);

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

#   Provide help information
help : hello
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(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) "$(TAB1)generate all selected files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Help"\
	&& $(ECHO) $(ECHO_FLAGS) "----"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "hello"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)greeter, provided with all, clean and help"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "help"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)provide this help message"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Actions Chipflasher Devkit"\
	&& $(ECHO) $(ECHO_FLAGS) "--------------------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "chipflasher-devkit"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Checkout ‘HEAD’, build and copy design files into \`chipflasher-devkit\` device folder."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Attention! In order to avoid mess up, invoke clean target first!"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-chipflasher-devkit"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove \`chipflasher-devkit\` device folder"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Actions Chipflasher NG"\
	&& $(ECHO) $(ECHO_FLAGS) "----------------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "chipflasher-ng"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Checkout ‘HEAD’, build and copy design files into \`chipflasher-ng\` device folder."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Attention! In order to avoid mess up, invoke clean target first!"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-chipflasher-ng"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove \`chipflasher-ng\` device folder"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Actions Chipflasher v2.1"\
	&& $(ECHO) $(ECHO_FLAGS) "------------------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "chipflasher-v2-1"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Checkout ‘HEAD’, build and copy design files into \`chipflasher-v2-1\` device folder."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Attention! In order to avoid mess up, invoke clean target first!"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-chipflasher-v2-1"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove \`chipflasher-v2-1\` device folder"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Actions Chipflasher v2"\
	&& $(ECHO) $(ECHO_FLAGS) "----------------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "chipflasher-v2"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Checkout commit ‘fa7ba6995’, build and copy design files into \`chipflasher-v2\` device folder."\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Checkout ‘HEAD’, build and copy panel files into \`chipflasher-v2\` device folder."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Attention! In order to avoid mess up, invoke clean target first!"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-chipflasher-v2"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove \`chipflasher-v2\` device folder"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Actions Chipflasher board-edition-1"\
	&& $(ECHO) $(ECHO_FLAGS) "-----------------------------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "chipflasher-board-edition-1"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Checkout tag ‘board-edition-1’, build hardware design images, copy into \`chipflasher-board-edition-1\` device folder."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Attention! In order to avoid mess up, invoke clean target first!"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-chipflasher-board-edition-1"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove \`chipflasher-board-edition-1\` device folder"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Actions"\
	&& $(ECHO) $(ECHO_FLAGS) "-------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "docu"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate html documentation files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "spiflash"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate all spiflash files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "cable"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate all cable files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "powerswitch"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate all powerswitch files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "sliderswitch"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate all sliderswitch files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "devkit"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate all devkit files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "devkit-label"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate chipflasher devkit label files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "devkit-panel"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate chipflasher devkit panel files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "chipflasher"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate all chipflasher files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "chipflasher-device"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate chipflasher device files, images and video"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "chipflasher-label"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate chipflasher label files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "chipflasher-panel"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)generate chipflasher panel files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "settings"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)display retrieved settings"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "gerbv"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)start gerbv utility with all chipflasher ‘Gerber X’ files loaded"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "gerber"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)export chipflasher PCB layers as RS-274X (Extended Gerber, aka ‘Gerber X’) files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "gerber-archive"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)create archive with exported chipflasher ‘Gerber X’ files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "gerber-archive-preview"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)* export a PNG image of the chipflasher ‘Gerber X’ files"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)* export a PostScript PCB documentation file"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "gerber-aisler"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)copy selected ‘Gerber X’ files, change extensions into Aisler namespace"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)See https://aisler.net/en-US/imprint"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)See https://community.aisler.net/t/support-for-traditional-gerber-files/99"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "gerber-aisler-archive"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)create archive with selected ‘Gerber X’ files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)The archive can be used without modification to order PCBs from Aisler."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "check"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)perform design rule check for schematics, cables, chipflasher and devkit"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "synchronize"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)update chipflasher PCB file from schematic (manual action required)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Clean"\
	&& $(ECHO) $(ECHO_FLAGS) "-----"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-animation-files"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove 3D animation and related temporary files, if any"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-synchronize"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove files, generated by synchronize action"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-backups"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove backup files, generated by PCB- and schematic editors"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-archives"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove zipped archives with ‘Gerber X’ files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-gerber"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove exported ‘Gerber X’ files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-chipflasher"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove generated chipflasher files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-devkit"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove generated devkit files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-powerswitch"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove generated powerswitch files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-sliderswitch"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove generated sliderswitch files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-cable"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove generated cable files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-spiflash"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove generated spiflash files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-docu"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove generated html documentation files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-but-device"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)make files and folders clean, do not touch device folder"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)make files and folders clean"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(DONE);

#   Generate html documentation files
docu : ./cern_ohl_s_v2.html ./cern_ohl_s_v2_user_guide.html ./README.html ./CHANGES.html
	@$(HEADLINE)\
	&& $(DONE);

#   Generate files, related to SPI flash
spiflash : $(SPIFLASH_DRC) $(SPIFLASH_IMG) $(SPIFLASH_SCHEMATIC_PDF) $(SPIFLASH_BOM_HTML)
	@$(HEADLINE)\
	&& $(DONE);

#   Generate files, related to cable
cable : $(CABLE_DRC) $(CABLE_IMG) $(CABLE_SCHEMATIC_PDF) $(CABLE_BOM_HTML)
	@$(HEADLINE)\
	&& $(DONE);

#   Generate files, related to power switch
powerswitch : $(POWERSWITCH_DRC) $(POWERSWITCH_IMG) $(POWERSWITCH_SCHEMATIC_PDF) $(POWERSWITCH_BOM_HTML)
	@$(HEADLINE)\
	&& $(DONE);

#   Generate files, related to slider switches
sliderswitch : $(SLIDERSWITCH_DRC) $(SLIDERSWITCH_IMG) $(SLIDERSWITCH_SCHEMATIC_PDF) $(SLIDERSWITCH_BOM_HTML)
	@$(HEADLINE)\
	&& $(DONE);

#   Generate chipflasher related files
chipflasher :\
	$(CHIPFLASHER_DRC)\
		$(CHIPFLASHER_IMG)\
			$(CHIPFLASHER_SCHEMATIC_PDF)\
				$(GERBER_PREAMP).bom.html\
					$(GERBER_PREAMP).xy.html\
						./chipflasher-bom.html\
							chipflasher-device\
								chipflasher-label\
									chipflasher-panel\
										gerber-archive-preview\
											gerber-archive\
												gerber-aisler-archive
	@$(HEADLINE)\
	&& $(DONE);

# OpenSCAD animation images
animation-images : $(ROOT_OPENSCAD)chipflasher-device.scad
	@$(HEADLINE)\
	&& $(CD) $(CD_FLAGS) $(<D)\
	&& $(OPENSCAD) $(OPENSCAD_FLAGS)\
		--animate 300\
		--imgsize=1280,720\
			$(<F)\
	&& $(CP) $(CP_FLAGS)\
		./frame00000.png\
			./poster.png\
	&& $(CD) $(CD_FLAGS) -\
	&& $(DONE);

# OpenSCAD animation
$(ROOT_OPENSCAD)chipflasher-device.ogg $(ROOT_OPENSCAD)chipflasher-device.mp4 $(ROOT_OPENSCAD)chipflasher-device.webm : animation-images
	@$(HEADLINE)\
	&& $(CD) $(CD_FLAGS) $(@D)\
	&& $(FFMPEG) $(FFMPEG_FLAGS)\
		-f image2\
		-framerate 25\
		-stream_loop 75\
		-i frame00000.png\
		-s 1280x720\
		-b:v 5M\
			startstop$(suffix $@)\
	&& $(FFMPEG) $(FFMPEG_FLAGS)\
		-f image2\
		-framerate 25\
		-i frame%05d.png\
		-s 1280x720\
		-b:v 5M\
			body$(suffix $@)\
	&& $(ECHO) $(ECHO_FLAGS) "file 'startstop$(suffix $@)'" > concat.txt\
	&& $(ECHO) $(ECHO_FLAGS) "file 'body$(suffix $@)'"      >> concat.txt\
	&& $(ECHO) $(ECHO_FLAGS) "file 'startstop$(suffix $@)'" >> concat.txt\
	&& $(FFMPEG) $(FFMPEG_FLAGS)\
		-f concat\
		-i concat.txt\
		-c copy\
			$(@F)\
	&& $(RM) $(RM_FLAGS)\
		./startstop$(suffix $@)\
		./body$(suffix $@)\
		./concat.txt\
	&& $(CD) $(CD_FLAGS) -\
	&& $(DONE);

#   Remove generated animations
clean-animation-files :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(wildcard $(ROOT_OPENSCAD)*.ogg)\
		$(wildcard $(ROOT_OPENSCAD)*.mp4)\
		$(wildcard $(ROOT_OPENSCAD)*.webm)\
		$(wildcard $(ROOT_OPENSCAD)frame*.png)\
		$(ROOT_OPENSCAD)poster.png\
		$(ROOT_OPENSCAD)concat.txt\
	&& $(DONE);

#   Generate Testboard v2.0.2 files and move selection into device folder
#   Attention! In order to avoid mess up, invoke clean target first!
#   (The testboard had been used to develop the kick2 flashrom interface.)
./device/testboard-v2-0-2 :
	@$(HEADLINE)\
	\
	&& $(MKDIR) $(MKDIR_FLAGS) -p $@\
	\
	&& fw1file=./../firmware1/src/libcommon/common.h\
	&& if [ -e $${fw1file} ]\
		;then\
			$(MV) $(MV_FLAGS) -f $${fw1file} $${fw1file}.bak\
		;fi\
	\
	&& checkout=v2.0.2\
	&& $(GIT) checkout --detach $${checkout}\
	&& $(ECHO) $(ECHO_FLAGS) $(INFO_CHECKOUT) > $@/checkout.txt\
	&& $(SED) $(SED_FLAGS) -e's,$(GUIX_REPO_SAVANNAH),$(GUIX_REPO_META),;' ./guix/channels.scm > $@/channels.scm\
	&& $(CP) $(CP_FLAGS) ./guix/manifest0.scm $@/manifest.scm\
	&& $(SED) $(SED_FLAGS) -i $(SEDSCR_DISABLE_UNUSED) $@/manifest.scm\
	&& tmpmake=`$(MKTEMP) $(MKTEMP_FLAGS) -q --suffix=.mk Makefile-XXXXX` && {\
			$(SED) $(SED_FLAGS) $(SEDSCR_TRUNC_REV) ./Makefile > $${tmpmake}\
			&& $(ECHO) $(ECHO_FLAGS) "\
					LANG=C\
					&& make -C ./ -f $${tmpmake} clean\
					&& make -C ./ -f $${tmpmake} testboard\
					&& mv -f ./gschem/*{.png,.pdf,.bom.html} $@/\
					&& mv -f ./artwork/*{.png,.pdf} $@/\
					&& make -C ./ -f $${tmpmake} clean\
				"\
			| $(GUIX) time-machine\
				--channels=$@/channels.scm\
				-- shell -q\
					--pure\
					--rebuild-cache\
					--preserve=^LANG\
					--manifest=$@/manifest.scm\
			&& $(RM) $(RM_FLAGS) $${tmpmake}\
		;}\
	&& $(SED) $(SED_FLAGS) -i $(SEDSCR_RESTORE_UNUSED) $@/manifest.scm\
	&& $(GIT) checkout -\
	\
	&& if [ -e $${fw1file}.bak ]\
		;then\
			$(MV) $(MV_FLAGS) -f $${fw1file}.bak $${fw1file}\
		;fi\
	\
	&& $(DONE);

#   Goal for Testboard v2.0.2 device folder
testboard-v2-0-2 : | ./device/testboard-v2-0-2
	@$(HEADLINE)\
	&& $(DONE);

#   Remove Testboard v2.0.2 device folder
clean-testboard-v2-0-2 :
	@-$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		-r\
			./device/testboard-v2-0-2\
	&& $(DONE);

#   Generate Chipflasher board-edition-1 files and move selection into device folder
#   Attention! In order to avoid mess up, invoke clean target first!
./device/chipflasher-board-edition-1 : ../guix/channels0.scm ../guix/manifest0.scm
	@$(HEADLINE)\
	\
	&& $(MKDIR) $(MKDIR_FLAGS) -p $@\
	&& $(SED) $(SED_FLAGS) -e's,$(GUIX_REPO_SAVANNAH),$(GUIX_REPO_META),;' ../guix/channels0.scm > $@/channels.scm\
	&& $(CP) $(CP_FLAGS) ../guix/manifest0.scm $@/manifest.scm\
	&& $(SED) $(SED_FLAGS) -i $(SEDSCR_DISABLE_UNUSED) $@/manifest.scm\
	\
	&& checkout=board-edition-1\
	&& $(GIT) checkout --detach $${checkout}\
	&& $(ECHO) $(ECHO_FLAGS) $(INFO_CHECKOUT) > $@/checkout.txt\
	&& $(ECHO) $(ECHO_FLAGS) "\
			LANG=C\
			&& make -C ../hardware/doc clean\
			&& make -C ../hardware/doc ../pcb/board.pcb.png board.bom.md cables.bom.md\
			&& gaf export --dpi=300 --color --size=auto --format=png -o ../hardware/gschem/board.sch.png ../hardware/gschem/board.sch\
			&& gaf export --dpi=300 --color --size=auto --format=png -o ../hardware/gschem/cables.sch.png ../hardware/gschem/cables.sch\
			&& mv -f ../hardware/gschem/{board,cables}.sch.png $@/\
			&& mv -f ../hardware/pcb/board.pcb.png $@/\
			&& mv -f ../hardware/artwork/front-label{.png,.pdf} $@/\
			&& mv -f ../hardware/doc/{board,cables}.bom.md $@/\
			&& sed -i -r -e's,_,\\\\_,g; # escape underscores in markdown!' $@/*.bom.md\
			&& make -C ../hardware/doc clean\
			&& cd ./pcb && pcb -x png --dpi 300 --use-alpha --only-visible --photo-mode --photo-flip-x --outfile board.pcb.bottom.png board.pcb && cd -\
			&& mv -f ../hardware/pcb/board.pcb.bottom.png $@/\
			&& cd ./pcb && pcb -x gerber --fab-author N\.N\. board.pcb && zip chipflasher-pcb-$${checkout}.zip *.gbr *.cnc && rm -f ./*.gbr ./*.cnc && cd -\
			&& mv -f ../hardware/pcb/chipflasher-pcb-$${checkout}.zip $@/\
		"\
	| $(GUIX) time-machine\
		--channels=$@/channels.scm\
		-- shell -q\
			--pure\
			--rebuild-cache\
			--preserve=^LANG\
			--manifest=$@/manifest.scm\
	&& $(GIT) checkout -\
	\
	&& $(SED) $(SED_FLAGS) -i $(SEDSCR_RESTORE_UNUSED) $@/manifest.scm\
	&& $(IM_MOGRIFY) $(IM_MOGRIFY_FLAGS)\
				-resize 2000x\
					$@/board.sch.png\
	&& $(IM_MOGRIFY) $(IM_MOGRIFY_FLAGS)\
				-resize 2000x\
					$@/cables.sch.png\
	&& $(MAKE) -C ./\
		$@/board.bom.html\
		$@/cables.bom.html\
	\
	&& $(DONE);

#   Goal for Chipflasher ‘board-edition-1’ device folder
chipflasher-board-edition-1 : | ./device/chipflasher-board-edition-1
	@$(HEADLINE)\
	&& $(DONE);

#   Remove Chipflasher ‘board-edition-1’ device folder
clean-chipflasher-board-edition-1 :
	@-$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		-r\
			./device/chipflasher-board-edition-1\
	&& $(DONE);

#   Generate Chipflasher Devkit files and move selection into device folder
#   Attention! In order to avoid mess up, invoke clean target first!
./device/chipflasher-devkit :
	@$(HEADLINE)\
	\
	&& $(MKDIR) $(MKDIR_FLAGS) -p $@\
	\
	&& checkout=HEAD\
	&& $(ECHO) $(ECHO_FLAGS) $(INFO_CHECKOUT) > $@/checkout.txt\
	&& $(GIT) checkout --detach $${checkout}\
	&& $(SED) $(SED_FLAGS) -e's,$(GUIX_REPO_SAVANNAH),$(GUIX_REPO_META),;' ./guix/channels.scm > $@/channels.scm\
	&& $(CP) $(CP_FLAGS) ./guix/manifest.scm $@/\
	&& tmpmake=`$(MKTEMP) $(MKTEMP_FLAGS) -q --suffix=.mk Makefile-XXXXX` && {\
			$(SED) $(SED_FLAGS) $(SEDSCR_TRUNC_REV) ./Makefile > $${tmpmake}\
			&& $(ECHO) $(ECHO_FLAGS) "\
					LANG=C\
					&& make -C ./ -f $${tmpmake} clean-but-device\
					&& make -C ./ -f $${tmpmake} devkit\
					&& mv -f ./gschem/devkit-schematic.pdf $@/\
					&& mv -f ./gschem/devkit-page{01,02,03,04,05,06,07,08,09,10,11,12,13,14,15}{.sch.png,.bom.html} $@/\
					&& mv -f ./artwork/devkit-label{.png,.pdf} $@/\
					&& mv -f ./librecad/devkit-panel{.png,.pdf} $@/\
					&& make -C ./ -f $${tmpmake} clean-but-device\
				"\
			| $(GUIX) time-machine\
				--channels=$@/channels.scm\
				-- shell -q\
					--pure\
					--rebuild-cache\
					--preserve=^LANG\
					--manifest=$@/manifest.scm\
			&& $(RM) $(RM_FLAGS) $${tmpmake}\
		;}\
	&& $(GIT) checkout -\
	\
	&& $(DONE);

#   Goal for Chipflasher Devkit device folder
chipflasher-devkit : | ./device/chipflasher-devkit
	@$(HEADLINE)\
	&& $(DONE);

#   Remove Chipflasher Devkit device folder
clean-chipflasher-devkit :
	@-$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		-r\
			./device/chipflasher-devkit\
	&& $(DONE);

#   Generate Chipflasher NG files and move selection into device folder
#   Attention! In order to avoid mess up, invoke clean target first!
./device/chipflasher-ng :
	@$(HEADLINE)\
	&& $(MKDIR) $(MKDIR_FLAGS) -p $@\
	\
	&& checkout=board-v2.2.0\
	&& $(GIT) checkout --detach $${checkout}\
	&& $(ECHO) $(ECHO_FLAGS) $(INFO_CHECKOUT)" (Circuit Schematics and PCB)" > $@/checkout-PCB.txt\
	&& $(SED) $(SED_FLAGS) -e's,$(GUIX_REPO_SAVANNAH),$(GUIX_REPO_META),;' ./guix/channels.scm > $@/channels-PCB.scm\
	&& $(CP) $(CP_FLAGS) ./guix/manifest.scm $@/manifest-PCB.scm\
	&& tmpmake=`$(MKTEMP) $(MKTEMP_FLAGS) -q --suffix=.mk Makefile-XXXXX` && {\
			$(SED) $(SED_FLAGS) $(SEDSCR_TRUNC_REV) ./Makefile > $${tmpmake}\
			&& $(ECHO) $(ECHO_FLAGS) "\
					LANG=C\
					&& make -C ./ -f $${tmpmake} clean-but-device\
					&& make -C ./ -f $${tmpmake} $(CHIPFLASHER_DRC)\
						$(CHIPFLASHER_IMG)\
							$(CHIPFLASHER_SCHEMATIC_PDF)\
								$(GERBER_PREAMP).bom.html\
									$(GERBER_PREAMP).xy.html\
										gerber-archive-preview\
											gerber-archive\
												gerber-aisler-archive\
					&& mv -f ./gschem/chipflasher-schematic.pdf $@/\
					&& mv -f ./gschem/chipflasher-page{01,02,03,04,05,06,07,08,09}.sch.png $@/\
					&& mv -f ./pcb/chipflasher-pcb{.bom.html,.xy.html} $@/\
					&& mv -f ./pcb/chipflasher-pcb{.png,.ps} $@/\
					&& mv -f ./pcb/chipflasher-pcb{.top,.bottom}.png $@/\
					&& mv -f ./pcb/chipflasher-pcb{,.aisler}.zip $@/\
					&& make -C ./ -f $${tmpmake} clean-but-device\
				"\
			| $(GUIX) time-machine\
				--channels=$@/channels-PCB.scm\
				-- shell -q\
					--pure\
					--rebuild-cache\
					--preserve=^LANG\
					--manifest=$@/manifest-PCB.scm\
			&& $(RM) $(RM_FLAGS) $${tmpmake}\
		;}\
	&& $(GIT) checkout -\
	\
	&& checkout=HEAD\
	&& $(GIT) checkout --detach $${checkout}\
	&& $(ECHO) $(ECHO_FLAGS) $(INFO_CHECKOUT)" (Device, Switches and Cables)" > $@/checkout-device.txt\
	&& $(SED) $(SED_FLAGS) -e's,$(GUIX_REPO_SAVANNAH),$(GUIX_REPO_META),;' ./guix/channels.scm > $@/channels-device.scm\
	&& $(CP) $(CP_FLAGS) ./guix/manifest.scm $@/manifest-device.scm\
	&& tmpmake=`$(MKTEMP) $(MKTEMP_FLAGS) -q --suffix=.mk Makefile-XXXXX` && {\
			$(SED) $(SED_FLAGS) $(SEDSCR_TRUNC_REV) ./Makefile > $${tmpmake}\
			&& $(ECHO) $(ECHO_FLAGS) "\
					LANG=C\
					&& make -C ./ -f $${tmpmake} clean-but-device\
					&& make -C ./ -f $${tmpmake} powerswitch sliderswitch cable\
						./chipflasher-bom.html\
							chipflasher-device\
								chipflasher-label\
									chipflasher-panel\
					&& mv -f ./gschem/{cable,powerswitch,sliderswitch}-schematic.pdf $@/\
					&& mv -f ./gschem/powerswitch-page01{.bom.html,.sch.png} $@/\
					&& mv -f ./gschem/sliderswitch-page{01,02}{.bom.html,.sch.png} $@/\
					&& mv -f ./gschem/cable-page{01,02,03}{.bom.html,.sch.png} $@/\
					&& mv -f ./artwork/chipflasher-label{.png,.pdf} $@/\
					&& mv -f ./librecad/chipflasher-panel{.png,.pdf} $@/\
					&& mv -f ./openscad/*.png $@/\
					&& mv -f ./openscad/*{.ogg,.mp4,.webm} $@/\
					&& mv -f ./chipflasher-bom.html $@/\
					&& sed -i -r -e's,\./device/chipflasher/,\.\./\.\./\.\./hardware/$@/,g;' $@/chipflasher-bom.html\
					&& make -C ./ -f $${tmpmake} clean-but-device\
				"\
			| $(GUIX) time-machine\
				--channels=$@/channels-device.scm\
				-- shell -q\
					--pure\
					--rebuild-cache\
					--preserve=^LANG\
					--manifest=$@/manifest-device.scm\
			&& $(RM) $(RM_FLAGS) $${tmpmake}\
		;}\
	&& $(GIT) checkout -\
	\
	&& $(DONE);

#   Goal for Chipflasher NG device folder
chipflasher-ng : | ./device/chipflasher-ng
	@$(HEADLINE)\
	&& $(DONE);

#   Remove Chipflasher NG device folder
clean-chipflasher-ng :
	@-$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		-r\
			./device/chipflasher-ng\
	&& $(DONE);

#   Generate Chipflasher v2.1 files and move selection into device folder
#   Attention! In order to avoid mess up, invoke clean target first!
./device/chipflasher-v2-1 :
	@$(HEADLINE)\
	&& $(MKDIR) $(MKDIR_FLAGS) -p $@\
	\
	&& checkout=HEAD\
	&& $(GIT) checkout --detach $${checkout}\
	&& $(ECHO) $(ECHO_FLAGS) $(INFO_CHECKOUT) > $@/checkout.txt\
	&& $(SED) $(SED_FLAGS) -e's,$(GUIX_REPO_SAVANNAH),$(GUIX_REPO_META),;' ./guix/channels.scm > $@/channels.scm\
	&& $(CP) $(CP_FLAGS) ./guix/manifest.scm $@/\
	&& tmpmake=`$(MKTEMP) $(MKTEMP_FLAGS) -q --suffix=.mk Makefile-XXXXX` && {\
			$(SED) $(SED_FLAGS) $(SEDSCR_TRUNC_REV) ./Makefile > $${tmpmake}\
			&& $(ECHO) $(ECHO_FLAGS) "\
					LANG=C\
					&& make -C ./ -f $${tmpmake} clean-but-device\
					&& make -C ./ -f $${tmpmake} powerswitch sliderswitch chipflasher cable\
					&& mv -f ./gschem/{cable,powerswitch,sliderswitch,chipflasher}-schematic.pdf $@/\
					&& mv -f ./gschem/powerswitch-page01{.bom.html,.sch.png} $@/\
					&& mv -f ./gschem/sliderswitch-page{01,02}{.bom.html,.sch.png} $@/\
					&& mv -f ./gschem/chipflasher-page{01,02,03,04,05,06,07,08,09}.sch.png $@/\
					&& mv -f ./gschem/cable-page{01,02,03}{.bom.html,.sch.png} $@/\
					&& mv -f ./pcb/chipflasher-pcb{.bom.html,.xy.html} $@/\
					&& mv -f ./pcb/chipflasher-pcb{.png,.ps} $@/\
					&& mv -f ./pcb/chipflasher-pcb{.top,.bottom}.png $@/\
					&& mv -f ./pcb/chipflasher-pcb{,.aisler}.zip $@/\
					&& mv -f ./artwork/chipflasher-label{.png,.pdf} $@/\
					&& mv -f ./librecad/chipflasher-panel{.png,.pdf} $@/\
					&& mv -f ./openscad/*.png $@/\
					&& mv -f ./openscad/*{.ogg,.mp4,.webm} $@/\
					&& mv -f ./chipflasher-bom.html $@/\
					&& sed -i -r -e's,\./device/chipflasher/,\.\./\.\./\.\./hardware/$@/,g;' $@/chipflasher-bom.html\
					&& make -C ./ -f $${tmpmake} clean-but-device\
				"\
			| $(GUIX) time-machine\
				--channels=$@/channels.scm\
				-- shell -q\
					--pure\
					--rebuild-cache\
					--preserve=^LANG\
					--manifest=$@/manifest.scm\
			&& $(RM) $(RM_FLAGS) $${tmpmake}\
		;}\
	&& $(GIT) checkout -\
	\
	&& $(DONE);

#   Goal for Chipflasher v2.1 device folder
chipflasher-v2-1 : | ./device/chipflasher-v2-1
	@$(HEADLINE)\
	&& $(DONE);

#   Remove Chipflasher v2.1 device folder
clean-chipflasher-v2-1 :
	@-$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		-r\
			./device/chipflasher-v2-1\
	&& $(DONE);

#   Generate Chipflasher v2 files and move selection into device folder
#   Attention! In order to avoid mess up, invoke clean target first!
./device/chipflasher-v2 :
	@$(HEADLINE)\
	&& $(MKDIR) $(MKDIR_FLAGS) -p $@\
	\
	&& checkout=fa7ba6995\
	&& $(GIT) checkout --detach $${checkout}\
	&& $(ECHO) $(ECHO_FLAGS) $(INFO_CHECKOUT) > $@/checkout.txt\
	&& $(SED) $(SED_FLAGS) -e's,$(GUIX_REPO_SAVANNAH),$(GUIX_REPO_META),;' ./guix/channels.scm > $@/channels.scm\
	&& $(CP) $(CP_FLAGS) ./guix/manifest.scm $@/\
	&& tmpmake=`$(MKTEMP) $(MKTEMP_FLAGS) -q --suffix=.mk Makefile-XXXXX` && {\
			$(SED) $(SED_FLAGS) $(SEDSCR_TRUNC_REV) ./Makefile > $${tmpmake}\
			&& $(ECHO) $(ECHO_FLAGS) "\
					LANG=C\
					&& make -C ./ -f $${tmpmake} clean\
					&& make -C ./ -f $${tmpmake} cables board\
					&& mv -f ./gschem/chipflasher-page??{.bom.html,.sch.png,.sch.pdf} $@/\
					&& mv -f ./pcb/*.{top,bottom}.png $@/\
					&& mv -f ./pcb/*.zip $@/\
					&& mv -f ./artwork/board-label.svg.{png,pdf} $@/\
					&& make -C ./ -f $${tmpmake} clean\
				"\
			| $(GUIX) time-machine\
				--channels=$@/channels.scm\
				-- shell -q\
					--pure\
					--rebuild-cache\
					--preserve=^LANG\
					--manifest=$@/manifest.scm\
			&& $(RM) $(RM_FLAGS) $${tmpmake}\
		;}\
	&& $(GIT) checkout -\
	\
	&& for i in $$($(LS) $(LS_FLAGS) $@/chipflasher-page??.bom.html)\
		;do\
			$(MV) $(MV_FLAGS) -f $${i} $${i}.body\
			&& $(ECHO) $(ECHO_FLAGS) "<!DOCTYPE html>" > $${i}\
			&& $(ECHO) $(ECHO_FLAGS) "<html>" >> $${i}\
			&& $(subst $@,$${i},$(HTML_HEAD))\
			&& $(ECHO) $(ECHO_FLAGS) "  <body>" >> $${i}\
			&& $(CAT) $(CAT_FLAGS) $${i}.body >> $${i}\
			&& $(ECHO) $(ECHO_FLAGS) "  </body>" >> $${i}\
			&& $(ECHO) $(ECHO_FLAGS) "</html>" >> $${i}\
			&& $(RM) $(RM_FLAGS) $${i}.body\
		;done\
	\
	&& checkout=HEAD\
	&& $(GIT) checkout --detach $${checkout}\
	&& $(ECHO) $(ECHO_FLAGS) $(INFO_CHECKOUT)" (Panel)" > $@/checkout-panel.txt\
	&& $(SED) $(SED_FLAGS) -e's,$(GUIX_REPO_SAVANNAH),$(GUIX_REPO_META),;' ./guix/channels.scm > $@/channels-panel.scm\
	&& $(CP) $(CP_FLAGS) ./guix/manifest.scm $@/manifest-panel.scm\
	&& $(ECHO) $(ECHO_FLAGS) "\
			LANG=C\
			&& rm -f ./librecad/chipflasher-v2-panel.{png,pdf}\
			&& make ./librecad/chipflasher-v2-panel.{png,pdf}\
			&& mv -f ./librecad/chipflasher-v2-panel.{png,pdf} $@/\
		"\
	| $(GUIX) time-machine\
		--channels=$@/channels-panel.scm\
		-- shell -q\
			--pure\
			--rebuild-cache\
			--preserve=^LANG\
			--manifest=$@/manifest-panel.scm\
	&& $(GIT) checkout -\
	\
	&& $(AMENDMENT_V2)\
	\
	&& $(DONE);

#   Goal for Chipflasher v2 device folder
chipflasher-v2 : | ./device/chipflasher-v2
	@$(HEADLINE)\
	&& $(DONE);

#   Remove Chipflasher v2 device folder
clean-chipflasher-v2 :
	@-$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		-r\
			./device/chipflasher-v2\
	&& $(DONE);

#   Generate devkit related files
devkit : $(DEVKIT_DRC) $(DEVKIT_IMG) $(DEVKIT_SCHEMATIC_PDF) $(DEVKIT_BOM_HTML) devkit-label devkit-panel
	@$(HEADLINE)\
	&& $(DONE);

#   Report retrieved settings and compound Gerber file names
settings :
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "PROJECT_COMMIT:"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)$(PROJECT_COMMIT)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "PROJECT_NUMBER:"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)$(PROJECT_NUMBER)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "BOARD_NUMBER:"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)$(BOARD_NUMBER)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Gerber file base:"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)$(GERBER_PREAMP)-$(PROJECT_COMMIT)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Gerber archive preview:"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)$(GERBER_PREAMP).png"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Gerber archive:"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)$(GERBER_PREAMP).zip"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Gerber archive for Aisler PCB manufacturer:"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)$(GERBER_PREAMP).aisler.zip"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(DONE);

#   Create .bom and .xy files from versioned PCB file
$(GERBER_PREAMP)-$(PROJECT_COMMIT).bom $(GERBER_PREAMP)-$(PROJECT_COMMIT).xy : $(CHIPFLASHER_PCB).version
	@$(HEADLINE)\
	\
	&& $(PCB) $(PCB_FLAGS)\
		-x bom\
		--attrs ./pcb/attribs\
		--fab-author N\.N\.\
			$<\
	\
	&& $(MV) $(MV_FLAGS) $(<).bom $(GERBER_PREAMP)-$(PROJECT_COMMIT).bom\
	&& $(MV) $(MV_FLAGS) $(<).xy $(GERBER_PREAMP)-$(PROJECT_COMMIT).xy\
	\
	&& $(DONE);

#   Create .bom.html file from .bom file
$(GERBER_PREAMP).bom.html : $(GERBER_PREAMP)-$(PROJECT_COMMIT).bom
	@$(HEADLINE)\
	\
	&& $(ECHO) $(ECHO_FLAGS) "<!DOCTYPE html>" > $@\
	&& $(ECHO) $(ECHO_FLAGS) "<html>" > $@\
	&& $(HTML_HEAD)\
	&& $(ECHO) $(ECHO_FLAGS) "<body>" >> $@\
	\
	&& outfile1=`$(MKTEMP) $(MKTEMP_FLAGS) -q`\
	\
	&& $(ECHO) $(ECHO_FLAGS) "# Bill of Materials ($(notdir $<))" > "$${outfile1}"\
	&& $(ECHO) $(ECHO_FLAGS) "" >> "$${outfile1}"\
	&& $(ECHO) $(ECHO_FLAGS) "Footprints are named according to gEDA/gaf and PCB footprint naming convention." >> "$${outfile1}"\
	&& $(ECHO) $(ECHO_FLAGS) "" >> "$${outfile1}"\
	&& $(SED) $(SED_FLAGS)\
		-e'# indent text to make it preformatted'\
		-e's/^/    /g;'\
			$(<)\
				>> "$${outfile1}"\
	&& $(MARKDOWN) $(MARKDOWN_FLAGS)\
		"$${outfile1}"\
			>> $(@)\
	&& $(SED) $(SED_FLAGS)\
		-i\
		-e'# convert urls into real links'\
		-e's,(\")(http)([^\"]*)(\"),\1<a href=\"\2\3\">\2\3</a>\4,g;'\
			$(@)\
	\
	&& $(RM) $(RM_FLAGS) "$${outfile1}"\
	\
	&& $(ECHO) $(ECHO_FLAGS) "</body>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</html>" >> $@\
	&& $(DONE);

#   Create .xy.html file from .xy file
$(GERBER_PREAMP).xy.html : $(GERBER_PREAMP)-$(PROJECT_COMMIT).xy
	@$(HEADLINE)\
	\
	&& $(ECHO) $(ECHO_FLAGS) "<!DOCTYPE html>" > $@\
	&& $(ECHO) $(ECHO_FLAGS) "<html>" > $@\
	&& $(HTML_HEAD)\
	&& $(ECHO) $(ECHO_FLAGS) "<body>" >> $@\
	\
	&& outfile2=`$(MKTEMP) $(MKTEMP_FLAGS) -q`\
	\
	&& $(ECHO) $(ECHO_FLAGS) "# Pick ’n Place Data ($(notdir $<))" > "$${outfile2}"\
	&& $(ECHO) $(ECHO_FLAGS) "" >> "$${outfile2}"\
	&& $(ECHO) $(ECHO_FLAGS) "Footprints are named according to gEDA/gaf and PCB footprint naming convention." >> "$${outfile2}"\
	&& $(ECHO) $(ECHO_FLAGS) "" >> "$${outfile2}"\
	&& $(SED) $(SED_FLAGS)\
		-e'# indent text to make it preformatted'\
		-e's/^/    /g;'\
			$(<)\
				>> "$${outfile2}"\
	&& $(MARKDOWN) $(MARKDOWN_FLAGS)\
		"$${outfile2}"\
			>> $(@)\
	\
	&& $(RM) $(RM_FLAGS) "$${outfile2}"\
	\
	&& $(ECHO) $(ECHO_FLAGS) "</body>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</html>" >> $@\
	&& $(DONE);

#   Check design rules in schematics (and create *.drc file by the way)
$(SPIFLASH_DRC) : $(GNETLIST_RULE) $(SPIFLASH_SCH)
	@$(HEADLINE)\
	&& $(GNETLIST) $(GNETLIST_FLAGS)\
		-g drc2\
		-l $<\
		-o $@\
			$(SPIFLASH_SCH)\
	&& $(DONE);

#   Check design rules in schematics (and create *.drc file by the way)
$(CABLE_DRC) : $(GNETLIST_RULE) $(CABLE_SCH)
	@$(HEADLINE)\
	&& $(GNETLIST) $(GNETLIST_FLAGS)\
		-g drc2\
		-l $<\
		-o $@\
			$(CABLE_SCH)\
	&& $(DONE);

#   Check design rules in schematics (and create *.drc file by the way)
$(POWERSWITCH_DRC) : $(GNETLIST_RULE) $(POWERSWITCH_SCH)
	@$(HEADLINE)\
	&& $(GNETLIST) $(GNETLIST_FLAGS)\
		-g drc2\
		-l $<\
		-o $@\
			$(POWERSWITCH_SCH)\
	&& $(DONE);

#   Check design rules in schematics (and create *.drc file by the way)
$(SLIDERSWITCH_DRC) : $(GNETLIST_RULE) $(SLIDERSWITCH_SCH)
	@$(HEADLINE)\
	&& $(GNETLIST) $(GNETLIST_FLAGS)\
		-g drc2\
		-l $<\
		-o $@\
			$(SLIDERSWITCH_SCH)\
	&& $(DONE);

#   Check design rules in schematics (and create *.drc file by the way)
$(CHIPFLASHER_DRC) : $(GNETLIST_RULE) $(CHIPFLASHER_SCH)
	@$(HEADLINE)\
	&& $(GNETLIST) $(GNETLIST_FLAGS)\
		-g drc2\
		-l $<\
		-o $@\
			$(CHIPFLASHER_SCH)\
	&& $(DONE);

#   Check design rules in schematics (and create *.drc file by the way)
$(DEVKIT_DRC) : $(GNETLIST_RULE) $(DEVKIT_SCH)
	@$(HEADLINE)\
	&& $(GNETLIST) $(GNETLIST_FLAGS)\
		-g drc2\
		-l $<\
		-o $@\
			$(DEVKIT_SCH)\
	&& $(DONE);

#   Generate bill of material files from gschem schematics.
%.bom : %.sch $(GSCHEM_ATTRIBS)
	@$(HEADLINE)\
	&& $(GNETLIST) $(GNETLIST_FLAGS)\
		-g bom2\
		-Oattrib_file=$(GSCHEM_ATTRIBS)\
		-o $@\
			$<\
	&& $(DONE);

#   Create markdown file from bom file.
%.bom.md : %.bom
	@$(HEADLINE)\
	&& $(SED) $(SED_FLAGS)\
		--in-place\
		-e '# add a first colon per line'\
		-e 's/^/\:/;'\
		-e '# replace first colon by top level bullet and new lines'\
		-e 's/^\:/\r\n* /;'\
		-e '# replace second colon by second level bullet and new lines'\
		-e 's/:/\r\n\n    - /;'\
		-e '# replace remaining colons with new lines and second level bullets (take care for ‘https://’!)'\
		-e 's/(:)([^\/])/\r\n    - \2/g;'\
			$<\
	&& $(ECHO) $(ECHO_FLAGS) "# Bill of Materials ($(notdir $*).sch)" > $@\
	&& $(ECHO) $(ECHO_FLAGS) "" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "Revision: $(BOARD_NUMBER)  " >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "Footprints are named according to gEDA/gaf and PCB footprint naming convention." >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "## Pattern per Record" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "" >> $@\
	&& $(SED) $(SED_FLAGS)\
		-e '2,14!d;'\
		-e 's/_/\\_/g;'\
			$<\
				>> $@\
	&& $(ECHO) $(ECHO_FLAGS) "" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "## Bill" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "" >> $@\
	&& $(SED) $(SED_FLAGS)\
		-e '1,15d;'\
		-e 's/_/\\_/g;'\
			$<\
				>> $@\
	&& $(DONE);

#   Create bom html files
%.bom.html : %.bom.md
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "<!DOCTYPE html>" > $@\
	&& $(ECHO) $(ECHO_FLAGS) "<html>" >> $@\
	&& $(HTML_HEAD)\
	&& $(ECHO) $(ECHO_FLAGS) "<body>" >> $@\
	&& $(MARKDOWN) $(MARKDOWN_FLAGS)\
		$<\
			>> $@\
	&& $(SED) $(SED_FLAGS)\
		-i\
		-e's,(>)(http)(.*)(<),\1<a href=\"\2\3\">\2\3</a>\4,g;'\
			$@\
	&& $(ECHO) $(ECHO_FLAGS) "</body>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</html>" >> $@\
	&& $(DONE);

#   Create html files from markdown files
%.html : %.md
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "<!DOCTYPE html>" > $@\
	&& $(ECHO) $(ECHO_FLAGS) "<html>" >> $@\
	&& $(HTML_HEAD)\
	&& $(MARKDOWN) $(MARKDOWN_FLAGS)\
		$<\
			>> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</body>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</html>" >> $@\
	&& $(DONE);

#   Create html files from txt files
%.html : %.txt
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "<!DOCTYPE html>" > $@\
	&& $(ECHO) $(ECHO_FLAGS) "<html>" >> $@\
	&& $(HTML_HEAD)\
	&& $(ECHO) $(ECHO_FLAGS) "<body>" >> $@\
	&& $(SED) $(SED_FLAGS)\
		-e's/^/    /; # indent 4 spaces to make text preformatted'\
			$<\
	| $(MARKDOWN) $(MARKDOWN_FLAGS)\
		-\
			>> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</body>" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "</html>" >> $@\
	&& $(DONE);

#   Update schematic titleblock: chipflasher
gschem/chipflasher-page%.titleblock.sch : gschem/chipflasher-page%.sch
	@$(HEADLINE)\
	&& page="$$((10#$(subst gschem/chipflasher-page,,$*)))"\
	&& pages="$(words $(wildcard gschem/chipflasher-page*.sch))"\
	&& $(TITLEBLOCK)\
	&& $(DONE);

#   Update schematic titleblock: powerswitch
gschem/powerswitch-page%.titleblock.sch : gschem/powerswitch-page%.sch
	@$(HEADLINE)\
	&& page="$$((10#$(subst gschem/powerswitch-page,,$*)))"\
	&& pages="$(words $(wildcard gschem/powerswitch-page*.sch))"\
	&& $(TITLEBLOCK)\
	&& $(DONE);

#   Update schematic titleblock: sliderswitch
gschem/sliderswitch-page%.titleblock.sch : gschem/sliderswitch-page%.sch
	@$(HEADLINE)\
	&& page="$$((10#$(subst gschem/sliderswitch-page,,$*)))"\
	&& pages="$(words $(wildcard gschem/sliderswitch-page*.sch))"\
	&& $(TITLEBLOCK)\
	&& $(DONE);

#   Update schematic titleblock: cable
gschem/cable-page%.titleblock.sch : gschem/cable-page%.sch
	@$(HEADLINE)\
	&& page="$$((10#$(subst gschem/cable-page,,$*)))"\
	&& pages="$(words $(wildcard gschem/cable-page*.sch))"\
	&& $(TITLEBLOCK)\
	&& $(DONE);

#   Update schematic titleblock: spiflash
gschem/spiflash-page%.titleblock.sch : gschem/spiflash-page%.sch
	@$(HEADLINE)\
	&& page="$$((10#$(subst gschem/spiflash-page,,$*)))"\
	&& pages="$(words $(wildcard gschem/spiflash-page*.sch))"\
	&& $(TITLEBLOCK)\
	&& $(DONE);

#   Update schematic titleblock: devkit
gschem/devkit-page%.titleblock.sch : gschem/devkit-page%.sch
	@$(HEADLINE)\
	&& page="$$((10#$(subst gschem/devkit-page,,$*)))"\
	&& pages="$(words $(wildcard gschem/devkit-page*.sch))"\
	&& $(TITLEBLOCK)\
	&& $(DONE);

#   Generate multipage PDF from schematics: SPIFLASH_SCH
$(SPIFLASH_SCHEMATIC_PDF) : $(subst .sch,.titleblock.sch,$(SPIFLASH_SCH))
	@$(HEADLINE)\
	&& $(GAF) $(GAF_FLAGS)\
		export\
			--color\
			--paper=iso_a4\
			--align=auto\
			--margins=0mm:14mm:0mm:14mm\
			--output=$@\
				$^\
	&& $(DONE);

#   Generate multipage PDF from schematics: CABLE_SCH
$(CABLE_SCHEMATIC_PDF) : $(subst .sch,.titleblock.sch,$(CABLE_SCH))
	@$(HEADLINE)\
	&& $(GAF) $(GAF_FLAGS)\
		export\
			--color\
			--paper=iso_a4\
			--align=auto\
			--margins=0mm:14mm:0mm:14mm\
			--output=$@\
				$^\
	&& $(DONE);

#   Generate multipage PDF from schematics: POWERSWITCH_SCH
$(POWERSWITCH_SCHEMATIC_PDF) : $(subst .sch,.titleblock.sch,$(POWERSWITCH_SCH))
	@$(HEADLINE)\
	&& $(GAF) $(GAF_FLAGS)\
		export\
			--color\
			--paper=iso_a4\
			--align=auto\
			--margins=0mm:14mm:0mm:14mm\
			--output=$@\
				$^\
	&& $(DONE);

#   Generate multipage PDF from schematics: SLIDERSWITCH_SCH
$(SLIDERSWITCH_SCHEMATIC_PDF) : $(subst .sch,.titleblock.sch,$(SLIDERSWITCH_SCH))
	@$(HEADLINE)\
	&& $(GAF) $(GAF_FLAGS)\
		export\
			--color\
			--paper=iso_a4\
			--align=auto\
			--margins=0mm:14mm:0mm:14mm\
			--output=$@\
				$^\
	&& $(DONE);

#   Generate multipage PDF from schematics: CHIPFLASHER_SCH
$(CHIPFLASHER_SCHEMATIC_PDF) : $(subst .sch,.titleblock.sch,$(CHIPFLASHER_SCH))
	@$(HEADLINE)\
	&& $(GAF) $(GAF_FLAGS)\
		export\
			--color\
			--paper=iso_a4\
			--align=auto\
			--margins=0mm:14mm:0mm:14mm\
			--output=$@\
				$^\
	&& $(DONE);

#   Generate multipage PDF from schematics: DEVKIT_SCH
$(DEVKIT_SCHEMATIC_PDF) : $(subst .sch,.titleblock.sch,$(DEVKIT_SCH))
	@$(HEADLINE)\
	&& $(GAF) $(GAF_FLAGS)\
		export\
			--color\
			--paper=iso_a4\
			--align=auto\
			--margins=0mm:14mm:0mm:14mm\
			--output=$@\
				$^\
	&& $(DONE);

#   Generate PNG images from schematics.
%.sch.png : %.titleblock.sch
	@$(HEADLINE)\
	&& $(GAF) $(GAF_FLAGS)\
		export\
			--color\
			--dpi=144\
			--size=auto\
			--margins=10px\
			--output=$@\
				$<\
	&& $(DONE);

#   Stamp version string onto pcb.
%.pcb.version : %.pcb
	@$(HEADLINE)\
	&& $(SED) $(SED_FLAGS)\
		-e "s/(PCB\[\")(.*)($(TOKEN_BOARD_NUMBER))(\".*)/\1\2$(BOARD_NUMBER)\4/;"\
		-e "s/(Text\[.*\")(.*)($(TOKEN_BOARD_NUMBER))(\".*)/\1\2$(BOARD_NUMBER)\4/;"\
			$< > $@\
	&& $(DONE);

#   Create top view images from pcb files.
%.top.png : %.pcb.version
	@$(HEADLINE)\
	&& $(PCB) $(PCB_FLAGS)\
		-x png --dpi 300 --use-alpha --only-visible --photo-mode --photo-mask-colour green\
		--outfile $@\
			$<\
	&& $(DONE);

#   Create bottom view images from pcb files.
%.bottom.png : %.pcb.version
	@$(HEADLINE)\
	&& $(PCB) $(PCB_FLAGS)\
		-x png --dpi 300 --use-alpha --only-visible --photo-mode --photo-flip-x --photo-mask-colour green\
		--outfile $@\
			$<\
	&& $(DONE);

#   Export chipflasher device images.
chipflasher-device : $(ROOT_OPENSCAD)chipflasher-device.scad\
	$(ROOT_OPENSCAD)chipflasher-device.ogg\
		$(ROOT_OPENSCAD)chipflasher-device.mp4\
			$(ROOT_OPENSCAD)chipflasher-device.webm
	@$(HEADLINE)\
	&& a=(\
		'50.80,40.80,-18.80,0.00,0.00,180.00,250.00' o\
		'56.96,29.94,-23.90,63.40,0.00,65.60,287.94' p\
		'55.94,33.79,-20.85,71.10,0.00,323.90,281.94' p\
		'56.82,38.40,-8.86,135.50,0.00,336.00,326.75' p\
	)\
	&& tmpfile=$$(mktemp -q --suffix=.scad cadfile-XXXXX)\
	&& {\
			$(CP) $(CP_FLAGS) -f $< $${tmpfile}\
			&& $(SED) $(SED_FLAGS) -i -e'/^[\t ]*panel_transparent/s/^/*/;' $${tmpfile}\
			&& $(OPENSCAD) $(OPENSCAD_FLAGS)\
				--camera=$${a[0]}\
				--imgsize=1400,918\
				--view axes\
				--projection=$${a[1]}\
				-o $(subst .scad,.0.png,$<)\
					$${tmpfile}\
			&& $(RM) $(RM_FLAGS) $${tmpfile}\
		;}\
	&& for i in $$($(SEQ) $(SEQ_FLAGS) -w 1 1 3)\
		;do\
			$(OPENSCAD) $(OPENSCAD_FLAGS)\
			--camera=$${a[$$((i*2))]}\
			--imgsize=1400,918\
			--view axes\
			--projection=$${a[$$((i*2+1))]}\
			-o $(subst .scad,.$${i}.png,$<)\
				$<\
		;done\
	&& $(DONE);

#   Export chipflasher panel files.
chipflasher-panel : $(subst .dxf,.pdf,$(CHIPFLASHER_DXF)) $(subst .dxf,.png,$(CHIPFLASHER_DXF))
	@$(HEADLINE)\
	&& $(DONE);

#   Export devkit panel files.
devkit-panel : $(subst .dxf,.pdf,$(DEVKIT_DXF)) $(subst .dxf,.png,$(DEVKIT_DXF))
	@$(HEADLINE)\
	&& $(DONE);

librecad/chipflasher-v2-panel.png : librecad/chipflasher-v2-panel.pdf
	@$(HEADLINE)\
	&& $(IM_CONVERT) $(IM_CONVERT_FLAGS)\
		$<\
		-gravity Center\
		-crop 70%x55%\
			$@\
	&& $(DONE);

librecad/chipflasher-panel.png : librecad/chipflasher-panel.pdf
	@$(HEADLINE)\
	&& $(IM_CONVERT) $(IM_CONVERT_FLAGS)\
		$<\
		-gravity Center\
		-rotate 90\
		-crop 65%x65%\
			$@\
	&& $(DONE);

librecad/devkit-panel.png : librecad/devkit-panel.pdf
	@$(HEADLINE)\
	&& $(IM_CONVERT) $(IM_CONVERT_FLAGS)\
		$<\
		-gravity center\
		-rotate 90\
		-crop 80%x85%\
		-resize 2000\
			$@\
	&& $(DONE);

%.pdf : %.dxf
	@$(HEADLINE)\
	&& $(LIBRECAD) $(LIBRECAD_FLAGS) dxf2pdf\
		$<\
		-t $(<D)\
		--paper 210x297\
		--center\
		--resolution 300\
	&& $(DONE);

#   Export chipflasher label files, png and pdf.
chipflasher-label : $(CHIPFLASHER_SVG)
	@$(HEADLINE)\
	&& tmpfile=`$(MKTEMP) $(MKTEMP_FLAGS) -q --suffix=.svg`\
	&& $(SED) $(SED_FLAGS)\
		-e 's/(>Version: )(\$$.*\$$)/\1'$(PROJECT_NUMBER)'/;'\
			$<\
				> "$${tmpfile}"\
	&& $(INKSCAPE) $(INKSCAPE_FLAGS)\
		--export-filename=$(subst .svg,.png,$<)\
		--export-id="layer7"\
		--export-id-only\
		--export-dpi=300\
			"$${tmpfile}"\
	&& $(INKSCAPE) $(INKSCAPE_FLAGS)\
		--export-filename=$(subst .svg,.pdf,$<)\
		--export-area-page\
			"$${tmpfile}"\
	&& $(RM) $(RM_FLAGS) "$${tmpfile}"\
	&& $(DONE);

#   Export devkit label files, png and pdf.
devkit-label : $(DEVKIT_SVG)
	@$(HEADLINE)\
	&& tmpfile=`$(MKTEMP) $(MKTEMP_FLAGS) -q --suffix=.svg`\
	&& $(SED) $(SED_FLAGS)\
		-e 's/(>Version: )(\$$.*\$$)/\1'$(PROJECT_NUMBER)'/;'\
			$<\
				> "$${tmpfile}"\
	&& $(INKSCAPE) $(INKSCAPE_FLAGS)\
		--export-filename=$(subst .svg,.png,$<)\
		--export-id="layer6"\
		--export-id-only\
		--export-dpi=300\
			"$${tmpfile}"\
	&& $(INKSCAPE) $(INKSCAPE_FLAGS)\
		--export-filename=$(subst .svg,.pdf,$<)\
		--export-area-page\
			"$${tmpfile}"\
	&& $(RM) $(RM_FLAGS) "$${tmpfile}"\
	&& $(DONE);

#   Start gerbv utility with all gerber files loaded.
gerbv : gerber
	@$(HEADLINE)\
	&& $(CD) $(CD_FLAGS)\
		$(ROOT_PCB)\
	&& $(GERBV) $(GERBV_FLAGS)\
		$(notdir $(GERBER_PREAMP)-$(PROJECT_COMMIT).*.cnc)\
		$(notdir $(GERBER_PREAMP)-$(PROJECT_COMMIT).*.gbr)\
		$(notdir $(GERBER_PREAMP)-$(PROJECT_COMMIT).xy)\
	&& $(CD) $(CD_FLAGS)\
		-\
	&& $(DONE);

#   Let PCB editor export layers as gerber files.
gerber : $(addsuffix .version,$(CHIPFLASHER_PCB)) $(GERBER_PREAMP)-$(PROJECT_COMMIT).bom $(GERBER_PREAMP)-$(PROJECT_COMMIT).xy
	@$(HEADLINE)\
	&& $(CD) $(CD_FLAGS)\
		$(ROOT_PCB)\
	&& $(PCB) $(PCB_FLAGS)\
		-x gerber\
		--gerberfile $(notdir $(GERBER_PREAMP)-$(PROJECT_COMMIT))\
		--fab-author N\.N\.\
			$(notdir $<)\
	&& $(CD) $(CD_FLAGS)\
		-\
	&& $(DONE);

#   Turn pcb’s native gerber file extensions into aisler namespace
gerber-aisler : gerber
	-@$(HEADLINE)\
	&& {\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).fab.gbr $(GERBER_PREAMP)-$(PROJECT_COMMIT).fab.ger;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).outline.gbr $(GERBER_PREAMP)-$(PROJECT_COMMIT).boardoutline.ger;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).top.gbr $(GERBER_PREAMP)-$(PROJECT_COMMIT).toplayer.ger;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).topmask.gbr $(GERBER_PREAMP)-$(PROJECT_COMMIT).topsoldermask.ger;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).toppaste.gbr $(GERBER_PREAMP)-$(PROJECT_COMMIT).toppaste.ger;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).topsilk.gbr $(GERBER_PREAMP)-$(PROJECT_COMMIT).topsilkscreen.ger;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).bottom.gbr $(GERBER_PREAMP)-$(PROJECT_COMMIT).bottomlayer.ger;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).bottommask.gbr $(GERBER_PREAMP)-$(PROJECT_COMMIT).bottomsoldermask.ger;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).bottompaste.gbr $(GERBER_PREAMP)-$(PROJECT_COMMIT).bottompaste.ger;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).bottomsilk.gbr $(GERBER_PREAMP)-$(PROJECT_COMMIT).bottomsilkscreen.ger;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).plated-drill.cnc $(GERBER_PREAMP)-$(PROJECT_COMMIT).drills_pth.xln;\
		$(CP) $(CP_FLAGS) -f $(GERBER_PREAMP)-$(PROJECT_COMMIT).unplated-drill.cnc $(GERBER_PREAMP)-$(PROJECT_COMMIT).holes_npth.xln;\
	}\
	&& $(DONE);

#   target for pcb’s native gerber archive
gerber-archive : gerber
	@$(HEADLINE)\
	&& $(CD) $(CD_FLAGS)\
		$(dir $(GERBER_PREAMP))\
	&& $(ZIP) $(ZIP_FLAGS)\
		$(notdir $(GERBER_PREAMP).zip)\
		$(notdir $(GERBER_PREAMP)-$(PROJECT_COMMIT).*.gbr)\
		$(notdir $(GERBER_PREAMP)-$(PROJECT_COMMIT).*.cnc)\
		$(notdir $(GERBER_PREAMP)-$(PROJECT_COMMIT).bom)\
		$(notdir $(GERBER_PREAMP)-$(PROJECT_COMMIT).xy)\
	&& $(CD) $(CD_FLAGS)\
		-\
	&& $(DONE);

#   target for aisler’s gerber archive
gerber-aisler-archive : gerber-aisler
	@$(HEADLINE)\
	&& $(CD) $(CD_FLAGS)\
		$(dir $(GERBER_PREAMP))\
	&& $(ZIP) $(ZIP_FLAGS)\
		$(notdir $(GERBER_PREAMP).aisler.zip)\
		$(notdir $(GERBER_PREAMP)-$(PROJECT_COMMIT).*.ger)\
		$(notdir $(GERBER_PREAMP)-$(PROJECT_COMMIT).*.xln)\
	&& $(CD) $(CD_FLAGS)\
		-\
	&& $(DONE);

#   target for native pcb gerber archive, PNG and PS preview
gerber-archive-preview : $(GERBER_PREAMP).png $(GERBER_PREAMP).ps
	@$(HEADLINE)\
	&& $(DONE);

#   Rule for gerber archive PNG preview
$(GERBER_PREAMP).png : gerber
	@$(HEADLINE)\
	&& $(CD) $(CD_FLAGS)\
		$(@D)\
	&& $(GERBV) $(GERBV_FLAGS)\
		--export=png\
		--output=$(@F)\
		--dpi=300\
		--background=#efefef\
		--foreground=#cc000033\
		$(notdir $(GERBER_PREAMP))-$(PROJECT_COMMIT).*.{gbr,cnc}\
	&& $(CD) $(CD_FLAGS)\
		-\
	&& $(DONE);

#   Create .ps file from versioned PCB file
$(GERBER_PREAMP).ps : $(GERBER_PREAMP).pcb.version
	@$(HEADLINE)\
	&& $(PCB) $(PCB_FLAGS) -x ps\
		--psfile $@\
		--drill-helper\
		--align-marks\
		--outline\
		--media A4\
		--drill-copper\
		--show-legend\
		--psfade 0.5\
		--ps-color\
		--fab-author N\.N\.\
			$(<)\
	&& $(DONE);

#   Perform checks
check : $(SPIFLASH_DRC) $(CABLE_DRC) $(POWERSWITCH_DRC) $(SLIDERSWITCH_DRC) $(CHIPFLASHER_DRC) $(DEVKIT_DRC)
	@$(HEADLINE)\
	&& $(DONE);

#   Synchronize chipflasher pcb file with chipflasher schematic
synchronize : $(CHIPFLASHER_SCH) $(wildcard $(ROOT_FOOTPRINTS)*)
	@$(HEADLINE)\
	&& $(GSCH2PCB) $(GSCH2PCB_FLAGS)\
		-o $(ROOT_PCB)chipflasher-pcb\
		-d $(ROOT_FOOTPRINTS)\
			$(CHIPFLASHER_SCH)\
	&& $(DONE);

#   Clean files generated by gsch2pcb.
clean-synchronize :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(ROOT_PCB)chipflasher-pcb.{cmd,net,new.pcb,pcb.bak}\
	&& $(DONE);

#   Clean backup files, generated by PCB- and schematic editors.
clean-backups :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(TARGETS_GSCHEM_AUTO1)\
		$(TARGETS_GSCHEM_AUTO2)\
		$(TARGETS_GSCHEM_AUTO3)\
	&& $(RM) $(RM_FLAGS)\
		$(wildcard $(ROOT_PCB)*.backup)\
		$(wildcard $(ROOT_PCB)*.pcb~)\
		$(wildcard $(ROOT_LIBRECAD)*.dxf~)\
		$(wildcard $(ROOT_FOOTPRINTS)*.fp~)\
	&& $(DONE);

#   Clean gerber files
clean-gerber :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS) \
		$(wildcard $(GERBER_PREAMP)-*.*.gbr)\
		$(wildcard $(GERBER_PREAMP)-*.*.cnc)\
		$(wildcard $(GERBER_PREAMP)-*.*.ger)\
		$(wildcard $(GERBER_PREAMP)-*.*.xln)\
		$(wildcard $(GERBER_PREAMP)-*.bom)\
		$(wildcard $(GERBER_PREAMP)-*.xy)\
		$(addsuffix .version,$(CHIPFLASHER_PCB))\
	&& $(DONE);

#   Clean zipped gerber archives
clean-archives :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(wildcard $(GERBER_PREAMP).zip)\
		$(wildcard $(GERBER_PREAMP).aisler.zip)\
	&& $(DONE);

#   Clean gerber archive PNG previews
clean-archive-previews :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(wildcard $(GERBER_PREAMP).png)\
		$(wildcard $(GERBER_PREAMP).ps)\
	&& $(DONE);

#   Clean spiflash files
clean-spiflash :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(SPIFLASH_DRC)\
		$(SPIFLASH_SCHEMATIC_PDF)\
		$(SPIFLASH_PNG)\
		$(SPIFLASH_BOM_HTML)\
	&& $(DONE);

#   Clean cable files
clean-cable :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(CABLE_DRC)\
		$(CABLE_SCHEMATIC_PDF)\
		$(CABLE_PNG)\
		$(CABLE_BOM_HTML)\
	&& $(DONE);

#   Clean power switch files
clean-powerswitch :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(POWERSWITCH_DRC)\
		$(POWERSWITCH_SCHEMATIC_PDF)\
		$(POWERSWITCH_PNG)\
		$(POWERSWITCH_BOM_HTML)\
	&& $(DONE);

#   Clean slider switch files
clean-sliderswitch :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(SLIDERSWITCH_DRC)\
		$(SLIDERSWITCH_SCHEMATIC_PDF)\
		$(SLIDERSWITCH_PNG)\
		$(SLIDERSWITCH_BOM_HTML)\
	&& $(DONE);

#   Clean chipflasher files
clean-chipflasher : clean-gerber clean-archive-previews clean-archives clean-animation-files
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		./chipflasher-bom.html\
		$(wildcard $(GERBER_PREAMP).xy.html)\
		$(wildcard $(GERBER_PREAMP).bom.html)\
		$(CHIPFLASHER_DRC)\
		$(CHIPFLASHER_SCHEMATIC_PDF)\
		$(CHIPFLASHER_PNG)\
		$(subst .svg,.png,$(CHIPFLASHER_SVG))\
		$(subst .svg,.pdf,$(CHIPFLASHER_SVG))\
		$(subst .dxf,.pdf,$(CHIPFLASHER_DXF))\
		$(subst .dxf,.png,$(CHIPFLASHER_DXF))\
		$(ROOT_OPENSCAD)*.png\
	&& $(DONE);

#   Clean devkit files
clean-devkit :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		$(DEVKIT_DRC)\
		$(DEVKIT_SCHEMATIC_PDF)\
		$(DEVKIT_PNG)\
		$(DEVKIT_BOM)\
		$(DEVKIT_BOM_MD)\
		$(DEVKIT_BOM_HTML)\
		$(subst .svg,.png,$(DEVKIT_SVG))\
		$(subst .svg,.pdf,$(DEVKIT_SVG))\
		$(subst .dxf,.pdf,$(DEVKIT_DXF))\
		$(subst .dxf,.png,$(DEVKIT_DXF))\
	&& $(DONE);

#   Clean documentation files
clean-docu :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		./cern_ohl_s_v2.html\
		./cern_ohl_s_v2_user_guide.html\
		./README.html\
		./CHANGES.html\
	&& $(DONE);

#   Clean all but device folder
clean-but-device : hello\
	clean-docu\
		clean-synchronize\
			clean-backups\
				clean-spiflash\
					clean-cable\
						clean-powerswitch\
							clean-sliderswitch\
								clean-chipflasher\
									clean-devkit
	@$(HEADLINE)\
	&& $(DONE);

#   Clean all
clean : hello clean-but-device\
	clean-chipflasher-devkit\
		clean-chipflasher-ng\
			clean-chipflasher-v2\
				clean-chipflasher-board-edition-1\
					clean-testboard-v2-0-2
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		./Makefile-?????.mk\
	&& $(RM) $(RM_FLAGS)\
		./cadfile-?????.scad\
	&& $(DONE);
