mirror of
https://github.com/harvard-edge/cs249r_book.git
synced 2026-07-16 14:42:29 -05:00
149 lines
6.0 KiB
Makefile
149 lines
6.0 KiB
Makefile
# =============================================================================
|
|
# mlsysim/tutorial/Makefile — Build ISCA tutorial slides
|
|
# =============================================================================
|
|
# Usage:
|
|
# make Build the full tutorial deck (PDF)
|
|
# make svgs Convert all SVGs to PDFs
|
|
# make slides Build slides only (assumes SVGs already converted)
|
|
# make clean Remove build artifacts
|
|
# make check Build slides and fail on layout warnings
|
|
# make check-tools Verify SVG source files and local tools
|
|
#
|
|
# Prerequisites:
|
|
# - xelatex (TeX Live or MacTeX)
|
|
# - inkscape (for SVG→PDF conversion)
|
|
# OR
|
|
# - rsvg-convert (alternative SVG→PDF, lighter than inkscape)
|
|
# =============================================================================
|
|
|
|
SHELL := /bin/bash
|
|
|
|
# Directories
|
|
SLIDES_DIR := slides
|
|
SVG_DIR := $(SLIDES_DIR)/images/svg
|
|
PDF_IMG_DIR := $(SLIDES_DIR)/images/pdf
|
|
BUILD_DIR := _build
|
|
|
|
# Source files
|
|
MOD1 := $(SLIDES_DIR)/tutorial_module1.tex
|
|
MOD2 := $(SLIDES_DIR)/tutorial_module2.tex
|
|
MOD3 := $(SLIDES_DIR)/tutorial_module3.tex
|
|
MOD4 := $(SLIDES_DIR)/tutorial_module4.tex
|
|
RELATED := $(SLIDES_DIR)/related_work.tex
|
|
|
|
# All SVG sources (auto-detected)
|
|
SVGS := $(wildcard $(SVG_DIR)/*.svg)
|
|
PDFS := $(patsubst $(SVG_DIR)/%.svg,$(PDF_IMG_DIR)/%.pdf,$(SVGS))
|
|
|
|
# LaTeX engine — pdflatex + helvet/courier, matching slides/Makefile
|
|
# and mlsysim/paper. Was xelatex+fontspec, which had silent-fallback
|
|
# rendering issues on Ubuntu CI (see 2026-05-12 publish drama).
|
|
LATEX := pdflatex
|
|
LATEX_FLAGS := -interaction=nonstopmode -halt-on-error -output-directory=$(BUILD_DIR)
|
|
|
|
# SVG converter (try inkscape first, fall back to rsvg-convert)
|
|
SVG2PDF := $(shell command -v inkscape >/dev/null 2>&1 && echo "inkscape --export-type=pdf" || echo "rsvg-convert -f pdf -o")
|
|
|
|
# =============================================================================
|
|
# TARGETS
|
|
# =============================================================================
|
|
|
|
.PHONY: all slides svgs clean check check-tools help
|
|
|
|
all: svgs slides ## Build everything (SVGs → PDFs → slide deck)
|
|
|
|
help: ## Show this help
|
|
@echo "mlsysim Tutorial Build System"
|
|
@echo ""
|
|
@echo "Targets:"
|
|
@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " %-12s %s\n", $$1, $$2}'
|
|
|
|
# --- SVG → PDF conversion ---
|
|
svgs: $(PDFS) ## Convert all SVGs to PDF
|
|
|
|
$(PDF_IMG_DIR)/%.pdf: $(SVG_DIR)/%.svg | $(PDF_IMG_DIR)
|
|
@echo "SVG → PDF: $<"
|
|
@if command -v inkscape >/dev/null 2>&1; then \
|
|
inkscape --export-type=pdf --export-filename=$@ $<; \
|
|
elif command -v rsvg-convert >/dev/null 2>&1; then \
|
|
rsvg-convert -f pdf -o $@ $<; \
|
|
else \
|
|
echo "ERROR: Neither inkscape nor rsvg-convert found. Install one."; \
|
|
exit 1; \
|
|
fi
|
|
|
|
$(PDF_IMG_DIR):
|
|
@mkdir -p $@
|
|
|
|
# --- Slide compilation ---
|
|
# Build both decks. Each .tex is compiled twice so cross-references resolve.
|
|
# The output is BUILD_DIR/<name>.pdf (xelatex -output-directory writes there).
|
|
slides: $(BUILD_DIR)/tutorial_module1.pdf $(BUILD_DIR)/tutorial_module2.pdf $(BUILD_DIR)/tutorial_module3.pdf $(BUILD_DIR)/tutorial_module4.pdf ## Build all tutorial deck PDFs
|
|
|
|
$(BUILD_DIR)/tutorial_module1.pdf: $(MOD1) $(RELATED) $(PDFS) | $(BUILD_DIR)
|
|
@echo "Building tutorial Module 1..."
|
|
@mkdir -p $(SLIDES_DIR)/$(BUILD_DIR)
|
|
@cd $(SLIDES_DIR) && $(LATEX) $(LATEX_FLAGS) tutorial_module1.tex
|
|
@cd $(SLIDES_DIR) && $(LATEX) $(LATEX_FLAGS) tutorial_module1.tex
|
|
@cp $(SLIDES_DIR)/$(BUILD_DIR)/tutorial_module1.pdf $@
|
|
@echo " ✓ $@"
|
|
|
|
$(BUILD_DIR)/tutorial_module2.pdf: $(MOD2) $(RELATED) $(PDFS) | $(BUILD_DIR)
|
|
@echo "Building tutorial Module 2..."
|
|
@mkdir -p $(SLIDES_DIR)/$(BUILD_DIR)
|
|
@cd $(SLIDES_DIR) && $(LATEX) $(LATEX_FLAGS) tutorial_module2.tex
|
|
@cd $(SLIDES_DIR) && $(LATEX) $(LATEX_FLAGS) tutorial_module2.tex
|
|
@cp $(SLIDES_DIR)/$(BUILD_DIR)/tutorial_module2.pdf $@
|
|
@echo " ✓ $@"
|
|
|
|
$(BUILD_DIR)/tutorial_module3.pdf: $(MOD3) $(RELATED) $(PDFS) | $(BUILD_DIR)
|
|
@echo "Building tutorial Module 3..."
|
|
@mkdir -p $(SLIDES_DIR)/$(BUILD_DIR)
|
|
@cd $(SLIDES_DIR) && $(LATEX) $(LATEX_FLAGS) tutorial_module3.tex
|
|
@cd $(SLIDES_DIR) && $(LATEX) $(LATEX_FLAGS) tutorial_module3.tex
|
|
@cp $(SLIDES_DIR)/$(BUILD_DIR)/tutorial_module3.pdf $@
|
|
@echo " ✓ $@"
|
|
|
|
$(BUILD_DIR)/tutorial_module4.pdf: $(MOD4) $(RELATED) $(PDFS) | $(BUILD_DIR)
|
|
@echo "Building tutorial Module 4..."
|
|
@mkdir -p $(SLIDES_DIR)/$(BUILD_DIR)
|
|
@cd $(SLIDES_DIR) && $(LATEX) $(LATEX_FLAGS) tutorial_module4.tex
|
|
@cd $(SLIDES_DIR) && $(LATEX) $(LATEX_FLAGS) tutorial_module4.tex
|
|
@cp $(SLIDES_DIR)/$(BUILD_DIR)/tutorial_module4.pdf $@
|
|
@echo " ✓ $@"
|
|
|
|
$(BUILD_DIR):
|
|
@mkdir -p $@
|
|
|
|
# --- Utilities ---
|
|
check: slides ## Build slides and fail on layout warnings
|
|
@echo "Checking slide logs for layout warnings..."
|
|
@logs="$(SLIDES_DIR)/$(BUILD_DIR)/tutorial_module*.log"; \
|
|
if grep -E 'Overfull \\[hv]box|Underfull \\[hv]box|Frame text is shrunk' $$logs; then \
|
|
echo ""; \
|
|
echo "ERROR: slide layout warnings found."; \
|
|
exit 1; \
|
|
fi; \
|
|
echo " ✓ No overfull, underfull, or shrink warnings"
|
|
|
|
check-tools: ## Verify SVG sources and dependencies
|
|
@echo "SVG figures found: $(words $(SVGS))"
|
|
@for svg in $(SVGS); do echo " ✓ $$svg"; done
|
|
@echo ""
|
|
@echo "Checking tools..."
|
|
@command -v $(LATEX) >/dev/null 2>&1 && echo " ✓ $(LATEX)" || echo " ✗ $(LATEX) NOT FOUND"
|
|
@command -v inkscape >/dev/null 2>&1 && echo " ✓ inkscape" || echo " ⚠ inkscape not found (trying rsvg-convert)"
|
|
@command -v rsvg-convert >/dev/null 2>&1 && echo " ✓ rsvg-convert" || echo " ⚠ rsvg-convert not found"
|
|
@echo ""
|
|
@echo "Slide sources:"
|
|
@wc -l $(MOD1) $(MOD2) $(MOD3) $(MOD4) $(RELATED) 2>/dev/null || echo " Some files missing"
|
|
|
|
clean: ## Remove all build artifacts
|
|
@rm -rf $(BUILD_DIR)
|
|
@rm -rf $(SLIDES_DIR)/$(BUILD_DIR)
|
|
@rm -f $(PDF_IMG_DIR)/*.pdf
|
|
@rm -f $(SLIDES_DIR)/*.aux $(SLIDES_DIR)/*.log $(SLIDES_DIR)/*.nav
|
|
@rm -f $(SLIDES_DIR)/*.out $(SLIDES_DIR)/*.snm $(SLIDES_DIR)/*.toc
|
|
@rm -f $(SLIDES_DIR)/*.vrb $(SLIDES_DIR)/*.fls $(SLIDES_DIR)/*.fdb_latexmk
|
|
@echo "Clean."
|