aboutsummaryrefslogtreecommitdiff
path: root/latex/Makefile
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fl.fischer@fau.de>2021-02-28 17:01:38 +0100
committerFlorian Fischer <florian.fl.fischer@fau.de>2021-02-28 17:01:38 +0100
commit0692ccd33afc4fdd80550e9979b824c1c25e973b (patch)
tree8cf46b780af060d9fd6cf5a089729a9491eaa1c7 /latex/Makefile
parent5074205584de432892de5b0543b64efde4ddd6e3 (diff)
downloadmuhqs-game-0692ccd33afc4fdd80550e9979b824c1c25e973b.tar.gz
muhqs-game-0692ccd33afc4fdd80550e9979b824c1c25e973b.zip
rework how cards are defined and generated
Card definitions are now stored in data/cards/ in a subdirectory for each set as YAML files. YAML is still human readable but stricter and better to handle in code than ini. The latex filesystem layout resembles the card definition layout and is created by the Makefile from the YAML card definitions and must not be regenerated each time by hand.
Diffstat (limited to 'latex/Makefile')
-rw-r--r--latex/Makefile100
1 files changed, 63 insertions, 37 deletions
diff --git a/latex/Makefile b/latex/Makefile
index 5eedeb05..ce98c59d 100644
--- a/latex/Makefile
+++ b/latex/Makefile
@@ -1,4 +1,4 @@
-.PHONY: all clean
+.PHONY: all clean clean-all cards-tex cards-pdf cards-png
.DEFAULT_GOAL = all
@@ -6,57 +6,83 @@ PDFLATEX = lualatex
PDFTOPPM = pdftoppm
PDFUNITE = pdfunite
-PDFTOPPM_FLAGS = -singlefile -png -r 300
+GENERATE_CARD = $(GAME_ROOT)scripts/generate_card.py
-COMMON_TEX_FILES = libs.tex colors.tex tikzcards.tex
+PDFTOPPM_FLAGS = -singlefile -png -r 300
-CARDS_DIR = cards
-CARD_SOURCES = $(shell find $(CARDS_DIR) -name "*.tex")
+COMMON_TEX_FILES = common.tex libs.tex colors.tex tikzcards.tex
-SETS_DIR = sets
-SETS_SOURCES = $(shell find $(SETS_DIR) -name "*.tex")
+# 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))
-VERBOSE = @
-PDF_DIR = ./build
+LATEX_ROOT := $(MAKEFILE_DIR)
+GAME_ROOT := $(MAKEFILE_DIR)/../
+DATA_ROOT := $(GAME_ROOT)/data
+CARDS_YML_DIR := $(DATA_ROOT)/cards
+CARDS_TEX_DIR := $(LATEX_ROOT)/cards
+BUILDDIR := $(LATEX_ROOT)/build
-ALL_SOURCES = $(CARD_SOURCES) $(SETS_SOURCES)
-PDFS = $(notdir $(ALL_SOURCES:.tex=.pdf))
-PDFS_PREFIXED = $(addprefix $(PDF_DIR)/,$(PDFS))
+ASSETS_PATH = $(GAME_ROOT)/assets
+PDFLATEX_ENV := TEXINPUTS=".:$(ASSETS_PATH):"
-CARD_PNGS = $(notdir $(CARD_SOURCES:.tex=.png))
-CARD_PNGS_PREFIXED = $(addprefix $(PDF_DIR)/,$(CARD_PNGS))
+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)))
-MAKEFILE_LIST = Makefile
+# Add yml dirs to VPATH, the place make will look for the source files
+VPATH = $(SETS_SOURCEDIRS) $(SETS_TEXDIRS)
-ASSETS_PATH = ../assets
-PDFLATEX_ENV := TEXINPUTS=".:$(ASSETS_PATH):"
+# Create a list of yaml card definitions
+CARDS_YAML := $(foreach dir,$(SETS_SOURCEDIRS),$(wildcard $(dir)/*.yml))
+CARDS_TEX := $(subst $(CARDS_YML_DIR),$(CARDS_TEX_DIR),$(CARDS_YAML:.yml=.tex))
+CARDS_PDF := $(subst $(CARDS_YML_DIR),$(BUILDDIR),$(CARDS_YAML:.yml=.pdf))
+CARDS_PNG = $(CARDS_PDF:.pdf=.png)
-all: $(PDF_DIR)/print.pdf $(PDFS_PREFIXED) $(CARD_PNGS_PREFIXED)
+VERBOSE = @
-$(PDF_DIR)/print.pdf: print.tex $(CARD_SOURCES) $(COMMON_TEX_FILES) $(MAKEFILE_LIST)
- @echo "building › › $@"
- @if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
- $(VERBOSE) $(PDFLATEX_ENV) $(PDFLATEX) --output-directory $(PDF_DIR) print.tex
+MAKEFILE_LIST = Makefile
-$(PDF_DIR)/cards.pdf: $(PDFS_PREFIXED) $(MAKEFILE_LIST)
+# Define the functions that will generate each rule
+define generatePdfRules
+$(1)/%.pdf: %.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 generateTexRules
+$(1)/%.tex: %.yml
+ @echo building $$@
+ @if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi
+ $(VERBOSE)$(GENERATE_CARD) --latex-root $(LATEX_ROOT) $$<
+endef
+
+# Generate tex rules
+$(foreach texdir, $(SETS_TEXDIRS), $(eval $(call generateTexRules, $(texdir))))
+
+# Generate pdf rules
+$(foreach pdfdir, $(SETS_BUILDDIRS), $(eval $(call generatePdfRules, $(pdfdir))))
+
+all: cards-tex cards-pdf cards-png
+cards-tex: $(CARDS_TEX)
+cards-pdf: $(CARDS_PDF)
+cards-png: $(CARDS_PNG)
+
+$(BUILDDIR)/cards.pdf: $(CARDS_PDF) $(MAKEFILE_LIST)
@echo "building › › $@"
@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
- $(VERBOSE) $(PDFUNITE) $(PDFS_PREFIXED) $@
-
-$(PDF_DIR)/%.pdf : $(CARDS_DIR)/%.tex $(COMMON_TEX_FILES) $(MAKEFILE_LIST)
- @echo "card › $@"
- @if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
- $(VERBOSE) $(PDFLATEX_ENV) $(PDFLATEX) --output-directory $(PDF_DIR) $(CARDS_DIR)/$*.tex
+ $(VERBOSE)$(PDFUNITE) $(CARDS_PDF) $@
-$(PDF_DIR)/%.pdf : $(SETS_DIR)/%.tex $(CARD_SOURCES) $(COMMON_TEX_FILES) $(MAKEFILE_LIST)
- @echo "card › $@"
- @if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
- $(VERBOSE) $(PDFLATEX_ENV) $(PDFLATEX) --output-directory $(PDF_DIR) $^
-
-$(PDF_DIR)/%.png : $(PDF_DIR)/%.pdf $(MAKEFILE_LIST)
+%.png: %.pdf $(MAKEFILE_LIST)
@echo "png › $@"
@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
- $(VERBOSE) $(PDFTOPPM) $(PDFTOPPM_FLAGS) $(PDF_DIR)/$*.pdf $(PDF_DIR)/$*
+ $(VERBOSE)$(PDFTOPPM) $(PDFTOPPM_FLAGS) $< $*
clean:
- rm -rf build/
+ rm -rf $(BUILDDIR)
+
+clean-all: clean
+ rm -rf $(CARDS_TEX_DIR)