From: Lady Date: Wed, 31 Jan 2024 05:48:08 +0000 (-0500) Subject: Specifiy magic files, not a directory X-Git-Tag: 0.5.0~6 X-Git-Url: https://git.ladys.computer/Shushe/commitdiff_plain/fe1f9e5474fa7f3a6b42e384d92b466b2dcda952 Specifiy magic files, not a directory This is more flexible and matches how parsers and transforms work. Compiling magic requires these to all be placed in the same directory at some point, but symbolic linking works for this purpose. --- diff --git a/GNUmakefile b/GNUmakefile index 1fe78ec..1e809b2 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,14 +136,6 @@ 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´. @@ -150,6 +144,14 @@ EXTRAFINDINCLUDERULES := FINDRULES := ! '(' '(' -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. @@ -255,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),))) @@ -418,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) diff --git a/README.markdown b/README.markdown index 654904a..81279a4 100644 --- a/README.markdown +++ b/README.markdown @@ -108,6 +108,7 @@ In every case, you may supply your own implementation by overriding the - `file` - `find` - `git` (optional; set `GIT=` to disable) +- `ln` - `mkdir` (requires support for `-p`) - `mv` - `od` (requires support for `-t x1`) @@ -164,8 +165,13 @@ The following additional variables can be used to control the behaviour This variable is used to find the ⛩️📰 书社 `lib/` folder, which is expected to be in the same location. -- **`MAGICDIR`:** - The location of the magic files to use (default: `$(THISDIR)/magic`). +- **`MAGIC`:** + A white·space‐separated list of magic files to use (default: + `$(THISDIR)/magic/*`). + +- **`EXTRAMAGIC`:** + The value of this variable is appended to `MAGIC` by default, to + enable additional magic files without overriding the existing ones. - **`FINDRULES`:** Rules to use with `find` when searching for source files.