X-Git-Url: https://git.ladys.computer/Shushe/blobdiff_plain/c6779bb65edc0232b3dbac696a001a89770c5e65..88823523127972944771746f48bc2838e0317d31:/GNUmakefile diff --git a/GNUmakefile b/GNUmakefile index bcaa00d..4979bfb 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -22,6 +22,7 @@ override define makefileinfo ║│ • file │║ ║│ • find │║ ║│ • git (optional) │║ +║│ • ln │║ ║│ • mkdir (requires support for `-p´) │║ ║│ • mv │║ ║│ • od (requires support for `-t x1´) │║ @@ -93,6 +94,7 @@ ECHO := echo FILE := file FIND := find GIT := git +LN := ln MKDIR := mkdir MV := mv OD := od @@ -134,27 +136,31 @@ DESTDIR := public # By default, this is inferred from the variable `MAKEFILE_LIST´. THISDIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) -# The location of the magic files to use when determining media types. -# -# One is provided as part of this repository, but you can override it if you need different media type detection. -# -# Your computer probably has a more comprehensive one installed at `/usr/share/file/magic´, but it is not recommended that you use this directly. -# Instead, link or copy just the files you expect to need for your project. -MAGICDIR := $(patsubst ./%,%,$(THISDIR)/magic) - # Configuration of `find´. # # By default, `find´ will ignore files which begin with a period and those which are likely to cause problems for `make´. -FINDRULES := ! '(' '(' -name '[.-]*' -o -name '*[][*?:|$$%\#\\; ]*' ')' -a -prune ')' -FINDINCLUDERULES := $(FINDRULES) +EXTRAFINDRULES := +EXTRAFINDINCLUDERULES := +FINDRULES := ! '(' '(' -name '[.-]*' -o -name '*[][*?:|$$%\#\\; ]*' -o -name '*[)]' ')' -a -prune ')'$(if $(EXTRAFINDRULES), -a $(EXTRAFINDRULES),) +FINDINCLUDERULES := $(FINDRULES)$(if $(EXTRAFINDINCLUDERULES), -a $(EXTRAFINDINCLUDERULES),) + +# The list of magic files to use when determining media types. +# +# Some are provided as part of this repository, but you can add more if you need different media type detection. +# +# Your computer probably has several already installed at `/usr/share/file/magic´. +EXTRAMAGIC := +MAGIC := $(sort $(patsubst ./%,%,$(wildcard $(THISDIR)/magic/*)) $(EXTRAMAGIC)) # The list of parsers for plaintext file types. # # Which parsers are provided will influence which kinds of files are recognized as plaintext. -PARSERS := $(patsubst ./%,%,$(wildcard $(THISDIR)/parsers/*.xslt)) +EXTRAPARSERS := +PARSERS := $(sort $(patsubst ./%,%,$(wildcard $(THISDIR)/parsers/*.xslt)) $(EXTRAPARSERS)) # The list of transforms. -TRANSFORMS := $(patsubst ./%,%,$(wildcard $(THISDIR)/transforms/*.xslt)) +EXTRATRANSFORMS := +TRANSFORMS := $(sort $(patsubst ./%,%,$(wildcard $(THISDIR)/transforms/*.xslt)) $(EXTRATRANSFORMS)) # List of types which should be treated as X·M·L. XMLTYPES := application/xml text/xml @@ -196,7 +202,7 @@ override silent := $(if $(VERBOSE),,@) override sedesc = $(subst /,[/],$(subst $$,\$$,$(subst *,\*,$(subst .,\.,$(subst [,\[,$(subst ^,\^,$(subst \,\\,$1))))))) # (callable) Percent‐decode the given strings. -override perdec = $(foreach encoded,$1,$(shell $(PRINTF) '%s\n' $(call quote,$(encoded)) | $(SED) 's/|/%7C/g;s/[\]/%5C/g;s/%[0-9A-Fa-f]\{2\}/|&|/g' | $(TR) '|' '\n' | $(SED) '/^%[0-9A-Fa-f]\{2\}$$/!s/%/|%25|/' | $(TR) '|' '\n' | $(AWK) '$$0!~/%/{printf("%s",$$0)}/%/{sub("%","0x");printf("\\%04o",$$0)}' | $(XARGS) -0 $(PRINTF) '%b')) +override perdec = $(foreach encoded,$1,$(shell $(PRINTF) '%s\n' $(call quote,$(encoded)) | $(SED) 's/|/%7C/g;s/[\]/%5C/g;s/%[0-9A-Fa-f]\{2\}/|&|/g' | $(TR) '|' '\n' | $(SED) '/^%[0-9A-Fa-f]\{2\}$$/!s/%/|%25|/' | $(TR) '|' '\n' | $(AWK) '$$0!~/%/{printf "%s",$$0}/%/{sub("%","0x");cmd="$(XARGS) $(PRINTF) \"%04o\"";printf "%s","\\";printf "%s",$$0|cmd;close(cmd)}' | $(XARGS) -0 $(PRINTF) '%b')) # (callable) Percent‐encode the given strings. # @@ -251,6 +257,15 @@ override typeoffile = $(patsubst $(foreach file,$1,$(file)|%),%,$(filter $(forea # (callable) Get the identifier for the given parser or transform. override id = $(or $(shell $(XMLLINT) --xpath '/*/*[local-name()="id" and namespace-uri()="urn:fdc:ladys.computer:20231231:Shu1She4"]/text()[1]' $1 2> /dev/null),about:shushe?$(or $2,unknown)=$(call pathenc,$(basename $(notdir $1)))) +# Pair each source magic file with its location in the build directory. +override magicpair := $(foreach magicfile,$(MAGIC),$(magicfile)|$(BUILDDIR)/magic/$(notdir $(magicfile))) + +# (callable) Get the source file for the given magic files. +override magicsource = $(foreach magicpath,$1,$(patsubst %|$(magicpath),%,$(firstword $(filter %|$(magicpath),$(magicpair))))) + +# (callable) Get the build file for the given magic files. +override magicfile = $(foreach file,$1,$(patsubst $(file)|%,%,$(filter $(file)|%,$(magicpair)))) + # (callable) Get the local path for the given source file. override sourcepath = $(firstword $(foreach directory,$(SRCDIR),$(if $(filter $(directory)/%,$1),$(patsubst $(directory)/%,%,$1),))) @@ -414,14 +429,21 @@ endif # ─ ¶ Build Targets ─────────────────────────────────────────────────── +# Create symbolic links from the build directory’s store of magic files +# to their corresponding sources. +$(call magicfile,$(MAGIC)): $(BUILDDIR)/magic/%: $$(call magicsource,$$@) + $(silent)$(call ensuredirectory,$(dir $@)) + $(silent)$(LN) -sf $(call quote,$(realpath $<)) $(call quote,$@) + # Generate the compiled magic file from its sources. # # It must be updated if any of the files in the magic directory change. # It ⁜also⁜ should be updated if any of the files in the magic directory are deleted, but this isn’t tracked presently. -$(BUILDDIR)/magic.mgc: $(wildcard $(MAGICDIR)/*) +$(BUILDDIR)/magic.mgc: $(call magicfile,$(MAGIC)) + $(foreach outdated,$(filter-out $^,$(wildcard $(BUILDDIR)/magic/*)),$(silent)$(RM) $(call quote,$(outdated))$(newline)) @$(ECHO) "Compiling new magic…" $(silent)$(call ensuredirectory,$(dir $@)) - $(silent)cd $(call quote,$(BUILDDIR)) && $(FILE) -C -m $(call quote,$(realpath $(MAGICDIR))) + $(silent)cd $(call quote,$(BUILDDIR)) && $(FILE) -C -m $(call quote,$(realpath $(BUILDDIR)/magic)) # Generate the main parser. $(BUILDDIR)/parser.catalog: $(PARSERS)