Files
fd-dictionaries/shared/Makefile
T
2026-10-02 22:51:03 +08:00

171 lines
6.8 KiB
Makefile

BUILD ?= ../build
XMLLINT ?= xmllint
JING ?= jing
CURL ?= curl
JAVA ?= java
UNZIP ?= unzip
ANT ?= ant
APT_CACHE ?= apt-cache
DPKG ?= dpkg
ODD := freedict-P5.xml
ODD_SCHEMA := $(BUILD)/tei_odds.rng
ODD_SCHEMA_URL := https://tei-c.org/release/xml/tei/custom/schema/relaxng/tei_odds.rng
P5SUBSET := $(BUILD)/p5subset.xml
P5SUBSET_URL := https://tei-c.org/release/xml/tei/odd/p5subset.xml
GENERATED_SCHEMAS := freedict-P5.rng freedict-P5.dtd freedict-P5.sch
# required for generation from ODD → RNG, DTD and friends
MIN_SAXON_VERSION ?= 12.0
SAXON_VERSION ?= 13.0
SAXON_JAR := $(BUILD)/Saxon-HE-$(SAXON_VERSION).jar
SAXON_URL := https://repo1.maven.org/maven2/net/sf/saxon/Saxon-HE/$(SAXON_VERSION)/Saxon-HE-$(SAXON_VERSION).jar
XMLRESOLVER_VERSION ?= 6.0.23
XMLRESOLVER_JAR := $(BUILD)/xmlresolver-$(XMLRESOLVER_VERSION).jar
XMLRESOLVER_DATA_JAR := $(BUILD)/xmlresolver-$(XMLRESOLVER_VERSION)-data.jar
XMLRESOLVER_URL := https://repo1.maven.org/maven2/org/xmlresolver/xmlresolver/$(XMLRESOLVER_VERSION)/xmlresolver-$(XMLRESOLVER_VERSION).jar
XMLRESOLVER_DATA_URL := https://repo1.maven.org/maven2/org/xmlresolver/xmlresolver/$(XMLRESOLVER_VERSION)/xmlresolver-$(XMLRESOLVER_VERSION)-data.jar
SAXON_CP := $(SAXON_JAR):$(XMLRESOLVER_JAR):$(XMLRESOLVER_DATA_JAR)
SAXON_CP_ABS := $(abspath $(SAXON_JAR)):$(abspath $(XMLRESOLVER_JAR)):$(abspath $(XMLRESOLVER_DATA_JAR))
ANT_XML_RESOLVER_JAR ?= $(firstword $(wildcard /usr/share/java/xml-resolver.jar /usr/share/java/xml-resolver-*.jar /usr/share/java/xml-commons-resolver*.jar))
TEI_XSL_VERSION ?= 7.60.0
TEI_XSL_ARCHIVE := $(BUILD)/tei-xsl-$(TEI_XSL_VERSION).zip
TEI_XSL_DIR := $(BUILD)/tei-xsl-$(TEI_XSL_VERSION)
TEI_XSL_STYLESHEET_DIR := $(abspath $(TEI_XSL_DIR)/xml/tei/stylesheet)
TEI_XSL_URL := https://github.com/TEIC/Stylesheets/releases/download/v$(TEI_XSL_VERSION)/tei-xsl-$(TEI_XSL_VERSION).zip
LOCAL_SAXON_JAR := $(firstword $(wildcard /usr/share/java/Saxon-HE.jar /usr/share/java/saxon-he.jar))
SCHEMA_IDENT ?= freedict-P5
ANT_LIB_CP := $(SAXON_CP_ABS):$(ANT_XML_RESOLVER_JAR)
SCHEMA_ANT_COMMON := -f build-to.xml -lib "$(ANT_LIB_CP)" -Dprofile=default -DselectedSchema=$(SCHEMA_IDENT) -DdefaultSource=file://$(abspath $(P5SUBSET))
SCHEMA_ANT_COMMON += -DinputFile="$(abspath $(ODD))"
.PHONY: all validate-odd schemas dependencies check-dependencies fetch-dependencies clean
all: validate-odd
schemas: dependencies validate-odd $(GENERATED_SCHEMAS)
$(ODD_SCHEMA):
mkdir -p $(BUILD)
$(CURL) -fL -o $@ $(ODD_SCHEMA_URL)
validate-odd: $(ODD_SCHEMA) $(ODD)
@if [ -n "$(USE_JING)" ]; then \
$(JING) $(ODD_SCHEMA) $(ODD); \
else \
$(XMLLINT) --noout --relaxng $(ODD_SCHEMA) $(ODD); \
fi
dependencies: check-dependencies fetch-dependencies
check-dependencies:
@set -eu; \
echo "Checking schema generation dependencies"; \
if [ -n "$(LOCAL_SAXON_JAR)" ]; then \
version=`$(JAVA) -cp "$(LOCAL_SAXON_JAR)" net.sf.saxon.Transform '-?' 2>&1 | sed -n 's/^Saxon[^ ]*HE \([^ ]*\).*/\1/p' | sed 's/J$$//'`; \
echo "Installed Saxon: $$version ($(LOCAL_SAXON_JAR))"; \
if command -v $(DPKG) >/dev/null 2>&1 && $(DPKG) --compare-versions "$$version" ge "$(MIN_SAXON_VERSION)"; then \
echo "Installed Saxon is new enough."; \
else \
echo "Installed Saxon is older than required $(MIN_SAXON_VERSION)."; \
fi; \
else \
echo "Installed Saxon: not found"; \
fi; \
if command -v $(APT_CACHE) >/dev/null 2>&1; then \
echo "Debian package candidates:"; \
$(APT_CACHE) policy libsaxonhe-java ant tei-xsl 2>/dev/null | sed 's/^/ /'; \
fi; \
if command -v $(ANT) >/dev/null 2>&1; then \
$(ANT) -version; \
else \
echo "Installed Ant: not found"; \
echo "Ant is a hard dependency."; \
if command -v $(APT_CACHE) >/dev/null 2>&1; then \
echo "Install it with: sudo apt install ant"; \
fi; \
echo "Alternatively provide ANT=/path/to/ant."; \
exit 1; \
fi; \
if [ -n "$(ANT_XML_RESOLVER_JAR)" ] && [ -f "$(ANT_XML_RESOLVER_JAR)" ]; then \
echo "Installed Ant XML resolver: $(ANT_XML_RESOLVER_JAR)"; \
else \
echo "Installed Ant XML resolver: not found"; \
echo "Apache XML Commons Resolver is required so Ant xmlcatalog entries are honored."; \
if command -v $(APT_CACHE) >/dev/null 2>&1; then \
echo "Debian package candidate:"; \
$(APT_CACHE) policy libxml-commons-resolver1.1-java 2>/dev/null | sed 's/^/ /'; \
echo "Install it with: sudo apt install libxml-commons-resolver1.1-java"; \
fi; \
echo "Alternatively provide ANT_XML_RESOLVER_JAR=/path/to/xml-resolver.jar."; \
exit 1; \
fi
fetch-dependencies: $(SAXON_JAR) $(XMLRESOLVER_JAR) $(XMLRESOLVER_DATA_JAR) $(TEI_XSL_STYLESHEET_DIR)/rng/build-to.xml
$(P5SUBSET):
mkdir -p $(BUILD)
$(CURL) -fL -o $@ $(P5SUBSET_URL)
$(SAXON_JAR):
@set -eu; \
mkdir -p $(BUILD); \
if [ -n "$(LOCAL_SAXON_JAR)" ]; then \
version=`$(JAVA) -cp "$(LOCAL_SAXON_JAR)" net.sf.saxon.Transform '-?' 2>&1 | sed -n 's/^Saxon[^ ]*HE \([^ ]*\).*/\1/p' | sed 's/J$$//'`; \
else \
version="not installed"; \
fi; \
if [ "$$version" != "not installed" ] && command -v $(DPKG) >/dev/null 2>&1 && $(DPKG) --compare-versions "$$version" ge "$(MIN_SAXON_VERSION)"; then \
echo "Using installed Saxon $$version; not downloading $(SAXON_JAR)."; \
ln -sf "$(LOCAL_SAXON_JAR)" "$@"; \
else \
echo "Saxon $$version is missing or too old; upstream Saxon $(SAXON_VERSION) is required."; \
if [ "$${FD_FETCH_DEPS:-}" != "yes" ]; then \
printf "Download Saxon $(SAXON_VERSION) into $(BUILD)? [y/N] "; \
read answer; \
case "$$answer" in y|Y|yes|YES) ;; *) echo "Aborting dependency download."; exit 1;; esac; \
fi; \
$(CURL) -fL -o "$@" "$(SAXON_URL)"; \
fi
$(XMLRESOLVER_JAR):
mkdir -p $(BUILD)
$(CURL) -fL -o $@ $(XMLRESOLVER_URL)
$(XMLRESOLVER_DATA_JAR):
mkdir -p $(BUILD)
$(CURL) -fL -o $@ $(XMLRESOLVER_DATA_URL)
$(TEI_XSL_STYLESHEET_DIR)/rng/build-to.xml: $(TEI_XSL_ARCHIVE)
mkdir -p $(TEI_XSL_DIR)
$(UNZIP) -q -o $(TEI_XSL_ARCHIVE) -d $(TEI_XSL_DIR)
test -f $@
$(TEI_XSL_ARCHIVE):
@set -eu; \
mkdir -p $(BUILD); \
echo "TEI Stylesheets are required for ODD expansion and schema generation."; \
if [ "$${FD_FETCH_DEPS:-}" != "yes" ]; then \
printf "Download TEI Stylesheets $(TEI_XSL_VERSION) into $(BUILD)? [y/N] "; \
read answer; \
case "$$answer" in y|Y|yes|YES) ;; *) echo "Aborting dependency download."; exit 1;; esac; \
fi; \
$(CURL) -fL -o "$@" "$(TEI_XSL_URL)"
freedict-P5.rng: $(ODD) check-dependencies fetch-dependencies $(P5SUBSET)
cd $(TEI_XSL_STYLESHEET_DIR)/rng && $(ANT) $(SCHEMA_ANT_COMMON) -DoutputFile="$(abspath $@)"
freedict-P5.dtd: $(ODD) check-dependencies fetch-dependencies $(P5SUBSET)
cd $(TEI_XSL_STYLESHEET_DIR)/dtd && $(ANT) $(SCHEMA_ANT_COMMON) -DoutputFile="$(abspath $@)"
freedict-P5.sch: $(ODD) check-dependencies fetch-dependencies $(P5SUBSET)
cd $(TEI_XSL_STYLESHEET_DIR)/schematron && $(ANT) $(SCHEMA_ANT_COMMON) -Dodd=true -DoutputFile="$(abspath $@)"
rm -f $(ODD).processedodd
clean:
rm -f $(ODD_SCHEMA) $(P5SUBSET) $(ODD).processedodd