# This is all of the non·asset, nonrecursive files.
override compilablefiles := $(filter-out $(assetfiles) $(recursivefiles),$(sourcefiles))
+ifneq ($(wildcard $(BUILDDIR)/destinations),)
+# Get the output of the destination transform.
+override destinations := $(shell $(CAT) $(BUILDDIR)/destinations)
+
+# Pair source files and their destinations.
+override sourcedestinationpair := $(foreach destination,$(destinations),$(call sourcefile,$(firstword $(subst |, ,$(destination))))|$(call perdec,$(subst $(space),|,$(wordlist 2,$(words $(subst |, ,$(destination))),$(subst |, ,$(destination))))))
+
+# (callable) Get the destination for the given source files.
+override destination = $(foreach file,$1,$(patsubst $(file)|%,%,$(filter $(file)|%,$(sourcedestinationpair))))
+
# Pair each source file and include with its compiled location.
-override sourcecompiledpair := $(foreach file,$(sourcefiles) $(sourceincludes),$(file)|$(BUILDDIR)/public/$(call sourcepath,$(file)))
+override sourcecompiledpair := $(foreach file,$(sourcefiles) $(sourceincludes),$(file)|$(BUILDDIR)/public/$(call destination,$(file)))
# (callable) Get the location of the transformed X·M·L files for the
# given source files.
override uncompiled = $(foreach file,$1,$(patsubst %|$(file),%,$(filter %|$(file),$(sourcecompiledpair))))
# (callable) Get the installed locations for the given source files.
-override installed = $(foreach file,$1,$(DESTDIR)/$(call sourcepath,$(file)))
+override installed = $(foreach file,$1,$(DESTDIR)/$(call destination,$(file)))
+endif
# ─ ¶ Recipe Variable Definitions ─────────────────────────────────────
# List all source files and includes and their computed types.
list:
- $(silent)$(PRINTF) '%b' $(call quote,$(foreach file,$(sort $(sourcefiles)) $(sort $(sourceincludes)),\0033[1m$(file)\0033[22m|$(call typeoffile,$(file))|[\0033[3m$(if $(filter $(file),$(xmlfiles)),xml,$(if $(filter $(file),$(plaintextfiles)),text,asset))$(if $(filter $(file),$(sourceincludes)),|include,)\0033[23m]$(if $(call dependencies,$(file))$(call recursives,$(file)), $(strip $(foreach recursive,$(call recursives,$(file)),\0033[93;41m•|Recursive|Dependency|\0033[39;49m|$(recursive)) $(foreach dependency,$(call dependencies,$(file)),\0033[2m•|Dependency|\0033[22m|$(dependency)))) )) | $(TR) ' |' '\n '
+ $(silent)$(PRINTF) '%b' $(call quote,$(foreach file,$(sort $(sourcefiles)) $(sort $(sourceincludes)),\0033[1m$(file)\0033[22m|$(call typeoffile,$(file))|[\0033[3m$(if $(filter $(file),$(xmlfiles)),xml,$(if $(filter $(file),$(plaintextfiles)),text,asset))$(if $(filter $(file),$(sourceincludes)),|include,)\0033[23m]$(if $(call dependencies,$(file))$(call recursives,$(file)), $(strip $(foreach recursive,$(call recursives,$(file)),\0033[93;41m•|Recursive|Dependency|\0033[39;49m|$(recursive)) $(foreach dependency,$(call dependencies,$(file)),\0033[2m•|Dependency|\0033[22m|$(dependency))))$(if $(filter $(file),$(sourcefiles)), →|<\0033[4m/$(call destination,$(file))\0033[24m>,) )) | $(TR) ' |' '\n '
# Raise an error when attempting to build any files with recursive
# dependencies.
#
# This recipe only exists after types have been updated or when the
# dependency graph already exists.
-$(THISDIR)/GNUmakefile:: $(BUILDDIR)/dependencies
+$(THISDIR)/GNUmakefile:: $(BUILDDIR)/dependencies $(BUILDDIR)/destinations
$(silent)$(TOUCH) $(THISDIR)/GNUmakefile
$(silent)$(RM) -f $(BUILDDIR)/.update-types
- @$(PRINTF) '%b\n' '\0033[1mDependency graph updated. Restarting…\0033[22m'
+ @$(PRINTF) '%b\n' '\0033[1mDependency graph and output destinations updated. Restarting…\0033[22m'
endif
ifeq ($(wildcard $(BUILDDIR)/.update-types),)
@$(ECHO) "Identifying dependencies…"
$(silent)$(XSLTPROC) -o $(call quote,$@) $(call quote,$(THISDIR)/lib/catalog2dependencies.xslt) $(call quote,$<)
+# Generate a catalog of destinations for files. This depends on parsing
+# non·asset source files, but not assets or includes. It does not
+# require knowing the dependencies.
+$(BUILDDIR)/destinations: $(BUILDDIR)/catalog $(call parsed,$(filter-out $(assetfiles),$(sourcefiles))) $(THISDIR)/lib/catalog2destinations.xslt
+ @$(ECHO) "Identifying output destinations…"
+ $(silent)$(XSLTPROC) -o $(call quote,$@) $(call quote,$(THISDIR)/lib/catalog2destinations.xslt) $(call quote,$<)
+
# Generate the main transform.
$(BUILDDIR)/transform.catalog: $(TRANSFORMS)
@$(ECHO) "Generating catalog of transforms…"
--- /dev/null
+<?xml version="1.0"?>
+<!--
+⁌ ⛩️📰 书社 ∷ lib/catalog2destinations.xslt
+
+© 2024 Lady [@ Lady’s 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 <https://mozilla.org/MPL/2.0/>.
+-->
+<transform
+ xmlns="http://www.w3.org/1999/XSL/Transform"
+ xmlns:catalog="urn:oasis:names:tc:entity:xmlns:xml:catalog"
+ xmlns:书社="urn:fdc:ladys.computer:20231231:Shu1She4"
+ version="1.0"
+>
+ <template match="/">
+ <for-each select="//catalog:uri[starts-with(@name, 'about:shushe?source=')]">
+ <choose>
+ <when test="substring-after(@uri, '#')='xml'">
+ <variable name="destination" select="document(substring-before(@uri, '#'), .)/*/@书社:destination"/>
+ <value-of select="@name"/>
+ <text>|</text>
+ <choose>
+ <when test="$destination">
+ <value-of select="$destination"/>
+ </when>
+ <otherwise>
+ <value-of select="substring-after(@name, 'about:shushe?source=')"/>
+ </otherwise>
+ </choose>
+ <text>
</text>
+ </when>
+ <otherwise>
+ <value-of select="@name"/>
+ <text>|</text>
+ <value-of select="substring-after(@name, 'about:shushe?source=')"/>
+ <text>
</text>
+ </otherwise>
+ </choose>
+ </for-each>
+ </template>
+ <output method="text" encoding="UTF-8"/>
+</transform>