X-Git-Url: https://git.ladys.computer/Shushe/blobdiff_plain/61599492d0451c48f963a13a78a11a59415eb6f0..1b8607a9b87e197993fd6b699a570e268a288b08:/GNUmakefile diff --git a/GNUmakefile b/GNUmakefile index 2c77723..7a09b28 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -22,12 +22,12 @@ override define makefileinfo ║│ • cksum │║ ║│ • cp │║ ║│ • date │║ +║│ • diff │║ ║│ • file │║ ║│ • find │║ ║│ • grep │║ ║│ • git (optional) │║ ║│ • ln │║ -║│ • ls │║ ║│ • mkdir │║ ║│ • mv │║ ║│ • od │║ @@ -102,12 +102,12 @@ CAT := cat CKSUM := cksum CP := cp DATE := date +DIFF := diff FILE := file FIND := find GIT := git GREP := grep LN := ln -LS := ls MKDIR := mkdir MV := mv OD := od @@ -255,17 +255,13 @@ override quote = '$(subst ','"'"',$1)' # (callable) Get the modified time of the provided file. # -# Only the date·time information available via `ls -l´ is supported; that is, only minute precision for files newer than six months, and only day precision for files which are older. -# This is, unfortunately, the best that can be done in pure Posix as of now. +# This touches a file containing only a newline and then diffs it with `/dev/null´ and extracts the timestamp from the diff. +# Interestingly, on Macintosh, the format of `diff -u´ is only Posixy (including a fractional component and timezone) when `COMMAND_MODE=legacy´; however, the timezone will always be zero and the fractional component is ignorable, so it’s not necessary to worry about that here. # -# There is an easier implementation which provides the full date·time by archiving an empty file and then reading it back out of the archive :— -# -# $(shell LC_TIME=POSIX TZ=UTC0 $(TOUCH) -m -r $(callquote,$1) $(BUILDDIR)/.mtime && $(PAX) -w -x ustar $(BUILDDIR)/.mtime | $(PAX) -v -o 'listopt=%(mtime=%Y-%m-%dT%H:%M:%SZ)T') -# -# However, it depends on the `listopt´ option in `pax´, which (despite being specified in Posix) no implementations actually support. +# The diff will always have an exit status of 1, but this is ignored by piping into Sed. # # ☡ This variable creates a subshell every time it is computed. -override modtime = $(shell { $(DATE) -u '+%Y-%m'; LC_TIME=POSIX TZ=UTC0 ls -q -A -l $(call quote,$1) | $(SED) 's/\([^ ]* \{1,\}\)\{5\}\(\([^ ]* \{1,\}\)\{3\}\).*/\2/;s/ \([0123456789]\) / 0\1 /;s/Jan/01/;s/Feb/02/;s/Mar/03/;s/Apr/04/;s/May/05/;s/Jun/06/;s/Jul/07/;s/Aug/08/;s/Sep/09/;s/Oct/10/;s/Nov/11/;s/Dec/12/;s/\([0123456789]\{2\}\) *\([0123456789]\{2\}\) *\([0123456789]\{4\}\)/\3-\1-\2T00:00:00Z/;s/\([0123456789]\{2\}\) *\([0123456789]\{2\}\) *\([0123456789:]\{5\}\)/XXXX-\1-\2T\3:00Z/'; } | $(TR) -d ' ' | $(AWK) -F '-' 'NR==1{year=$$1;month=$$2}$$1=="XXXX"&&$$2<=month{print year"-"$$2"-"$$3}$$1=="XXXX"&&$$2>month{print year-1"-"$$2"-"$$3}NR>1&&$$1!="XXXX"') +override modtime = $(shell if $(TEST) ! -f $(call quote,$(BUILDDIR)/.mtime); then $(PRINTF) '%b' '\n' > $(call quote,$(BUILDDIR)/.mtime); fi; $(TOUCH) -r $(call quote,$1) $(call quote,$(BUILDDIR)/.mtime); TZ=UTC0 $(DIFF) -u $(call quote,$(BUILDDIR)/.mtime) /dev/null | $(SED) '1!d;s/.* \([^ ]*\) \([^ ]*\).*$$/\1T\2Z/') # ─ ¶ Recipe Variable Definitions ───────────────────────────────────── @@ -363,7 +359,7 @@ override plaintextfiles := $(filter-out $(xmlfiles),$(call filesoftype,$(plainte override assetfiles := $(filter-out $(xmlfiles) $(plaintextfiles),$(sourcefiles) $(sourceincludes)) # (callable) Get the types of the given files. -override typeoffile = $(patsubst $(foreach file,$1,$(file)|%),%,$(filter $(foreach file,$1,$(file)|%),$(types))) +override typeoffile = $(foreach file,$1,$(patsubst $(file)|%,%,$(filter $(file)|%,$(types)))) # Pair each source magic file with its location in the build directory. override magicpair := $(foreach magicfile,$(MAGIC),$(magicfile)|$(BUILDDIR)/magic/$(notdir $(magicfile))) @@ -394,11 +390,11 @@ override localuri = $(foreach file,$1,$(patsubst $(file)|%,%,$(filter $(file)|%, # (callable) Get the source files for the given local uris. override sourcefile = $(foreach local,$1,$(patsubst %|$(local),%,$(filter %|$(local),$(sourcelocalpair)))) -# Adds a requirement on `$(BUILDDIR)/.update-types´ if the file is present. +# Resolves to the `FORCE´ target if `$(BUILDDIR)/.update-types´ is present. # -# This file is created after a reload due to type changes, and is removed after. -# Requiring it ensures that file classifications are up·to·date immediately after the reload. -override typeupdates := $(wildcard $(BUILDDIR)/.update-types) +# This file is created before a reload due to type changes, and is removed after. +# This ensures that file classifications are up·to·date immediately after the reload. +override typeupdates := $(if $(wildcard $(BUILDDIR)/.update-types),FORCE,) # Pair each source file and include with its parsed location. override sourceparsedpair := $(foreach file,$(sourcefiles) $(sourceincludes),$(file)|$(BUILDDIR)/$(if $(filter $(file),$(sourceincludes)),includes/$(call includepath,$(file)),sources/$(call sourcepath,$(file))))