diff options
Diffstat (limited to 'codegen/vulkan/Makefile')
-rw-r--r-- | codegen/vulkan/Makefile | 614 |
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 $@ |