summaryrefslogtreecommitdiff
path: root/codegen/vulkan/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'codegen/vulkan/Makefile')
-rw-r--r--codegen/vulkan/Makefile614
1 files changed, 614 insertions, 0 deletions
diff --git a/codegen/vulkan/Makefile b/codegen/vulkan/Makefile
new file mode 100644
index 00000000..b6a5eaf7
--- /dev/null
+++ b/codegen/vulkan/Makefile
@@ -0,0 +1,614 @@
+# Copyright 2014-2021 The Khronos Group Inc.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+# Vulkan Specification makefile
+#
+# To build the spec with a specific version included, set the
+# $(VERSIONS) variable on the make command line to a space-separated
+# list of version names (e.g. VK_VERSION_1_2) *including all previous
+# versions of the API* (e.g. VK_VERSION_1_1 must also include
+# VK_VERSION_1_0). $(VERSIONS) is converted into asciidoc and generator
+# script arguments $(VERSIONATTRIBS) and $(VERSIONOPTIONS)
+#
+# To build the specification / reference pages (refpages) with optional
+# extensions included, set the $(EXTENSIONS) variable on the make
+# command line to a space-separated list of extension names.
+# $(EXTENSIONS) is converted into asciidoc and generator script
+# arguments $(EXTATTRIBS) and $(EXTOPTIONS).
+
+# If a recipe fails, delete its target file. Without this cleanup, the leftover
+# file from the failed recipe can falsely satisfy dependencies on subsequent
+# runs of `make`.
+.DELETE_ON_ERROR:
+
+VERSIONS := VK_VERSION_1_0 VK_VERSION_1_1 VK_VERSION_1_2
+VERSIONATTRIBS := $(foreach version,$(VERSIONS),-a $(version))
+VERSIONOPTIONS := $(foreach version,$(VERSIONS),-feature $(version))
+
+EXTS := $(sort $(EXTENSIONS) $(DIFFEXTENSIONS))
+EXTATTRIBS := $(foreach ext,$(EXTS),-a $(ext))
+EXTOPTIONS := $(foreach ext,$(EXTS),-extension $(ext))
+
+# APITITLE can be set to extra text to append to the document title,
+# normally used when building with extensions included.
+APITITLE =
+
+# IMAGEOPTS is normally set to generate inline SVG images, but can be
+# overridden to an empty string, since the inline option doesn't work
+# well with our HTML diffs.
+IMAGEOPTS = inline
+
+# The default 'all' target builds the following sub-targets:
+# html - HTML single-page API specification
+# pdf - PDF single-page API specification
+# styleguide - HTML5 single-page "Documentation and Extensions" guide
+# registry - HTML5 single-page XML Registry Schema documentation
+# manhtml - HTML5 single-page reference guide - NOT SUPPORTED
+# manpdf - PDF reference guide - NOT SUPPORTED
+# manhtmlpages - HTML5 separate per-feature refpages
+# allchecks - Python sanity checker for script markup and macro use
+
+all: alldocs allchecks
+
+alldocs: allspecs allman proposals
+
+allspecs: html pdf styleguide registry
+
+allman: manhtmlpages
+
+# check_spec_links.py looks for proper use of custom markup macros
+# --ignore_count 0 can be incremented if there are unfixable errors
+# xml_consistency.py performs various XML consistency checks
+# check_undefined looks for untagged use of 'undefined' in spec sources
+# reflow.py looks for asciidoctor conditionals inside VU statements;
+# and for duplicated VUID numbers, but only in spec sources.
+allchecks:
+ $(PYTHON) $(SCRIPTS)/check_spec_links.py -Werror --ignore_count 0
+ $(PYTHON) $(SCRIPTS)/xml_consistency.py
+ $(SCRIPTS)/ci/check_undefined
+ $(PYTHON) $(SCRIPTS)/reflow.py -nowrite -noflow -check FAIL -checkVUID FAIL $(SPECFILES)
+
+# Note that the := assignments below are immediate, not deferred, and
+# are therefore order-dependent in the Makefile
+
+QUIET ?= @
+VERYQUIET?= @
+PYTHON ?= python3
+ASCIIDOC ?= asciidoctor
+RUBY = ruby
+NODEJS = node
+PATCH = patch
+RM = rm -f
+RMRF = rm -rf
+MKDIR = mkdir -p
+CP = cp
+ECHO = echo
+GS_EXISTS := $(shell command -v gs 2> /dev/null)
+
+# Path to scripts used in generation
+SCRIPTS = $(CURDIR)/scripts
+
+# Target directories for output files
+# HTMLDIR - 'html' target
+# PDFDIR - 'pdf' target
+# CHECKDIR - 'allchecks' target
+OUTDIR = $(GENERATED)/out
+HTMLDIR = $(OUTDIR)/html
+VUDIR = $(OUTDIR)/validation
+PDFDIR = $(OUTDIR)/pdf
+CHECKDIR = $(OUTDIR)/checks
+PROPOSALDIR = $(OUTDIR)/proposals
+
+# PDF Equations are written to SVGs, this dictates the location to store those files (temporary)
+PDFMATHDIR:=$(OUTDIR)/equations_temp
+
+# Set VERBOSE to -v to see what asciidoc is doing.
+VERBOSE =
+
+# asciidoc attributes to set (defaults are usually OK)
+# NOTEOPTS sets options controlling which NOTEs are generated
+# PATCHVERSION must equal VK_HEADER_VERSION from vk.xml
+# ATTRIBOPTS sets the API revision and enables KaTeX generation
+# VERSIONATTRIBS sets attributes for enabled API versions (set above
+# based on $(VERSIONS))
+# EXTATTRIBS sets attributes for enabled extensions (set above based on
+# $(EXTENSIONS))
+# EXTRAATTRIBS sets additional attributes, if passed to make
+# ADOCMISCOPTS miscellaneous options controlling error behavior, etc.
+# ADOCEXTS asciidoctor extensions to load
+# ADOCOPTS options for asciidoc->HTML5 output
+
+NOTEOPTS = -a editing-notes -a implementation-guide
+PATCHVERSION = 198
+
+ifneq (,$(findstring VK_VERSION_1_2,$(VERSIONS)))
+SPECMINOR = 2
+else
+ifneq (,$(findstring VK_VERSION_1_1,$(VERSIONS)))
+SPECMINOR = 1
+else
+SPECMINOR = 0
+endif
+endif
+
+SPECREVISION = 1.$(SPECMINOR).$(PATCHVERSION)
+
+# Spell out ISO 8601 format as not all date commands support --rfc-3339
+SPECDATE = $(shell echo `date -u "+%Y-%m-%d %TZ"`)
+
+# Generate Asciidoc attributes for spec remark
+# Could use `git log -1 --format="%cd"` to get branch commit date
+# This used to be a dependency in the spec html/pdf targets,
+# but that's likely to lead to merge conflicts. Just regenerate
+# when pushing a new spec for review to the sandbox.
+# The dependency on HEAD is per the suggestion in
+# http://neugierig.org/software/blog/2014/11/binary-revisions.html
+SPECREMARK = from git branch: $(shell echo `git symbolic-ref --short HEAD 2> /dev/null || echo Git branch not available`) \
+ commit: $(shell echo `git log -1 --format="%H" 2> /dev/null || echo Git commit not available`)
+
+# Base path to SPIR-V extensions on the web.
+SPIRVPATH = https://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/master/extensions
+
+# Some of the attributes used in building all spec documents:
+# chapters - absolute path to chapter sources
+# appendices - absolute path to appendix sources
+# images - absolute path to images
+# generated - absolute path to generated sources
+# refprefix - controls which generated extension metafiles are
+# included at build time. Must be empty for specification,
+# 'refprefix.' for refpages (see ADOCREFOPTS below).
+ATTRIBOPTS = -a revnumber="$(SPECREVISION)" \
+ -a revdate="$(SPECDATE)" \
+ -a revremark="$(SPECREMARK)" \
+ -a apititle="$(APITITLE)" \
+ -a stem=latexmath \
+ -a imageopts="$(IMAGEOPTS)" \
+ -a config=$(CURDIR)/config \
+ -a appendices=$(CURDIR)/appendices \
+ -a chapters=$(CURDIR)/chapters \
+ -a images=$(IMAGEPATH) \
+ -a generated=$(GENERATED) \
+ -a spirv="$(SPIRVPATH)" \
+ -a refprefix \
+ $(VERSIONATTRIBS) \
+ $(EXTATTRIBS) \
+ $(EXTRAATTRIBS)
+ADOCMISCOPTS = --failure-level ERROR
+# Non target-specific Asciidoctor extensions and options
+# Look in $(GENERATED) for explicitly required non-extension Ruby, such
+# as api.rb
+ADOCEXTS = -I$(GENERATED) -r $(CURDIR)/config/spec-macros.rb -r $(CURDIR)/config/tilde_open_block.rb
+ADOCOPTS = -d book $(ADOCMISCOPTS) $(ATTRIBOPTS) $(NOTEOPTS) $(VERBOSE) $(ADOCEXTS)
+
+# HTML target-specific Asciidoctor extensions and options
+ADOCHTMLEXTS = -r $(CURDIR)/config/katex_replace.rb \
+ -r $(CURDIR)/config/loadable_html.rb \
+ -r $(CURDIR)/config/vuid-expander.rb \
+ -r $(CURDIR)/config/rouge-extend-css.rb
+
+# ADOCHTMLOPTS relies on the relative runtime path from the output HTML
+# file to the katex scripts being set with KATEXDIR. This is overridden
+# by some targets.
+# ADOCHTMLOPTS also relies on the absolute build-time path to the
+# 'stylesdir' containing our custom CSS.
+KATEXSRCDIR = $(CURDIR)/katex
+KATEXDIR = katex
+ADOCHTMLOPTS = $(ADOCHTMLEXTS) -a katexpath=$(KATEXDIR) \
+ -a stylesheet=khronos.css \
+ -a stylesdir=$(CURDIR)/config \
+ -a sectanchors
+
+# PDF target-specific Asciidoctor extensions and options
+ADOCPDFEXTS = -r asciidoctor-pdf \
+ -r asciidoctor-mathematical \
+ -r $(CURDIR)/config/asciidoctor-mathematical-ext.rb \
+ -r $(CURDIR)/config/vuid-expander.rb
+ADOCPDFOPTS = $(ADOCPDFEXTS) -a mathematical-format=svg \
+ -a imagesoutdir=$(PDFMATHDIR) \
+ -a pdf-fontsdir=config/fonts,GEM_FONTS_DIR \
+ -a pdf-stylesdir=config/themes -a pdf-style=pdf
+
+# Valid usage-specific Asciidoctor extensions and options
+ADOCVUEXTS = -r $(CURDIR)/config/vu-to-json.rb
+ADOCVUOPTS = $(ADOCVUEXTS)
+
+.PHONY: directories
+
+# Images used by the spec. These are included in generated HTML now.
+IMAGEPATH = $(CURDIR)/images
+SVGFILES = $(wildcard $(IMAGEPATH)/*.svg)
+
+# Top-level spec source file
+SPECSRC := vkspec.txt
+# Static files making up sections of the API spec.
+SPECFILES = $(wildcard chapters/[A-Za-z]*.txt chapters/*/[A-Za-z]*.txt appendices/[A-Za-z]*.txt)
+# Shorthand for where different types generated files go.
+# All can be relocated by overriding GENERATED in the make invocation.
+GENERATED = $(CURDIR)/gen
+REFPATH = $(GENERATED)/refpage
+APIPATH = $(GENERATED)/api
+VALIDITYPATH = $(GENERATED)/validity
+HOSTSYNCPATH = $(GENERATED)/hostsynctable
+METAPATH = $(GENERATED)/meta
+INTERFACEPATH = $(GENERATED)/interfaces
+SPIRVCAPPATH = $(GENERATED)/spirvcap
+PROPOSALPATH = $(CURDIR)/proposals
+# timeMarker is a proxy target created when many generated files are
+# made at once
+APIDEPEND = $(APIPATH)/timeMarker
+VALIDITYDEPEND = $(VALIDITYPATH)/timeMarker
+HOSTSYNCDEPEND = $(HOSTSYNCPATH)/timeMarker
+METADEPEND = $(METAPATH)/timeMarker
+INTERFACEDEPEND = $(INTERFACEPATH)/timeMarker
+SPIRVCAPDEPEND = $(SPIRVCAPPATH)/timeMarker
+RUBYDEPEND = $(GENERATED)/api.rb
+# All generated dependencies
+GENDEPENDS = $(APIDEPEND) $(VALIDITYDEPEND) $(HOSTSYNCDEPEND) $(METADEPEND) $(INTERFACEDEPEND) $(SPIRVCAPDEPEND) $(RUBYDEPEND)
+# All non-format-specific dependencies
+COMMONDOCS = $(SPECFILES) $(GENDEPENDS)
+
+# Script to add href to anchors
+GENANCHORLINKS = $(SCRIPTS)/genanchorlinks.py
+# Script to translate math on build time
+TRANSLATEMATH = $(NODEJS) $(SCRIPTS)/translate_math.js $(KATEXSRCDIR)/katex.min.js
+
+# Install katex in $(OUTDIR)/katex for reference by all HTML targets
+katexinst: KATEXDIR = katex
+katexinst: $(OUTDIR)/$(KATEXDIR)
+
+$(OUTDIR)/$(KATEXDIR): $(KATEXSRCDIR)
+ $(QUIET)$(MKDIR) $(OUTDIR)
+ $(QUIET)$(RMRF) $(OUTDIR)/$(KATEXDIR)
+# We currently only need the css and fonts, but copy it whole anyway
+ $(QUIET)$(CP) -rf $(KATEXSRCDIR) $(OUTDIR)
+
+# Spec targets
+# There is some complexity to try and avoid short virtual targets like 'html'
+# causing specs to *always* be regenerated.
+
+CHUNKER = $(CURDIR)/scripts/asciidoctor-chunker/asciidoctor-chunker.js
+CHUNKINDEX = $(CURDIR)/config/chunkindex
+# Only the $(CHUNKER) step is required unless the search index is to be
+# generated and incorporated into the chunked spec.
+#
+# Dropped $(QUIET) for now
+# Should set NODE_PATH=/usr/local/lib/node_modules or wherever, outside Makefile
+# Copying chunked.js into target avoids a warning from the chunker
+chunked: $(HTMLDIR)/vkspec.html $(SPECSRC) $(COMMONDOCS)
+ $(QUIET)$(CHUNKINDEX)/addscripts.sh $(HTMLDIR)/vkspec.html $(HTMLDIR)/prechunked.html
+ $(QUIET)$(CP) $(CHUNKINDEX)/chunked.css $(CHUNKINDEX)/chunked.js \
+ $(CHUNKINDEX)/lunr.js $(HTMLDIR)
+ $(QUIET)$(NODEJS) $(CHUNKER) $(HTMLDIR)/prechunked.html -o $(HTMLDIR)
+ $(QUIET)$(RM) $(HTMLDIR)/prechunked.html
+ $(QUIET)$(RUBY) $(CHUNKINDEX)/generate-index.rb $(HTMLDIR)/chap*html | \
+ $(NODEJS) $(CHUNKINDEX)/build-index.js > $(HTMLDIR)/search.index.js
+
+# This is a temporary target while the new chunker is pre-release.
+# Eventually we will either pull the chunker into CI, or permanently
+# store a copy of the short JavaScript chunker in this repository.
+CHUNKERVERSION = asciidoctor-chunker_v1.0.0
+CHUNKURL = https://github.com/wshito/asciidoctor-chunker/releases/download/v1.0.0/$(CHUNKERVERSION).zip
+getchunker:
+ wget $(CHUNKURL) -O $(CHUNKERVERSION).zip
+ unzip $(CHUNKERVERSION).zip
+ mv $(CHUNKERVERSION)/* scripts/asciidoctor-chunker/
+ rm -rf $(CHUNKERVERSION).zip $(CHUNKERVERSION)
+
+html: $(HTMLDIR)/vkspec.html $(SPECSRC) $(COMMONDOCS)
+
+$(HTMLDIR)/vkspec.html: KATEXDIR = ../katex
+$(HTMLDIR)/vkspec.html: $(SPECSRC) $(COMMONDOCS) katexinst
+ $(QUIET)$(ASCIIDOC) -b html5 $(ADOCOPTS) $(ADOCHTMLOPTS) -o $@ $(SPECSRC)
+ $(QUIET)$(PYTHON) $(GENANCHORLINKS) $@ $@
+ $(QUIET)$(TRANSLATEMATH) $@
+
+diff_html: $(HTMLDIR)/diff.html $(SPECSRC) $(COMMONDOCS)
+
+$(HTMLDIR)/diff.html: KATEXDIR = ../katex
+$(HTMLDIR)/diff.html: $(SPECSRC) $(COMMONDOCS) katexinst
+ $(QUIET)$(ASCIIDOC) -b html5 $(ADOCOPTS) $(ADOCHTMLOPTS) \
+ -a diff_extensions="$(DIFFEXTENSIONS)" \
+ -r $(CURDIR)/config/extension-highlighter.rb --trace \
+ -o $@ $(SPECSRC)
+ $(QUIET)$(TRANSLATEMATH) $@
+
+# PDF optimizer - usage $(OPTIMIZEPDF) in.pdf out.pdf
+# OPTIMIZEPDFOPTS=--compress-pages is slightly better, but much slower
+OPTIMIZEPDF = hexapdf optimize $(OPTIMIZEPDFOPTS)
+
+pdf: $(PDFDIR)/vkspec.pdf $(SPECSRC) $(COMMONDOCS)
+
+$(PDFDIR)/vkspec.pdf: $(SPECSRC) $(COMMONDOCS)
+ $(QUIET)$(MKDIR) $(PDFDIR)
+ $(QUIET)$(MKDIR) $(PDFMATHDIR)
+ $(QUIET)$(ASCIIDOC) -b pdf $(ADOCOPTS) $(ADOCPDFOPTS) -o $@ $(SPECSRC)
+ $(QUIET)$(OPTIMIZEPDF) $@ $@.out.pdf && mv $@.out.pdf $@
+ $(QUIET)rm -rf $(PDFMATHDIR)
+
+validusage: $(VUDIR)/validusage.json $(SPECSRC) $(COMMONDOCS)
+
+$(VUDIR)/validusage.json: $(SPECSRC) $(COMMONDOCS)
+ $(QUIET)$(MKDIR) $(VUDIR)
+ $(QUIET)$(ASCIIDOC) $(ADOCOPTS) $(ADOCVUOPTS) --trace \
+ -a json_output=$@ -o $@ $(SPECSRC)
+
+# Vulkan Documentation and Extensions, a.k.a. "Style Guide" documentation
+
+STYLESRC = styleguide.txt
+STYLEFILES = $(wildcard style/[A-Za-z]*.txt)
+
+styleguide: $(OUTDIR)/styleguide.html
+
+$(OUTDIR)/styleguide.html: KATEXDIR = katex
+$(OUTDIR)/styleguide.html: $(STYLESRC) $(STYLEFILES) $(GENDEPENDS) katexinst
+ $(QUIET)$(MKDIR) $(OUTDIR)
+ $(QUIET)$(ASCIIDOC) -b html5 $(ADOCOPTS) $(ADOCHTMLOPTS) -o $@ $(STYLESRC)
+ $(QUIET)$(TRANSLATEMATH) $@
+
+
+# Vulkan API Registry (XML Schema) documentation
+# Currently does not use latexmath / KaTeX
+
+REGSRC = registry.txt
+
+registry: $(OUTDIR)/registry.html
+
+$(OUTDIR)/registry.html: $(REGSRC) $(GENDEPENDS)
+ $(QUIET)$(MKDIR) $(OUTDIR)
+ $(QUIET)$(ASCIIDOC) -b html5 $(ADOCOPTS) $(ADOCHTMLOPTS) -o $@ $(REGSRC)
+ $(QUIET)$(TRANSLATEMATH) $@
+
+# Build proposal documents
+PROPOSALSOURCES = $(filter-out $(PROPOSALPATH)/template.asciidoc, $(wildcard $(PROPOSALPATH)/*.asciidoc))
+PROPOSALDOCS = $(PROPOSALSOURCES:$(PROPOSALPATH)/%.asciidoc=$(PROPOSALDIR)/%.html)
+proposals: $(PROPOSALDOCS) $(PROPOSALSOURCES)
+
+# Proposal documents are built outside of the main specification
+$(PROPOSALDIR)/%.html: $(PROPOSALPATH)/%.asciidoc
+ $(QUIET)$(ASCIIDOC) --failure-level ERROR -b html5 -o $@ $<
+ $(QUIET) if egrep -q '\\[([]' $@ ; then \
+ $(TRANSLATEMATH) $@ ; \
+ fi
+
+# Reflow text in spec sources
+REFLOW = $(SCRIPTS)/reflow.py
+REFLOWOPTS = -overwrite
+
+reflow:
+ $(QUIET) echo "Warning: please verify the spec outputs build without changes!"
+ $(PYTHON) $(REFLOW) $(REFLOWOPTS) $(SPECSRC) $(SPECFILES) $(STYLESRC) $(STYLEFILES)
+
+# Clean generated and output files
+
+clean: clean_html clean_pdf clean_man clean_checks clean_generated clean_validusage
+
+clean_html:
+ $(QUIET)$(RMRF) $(HTMLDIR) $(OUTDIR)/katex
+ $(QUIET)$(RM) $(OUTDIR)/apispec.html $(OUTDIR)/styleguide.html \
+ $(OUTDIR)/registry.html
+
+clean_pdf:
+ $(QUIET)$(RMRF) $(PDFDIR) $(OUTDIR)/apispec.pdf
+
+clean_man:
+ $(QUIET)$(RMRF) $(MANHTMLDIR)
+
+clean_checks:
+ $(QUIET)$(RMRF) $(CHECKDIR)
+
+# Generated directories and files to remove
+CLEAN_GEN_PATHS = \
+ $(APIPATH) \
+ $(HOSTSYNCPATH) \
+ $(VALIDITYPATH) \
+ $(METAPATH) \
+ $(INTERFACEPATH) \
+ $(SPIRVCAPPATH) \
+ $(REFPATH) \
+ $(GENERATED)/include \
+ $(GENERATED)/__pycache__ \
+ $(PDFMATHDIR) \
+ $(GENERATED)/api.py \
+ $(GENERATED)/api.rb \
+ $(GENERATED)/extDependency.*
+
+clean_generated:
+ $(QUIET)$(RMRF) $(CLEAN_GEN_PATHS)
+
+clean_validusage:
+ $(QUIET)$(RM) $(VUDIR)/validusage.json
+
+
+# Generated refpage sources. For now, always build all refpages.
+MANSOURCES = $(filter-out $(REFPATH)/apispec.txt, $(wildcard $(REFPATH)/*.txt))
+
+# Generation of refpage asciidoctor sources by extraction from the
+# specification.
+#
+# Should have a proper dependency causing the man page sources to be
+# generated by running genRef (once), but adding $(MANSOURCES) to the
+# targets causes genRef to run once/target.
+#
+# Should pass in $(EXTOPTIONS) to determine which pages to generate.
+# For now, all core and extension refpages are extracted by genRef.py.
+GENREF = $(SCRIPTS)/genRef.py
+LOGFILE = $(REFPATH)/refpage.log
+refpages: $(REFPATH)/apispec.txt
+$(REFPATH)/apispec.txt: $(SPECFILES) $(GENREF) $(SCRIPTS)/reflib.py $(GENERATED)/api.py
+ $(QUIET)$(MKDIR) $(REFPATH)
+ $(PYTHON) $(GENREF) -genpath $(GENERATED) -basedir $(REFPATH) \
+ -log $(LOGFILE) -extpath $(CURDIR)/appendices \
+ $(EXTOPTIONS) $(SPECFILES)
+
+# These targets are HTML5 refpages
+#
+# The recursive $(MAKE) is an apparently unavoidable hack, since the
+# actual list of man page sources isn't known until after
+# $(REFPATH)/apispec.txt is generated. $(GENDEPENDS) is generated before
+# running the recursive make, so it doesn't trigger twice
+# $(SUBMAKEOPTIONS) suppresses the redundant "Entering / leaving"
+# messages make normally prints out, similarly to suppressing make
+# command output logging in the individual refpage actions below.
+SUBMAKEOPTIONS = --no-print-directory
+manhtmlpages: $(REFPATH)/apispec.txt $(GENDEPENDS)
+ $(QUIET) echo "manhtmlpages: building HTML refpages with these options:"
+ $(QUIET) echo $(ASCIIDOC) -b html5 $(ADOCOPTS) $(ADOCHTMLOPTS) \
+ $(ADOCREFOPTS) -d manpage -o REFPAGE.html REFPAGE.txt
+ $(MAKE) $(SUBMAKEOPTIONS) -e buildmanpages
+
+# Build the individual refpages, then the symbolic links from aliases
+MANHTMLDIR = $(OUTDIR)/man/html
+MANHTML = $(MANSOURCES:$(REFPATH)/%.txt=$(MANHTMLDIR)/%.html)
+buildmanpages: $(MANHTML)
+ $(MAKE) $(SUBMAKEOPTIONS) -e manaliases
+
+# Asciidoctor options to build refpages
+#
+# ADOCREFOPTS *must* be placed after ADOCOPTS in the command line, so
+# that it can override spec attribute values.
+#
+# cross-file-links makes custom macros link to other refpages
+# refprefix includes the refpage (not spec) extension metadata.
+# isrefpage is for refpage-specific content
+# html_spec_relative is where to find the full specification
+ADOCREFOPTS = -a cross-file-links -a refprefix='refpage.' -a isrefpage \
+ -a html_spec_relative='../../html/vkspec.html'
+
+# The refpage build process normally generates far too much output, so
+# use VERYQUIET instead of QUIET
+# Running translate_math.js on every refpage is slow and most of them
+# don't contain math, so do a quick search for latexmath delimiters.
+$(MANHTMLDIR)/%.html: KATEXDIR = ../../katex
+$(MANHTMLDIR)/%.html: $(REFPATH)/%.txt $(GENDEPENDS) katexinst
+ $(VERYQUIET)echo "Building $@ from $< using default options"
+ $(VERYQUIET)$(MKDIR) $(MANHTMLDIR)
+ $(VERYQUIET)$(ASCIIDOC) -b html5 $(ADOCOPTS) $(ADOCHTMLOPTS) $(ADOCREFOPTS) \
+ -d manpage -o $@ $<
+ $(VERYQUIET)if egrep -q '\\[([]' $@ ; then \
+ $(TRANSLATEMATH) $@ ; \
+ fi
+
+# The 'manhtml' and 'manpdf' targets are NO LONGER SUPPORTED by Khronos.
+# They generate HTML5 and PDF single-file versions of the refpages.
+# The generated refpage sources are included by $(REFPATH)/apispec.txt,
+# and are always generated along with that file. Therefore there's no
+# need for a recursive $(MAKE) or a $(MANHTML) dependency, unlike the
+# manhtmlpages target.
+
+manpdf: $(OUTDIR)/apispec.pdf
+
+$(OUTDIR)/apispec.pdf: $(SPECVERSION) $(REFPATH)/apispec.txt $(SVGFILES) $(GENDEPENDS)
+ $(QUIET)$(MKDIR) $(OUTDIR)
+ $(QUIET)$(MKDIR) $(PDFMATHDIR)
+ $(QUIET)$(ASCIIDOC) -b pdf -a html_spec_relative='html/vkspec.html' \
+ $(ADOCOPTS) $(ADOCPDFOPTS) -o $@ $(REFPATH)/apispec.txt
+ $(QUIET)$(OPTIMIZEPDF) $@ $@.out.pdf && mv $@.out.pdf $@
+
+manhtml: $(OUTDIR)/apispec.html
+
+$(OUTDIR)/apispec.html: KATEXDIR = katex
+$(OUTDIR)/apispec.html: ADOCMISCOPTS =
+$(OUTDIR)/apispec.html: $(SPECVERSION) $(REFPATH)/apispec.txt $(SVGFILES) $(GENDEPENDS) katexinst
+ $(QUIET)$(MKDIR) $(OUTDIR)
+ $(QUIET)$(ASCIIDOC) -b html5 -a html_spec_relative='html/vkspec.html' \
+ $(ADOCOPTS) $(ADOCHTMLOPTS) -o $@ $(REFPATH)/apispec.txt
+ $(QUIET)$(TRANSLATEMATH) $@
+
+# Create links for refpage aliases
+
+MAKEMANALIASES = $(SCRIPTS)/makemanaliases.py
+manaliases: $(GENERATED)/api.py
+ $(PYTHON) $(MAKEMANALIASES) -genpath $(GENERATED) -refdir $(MANHTMLDIR)
+
+# Targets generated from the XML and registry processing scripts
+# $(GENERATED)/api.py - Python encoding of the registry
+# The $(...DEPEND) targets are files named 'timeMarker' in generated
+# target directories. They serve as proxies for the multiple generated
+# files written for each target:
+# apiinc / proxy $(APIDEPEND) - API interface include files in $(APIPATH)
+# hostsyncinc / proxy $(HOSTSYNCDEPEND) - host sync table include files in $(HOSTSYNCPATH)
+# validinc / proxy $(VALIDITYDEPEND) - API validity include files in $(VALIDITYPATH)
+# extinc / proxy $(METADEPEND) - extension appendix metadata include files in $(METAPATH)
+#
+# $(VERSIONOPTIONS) specifies the core API versions which are included
+# in these targets, and is set above based on $(VERSIONS)
+#
+# $(EXTOPTIONS) specifies the extensions which are included in these
+# targets, and is set above based on $(EXTENSIONS).
+#
+# $(GENVKEXTRA) are extra options that can be passed to genvk.py, e.g.
+# '-diag diag'
+
+REGISTRY = xml
+VKXML = $(REGISTRY)/vk.xml
+GENVK = $(SCRIPTS)/genvk.py
+GENVKOPTS = $(VERSIONOPTIONS) $(EXTOPTIONS) $(GENVKEXTRA) -registry $(VKXML)
+GENVKEXTRA =
+
+scriptapi: pyapi rubyapi
+
+pyapi $(GENERATED)/api.py: $(VKXML) $(GENVK)
+ $(PYTHON) $(GENVK) $(GENVKOPTS) -o $(GENERATED) api.py
+
+rubyapi $(GENERATED)/api.rb: $(VKXML) $(GENVK)
+ $(PYTHON) $(GENVK) $(GENVKOPTS) -o $(GENERATED) api.rb
+
+apiinc: $(APIDEPEND)
+
+$(APIDEPEND): $(VKXML) $(GENVK) $(GENERATED)/api.py
+ $(QUIET)$(MKDIR) $(APIPATH)
+ $(QUIET)$(PYTHON) $(GENVK) $(GENVKOPTS) -o $(APIPATH) -genpath $(GENERATED) apiinc
+
+hostsyncinc: $(HOSTSYNCDEPEND)
+
+$(HOSTSYNCDEPEND): $(VKXML) $(GENVK)
+ $(QUIET)$(MKDIR) $(HOSTSYNCPATH)
+ $(QUIET)$(PYTHON) $(GENVK) $(GENVKOPTS) -o $(HOSTSYNCPATH) hostsyncinc
+
+validinc: $(VALIDITYDEPEND)
+
+$(VALIDITYDEPEND): $(VKXML) $(GENVK)
+ $(QUIET)$(MKDIR) $(VALIDITYPATH)
+ $(QUIET)$(PYTHON) $(GENVK) $(GENVKOPTS) -o $(VALIDITYPATH) validinc
+
+extinc: $(METAPATH)/timeMarker
+
+$(METADEPEND): $(VKXML) $(GENVK)
+ $(QUIET)$(MKDIR) $(METAPATH)
+ $(QUIET)$(PYTHON) $(GENVK) $(GENVKOPTS) -o $(METAPATH) extinc
+
+interfaceinc: $(INTERFACEPATH)/timeMarker
+
+$(INTERFACEDEPEND): $(VKXML) $(GENVK)
+ $(QUIET)$(MKDIR) $(INTERFACEPATH)
+ $(QUIET)$(PYTHON) $(GENVK) $(GENVKOPTS) -o $(INTERFACEPATH) interfaceinc
+
+# This generates a single file, so SPIRVCAPDEPEND is the full path to
+# the file, rather than to a timeMarker in the same directory.
+spirvcapinc: $(SPIRVCAPDEPEND)
+
+$(SPIRVCAPDEPEND): $(VKXML) $(GENVK)
+ $(QUIET)$(MKDIR) $(SPIRVCAPPATH)
+ $(QUIET)$(PYTHON) $(GENVK) $(GENVKOPTS) -o $(SPIRVCAPPATH) spirvcapinc
+
+# Debugging aid - generate all files from registry XML
+# This leaves out $(GENERATED)/extDependency.sh intentionally as it only
+# needs to be updated when the extension dependencies in vk.xml change.
+
+generated: $(GENERATED)/api.py $(GENDEPENDS)
+
+# Extension dependencies derived from vk.xml
+# Both Bash and Python versions are generated
+
+extDependency: $(GENERATED)/extDependency.stamp
+$(GENERATED)/extDependency.sh: $(GENERATED)/extDependency.stamp
+$(GENERATED)/extDependency.py: $(GENERATED)/extDependency.stamp
+
+DEPSCRIPT = $(SCRIPTS)/make_ext_dependency.py
+$(GENERATED)/extDependency.stamp: $(VKXML) $(DEPSCRIPT)
+ $(QUIET)$(PYTHON) $(DEPSCRIPT) \
+ -registry $(VKXML) \
+ -outscript $(GENERATED)/extDependency.sh \
+ -outpy $(GENERATED)/extDependency.py
+ $(QUIET)touch $@