3 # โ ยง BASIC INFORMATION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
4 override define makefileinfo
5 โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
6 โโก โ ๐ชพ๐ฐ Caudex โท GNUmakefile โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
7 โโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ โ
8 โโฌ ยถ Prerequisites โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโข
10 โโ Requires GยทNยทU Make, at least version 3.81, and all of the โโ
11 โโ requirements of โฉ๐ฐ ไนฆ็คพ, which is included as a git โโ
12 โโ submodule. Run `make help-shusheยด for more information. โโ
13 โโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏโ
14 โโฌ ยถ Usage โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโข
16 โโ โข `make allยด (default): Compile, but do not install, all โโ
19 โโ โข `make cleanยด: Remove `BUILDDIRยด. โโ
21 โโ โข `make cleanยด: Remove `BUILDDIRยด. โโ
23 โโ โข `make goneยด: Remove `BUILDDIRยด and installed files. โโ
25 โโ โข `make helpยด: Print this message. โโ
27 โโ โข `make installยด: Compile all files and install in โโ
28 โโ `DESTDIRยด. โโ
30 โโ โข `make listยด: List all recognized source files and their โโ
31 โโ classification (including media type and dependencies). โโ
33 โโ โข `make uninstallยด: Remove installed files, but not โโ
34 โโ `BUILDDIRยด. โโ
36 โโ โข `make +โจCATEGORYโฉยด: Create a new entry in โจCATEGORYโฉ and โโ
37 โโ output its path. โโ
39 โโ Set `VERBOSE=1ยด to see the text of commands as they are โโ
40 โโ executed. โโ
42 โโ See `README.markdownยด for a more involved description of โโ
43 โโ the capabilities and configuration of this program. โโ
44 โโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏโ
45 โโฌ ยถ Copyright & License โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโข
47 โโ Copyright ยฉ 2024 Lady [@ Ladys Computer]. โโ
49 โโ This Source Code Form is subject to the terms of the โโ
50 โโ Mozilla Public License, v 2.0. If a copy of the MยทPยทL was โโ
51 โโ not distributed with this file, You can obtain one at โโ
52 โโ <http://mozilla.org/MPL/2.0/>. โโ
53 โโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏโ
54 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
57 # โ ยง MAKEยทFILE SETUP โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
59 # Programs needed to run this makeยทfile.
61 # If these are not installed on your computer, or you need to use a different implementation, you can override the appropriate variable.
63 # See also the documentation for โฉ๐ฐ ไนฆ็คพ, which specifies additional programs.
75 XMLCATALOG := xmlcatalog
77 # The directory which contains the codex entries and related metadata.
80 # The directory which contains additional assets for the codex generator.
83 # The directory which contains includes for additional assets for the codex generator.
84 ASSETINCLUDEDIR := $(ASSETDIR)/includes
86 # The directory in which to generate temporary buildfiles.
89 # The directory into which to output files on `makeยด.
92 # The location of this Makefile, relative to the current working directory.
94 # It is expected that other files packaged as a part of ๐ชพ๐ฐ Caudex can also be found in this directory.
96 # By default, this is inferred from the variable `MAKEFILE_LISTยด.
97 THISDIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
99 # Extra magic files to forward to โฉ๐ฐ ไนฆ็คพ.
101 # Your computer probably has several already installed at `/usr/share/file/magicยด.
104 # Extra parsers to forward to โฉ๐ฐ ไนฆ็คพ.
106 # Which parsers are provided will influence which kinds of files are recognized as plaintext.
109 # Extra transforms to forward to โฉ๐ฐ ไนฆ็คพ.
112 # A description of the current git revision of ๐ชพ๐ฐ Caudex.
113 THISREV := $(shell cd $(THISDIR); $(GIT) describe 2> /dev/null || $(GIT) rev-parse HEAD 2> /dev/null || true)
115 # Variables to communicate to further calls to Make.
117 # By default, `MAKEOVERRIDESยด contains all variable overrides specified on the commandline.
118 # However, some values are specific to ๐ชพ๐ฐ Caudex and may have different meaning in other makeยทfiles; filter these out.
119 MAKEOVERRIDES := $(filter-out SRCDIR=% ASSETDIR=% BUILDDIR=% DESTDIR=% THISDIR=% EXTRAMAGIC=% EXTRAPARSERS=% EXTRATRANSFORMS=% THISREV=%,$(MAKEOVERRIDES))
121 # The location of ๐๐ LesยทMยทL.
122 LESML := $(THISDIR)/.๐๐
124 # The location of โฉ๐ฐ ไนฆ็คพ.
125 SHUSHE := $(THISDIR)/.โฉ๐ฐ
127 # Set to a nonยทempty value to print all commands as they run.
130 # The default target for this makefile.
133 # โ ยง BEGIN MAKEยทFILE โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
135 # โ ยถ NonโRecipe Variable Definitions โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
137 # A variable which contains a newline, to allow the generation of multiline strings in function calls.
138 override define newline
143 # (callable) Quote the given string for use within shell calls.
144 override quote = '$(subst ','"'"',$1)'
146 # Outputs an `@ยด to silence rules, unless `VERBOSEยด is nonempty.
147 override silent := $(if $(VERBOSE),,@)
149 # The list of categories, determined by the set of directories in `SRCDIRยด with corresponding metadata files.
150 override categories := $(sort $(patsubst $(SRCDIR)/%/@,%,$(wildcard $(SRCDIR)/*/@)))
152 # (callable) The set of file locations for the entries of the provided categories.
153 override entriesforcategory = $(sort $(foreach category,$1,$(wildcard $(SRCDIR)/$(category)/???-????) $(wildcard $(SRCDIR)/$(category)/???-????,*)))
155 # A random WยทRยทMยทG(ยทlike) baseโน32 identifier.
157 # This variable returns a different value each time it is referenced.
158 # Use `foreachยด to save the value for repeated usage.
160 # This variable recursively calls itself to ensure there is no existing entry with the resulting identifier.
161 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)))
163 # (callable) Returns the identifiers of the provided entries.
164 override identifier = $(shell $(PRINTF) '%s\n' $(call quote,$1) | $(TR) ' ' '\n' | $(SED) 's/^\(.*[/]\)\{0,1\}\(.\{3\}-.\{4\}\)\(,[^/]*\)\{0,1\}$$/\2/')
166 # Output locations for compiled catalog files for categories.
167 override categorycatalogs := $(patsubst %,$(BUILDDIR)/catalogs/categories/%/index,$(categories))
169 # Output locations for compiled catalog files for entries.
170 override entrycatalogs := $(foreach entry,$(call entriesforcategory,$(categories)),$(patsubst $(SRCDIR)/%,$(BUILDDIR)/catalogs/entries/%,$(entry)))
172 # Output locations for all compiled catalog files.
173 override allcatalogs := $(BUILDDIR)/catalogs/indices/index $(BUILDDIR)/catalogs/indices/fullindex $(categorycatalogs) $(entrycatalogs)
175 # (overridable) Options to pass to โฉ๐ฐ ไนฆ็คพ.
176 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)))
178 # โ ยถ Recipe Variable Definitions โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
180 # (callable) Check to see if the given directory exists and create it if not.
181 override ensuredirectory = if $(TEST) ! -d $(call quote,$1); then $(MKDIR) -p $(call quote,$1); fi
183 # (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ยด.
184 # If not, return the fourth argument, plus an additional rule to save the new prerequisites.
186 # โป If the third argument is empty, the fourth argument is always returned.
187 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),)
189 # (callable) Make the catalog for the provided category.
190 override define makecategorycatalog
191 @$(PRINTF) '%s\n' $(call quote,Generating catalog for category `$1ยดโฆ)
192 $(silent)$(call ensuredirectory,$(BUILDDIR)/catalogs/categories/$1)
193 $(silent)$(XMLCATALOG) --create --noout $(call quote,$(BUILDDIR)/catalogs/categories/$1/index)
194 $(silent)$(XMLCATALOG) --add uri '?' 'about:category' --noout $(call quote,$(BUILDDIR)/catalogs/categories/$1/index)
195 $(silent)$(XMLCATALOG) --add uri '@' $(call quote,$1/@) --noout $(call quote,$(BUILDDIR)/catalogs/categories/$1/index)
196 $(foreach entry,$(call entriesforcategory,$1),$(silent)$(XMLCATALOG) --add uri $(call quote,$(call identifier,$(entry))) $(call quote,$(patsubst $(SRCDIR)/%,%,$(entry))) --noout $(call quote,$(BUILDDIR)/catalogs/categories/$1/index)$(newline))
199 # (callable) Make the catalog for the dynamic or static index.
200 override define makeindexcatalog
201 @$(PRINTF) '%s\n' 'Generating $(if $1,static,dynamic) catalog indexโฆ'
202 $(silent)$(call ensuredirectory,$(BUILDDIR)/catalogs/indices)
203 $(silent)$(XMLCATALOG) --create --noout $(call quote,$(BUILDDIR)/catalogs/indices/$(if $1,full,)index)
204 $(silent)$(XMLCATALOG) --add uri '.' '$(if $1,standalone,index).xhtml' --noout $(call quote,$(BUILDDIR)/catalogs/indices/$(if $1,full,)index)
205 $(silent)$(XMLCATALOG) --add uri '?' 'about:$(if $1,full,)index' --noout $(call quote,$(BUILDDIR)/catalogs/indices/$(if $1,full,)index)
206 $(silent)$(XMLCATALOG) --add uri '@' '@' --noout $(call quote,$(BUILDDIR)/catalogs/indices/$(if $1,full,)index)
207 $(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))
210 # โ ยถ โฉ๐ฐ ไนฆ็คพ Targets โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
212 # Targets to forward to โฉ๐ฐ ไนฆ็คพ.
213 all install list uninstall : $(SHUSHE)/GNUmakefile catalogs
214 $(silent)$(MAKE) -f $(call quote,$<) $(call quote,$@) $(shusheopts)
215 %-shushe : $(SHUSHE)/GNUmakefile FORCE
216 $(silent)$(MAKE) -f $(call quote,$<) $(call quote,$*) $(shusheopts)
217 build/โฉ๐ฐ/% : $(SHUSHE)/GNUmakefile catalogs FORCE
218 $(SILENT)$(MAKE) -f $(call quote,$<) $(call quote,$@) $(shusheopts)
219 public/% : $(SHUSHE)/GNUmakefile catalogs FORCE
220 $(SILENT)$(MAKE) -f $(call quote,$<) $(call quote,$@) $(shusheopts)
222 # โ ยถ Phony Targets โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
224 # Generate all catalogs, then remove any which no longer have corresponding source files.
225 catalogs : $(allcatalogs)
226 @$(PRINTF) '%s\n' 'Removing any outdated catalogsโฆ'
227 $(foreach deletedcategory,$(filter-out $(categorycatalogs),$(wildcard $(BUILDDIR)/catalogs/categories/*/index)),@$(PRINTF) '%s\n' $(call quote,Removing `$(patsubst $(BUILDDIR)/catalogs/categories/%/index,%,$(deletedcategory))ยดโฆ)$(newline)$(silent)$(RM) -rf $(call quote,./$(dir $(deletedcategory)))$(newline)$(silent)$(RM) -rf $(call quote,./$(patsubst $(BUILDDIR)/catalogs/categories/%,$(BUILDDIR)/catalogs/entries/%,$(dir $(deletedcategory))))$(newline))
228 $(foreach deletedentry,$(filter-out $(entrycatalogs),$(wildcard $(BUILDDIR)/catalogs/entries/*/*)),@$(PRINTF) '%s\n' $(call quote,Removing `$(patsubst $(BUILDDIR)/catalogs/entries/%,%,$(deletedentry))ยดโฆ)$(newline)$(silent)$(RM) $(call quote,./$(deletedentry))$(newline))
230 # Destroy buildfiles.
232 $(if $(BUILDDIR),$(silent)$(RM) -rf $(call quote,$(BUILDDIR)/),)
236 @$(PRINTF) '%b' '$(subst $(newline),\n,$(makefileinfo))'
238 # Destroy build directory and installed files.
239 gone : clean uninstall ;
241 # List the iยทdโs of all recognized entries.
243 @$(TR) '| ' ' \n' <<< '$(strip $(foreach category,$(categories),\0033[1m$(category)\0033[22m: $(patsubst %,โข|%,$(call identifier,$(call entriesforcategory,$(category)))) ))' | $(XARGS) -0 $(PRINTF) '%b'
245 # Output a random unused identifier.
247 @$(PRINTF) '%s\n' $(wrmg)
249 # Create a new entry in the provided category and output its path.
251 $(silent)$(call ensuredirectory,$(SRCDIR)/$*)
252 $(if $(wildcard $(SRCDIR)/$*/@),,$(silent)$(PRINTF) '%b' '%%\nCATEGORY : $*\n%%\n' > '$(SRCDIR)/$*/@')
253 $(foreach identifier,$(wrmg),@$(PRINTF) '%b' '\0043!lesml\nENTRY : $(identifier)\n%%\n\n' > '$(SRCDIR)/$*/$(identifier)'$(newline)@$(PRINTF) '%s\n' '$(SRCDIR)/$*/$(identifier)')
255 # โ ยถ Special Targets โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
257 # Perform secondary expansion; this enables pattern rules to determine their prerequisites based on the matched pattern.
260 # Donโt use any implicit rules.
263 # Treat targets with this as a prerequisite as though they were phony.
265 # Mainly useful in pattern rules.
268 # Phony rules; always consider these outยทofยทdate.
269 .PHONY : FORCE all build catalogs clean gone help install list listids uninstall wrmg ;
271 # โ ยถ Build Targets โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
273 # Initialize the โฉ๐ฐ ไนฆ็คพ repository if it is empty.
274 ifneq ($(filter $(THISDIR)/%,$(SHUSHE)),)
275 $(SHUSHE)/GNUmakefile : $(THISDIR)/%/GNUmakefile :
276 @$(PRINTF) '%s\n' $(call quote,Initializing git submodule at `$*ยด)
277 $(silent)cd $(THISDIR) && $(GIT) submodule update --init $(call quote,$*)
280 # Initialize the ๐๐ LesยทMยทL repository if it is empty.
281 ifneq ($(filter $(THISDIR)/%,$(LESML)),)
282 $(LESML)/parser.xslt : $(THISDIR)/%/parser.xslt :
283 @$(PRINTF) '%s\n' $(call quote,Initializing git submodule at `$*ยด)
284 $(silent)cd $(THISDIR) && $(GIT) submodule update --init $(call quote,$*)
287 # Create an empty codex metadata file if none exists.
289 $(silent)$(PRINTF) '%b' '%%\nCODEX :\n%%\n' > $(call quote,$@)
291 # Create category catalogs.
292 $(categorycatalogs) : $(BUILDDIR)/catalogs/categories/%/index : FORCE
293 $(call makeandsavedeps,$@,$*,$(call entriesforcategory,$*),$(call makecategorycatalog,$*))
295 # Create entry catalogs.
296 $(entrycatalogs) : $(BUILDDIR)/catalogs/entries/% :
297 @$(PRINTF) '%s\n' $(call quote,Generating catalog for document `$(call identifier,$*)ยดโฆ)
298 $(silent)$(call ensuredirectory,$(dir $@))
299 $(silent)$(XMLCATALOG) --create --noout $(call quote,$@)
300 $(silent)$(XMLCATALOG) --add uri '.' '$(call identifier,$*).xhtml' --noout $(call quote,$@)
301 $(silent)$(XMLCATALOG) --add uri '?' 'about:entry' --noout $(call quote,$@)
302 $(silent)$(XMLCATALOG) --add uri '@' $(call quote,$*) --noout $(call quote,$@)
304 $(BUILDDIR)/catalogs/indices/index : FORCE | $(SRCDIR)/@
305 $(call makeandsavedeps,$@,index,$(categories),$(call makeindexcatalog,))
307 $(BUILDDIR)/catalogs/indices/fullindex : FORCE | $(SRCDIR)/@
308 $(call makeandsavedeps,$@,fullindex,$(categories),$(call makeindexcatalog,1))