VERBOSE ?= @
SHELL := bash
HTML_TEMPLATE := template.html
PANDOC_FLAGS := -f markdown --embed-resources --standalone --template=$(HTML_TEMPLATE) --metadata-file=pandoc/default-metadata.yml
# The full path to the Makefile
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
# The path to the directory of the Makefile
MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
HTML_ROOT := $(MAKEFILE_DIR)
GAME_ROOT := $(MAKEFILE_DIR)..
GO_ROOT := $(GAME_ROOT)/go
RULES_ROOT := $(GAME_ROOT)/rules
MAPS_ROOT := $(GAME_ROOT)/maps
DATA_ROOT := $(GAME_ROOT)/data
CARDS_YML_DIR := $(DATA_ROOT)/cards
LATEX_ROOT := $(GAME_ROOT)/latex
LATEX_BUILDDIR := $(LATEX_ROOT)/build
GENERATE_CARD := $(GAME_ROOT)/scripts/generate_card.py
GENERATE_CARD_ARGS := --format markdown
GENERATE_CARD_LISTING := $(GAME_ROOT)/scripts/generate_card_listing.py
GENERATE_HOVER_LINKS := $(GAME_ROOT)/scripts/generate_card_hover_links.py
PREPARE_RULES := $(GAME_ROOT)/scripts/prepare_html_rules.py
SETS := $(shell find $(CARDS_YML_DIR) -mindepth 1 -type d -printf "%f\n")
SETS_SOURCEDIRS := $(foreach set, $(SETS), $(addprefix $(CARDS_YML_DIR)/, $(set)))
BUILDDIR := $(MAKEFILE_DIR)build
RULE_FILES := rules.md tiles.md ai.md
DE_RULES := $(addprefix $(RULES_ROOT)/de/,$(RULE_FILES))
EN_RULES := $(addprefix $(RULES_ROOT)/en/,$(RULE_FILES))
RULES := $(DE_RULES) $(EN_RULES)
RULES_HTML := $(subst $(RULES_ROOT), $(BUILDDIR)/rules, $(RULES:.md=.html))
CARDS_LISTING := cards_listing.md
DE_CARDS_LISTING := de/$(CARDS_LISTING)
EN_CARDS_LISTING := en/$(CARDS_LISTING)
LANG_CARDS_LISTINGS := $(foreach card_listing, $(DE_CARDS_LISTING) $(EN_CARDS_LISTING), \
$(addprefix $(BUILDDIR)/, $(card_listing:.md=.html)))
GENERATE_BOSS := $(GAME_ROOT)/scripts/generate_boss_html.py
BOSSES := kraken tyrant
BOSS_SITES := $(addprefix boss/,$(BOSSES:=.html))
BOSS_SITES_HTML := $(addprefix $(BUILDDIR)/,$(BOSS_SITES))
SITES := index.md rules.md cards.md maps.md tools.html decks.md boss/ai-companion.html boss/index.html
HTML := $(addprefix $(BUILDDIR)/,$(SITES:.md=.html)) $(BOSS_SITES_HTML)
BLOG_SOURCEDIR := $(HTML_ROOT)/blog
BLOG_POSTS_MD := $(shell find $(BLOG_SOURCEDIR) -mindepth 1 -type f -name "*.md" -printf "%f\n")
BLOG_POSTS_HTML := $(addprefix $(BUILDDIR)/blog/,$(BLOG_POSTS_MD:.md=.html))
VPATH := $(RULES_ROOT) $(BLOG_SOURCEDIR)
# Create a list of yaml card definitions
CARDS_YAML := $(foreach dir,$(SETS_SOURCEDIRS),$(wildcard $(dir)/*.yml))
MAKEFILE_LIST := Makefile
FILES_TO_COPY := hover-placeholder.png tools.html wasm.html $(subst $(HTML_ROOT),,$(wildcard $(HTML_ROOT)js/*)) blog/.htaccess blog/header.html
FILES_TO_COPY_TARGETS := $(addprefix $(BUILDDIR)/,$(FILES_TO_COPY))
.PHONY: all clean maps misc
all: $(HTML) $(RULES_HTML) maps misc $(BLOG_POSTS_HTML)
misc: $(BUILDDIR)/latex-build \
$(BUILDDIR)/cards-data \
$(FILES_TO_COPY_TARGETS) \
$(BUILDDIR)/webtools.wasm \
$(BUILDDIR)/boss/ai-companion.wasm \
$(BUILDDIR)/draftsim.wasm \
$(BUILDDIR)/feed.rss js/wasm_exec.js
js/wasm_exec.js: $(shell go env GOROOT)/lib/wasm/wasm_exec.js
cp $< $@
$(BUILDDIR)/%.wasm:
@echo "creating symlink $@"
@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
ln -s $(GO_ROOT)/$(*F)/$(*F).wasm $@
$(BUILDDIR)/draftsim.wasm:
@echo "creating symlink $@"
@if test \( ! \( -d $(@D) \) \); then mkdir -p $(@D);fi
ln -s $(GO_ROOT)/draftsim/client/client.wasm $@
$(FILES_TO_COPY_TARGETS): $(BUILDDIR)/%: %
@echo "copying $@"
@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
$(VERBOSE) cp $< $@
clean:
rm -rf $(BUILDDIR)
maps:
@echo "building $@"
$(VERBOSE) ln -sfT $(MAPS_ROOT) $(BUILDDIR)/maps
$(VERBOSE) $(MAKE) -C $(MAPS_ROOT)
$(BUILDDIR)/latex-build:
@echo "render cards"
$(VERBOSE) $(MAKE) -C $(LATEX_ROOT)
@echo "create rendered cards symlink"
$(VERBOSE) ln -sfT $(LATEX_BUILDDIR) $(BUILDDIR)/latex-build
$(BUILDDIR)/cards-data: $(LANG_CARDS_LISTINGS) $(BUILDDIR)/latex-build
@echo "create cards data symlink"
$(VERBOSE) ln -sfT $(DATA_ROOT)/cards $@
define generateCardsListing
$(1)/cards_listing.md: $(CARDS_YAML) $(GENERATE_CARD) $(GENERATE_CARD_LISTING) $(MAKEFILE_LIST)
@echo "building $$@"
@if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi
$(VERBOSE) $(GENERATE_CARD_LISTING) --language=$(2) $(CARDS_YML_DIR) > $$@;
$(1)/cards_listing.html: $(1)/cards_listing.md $(HTML_TEMPLATE)
@echo "building $$@"
@if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi
$(VERBOSE) pandoc --toc $(PANDOC_FLAGS) $$< -o $$@;
endef
$(eval $(call generateCardsListing, $(BUILDDIR)/de,de))
$(eval $(call generateCardsListing, $(BUILDDIR)/en,en))
define generateHtml
$(1)/%.html: %.md $(MAKEFILE_LIST) $(HTML_TEMPLATE) $(GENERATE_HOVER_LINKS)
@echo "building $$@"
@if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi
$(VERBOSE) if [[ $$$$(cat $$< | wc -l) -gt 80 ]]; \
then $(GENERATE_HOVER_LINKS) $$< | pandoc --toc $(PANDOC_FLAGS) $(2) -o $$@; \
else $(GENERATE_HOVER_LINKS) $$< | pandoc $(PANDOC_FLAGS) $(2) -o $$@; fi
endef
define generateRulesHtml
$(1)/%.html: %.md $(MAKEFILE_LIST) $(HTML_TEMPLATE) $(GENERATE_HOVER_LINKS) $(PREPARE_RULES)
@echo "building $$@"
@if test \( ! \( -d $$(@D) \) \); then mkdir -p $$(@D);fi
$(VERBOSE) if [[ $$$$(cat $$< | wc -l) -gt 80 ]]; \
then $(GENERATE_HOVER_LINKS) $$< | pandoc --toc $(PANDOC_FLAGS) $(2) | $(PREPARE_RULES) > $$@; \
else $(GENERATE_HOVER_LINKS) $$< | pandoc $(PANDOC_FLAGS) $(2) | $(PREPARE_RULES) > $$@; fi
endef
$(eval $(call generateHtml, $(BUILDDIR),))
$(eval $(call generateRulesHtml, $(BUILDDIR)/rules, -N))
$(eval $(call generateHtml, $(BUILDDIR)/blog,))
CARDS = $(notdir $(basename $(wildcard $(BUILDDIR)/cards-data/*/*.yml)))
GENCARDSDATALIST := echo $(CARDS) | python -c 'import sys; print("".join([f"" for card in sys.stdin.read().split()]))'
CARDSDATALIST := $(shell $(GENCARDSDATALIST))
$(BUILDDIR)/boss/ai-companion.html: boss/ai-companion.html $(MAKEFILE_LIST)
@echo "building $@"
$(VERBOSE)if test \( ! \( -d $(@D) \) \); then mkdir -p $(@D); fi
$(VERBOSE) sed 's|%CARDS%|$(CARDSDATALIST)|' $< > $@
FEEDSRC = feed
GEN_FEED = $(FEEDSRC)/create_feed.py
FEEDITEMS = $(wildcard $(FEEDSRC)/items/*)
$(BUILDDIR)/feed.rss: $(FEEDITEMS) $(GEN_FEED)
@echo "building $$@"
$(VERBOSE)python3 $(GEN_FEED) $(FEEDITEMS) > $@
$(BOSS_SITES_HTML): $(BUILDDIR)/boss/%.html: $(MAKEFILE_LIST) $(GENERATE_BOSS) $(GENERATE_HOVER_LINKS)
@echo "building $@"
@if test \( ! \( -d $(@D) \) \); then mkdir -p $(@D); fi
$(VERBOSE)$(GENERATE_BOSS) $(*F) $(DATA_ROOT) $(MAPS_ROOT) $(RULES_ROOT) > $@