From 0692ccd33afc4fdd80550e9979b824c1c25e973b Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sun, 28 Feb 2021 17:01:38 +0100 Subject: 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. --- latex/Makefile | 100 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 37 deletions(-) (limited to 'latex/Makefile') 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) -- cgit v1.2.3