# Phony rules; always consider these out·of·date.
.PHONY : FORCE all default clean gone info install list listout uninstall $(call built,$(recursivefiles)) ;
-ifneq ($(typeupdates)$(wildcard $(BUILDDIR)/dependencies)$(wildcard $(BUILDDIR)/destinations),)
+ifneq ($(typeupdates)$(wildcard $(BUILDDIR)/metadata),)
# Reload this make·file if the dependency graph or output destinations have changed.
#
# The dependency graph and output destinations are used to set the values of variables in this make·file, so it’s important to ensure that they are actually up·to·date prior to executing any later rules.
#
-# This recipe only exists after types have been updated or when the dependency graph or destinations file already exists.
+# This recipe only exists after types have been updated or when the metadata file exists, to avoid unnecessarily executing it when parsers need updating.
#
# ※ There is a chance that generating the dependencies will also update the parsers.
$(THISDIR)/GNUmakefile :: $(BUILDDIR)/dependencies $(BUILDDIR)/destinations
$(silent)$(call ensuredirectory,$(dir $@))
$(silent)$(if $(filter $<,$(assetfiles)),$(PRINTF) '%s\n' $(call quote,<?xml version="1.0"?><object xmlns="http://www.w3.org/1999/xhtml" type="$(call typeoffile,$<)" data="$(call datauri,$<)"/>) >|$(call quote,$@),$(if $(filter $<,$(plaintextfiles)),$(call wrapplaintext,$<),$(call serializexml,$<)) | $(XSLTPROC) --nonet --novalid --nomkdir --nowrite --stringparam BUILDTIME $$($(DATE) -u '+%Y-%m-%dT%H:%M:%SZ') --stringparam IDENTIFIER $(call quote,$(call localuri,$<))$(if $(THISREV), --stringparam THISREV $(call quote,$(THISREV)),)$(if $(SRCREV), --stringparam SRCREV $(call quote,$(SRCREV)),) $(call quote,$(BUILDDIR)/parser.xslt) - >|$(call quote,$@))
-# Collect the metadata into a single file.
+# Collect the metadata into a single file, and generate the dependencies and destinations files as side·effects.
+#
+# Doing this all in one step reduces the number of calls to `xsltproc´ required, but requires that it be called from the build directory (necessitating a subshell).
$(BUILDDIR)/metadata : $(call diffprereqs,metadatas,$(call metadata,$(sort $(sourcefiles) $(sourceincludes)))) $(call parsed,$(filter-out $(assetfiles),$(sourcefiles) $(sourceincludes))) $(THISDIR)/lib/expandmetadata.xslt
$(call inform,$(PRINTF) '%s\n' 'Compiling metadata…' >&2)
- $(silent){ $(PRINTF) '<?xml version="1.0"?><rdf:RDF xmlns:nie="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#" xmlns:nfo="http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:书社vocab="urn:fdc:ladys.computer:20231231:Shu1She4:vocab:"><书社vocab:BuildDirectory nfo:fileUrl="%s"/>' $(call quote,$(call attresc,$(call fileuri,$(BUILDDIR)))); { $(foreach meta,$(call metadata,$(sort $(sourcefiles) $(sourceincludes))),$(CAT) $(call quote,$(meta));) } | $(SED) 's/<?xml version="1.0"?>//g'; $(PRINTF) '%s\n' '</rdf:RDF>'; } | $(XSLTPROC) --nonet --novalid --nomkdir --nowrite $(call quote,$(THISDIR)/lib/expandmetadata.xslt) - | $(XMLLINT) --nonet --nsclean - >|$(call quote,$@)
-
-# Build a list of dependencies for each parsed file.
-$(BUILDDIR)/dependencies : $(BUILDDIR)/metadata $(THISDIR)/lib/metadata2dependencies.xslt
- $(call inform,$(PRINTF) '%s\n' 'Identifying dependencies…' >&2)
- $(silent)$(TOUCH) $(call quote,$@)
- $(silent)$(XSLTPROC) --nonet --novalid --nomkdir --nowrite $(call quote,$(THISDIR)/lib/metadata2dependencies.xslt) $(call quote,$<) >|$(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)/metadata $(THISDIR)/lib/metadata2destinations.xslt
- $(call inform,$(PRINTF) '%s\n' 'Identifying output destinations…' >&2)
- $(silent)$(TOUCH) $(call quote,$@)
- $(silent)$(XSLTPROC) --nonet --novalid --nomkdir --nowrite $(call quote,$(THISDIR)/lib/metadata2destinations.xslt) $(call quote,$<) >|$(call quote,$@)
+ $(silent){ $(PRINTF) '<?xml version="1.0"?><rdf:RDF xmlns:nie="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#" xmlns:nfo="http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:书社vocab="urn:fdc:ladys.computer:20231231:Shu1She4:vocab:"><书社vocab:BuildDirectory nfo:fileUrl="%s"/>' $(call quote,$(call attresc,$(call fileuri,$(BUILDDIR)))); {$(foreach meta,$(call metadata,$(sort $(sourcefiles) $(sourceincludes))), $(CAT) $(call quote,$(meta));) } | $(SED) 's/<?xml version="1.0"?>//g'; $(PRINTF) '%s\n' '</rdf:RDF>'; } | ( $(CD) $(call quote,$(BUILDDIR)); $(XSLTPROC) --nonet --novalid --nomkdir $(call quote,$(abspath $(THISDIR)/lib/expandmetadata.xslt)) - ) | $(XMLLINT) --nonet --nsclean - >|$(call quote,$(BUILDDIR)/metadata)
+
+# The dependencies and destinations files are side·effects of building the metadata file.
+$(BUILDDIR)/dependencies $(BUILDDIR)/destinations : $(BUILDDIR)/metadata ;
# Generate the main transform.
$(BUILDDIR)/transform.catalog : $(call diffprereqs,transforms,$(sort $(TRANSFORMS)))
</for-each>
</copy>
</template>
+ <template match="/">
+ <variable name="result-fragment">
+ <apply-templates/>
+ </variable>
+ <variable name="result" select="exsl:node-set($result-fragment)"/>
+ <copy-of select="$result/*"/>
+ <exsl:document href="dependencies" method="text" encoding="UTF-8">
+ <for-each select="$result/rdf:RDF/*[nie:interpretedAs/nfo:PlainTextDocument]">
+ <value-of select="@rdf:about"/>
+ <text>
</text>
+ <for-each select="书社vocab:hasRecursiveDependencyOn/@rdf:resource">
+ <text>	</text>
+ <text>-</text>
+ <value-of select="."/>
+ <text>
</text>
+ </for-each>
+ <for-each select="书社vocab:hasDependencyOn/@rdf:resource">
+ <text>	</text>
+ <value-of select="."/>
+ <text>
</text>
+ </for-each>
+ </for-each>
+ </exsl:document>
+ <exsl:document href="destinations" method="text" encoding="UTF-8">
+ <for-each select="$result//书社vocab:SourceFile">
+ <value-of select="@rdf:about"/>
+ <text>|</text>
+ <value-of select="@书社vocab:destination"/>
+ <text>
</text>
+ </for-each>
+ </exsl:document>
+ </template>
<template match="@*|node()">
<copy>
<apply-templates select="@*|node()"/>
</call-template>
</if>
</template>
+ <output method="xml" encoding="UTF-8"/>
</transform>
+++ /dev/null
-<?xml version="1.0"?>
-<!--
-SPDX-FileCopyrightText: 2023, 2024 Lady <https://www.ladys.computer/about/#lady>
-SPDX-License-Identifier: MPL-2.0
--->
-<!--
-⁌ ⛩📰 书社 ∷ lib/metadata2dependencies.xslt
-
-© 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 <https://mozilla.org/MPL/2.0/>.
--->
-<transform
- xmlns="http://www.w3.org/1999/XSL/Transform"
- xmlns:nie="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#"
- xmlns:nfo="http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:书社vocab="urn:fdc:ladys.computer:20231231:Shu1She4:vocab:"
- version="1.0"
->
- <template match="/">
- <for-each select="rdf:RDF/*[nie:interpretedAs/nfo:PlainTextDocument]">
- <value-of select="@rdf:about"/>
- <text>
</text>
- <for-each select="书社vocab:hasRecursiveDependencyOn/@rdf:resource">
- <text>	</text>
- <text>-</text>
- <value-of select="."/>
- <text>
</text>
- </for-each>
- <for-each select="书社vocab:hasDependencyOn/@rdf:resource">
- <text>	</text>
- <value-of select="."/>
- <text>
</text>
- </for-each>
- </for-each>
- </template>
- <output method="text" encoding="UTF-8"/>
-</transform>
+++ /dev/null
-<?xml version="1.0"?>
-<!--
-SPDX-FileCopyrightText: 2023, 2024 Lady <https://www.ladys.computer/about/#lady>
-SPDX-License-Identifier: MPL-2.0
--->
-<!--
-⁌ ⛩📰 书社 ∷ lib/metadata2destinations.xslt
-
-© 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 <https://mozilla.org/MPL/2.0/>.
--->
-<transform
- xmlns="http://www.w3.org/1999/XSL/Transform"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:书社vocab="urn:fdc:ladys.computer:20231231:Shu1She4:vocab:"
- version="1.0"
->
- <template match="/">
- <for-each select="//书社vocab:SourceFile">
- <value-of select="@rdf:about"/>
- <text>|</text>
- <value-of select="@书社vocab:destination"/>
- <text>
</text>
- </for-each>
- </template>
- <output method="text" encoding="UTF-8"/>
-</transform>