.DEFAULT_GOAL = all PDFLATEX ?= pdflatex PDFTOPPM = pdftoppm PDFUNITE = pdfunite PDFTOPPM_FLAGS = -singlefile -png -r 300 COMMON_TEX_FILES = common.tex libs.tex colors.tex tikzcards.tex # The full path to the Makefile MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) # The path to the directory of the Makefile MAKEFILE_DIR := $(realpath $(dir $(MAKEFILE_PATH))) LATEX_ROOT := $(MAKEFILE_DIR) GAME_ROOT := $(MAKEFILE_DIR)/.. DATA_ROOT := $(GAME_ROOT)/data CARDS_YML_DIR := $(DATA_ROOT)/cards # the default language LANGUAGE ?= en CARDS_TEX_DIR := $(LATEX_ROOT)/cards/$(LANGUAGE) BUILDDIR := $(LATEX_ROOT)/build/$(LANGUAGE) ASSETS_PATH := $(GAME_ROOT)/assets PDFLATEX_ENV := TEXINPUTS=".:$(ASSETS_PATH):" GENERATE_CARD := $(GAME_ROOT)/scripts/generate_card.py GENERATE_CARD_FLAGS := --language=$(LANGUAGE) GENERATE_DECK := $(GAME_ROOT)/scripts/generate_deck.py GENERATE_DECK_FLAGS := --language=$(LANGUAGE) SETS := $(shell find $(CARDS_YML_DIR) -mindepth 1 -type d -printf "%f\n") SETS_SOURCEDIRS := $(foreach set, $(SETS), $(addprefix $(CARDS_YML_DIR)/, $(set))) SETS_TEXDIRS := $(foreach set, $(SETS), $(addprefix $(CARDS_TEX_DIR)/, $(set))) SETS_BUILDDIRS := $(foreach set, $(SETS), $(addprefix $(BUILDDIR)/, $(set))) # tex directory for sets collection tex SETS_TEX_DIR := $(LATEX_ROOT)/sets/$(LANGUAGE) SETS_TEX := $(foreach set, $(SETS), $(addprefix $(SETS_TEX_DIR)/, $(set).tex)) SETS_PDF_DIR := $(BUILDDIR) SETS_PDF := $(foreach set, $(SETS), $(addprefix $(SETS_PDF_DIR)/, $(set).pdf)) DECKS_SOURCEDIR := $(DATA_ROOT)/decks DECKS := $(shell find $(DECKS_SOURCEDIR) -mindepth 1 -type f -name "*.deck" -printf "%f\n") DECKS := $(foreach deck, $(DECKS), $(subst .deck,,$(deck))) DECKS_TEX_DIR := $(LATEX_ROOT)/decks/$(LANGUAGE) DECKS_TEX := $(foreach deck, $(DECKS), $(addprefix $(DECKS_TEX_DIR)/, $(deck).tex)) DECKS_PDF_DIR := $(BUILDDIR)/decks DECKS_PDF := $(foreach deck, $(DECKS), $(addprefix $(DECKS_PDF_DIR)/, $(deck).pdf)) # Add all dirs to VPATH where we generate or store dependencies VPATH = $(SETS_SOURCEDIRS) $(SETS_TEXDIRS) $(SETS_TEX_DIR) $(DECKS_SOURCEDIR) $(DECKS_TEX_DIR) $(CARDS_TEX_DIR) # Create a list of yaml card definitions CARDS_YML := $(foreach dir,$(SETS_SOURCEDIRS),$(wildcard $(dir)/*.yml)) CARDS_TEX := $(subst $(CARDS_YML_DIR),$(CARDS_TEX_DIR),$(CARDS_YML:.yml=.tex)) CARDS_PDF := $(subst $(CARDS_YML_DIR),$(BUILDDIR),$(CARDS_YML:.yml=.pdf)) CARDS_PNG = $(CARDS_PDF:.pdf=.png) SPECIAL_CARDS_TEX := unit_explanation.tex SPECIAL_CARDS_PDF := $(foreach card, $(SPECIAL_CARDS_TEX), $(addprefix $(BUILDDIR)/, $(card:.tex=.pdf))) SPECIAL_CARDS_PNG := $(SPECIAL_CARDS_PDF:.pdf=.png) CARDFMT = $(LATEX_ROOT)/card.fmt $(CARDFMT): $(COMMON_TEX_FILES) $(PDFLATEX) -ini -jobname="card" "&$(PDFLATEX)" mylatexformat.ltx $(CARDS_TEX_DIR)/base/archer.tex VERBOSE ?= @ MAKEFILE_LIST = Makefile define generateSetTexRules $(SETS_TEX_DIR)/$(1).tex: $(wildcard $(CARDS_TEX_DIR)/$(1)/*.tex) $(MAKEFILE_LIST) @echo "generating $(1) tex" @if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi $(VERBOSE) echo '\documentclass[a4paper,landscape]{article}' > $$@ $(VERBOSE) echo '\usepackage[margin=6mm,top=5mm]{geometry}' >> $$@ $(VERBOSE) echo '\input{libs.tex}' >> $$@ $(VERBOSE) echo '\input{colors.tex}' >> $$@ $(VERBOSE) echo '\input{tikzcards.tex}' >> $$@ $(VERBOSE) echo '\usepackage{standalone}' >> $$@ $(VERBOSE) echo '\\begin{document}' >> $$@ $(VERBOSE) echo '\\begin{center}' >> $$@ $(VERBOSE) echo '\pagestyle{empty}' >> $$@ $(VERBOSE)for card in $(wildcard $(CARDS_TEX_DIR)/$(1)/*.tex); do \ rel_card=$$$${card#"$(LATEX_ROOT)/"}; \ echo "\includestandalone{$$$${rel_card%.tex}}" >> $$@; done $(VERBOSE) echo '\end{center}' >> $$@ $(VERBOSE) echo '\end{document}' >> $$@ endef # Generate set tex rules $(foreach set, $(SETS), $(eval $(call generateSetTexRules,$(set)))) $(DECKS_TEX_DIR)/%.tex: $(DECKS_SOURCEDIR)/%.deck $(GENERATE_DECK) @echo generating $@ @if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi $(VERBOSE) $(GENERATE_DECK) $(GENERATE_DECK_FLAGS) $< > $@ define generateCardTexRules $(1)/%.tex: %.yml $(GENERATE_CARD) @echo building $$@ @if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi $(VERBOSE) $(GENERATE_CARD) $(GENERATE_CARD_FLAGS) $$< > $$@ endef # Generate cards tex rules $(foreach texdir, $(SETS_TEXDIRS), $(eval $(call generateCardTexRules, $(texdir)))) define generatePdfRules $(1)/%.pdf: $(2)%.tex $(COMMON_TEX_FILES) $(MAKEFILE_LIST) @echo building $$@ @if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi $(VERBOSE) $(PDFLATEX_ENV) $(PDFLATEX) --output-directory $$(@D) $$< endef define generateCardPdfRules $(1)/%.pdf: %.tex $(COMMON_TEX_FILES) $(CARDFMT) $(MAKEFILE_LIST) @echo building $$@ @if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi $(VERBOSE) $(PDFLATEX_ENV) $(PDFLATEX) --fmt $(CARDFMT) --output-directory $$(@D) $$< endef # Generate cards pdf rules $(foreach pdfdir, $(SETS_BUILDDIRS), $(eval $(call generateCardPdfRules, $(pdfdir),))) # Misc cards not in a set $(eval $(call generatePdfRules, $(BUILDDIR),)) # Generate sets pdf rule $(eval $(call generatePdfRules, $(SETS_PDF_DIR), $(SETS_TEX_DIR)/)) # Generate decks pdf rule $(eval $(call generatePdfRules, $(DECKS_PDF_DIR), $(DECKS_TEX_DIR)/)) .PHONY: all de en all: de en de: $(MAKE) LANGUAGE=de cards-all sets decks en: $(MAKE) cards-all sets decks .PHONY: sets sets-tex sets-pdf sets: sets-tex sets-pdf sets-tex: $(SETS_TEX) sets-pdf: $(SETS_PDF) .PHONY: decks decks-tex decks-pdf decks: decks-tex decks-pdf sets-tex: $(DECKS_TEX) sets-pdf: $(DECKS_PDF) .PHONY: cards-all cards-tex cards-pdf cards-png cards-all: cards-tex cards-pdf cards-png @echo "building $(LANGUAGE) cards" cards-tex: $(CARDS_TEX) cards-pdf: $(CARDS_PDF) $(SPECIAL_CARDS_PDF) $(BUILDDIR)/cards.pdf cards-png: $(CARDS_PNG) $(SPECIAL_CARDS_PNG) $(BUILDDIR)/cards.pdf: $(CARDS_PDF) $(MAKEFILE_LIST) @echo "building › › $@" @if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi $(VERBOSE) $(PDFUNITE) $(CARDS_PDF) $@ %.png: %.pdf $(MAKEFILE_LIST) @echo "png › $@" @if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi $(VERBOSE) $(PDFTOPPM) $(PDFTOPPM_FLAGS) $< $* .PHONY: clean-build clean-tex clean-both tabula-rasa clean-build: rm -rf $(BUILDDIR) clean-tex: rm -rf $(LATEX_ROOT)/cards/* clean-both: clean-build clean-tex tabula-rasa: $(MAKE) LANGUAGE=en clean-both $(MAKE) LANGUAGE=de clean-both sync-with-website: rsync -ruvz --include='*/' --include='*.pdf' --include='*.png' --exclude='*' \ $(LATEX_ROOT)/build/ muhq.space:html/muhqs-game/latex/build ssh muhq.space 'make -C ~/html/muhqs-game/html' ssh muhq.space 'chmod -R u=rwX,go=rX ~/html'