From: Lady Date: Thu, 11 Jan 2024 01:20:48 +0000 (-0500) Subject: Allow multiple source directories X-Git-Tag: 0.2.4 X-Git-Url: https://git.ladys.computer/Shushe/commitdiff_plain/1bd721275d325dc6d3b7b0592983799ccdf325cd?hp=86c5d5eeef6def732f49b94bc497ee07d92dc72e Allow multiple source directories ⛩️📰 书社 might be called from another script or make·file, which might have built files of its own. It would be a pain if each parent script needed to copy all the source files into a new build directory at every step, and it’s much easier to just allow ⛩️📰 书社 to support multiple source directories (one for the original sources, and additional ones for any files built by other scripts). Naturally, ⛩️📰 书社 can’t support the same file subpath across multiple source directories, as these would compile to the same place. This commit tries to migitage this by just taking the first match, but it hasn’t been tested and the behaviour should formally be considered undefined. --- diff --git a/GNUmakefile b/GNUmakefile index e698262..085b4c2 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -101,12 +101,18 @@ XMLLINT := xmllint XSLTPROC := xsltproc # The directory which contains the source files. +# +# Multiple directories can be given so long as files with the same name +# do not exist in each. SRCDIR := sources # The directory which contains “includes”: Files which may be included # in other files but for which no final output will be generated. # -# This can be inside of `SOURCES_DIRECTORY´ if desired. +# Multiple directories can be given so long as files with the same name +# do not exist in each. +# +# These can be inside of `SRCDIR´ directories if desired. INCLUDEDIR := sources/includes # The directory in which to generate temporary buildfiles. @@ -197,11 +203,12 @@ override silent := $(if $(VERBOSE),,@) # expressions. override sedesc = $(subst /,[/],$(subst $$,\$$,$(subst *,\*,$(subst .,\.,$(subst [,\[,$(subst ^,\^,$(subst \,\\,$1))))))) -# Collect all of the applicable includes from the includes directory. +# (overridable) Collect all of the applicable includes from the +# includes directory. sourceincludes := $(shell $(FIND) $(FINDOPTS) $(INCLUDEDIR) -type f '(' $(FINDRULES) ')') -# Collect all of the applicable source files from the source directory, -# removing any which are also includes. +# (overridable) Collect all of the applicable source files from the +# source directory, removing any which are also includes. sourcefiles := $(filter-out $(sourceincludes),$(shell $(FIND) $(FINDOPTS) $(SRCDIR) -type f '(' $(FINDRULES) ')')) # Figure out the file type of each source file and source include. @@ -229,14 +236,23 @@ override typeoffile = $(patsubst $(foreach file,$1,$(file)?type=%),%,$(filter $( # (callable) Get the identifier for the given transform. override id = $(or $(shell $(XMLLINT) --xpath '/*/*[local-name()="id" and namespace-uri()="urn:fdc:ladys.computer:20231231:Shu1She4"]/text()[1]' $1),$(basename $(notdir $1)) | $(SED)) +# (callable) Get the local path for the given source file. +override sourcepath = $(firstword $(foreach directory,$(SRCDIR),$(if $(filter $(directory)/%,$1),$(patsubst $(directory)/%,%,$1),))) + +# (callable) Get the local path for the given include. +override includepath = $(firstword $(foreach directory,$(INCLUDEDIR),$(if $(filter $(directory)/%,$1),$(patsubst $(directory)/%,%,$1),))) + # (callable) Get base64 data u·r·i’s for the given files. override datauri = $(foreach file,$1,data:$(call typeoffile,$(file));base64,$(shell $(UUENCODE) -m -r $(call quote,$(file)) _ | tr -d ' \n')) # (callable) Get local leiris for the given files. -override localuri = $(foreach file,$1,$(if $(filter $(file),$(sourceincludes)),$(patsubst $(INCLUDEDIR)/%,about:shushe?include=%,$(file)),$(patsubst $(SRCDIR)/%,about:shushe?source=%,$(file)))) +override localuri = $(foreach file,$1,$(if $(filter $(file),$(sourceincludes)),about:shushe?include=$(call includepath,$(file)),about:shushe?source=$(call sourcepath,$(file)))) + +# Pair each source file and include with its local u·r·i. +override sourcelocalpair = $(foreach file,$(sourcefiles) $(sourceincludes),$(file)`$(call localuri,$(file))) # (callable) Get the source files for the given local leiris. -override sourcefile = $(foreach file,$1,$(if $(filter about:shushe?include=%,$(file)),$(patsubst about:shushe?include=%,$(INCLUDEDIR)/%,$(file)),$(patsubst about:shushe?source=%,$(SRCDIR)/%,$(file)))) +override sourcefile = $(foreach local,$1,$(patsubst %`$(local),%,$(filter %`$(local),$(sourcelocalpair)))) # Adds a requirement on `$(BUILDDIR)/.update-types´ if the file is # present. @@ -248,7 +264,13 @@ override typeupdates := $(wildcard $(BUILDDIR)/.update-types) # (callable) Get the location of the transformed X·M·L files for the # given source files. -override parsed = $(foreach file,$1,$(if $(filter $(file),$(sourceincludes)),$(patsubst $(INCLUDEDIR)/%,$(BUILDDIR)/includes/%,$(file)),$(patsubst $(SRCDIR)/%,$(BUILDDIR)/sources/%,$(file)))) +override parsed = $(foreach file,$1,$(if $(filter $(file),$(sourceincludes)),$(BUILDDIR)/includes/$(call includepath,$(file)),$(BUILDDIR)/sources/$(call sourcepath,$(file)))) + +# Pair each source file and include with its parsed location. +override sourceparsedpair = $(foreach file,$(sourcefiles) $(sourceincludes),$(file)`$(call parsed,$(file))) + +# (callable) Get the source files for the given parsed file. +override unparsed = $(foreach file,$1,$(patsubst %`$(file),%,$(filter %`$(file),$(sourceparsedpair)))) ifneq ($(wildcard $(BUILDDIR)/dependencies),) # Pair each file with a list of dependencies for it. @@ -278,10 +300,16 @@ override recursivefiles := $(foreach file,$(filter-out $(assetfiles),$(sourcefil override compilablefiles := $(filter-out $(assetfiles) $(recursivefiles),$(sourcefiles)) # (callable) Get the compiled locations for the given source files. -override compiled = $(patsubst $(SRCDIR)/%,$(BUILDDIR)/public/%,$(1)) +override compiled = $(foreach file,$1,$(BUILDDIR)/public/$(call sourcepath,$(file))) + +# Pair each source file and include with its compiled location. +override sourcecompiledpair = $(foreach file,$(sourcefiles) $(sourceincludes),$(file)`$(call compiled,$(file))) + +# (callable) Get the source files for the given compiled file. +override uncompiled = $(foreach file,$1,$(patsubst %`$(file),%,$(filter %`$(file),$(sourcecompiledpair)))) # (callable) Get the installed locations for the given source files. -override installed = $(patsubst $(SRCDIR)/%,$(DESTDIR)/%,$(1)) +override installed = $(foreach file,$1,$(DESTDIR)/$(call sourcepath,$(file))) # ─ ¶ Recipe Variable Definitions ───────────────────────────────────── @@ -392,14 +420,10 @@ $(BUILDDIR)/parser.xslt: $(BUILDDIR)/parser.catalog $(THISDIR)/lib/catalog2parse # Even plain X·M·L files are parsed, because they may contain X·H·T·M·L # `