ββ¬ ΒΆ Prerequisites ββββββββββββββββββββββββββββββββββββββββββββ¬β’
ββ ββ
ββ Requires GΒ·NΒ·U Make, at least version 3.81, and all of the ββ
-ββ requirements of β©οΈπ° δΉ¦η€Ύ, which is included as a git ββ
+ββ requirements of β©π° δΉ¦η€Ύ, which is included as a git ββ
ββ submodule. Run `make help-shusheΒ΄ for more information. ββ
ββ°βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ―β
ββ¬ ΒΆ Usage ββββββββββββββββββββββββββββββββββββββββββββββββββββ¬β’
ββ°βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ―β
ββ¬ ΒΆ Copyright & License ββββββββββββββββββββββββββββββββββββββ¬β’
ββ ββ
-ββ Copyright Β© 2024 Lady [@ Ladyβs Computer]. ββ
+ββ Copyright Β© 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 ββ
#
# If these are not installed on your computer, or you need to use a different implementation, you can override the appropriate variable.
#
-# See also the documentation for β©οΈπ° δΉ¦η€Ύ, which specifies additional programs.
+# See also the documentation for β©π° δΉ¦η€Ύ, which specifies additional programs.
AWK := awk
CAT := cat
-ECHO := echo
GIT := git
MKDIR := mkdir
OD := od
# The directory into which to output files on `makeΒ΄.
DESTDIR := public
-# The location of this Makefile (and related β©οΈπ° δΉ¦η€Ύ files), relative to the current working directory.
+# The location of this Makefile, relative to the current working directory.
+#
+# It is expected that other files packaged as a part of πͺΎπ° Caudex can also be found in this directory.
#
# By default, this is inferred from the variable `MAKEFILE_LISTΒ΄.
THISDIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
-# Extra magic files to forward to β©οΈπ° δΉ¦η€Ύ.
+# Extra magic files to forward to β©π° δΉ¦η€Ύ.
#
# Your computer probably has several already installed at `/usr/share/file/magicΒ΄.
EXTRAMAGIC :=
-# Extra parsers to forward to β©οΈπ° δΉ¦η€Ύ.
+# Extra parsers to forward to β©π° δΉ¦η€Ύ.
#
# Which parsers are provided will influence which kinds of files are recognized as plaintext.
EXTRAPARSERS :=
-# Extra transforms to forward to β©οΈπ° δΉ¦η€Ύ.
+# Extra transforms to forward to β©π° δΉ¦η€Ύ.
EXTRATRANSFORMS :=
+# A description of the current git revision of πͺΎπ° Caudex.
+THISREV := $(shell cd $(THISDIR); $(GIT) describe 2> /dev/null || $(GIT) rev-parse HEAD 2> /dev/null || true)
+
# Variables to communicate to further calls to Make.
#
# By default, `MAKEOVERRIDESΒ΄ contains all variable overrides specified on the commandline.
# However, some values are specific to πͺΎπ° Caudex and may have different meaning in other makeΒ·files; filter these out.
-MAKEOVERRIDES := $(filter-out SRCDIR=% ASSETDIR=% BUILDDIR=% DESTDIR=% THISDIR=% EXTRAMAGIC=% EXTRAPARSERS=% EXTRATRANSFORMS=%,$(MAKEOVERRIDES))
+MAKEOVERRIDES := $(filter-out SRCDIR=% ASSETDIR=% BUILDDIR=% DESTDIR=% THISDIR=% EXTRAMAGIC=% EXTRAPARSERS=% EXTRATRANSFORMS=% THISREV=%,$(MAKEOVERRIDES))
-# The location of β©οΈπ° δΉ¦η€Ύ.
-SHUSHE := $(THISDIR)/.β©οΈπ°
+# The location of ππ LesΒ·MΒ·L.
+LESML := $(THISDIR)/.ππ
-# The name of the generator program.
-GENERATOR := πͺΎπ°Β Caudex
-
-# A description of the current git revision of πͺΎπ° Caudex.
-VERSION := $(shell cd $(THISDIR); $(GIT) describe 2> /dev/null || $(GIT) rev-parse HEAD 2> /dev/null || true)
+# The location of β©π° δΉ¦η€Ύ.
+SHUSHE := $(THISDIR)/.β©π°
# Set to a nonΒ·empty value to print all commands as they run.
VERBOSE :=
override wrmg = $(foreach attempt,$(shell $(OD) -t u4 -N 4 /dev/random | $(SED) 's/^[0-9]* *//' | $(TR) -d ' \n' | $(AWK) 'BEGIN{chars="0123456789ABCDEFGHJKMNPQRSTVWXYZ&~@=U"}{d=32^5;r=$$0%(32^6);printf("%s",substr(chars,r%37,1));while(d>0){printf("%s", substr(chars,int(r/d),1));if(d==32^4)printf("%s", "-");r%=d;d=int(d/32)}}'),$(if $(wildcard $(SRCDIR)/*/($(attempt))*),$(call wrmg),$(attempt)))
# (callable) Returns the identifiers of the provided entries.
-override identifier = $(shell $(TR) ' ' '\n' <<< $(call quote,$1) | $(SED) 's/^\(.*[/]\)\{0,1\}\(.\{3\}-.\{4\}\)\(,[^/]*\)\{0,1\}$$/\2/')
+override identifier = $(shell $(PRINTF) '%s\n' $(call quote,$1) | $(TR) ' ' '\n' | $(SED) 's/^\(.*[/]\)\{0,1\}\(.\{3\}-.\{4\}\)\(,[^/]*\)\{0,1\}$$/\2/')
# Output locations for compiled catalog files for categories.
override categorycatalogs := $(patsubst %,$(BUILDDIR)/catalogs/categories/%/index,$(categories))
# Output locations for all compiled catalog files.
override allcatalogs := $(BUILDDIR)/catalogs/indices/index $(BUILDDIR)/catalogs/indices/fullindex $(categorycatalogs) $(entrycatalogs)
-# (overridable) Options to pass to β©οΈπ° δΉ¦η€Ύ.
-override shusheopts := SRCDIR=$(call quote,$(if $(wildcard $(ASSETDIR)),$(ASSETDIR),) $(if $(entrycatalogs),$(BUILDDIR)/catalogs/entries,) $(BUILDDIR)/catalogs/indices) BUILDDIR=$(call quote,$(BUILDDIR)/β©οΈπ°) INCLUDEDIR=$(call quote,$(SRCDIR) $(if $(wildcard $(ASSETINCLUDEDIR)),$(ASSETINCLUDEDIR),) $(if $(categorycatalogs),$(BUILDDIR)/catalogs/categories,)) DESTDIR=$(call quote,$(DESTDIR)) EXTRAMAGIC=$(call quote,$(sort $(patsubst ./%,%,$(wildcard $(THISDIR)/magic/*)) $(EXTRAMAGIC))) EXTRAPARSERS=$(call quote,$(sort $(patsubst ./%,%,$(wildcard $(THISDIR)/parsers/*.xslt)) $(EXTRAPARSERS))) EXTRATRANSFORMS=$(call quote,$(sort $(patsubst ./%,%,$(wildcard $(THISDIR)/transforms/*.xslt)) $(EXTRATRANSFORMS))) GENERATOR=$(call quote,$(GENERATOR)) VERSION=$(call quote,$(VERSION))
+# (overridable) Options to pass to β©π° δΉ¦η€Ύ.
+override shusheopts := SRCDIR=$(call quote,$(if $(wildcard $(ASSETDIR)),$(ASSETDIR),) $(if $(entrycatalogs),$(BUILDDIR)/catalogs/entries,) $(BUILDDIR)/catalogs/indices) BUILDDIR=$(call quote,$(BUILDDIR)/β©π°) INCLUDEDIR=$(call quote,$(SRCDIR) $(if $(wildcard $(ASSETINCLUDEDIR)),$(ASSETINCLUDEDIR),) $(if $(categorycatalogs),$(BUILDDIR)/catalogs/categories,)) DESTDIR=$(call quote,$(DESTDIR)) EXTRAMAGIC=$(call quote,$(sort $(patsubst ./%,%,$(wildcard $(THISDIR)/magic/*)) $(LESML)/magic $(EXTRAMAGIC))) EXTRAPARSERS=$(call quote,$(sort $(patsubst ./%,%,$(wildcard $(THISDIR)/parsers/*.xslt)) $(LESML)/parser.xslt $(EXTRAPARSERS))) EXTRATRANSFORMS=$(call quote,$(sort $(patsubst ./%,%,$(wildcard $(THISDIR)/transforms/*.xslt)) $(EXTRATRANSFORMS)))
# β ΒΆ Recipe Variable Definitions βββββββββββββββββββββββββββββββββββββ
# (callable) Check to see if the given directory exists and create it if not.
override ensuredirectory = if $(TEST) ! -d $(call quote,$1); then $(MKDIR) -p $(call quote,$1); fi
-# (callable) Test to see if the dependencies provided by the second argument matches the value in the file corresponding to the first argument in `$(BUILDDIR)/lastprereqsΒ΄.
-# If not, return the third argument, plus an additional rule to save the new prerequisites.
-override makeandsavedeps = $(if $(subst $(shell $(CAT) $(call quote,$(BUILDDIR)/lastdeps/$1) 2> /dev/null || true),,$2),$3$(newline)$(silent)$(call ensuredirectory,$(BUILDDIR)/lastdeps)$(newline)$(silent)$(PRINTF) '%s\n' $(call quote,$2) > $(BUILDDIR)/lastdeps/$1,)
+# (callable) Test to see if the file provided by the first argument exists and the dependencies provided by the third argument matches the value in the file corresponding to the second argument in `$(BUILDDIR)/lastprereqsΒ΄.
+# If not, return the fourth argument, plus an additional rule to save the new prerequisites.
+#
+# β» If the third argument is empty, the fourth argument is always returned.
+override makeandsavedeps = $(if $(or $(if $3,,1),$(if $(wildcard $1),,1),$(subst $(shell $(CAT) $(call quote,$(BUILDDIR)/lastdeps/$2) 2> /dev/null || true),,$3)),$4$(newline)$(silent)$(call ensuredirectory,$(BUILDDIR)/lastdeps)$(newline)$(silent)$(PRINTF) '%s\n' $(call quote,$3) > $(call quote,$(BUILDDIR)/lastdeps/$2),)
# (callable) Make the catalog for the provided category.
override define makecategorycatalog
$(foreach category,$(categories),$(silent)$(XMLCATALOG) --add uri $(call quote,$(category)) $(call quote,$(category)/index) --noout $(call quote,$(BUILDDIR)/catalogs/indices/$(if $1,full,)index)$(newline))
endef
-# β ΒΆ β©οΈπ° δΉ¦η€Ύ Targets ββββββββββββββββββββββββββββββββββββββββββββββ
+# β ΒΆ β©π° δΉ¦η€Ύ Targets ββββββββββββββββββββββββββββββββββββββββββββββ
-# Targets to forward to β©οΈπ° δΉ¦η€Ύ.
+# Targets to forward to β©π° δΉ¦η€Ύ.
all install list uninstall : $(SHUSHE)/GNUmakefile catalogs
$(silent)$(MAKE) -f $(call quote,$<) $(call quote,$@) $(shusheopts)
%-shushe : $(SHUSHE)/GNUmakefile FORCE
$(silent)$(MAKE) -f $(call quote,$<) $(call quote,$*) $(shusheopts)
-build/β©οΈπ°/% : $(SHUSHE)/GNUmakefile catalogs FORCE
+build/β©π°/% : $(SHUSHE)/GNUmakefile catalogs FORCE
$(SILENT)$(MAKE) -f $(call quote,$<) $(call quote,$@) $(shusheopts)
public/% : $(SHUSHE)/GNUmakefile catalogs FORCE
$(SILENT)$(MAKE) -f $(call quote,$<) $(call quote,$@) $(shusheopts)
# Output a random unused identifier.
wrmg :
- @$(ECHO) $(wrmg)
+ @$(PRINTF) '%s\n' $(wrmg)
# Create a new entry in the provided category and output its path.
+% : FORCE
$(silent)$(call ensuredirectory,$(SRCDIR)/$*)
$(if $(wildcard $(SRCDIR)/$*/@),,$(silent)$(PRINTF) '%b' '%%\nCATEGORY : $*\n%%\n' > '$(SRCDIR)/$*/@')
- $(foreach identifier,$(wrmg),@$(PRINTF) '%b' '%%\nENTRY : $(identifier)\n%%\n\n' > '$(SRCDIR)/$*/$(identifier)'$(newline)@$(ECHO) '$(SRCDIR)/$*/$(identifier)')
+ $(foreach identifier,$(wrmg),@$(PRINTF) '%b' '\0043!lesml\nENTRY : $(identifier)\n%%\n\n' > '$(SRCDIR)/$*/$(identifier)'$(newline)@$(PRINTF) '%s\n' '$(SRCDIR)/$*/$(identifier)')
# β ΒΆ Special Targets βββββββββββββββββββββββββββββββββββββββββββββββββ
# β ΒΆ Build Targets βββββββββββββββββββββββββββββββββββββββββββββββββββ
-# Initialize the β©οΈπ° δΉ¦η€Ύ repository if it is empty.
-$(SHUSHE)/GNUmakefile : %/GNUmakefile :
+# Initialize the β©π° δΉ¦η€Ύ repository if it is empty.
+ifneq ($(filter $(THISDIR)/%,$(SHUSHE)),)
+$(SHUSHE)/GNUmakefile : $(THISDIR)/%/GNUmakefile :
@$(PRINTF) '%s\n' $(call quote,Initializing git submodule at `$*Β΄)
- $(silent)$(GIT) submodule update --init $(call quote,$*)
+ $(silent)cd $(THISDIR) && $(GIT) submodule update --init $(call quote,$*)
+endif
-# Touch parsers and transforms if the files in `lib/Β΄ have changed.
-$(PARSERS) $(TRANSFORMS) : $(wildcard lib/*.xslt)
- $(silent)$(TOUCH) $(call quote,$@)
+# Initialize the ππ LesΒ·MΒ·L repository if it is empty.
+ifneq ($(filter $(THISDIR)/%,$(LESML)),)
+$(LESML)/parser.xslt : $(THISDIR)/%/parser.xslt :
+ @$(PRINTF) '%s\n' $(call quote,Initializing git submodule at `$*Β΄)
+ $(silent)cd $(THISDIR) && $(GIT) submodule update --init $(call quote,$*)
+endif
# Create an empty codex metadata file if none exists.
$(SRCDIR)/@ :
# Create category catalogs.
$(categorycatalogs) : $(BUILDDIR)/catalogs/categories/%/index : FORCE
- $(call makeandsavedeps,$*,$(call entriesforcategory,$*),$(call makecategorycatalog,$*))
+ $(call makeandsavedeps,$@,$*,$(call entriesforcategory,$*),$(call makecategorycatalog,$*))
# Create entry catalogs.
$(entrycatalogs) : $(BUILDDIR)/catalogs/entries/% :
$(silent)$(XMLCATALOG) --add uri '@' $(call quote,$*) --noout $(call quote,$@)
$(BUILDDIR)/catalogs/indices/index : FORCE | $(SRCDIR)/@
- $(call makeandsavedeps,index,$(categories),$(call makeindexcatalog,))
+ $(call makeandsavedeps,$@,index,$(categories),$(call makeindexcatalog,))
$(BUILDDIR)/catalogs/indices/fullindex : FORCE | $(SRCDIR)/@
- $(call makeandsavedeps,fullindex,$(categories),$(call makeindexcatalog,1))
+ $(call makeandsavedeps,$@,fullindex,$(categories),$(call makeindexcatalog,1))