# SPDX-FileCopyrightText: 2023-2024 Lady # SPDX-License-Identifier: MPL-2.0 SHELL = /bin/sh # Copyright © 2023–2024 Lady [@ Ladys Computer]. # # This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. # If a copy of the M·P·L was not distributed with this file, You can obtain one at . CP := cp FIND := find GIT := git MKDIR := mkdir PRINTF := printf RM := rm SED := sed TEST := test TOUCH := touch XARGS := xargs DATASRCDIR := data SITESRCDIR := site BUILDDIR := build DATABUILDDIR := build/data RDFBUILDDIR := build/rdf SITEBUILDDIR := build/site BUILDTARGET := .grass DESTDIR := public THISDIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) SHUSHE := .⛩📰 MAKEOPTS := CP='$(CP)' FIND='$(FIND)' GIT='$(GIT)' MKDIR='$(MKDIR)' PRINTF='$(PRINTF)' RM='$(RM)' SED='$(SED)' TEST='$(TEST)' TOUCH='$(TOUCH)' XARGS='$(XARGS)' # Stage 1: Build R·D·F files to build/rdf SHUSHEDATAOPTS := $(MAKEOPTS) SRCDIR='$(DATASRCDIR)' INCLUDEDIR='$(DATASRCDIR)' BUILDDIR='$(DATABUILDDIR)' DESTDIR='$(RDFBUILDDIR)' EXTRAPARSERS='$(wildcard $(THISDIR)/parsers/data/*.xslt)' EXTRAPARSERLIBS='$(DATASRCDIR)/ontologies/¦' EXTRAFINDINCLUDERULES='-not '"'"'('"'"' '"'"'('"'"' -name ontologies -o -name profiles '"'"')'"'"' -a -type d -a -prune '"'"')'"'"'' EXTRATRANSFORMS='$(wildcard $(THISDIR)/transforms/data/*.xslt)' # Stage 2: Build the actual site SHUSHESITEOPTS := $(MAKEOPTS) SRCDIR='$(SITESRCDIR)' INCLUDEDIR='$(RDFBUILDDIR)' BUILDDIR='$(SITEBUILDDIR)' DESTDIR='$(DESTDIR)' EXTRAPARSERS='$(wildcard $(THISDIR)/parsers/site/*.xslt)' EXTRATRANSFORMS='$(wildcard $(THISDIR)/transforms/site/*.xslt)' YSEME := .👥📤 YSEMEOPTS := $(MAKEOPTS) BUILDTARGET='.grass' DESTDIR='$(DESTDIR)' SERVERPATH='lady/vocab' xmls := $(wildcard $(DATASRCDIR)/*/*) # ━ § Call out to ⛩📰 书社 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ install : $(SHUSHE)/GNUmakefile build @for publicfile in $(patsubst %,"%",$(wildcard $(DESTDIR)/*)); do if $(GIT) check-ignore -q "$$publicfile"; then $(RM) -rf "$$publicfile"; fi; done @for target in $$($(MAKE) -s -f '$<' listout QUIET=1 $(SHUSHEDATAOPTS)); do $(PRINTF) '%s\n' "$$target" | $(SED) 's/¦/:/g' | $(XARGS) $(PRINTF) 'Copying …\n' >&2; $(PRINTF) '%s\n' "$$target" | $(SED) 's:^:$(DESTDIR)/:;s/¦/:/g' | $(XARGS) $(CP) '$(RDFBUILDDIR)/'"$$target"; done @for target in $$($(MAKE) -s -f '$<' listout QUIET=1 $(SHUSHESITEOPTS)); do for dir in $$($(FIND) "$(SITEBUILDDIR)/public/$$target" -not -name '.*' -and -type d); do if $(TEST) '!' -d "$(DESTDIR)/$$dir"; then $(PRINTF) '%s\n' "$$dir" | $(SED) 's:$(SITEBUILDDIR)/public/:$(DESTDIR)/:' | $(XARGS) $(MKDIR) -p; fi; done; for file in $$($(FIND) "$(SITEBUILDDIR)/public/$$target" -not '(' -name '.*' -or -type d ')'); do $(PRINTF) '%s\n' "$$file" | $(SED) 's:$(SITEBUILDDIR)/public/:/:;s:/_\(.*\)_\(\..*\)$$:/(\1)\2:g;s/¦/:/g' | $(XARGS) $(PRINTF) 'Copying <%s>…\n' >&2; $(PRINTF) '%s\n' "$$file" | $(SED) 's:$(SITEBUILDDIR)/public/:$(DESTDIR)/:;s:/_\(.*\)_\(\..*\)$$:/(\1)\2:g;s/¦/:/g' | $(XARGS) $(CP) "$$file"; done; done $(TOUCH) '$(BUILDTARGET)' build : $(SHUSHE)/GNUmakefile @$(RM) -rf '$(RDFBUILDDIR)/profiles' @$(MAKE) -f '$<' install $(SHUSHEDATAOPTS) @$(MAKE) -f '$<' $(SHUSHESITEOPTS) clean : $(SHUSHE)/GNUmakefile @$(MAKE) -f '$<' $@ $(SHUSHEDATAOPTS) @$(RM) -rf '$(RDFBUILDDIR)' @$(MAKE) -f '$<' $@ $(SHUSHESITEOPTS) list listout : $(SHUSHE)/GNUmakefile @$(RM) -rf '$(RDFBUILDDIR)/profiles' @$(MAKE) -f '$<' install $(SHUSHEDATAOPTS) @$(MAKE) -f '$<' $@ $(SHUSHESITEOPTS) $(BUILDDIR)/data/% : $(SHUSHE)/GNUmakefile FORCE @$(MAKE) -f '$<' $@ $(SHUSHEDATAOPTS) $(BUILDDIR)/rdf/% : $(SHUSHE)/GNUmakefile FORCE @$(MAKE) -f '$<' $@ $(SHUSHEDATAOPTS) $(BUILDDIR)/site/% : $(SHUSHE)/GNUmakefile FORCE @$(RM) -rf '$(RDFBUILDDIR)/profiles' @$(MAKE) -f '$<' install $(SHUSHEDATAOPTS) @$(MAKE) -f '$<' $@ $(SHUSHESITEOPTS) $(DESTDIR)/% : $(SHUSHE)/GNUmakefile FORCE @$(RM) -rf '$(RDFBUILDDIR)/profiles' @$(MAKE) -f '$<' install $(SHUSHEDATAOPTS) @$(MAKE) -f '$<' $@ $(SHUSHESITEOPTS) # ━ § Call out to 👥📤 Yseme ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ dry-sync sync : $(YSEME)/GNUmakefile @$(MAKE) -f '$<' $@ $(YSEMEOPTS) # ━ § Build xmllint ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # This is temporarily required as DTD resolving requires a very new # version of `xmllint´ when a filename contains non‐Ascii characters. # Once `libxml2` ≥ 2.13.2 is more widely available, this subrepo and # build step can probably be dropped. .libxml2/xmllint : .libxml2/autogen.sh $(CD) .libxml2 && ./autogen.sh && ./configure $(MAKE) -C .libxml2 # ━ § Linting ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ lint : $(foreach xml,$(xmls),lint][$(xml)) ; $(foreach xml,$(xmls),lint][$(xml)) : lint][% : .libxml2/xmllint @.libxml2/xmllint --valid --noout '$*' # ━ § Special targets ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ .IGNORE : $(foreach xml,$(xmls),lint][$(xml)) ; .PHONY : FORCE build clean dry-sync gone lint $(foreach xml,$(xmls),lint][$(xml)) list prebuild sync uninstall ; gone : clean uninstall ; uninstall : @for publicfile in $(patsubst %,"%",$(wildcard $(DESTDIR)/*)); do if $(GIT) check-ignore -q "$$publicfile"; then $(RM) -rf "$$publicfile"; fi; done FORCE : ; # ━ § Make·file targets ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ $(SHUSHE)/GNUmakefile $(YSEME)/GNUmakefile : %/GNUmakefile : FORCE $(GIT) submodule update --init '$*' .libxml2/autogen.sh : %/autogen.sh : FORCE $(GIT) submodule update --init '$*'