Source tree reorganization: - Move StarForth v3 engine to v3/ (src/, include/, Makefile) - Move kernel to kernel/ (src/, include/, linker/, Makefile) - Create v4/ skeleton for F18-ISA golden model (DECOMPOSITION.md, JUSTIFICATION.md) - Move FABRIC-0..4.md to docs/fabric/ - Move ONTOLOGY.md and ROADMAP.md to docs/ Board infrastructure: - Add boards/ser5/, boards/raspi/, boards/milkv/, boards/zynq7020/ - Each board has board.mk (ISA, CPU flags, boot recipe) and README.md - Root Makefile becomes thin dispatcher: boot_image, all, clean, docs take TARGET - make boot_image TARGET=SER5|RASPI|MILKV builds one GPT/MBR image per board - ZYNQ7020 target exists but stops with clear error (ARMv7 port not built yet) - scripts/mkdiskimage.sh builds disk images for all boards Docs pipeline: - docs/book/ with LaTeX master (main.tex) and Makefile - pandoc converts Markdown to LaTeX at build time - Two Lua filters: table-widths.lua (wide tables wrap), code-breaks.lua (inline code breaks) - make docs builds single PDF (754 pages, 0 missing characters) - make docs TARGET=<board> adds board appendix - build/docs/<book|board>/meta.tex stamps git commit into PDF Bug fixes: - 42 include paths that only worked by accident now use correct relative paths - clang-18 hardcode replaced with configurable CC variable (fixed aarch64 build) - Pi 5: kernel_2712.img linked at 0x80000, .bss zeroed, memory reserved - Doxyfile, .clang-tidy, README.md, Kconfig paths updated Verified: - Hosted v3 build passes 1012 tests, 0 failures - SER5 image boots in QEMU (OVMF), POST passes, K exact (65536 = Q48_ONE) - Milk-V image boots in QEMU (OpenSBI + U-Boot + bootefi), POST passes - make clean TARGET=<board> removes only that board and its ISA objects - make all builds all boards, hosted v3, and docs in one run Co-authored-by: Junie <junie@jetbrains.com>
113 lines
4.6 KiB
Makefile
113 lines
4.6 KiB
Makefile
# docs/book/Makefile -- the single LithosAnanke book, built from LaTeX.
|
|
#
|
|
# Run from the repo root (the root Makefile does this):
|
|
# make docs -> build/docs/LithosAnanke.pdf
|
|
# make docs TARGET=<board> -> build/docs/LithosAnanke-<board>.pdf
|
|
# (same book + that board's appendix)
|
|
#
|
|
# docs/book/main.tex is the master. Markdown sources are converted by pandoc
|
|
# into LaTeX fragments under build/docs/gen/ and \input from main.tex; the
|
|
# Markdown stays the source of truth until a chapter is rewritten in LaTeX.
|
|
# Figures and tables that present data read the CSV directly at LaTeX time
|
|
# (pgfplots / pgfplotstable) and cite it with \datasource{path}; see
|
|
# docs/book/README.md.
|
|
|
|
BOOK_DIR := docs/book
|
|
OUT := build/docs
|
|
GEN := $(OUT)/gen
|
|
|
|
BOARD ?=
|
|
BOARD_NAME ?=
|
|
VARIANT := $(if $(BOARD),$(BOARD),book)
|
|
VAR_DIR := $(OUT)/$(VARIANT)
|
|
PDF := $(OUT)/LithosAnanke$(if $(BOARD),-$(BOARD)).pdf
|
|
|
|
PANDOC ?= pandoc
|
|
LATEXMK ?= latexmk
|
|
PANDOC_FILTERS := $(BOOK_DIR)/pandoc/table-widths.lua $(BOOK_DIR)/pandoc/code-breaks.lua
|
|
PANDOC_FLAGS := -f gfm -t latex --top-level-division=chapter --wrap=preserve \
|
|
$(foreach f,$(PANDOC_FILTERS),--lua-filter=$(f))
|
|
|
|
# fragment name : Markdown source. The order of \input lines is main.tex's.
|
|
CHAPTERS := \
|
|
ontology:docs/ONTOLOGY.md \
|
|
roadmap:docs/ROADMAP.md \
|
|
boards:boards/README.md \
|
|
justification:docs/v4.0.0/JUSTIFICATION.md \
|
|
decomposition:docs/v4.0.0/DECOMPOSITION.md \
|
|
fabric-0:docs/fabric/FABRIC-0.md \
|
|
fabric-1:docs/fabric/FABRIC-1.md \
|
|
fabric-2:docs/fabric/FABRIC-2.md \
|
|
fabric-3:docs/fabric/FABRIC-3.md \
|
|
fabric-3-5:docs/fabric/FABRIC-3.5.md \
|
|
fabric-3-6:docs/fabric/FABRIC-3.6.md \
|
|
fabric-3-7:docs/fabric/FABRIC-3.7.md \
|
|
fabric-4:docs/fabric/FABRIC-4.md
|
|
|
|
ifneq ($(BOARD),)
|
|
ifeq ($(wildcard boards/$(BOARD)/README.md),)
|
|
$(error boards/$(BOARD)/README.md is missing: it is the board's appendix)
|
|
endif
|
|
CHAPTERS += board-$(BOARD):boards/$(BOARD)/README.md
|
|
endif
|
|
|
|
chapter_name = $(word 1,$(subst :, ,$(1)))
|
|
chapter_src = $(word 2,$(subst :, ,$(1)))
|
|
FRAGMENTS := $(foreach c,$(CHAPTERS),$(GEN)/$(call chapter_name,$(c)).tex)
|
|
|
|
.PHONY: all tools FORCE
|
|
all: $(PDF)
|
|
|
|
tools:
|
|
@missing=""; \
|
|
for t in $(PANDOC) $(LATEXMK) xelatex; do command -v $$t >/dev/null 2>&1 || missing="$$missing $$t"; done; \
|
|
if [ -n "$$missing" ]; then \
|
|
echo "Error: make docs needs:$$missing"; \
|
|
echo " sudo apt-get install -y pandoc latexmk texlive-xetex texlive-latex-extra texlive-pictures texlive-fonts-recommended fonts-dejavu fonts-dejavu-extra"; \
|
|
echo " (or a user-local TinyTeX + pandoc in ~/.local; see docs/book/README.md)"; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# --id-prefix keeps heading labels unique across documents that reuse
|
|
# section names ("Summary", "Open questions", ...).
|
|
define chapter_rule
|
|
$(GEN)/$(call chapter_name,$(1)).tex: $(call chapter_src,$(1)) $(PANDOC_FILTERS) | tools
|
|
@mkdir -p $(GEN)
|
|
@echo " PANDOC $$< -> $$@"
|
|
@$(PANDOC) $(PANDOC_FLAGS) --id-prefix=$(call chapter_name,$(1))- $$< -o $$@
|
|
endef
|
|
$(foreach c,$(CHAPTERS),$(eval $(call chapter_rule,$(c))))
|
|
|
|
# Pandoc's syntax-highlighting macros, taken from the installed pandoc so the
|
|
# fragments and their macros always come from the same version.
|
|
$(GEN)/pandoc-highlighting.tex: $(BOOK_DIR)/pandoc/highlighting.latex | tools
|
|
@mkdir -p $(GEN)
|
|
@printf '```c\nx\n```\n' | $(PANDOC) -f gfm -t latex -s --template=$< -o $@
|
|
|
|
# Per-build facts the book prints: the commit every \datasource refers to,
|
|
# and which board appendix (if any) is included.
|
|
$(VAR_DIR)/meta.tex: FORCE
|
|
@mkdir -p $(VAR_DIR)
|
|
@{ \
|
|
c=$$(git rev-parse --short=12 HEAD 2>/dev/null || echo unknown); \
|
|
git diff --quiet HEAD -- 2>/dev/null || c="$$c (+ uncommitted changes)"; \
|
|
printf '\\newcommand{\\bookcommit}{%s}\n' "$$c"; \
|
|
printf '\\newcommand{\\bookdate}{%s}\n' "$$(date -u +%Y-%m-%d)"; \
|
|
printf '\\def\\bookboard{%s}\n' "$(BOARD_NAME)"; \
|
|
$(if $(BOARD),printf '\\newcommand{\\bookboardappendix}{board-%s}\n' "$(BOARD)";) \
|
|
} > $@.tmp
|
|
@cmp -s $@.tmp $@ && rm -f $@.tmp || mv $@.tmp $@
|
|
|
|
FORCE:
|
|
|
|
TEXINPUTS_BOOK := $(abspath $(VAR_DIR)):$(abspath $(GEN)):$(abspath $(BOOK_DIR)):
|
|
|
|
$(PDF): $(BOOK_DIR)/main.tex $(FRAGMENTS) $(GEN)/pandoc-highlighting.tex $(VAR_DIR)/meta.tex | tools
|
|
@echo " LATEXMK $(BOOK_DIR)/main.tex -> $@"
|
|
@TEXINPUTS=$(TEXINPUTS_BOOK) $(LATEXMK) -xelatex -interaction=nonstopmode -halt-on-error \
|
|
-file-line-error -outdir=$(VAR_DIR) $(BOOK_DIR)/main.tex > $(VAR_DIR)/latexmk.log 2>&1 || { \
|
|
grep -A4 -E '^(.*:[0-9]+:|!)' $(VAR_DIR)/main.log | head -40; \
|
|
echo "Error: LaTeX failed; full log: $(VAR_DIR)/main.log"; exit 1; }
|
|
@cp $(VAR_DIR)/main.pdf $@
|
|
@echo " PDF $@"
|