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.
║│ • file │║
║│ • find │║
║│ • git (optional) │║
║│ • file │║
║│ • find │║
║│ • git (optional) │║
║│ • mkdir (requires support for `-p´) │║
║│ • mv │║
║│ • od (requires support for `-t x1´) │║
║│ • mkdir (requires support for `-p´) │║
║│ • mv │║
║│ • od (requires support for `-t x1´) │║
FILE := file
FIND := find
GIT := git
FILE := file
FIND := find
GIT := git
MKDIR := mkdir
MV := mv
OD := od
MKDIR := mkdir
MV := mv
OD := od
# By default, this is inferred from the variable `MAKEFILE_LIST´.
THISDIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
# 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´.
# 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 ')'$(if $(EXTRAFINDRULES), -a $(EXTRAFINDRULES),)
FINDINCLUDERULES := $(FINDRULES)$(if $(EXTRAFINDINCLUDERULES), -a $(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.
# The list of parsers for plaintext file types.
#
# Which parsers are provided will influence which kinds of files are recognized as plaintext.
# (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))))
# (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),)))
# (callable) Get the local path for the given source file.
override sourcepath = $(firstword $(foreach directory,$(SRCDIR),$(if $(filter $(directory)/%,$1),$(patsubst $(directory)/%,%,$1),)))
# ─ ¶ Build Targets ───────────────────────────────────────────────────
# ─ ¶ 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.
# 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 $@))
@$(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)
# Generate the main parser.
$(BUILDDIR)/parser.catalog: $(PARSERS)
- `file`
- `find`
- `git` (optional; set `GIT=` to disable)
- `file`
- `find`
- `git` (optional; set `GIT=` to disable)
- `mkdir` (requires support for `-p`)
- `mv`
- `od` (requires support for `-t x1`)
- `mkdir` (requires support for `-p`)
- `mv`
- `od` (requires support for `-t x1`)
This variable is used to find the ⛩️📰 书社 `lib/` folder, which is
expected to be in the same location.
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.
- **`FINDRULES`:**
Rules to use with `find` when searching for source files.