diff options
Diffstat (limited to 'codegen/vulkan/scripts/genspec.py')
-rw-r--r-- | codegen/vulkan/scripts/genspec.py | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/codegen/vulkan/scripts/genspec.py b/codegen/vulkan/scripts/genspec.py new file mode 100644 index 00000000..dfa55cca --- /dev/null +++ b/codegen/vulkan/scripts/genspec.py @@ -0,0 +1,164 @@ +#!/usr/bin/python3 +# +# Copyright 2016-2021 The Khronos Group Inc. +# +# SPDX-License-Identifier: Apache-2.0 +"""This script builds a full release package including XHTML and PDF +versions of the specification, including an optional list of +extensions. Other files in the release directory are removed, +including man pages, XHTML chunked, HTML, validity output, etc. + +The current branch must be fully committed and up to date when the +script is run, with no outstanding un-added / un-committed files. +After completing the build, suggestions for creating tags are made.""" + +import time +from datetime import date, timedelta + + +def releaseNum(): + """Return the Vulkan release number, used for tags.""" + return '$REVISION' + + +def buildOnFriday(): + """Return a date for the current, or upcoming if not already, Friday, + which is when releases happen.""" + today = date.today() + friday = today + timedelta((4 - today.weekday()) % 7) + return friday + + +def buildRelease(label, + versions, + extensions, + ratified, + outdir, + apititle, + xmlDir, xmlTargets, + specDir, specTargets, + miscSrc=None, miscDst=None, needRefSources=False): + """Build a release. + + - `label` = textual label to use for target being generated + - `versions` = list of core API versions to include + - `extensions` = list of extension names to include + - `ratified` = True if this is a ratified spec (one built without non-KHR extensions) + - `outdir` = directory to generate specs in + - `apititle` = extra title to apply to the specification + - `xmlDir` = directory containing registry XML + - `xmlTargets` = targets to build in xml/ + - `specDir` = directory containing spec source & Makefile + - `specTargets` = targets to build + - `miscSrc` = path to copy misc files from, if non-None + - `miscDst` = path to copy misc files to, if non-None + - `needRefSources` = True if ref pages must be extracted from the spec sources""" + + print('echo Info: Generating target=' + label, + 'outdir=' + outdir) + + outarg = 'OUTDIR=' + outdir + + if versions != None and len(versions) > 0: + versarg = 'VERSIONS="' + ' '.join(versions) + '"' + else: + versarg = '' + + if extensions != None and len(extensions) > 0: + extarg = 'EXTENSIONS="' + ' '.join(extensions) + '"' + else: + extarg = '' + + if ratified: + ratifiedarg = 'EXTRAATTRIBS="-a ratified_core_spec"' + else: + ratifiedarg = '' + + if apititle != None: + titlearg = 'APITITLE="' + apititle + '"' + else: + titlearg = '' + + # print('echo Info: Creating directory and cleaning spec in', outdir) + print('mkdir -p', outdir) + print('(cd ', outdir, '&& rm -rf', + 'html chunked pdf', + 'man config checks', + 'vkspec.html styleguide.html apispec.html apispec.pdf registry.html', + ')') + + if xmlTargets != '': + # print('echo Info: Generating headers and spec include files') + print('cd', xmlDir) + print('make', outarg, xmlTargets) + + # print('echo Info: Generating ref pages sources and spec targets') + print('cd', specDir) + print('make', outarg, 'clean') + # This is a temporary workaround for a dependency bug - if any of the + # specTargets require ref page sources, and they aren't already present + # at the time the make is invoked, that target will not be built. + if needRefSources: + print('make', outarg, versarg, extarg, 'refpages') + # Now make the actual targets. + print('make -O -k -j 8', + outarg, versarg, extarg, ratifiedarg, titlearg, + 'NOTEOPTS="-a implementation-guide"', + specTargets) + + if miscSrc != None and miscDst != None: + print('mkdir -p', miscDst) + print('cp', miscSrc + '/*.txt', miscDst + '/') + + print('') + + +def buildBranch(targetDir = '', + versions = '', + extensions = '', + ratified = False, + apititle = '(NO TITLE SPECIFIED)', + xmlTargets = '', + specTargets = '', + repoDir = '', + outDir = '', + needRefSources=False): + """Build all target documents. + + - `repoDir` = path to the Vulkan git repo containing the specs + - `outDir` = path to the output base directory in which targets are generated""" + + # Directory with vk.xml and generation tools + xmlDir = repoDir + '/xml' + # Directory with spec sources + specDir = repoDir + # Directory containing misc. files to copy to registry. + # At present there are none, since GLSL extensions have moved to the + # GLSL repository and are redirected from the Vulkan registy website. + # These should be relative to repoDir and outDir, respectively + miscSrc = None + miscDst = None + + buildRelease(targetDir, + versions, + extensions, + ratified, + outDir + '/' + targetDir, + apititle, + xmlDir, xmlTargets, + specDir, specTargets, + miscSrc, miscDst, + needRefSources) + + +def createTags(releaseNum, tagdate): + """Print commands to tag the git branches. + + - `releaseNum` = release number of this spec update, to tag the tree with + - `tagdate` = date (used to be used to tag the tree with)""" + # Tag date in YYYYMMDD format + now = tagdate.strftime('%Y%m%d') + + print('echo To tag the spec branch for this release, execute the command:') + print('echo git tag -a -m \\"Tag Vulkan API specification for 1.2.' + + releaseNum, 'release\\"', 'v1.2.' + releaseNum) |