xref: /aosp_15_r20/external/deqp/framework/qphelper/gen_release_info.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
1# -*- coding: utf-8 -*-
2
3#-------------------------------------------------------------------------
4# drawElements Quality Program utilities
5# --------------------------------------
6#
7# Copyright 2016 The Android Open Source Project
8#
9# Licensed under the Apache License, Version 2.0 (the "License");
10# you may not use this file except in compliance with the License.
11# You may obtain a copy of the License at
12#
13#      http://www.apache.org/licenses/LICENSE-2.0
14#
15# Unless required by applicable law or agreed to in writing, software
16# distributed under the License is distributed on an "AS IS" BASIS,
17# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18# See the License for the specific language governing permissions and
19# limitations under the License.
20#
21#-------------------------------------------------------------------------
22
23import os
24import subprocess
25import sys
26import argparse
27
28def readFile (filename):
29    f = open(filename, 'rt')
30    d = f.read()
31    f.close()
32    return d
33
34def writeFile (filename, data):
35    f = open(filename, 'wt')
36    f.write(data)
37    f.close()
38
39def getDescribe (gitDir):
40    commit = subprocess.check_output(["git", "--git-dir", gitDir,
41                                      "describe", "--always", "--long", "--abbrev=40"])
42    return commit.decode().strip()
43
44def getHead (gitDir):
45    commit = subprocess.check_output(["git", "--git-dir", gitDir,
46                                      "rev-parse", "HEAD"])
47    return commit.decode().strip()
48
49def makeReleaseInfo (name, id, glslname, spirvtoolsname, spirvheadersname):
50    return """
51/* WARNING: auto-generated file, use {genFileName} to modify */
52
53#define DEQP_RELEASE_NAME                "{releaseName}"
54#define DEQP_RELEASE_ID                    {releaseId}
55#define DEQP_RELEASE_GLSL_NAME            "{glslReleaseName}"
56#define DEQP_RELEASE_SPIRV_TOOLS_NAME    "{spirvToolsReleaseName}"
57#define DEQP_RELEASE_SPIRV_HEADERS_NAME    "{spirvHeadersReleaseName}"
58
59"""[1:].format(
60        genFileName = os.path.basename(__file__),
61        releaseName = name,
62        releaseId = id,
63        glslReleaseName = glslname,
64        spirvToolsReleaseName = spirvtoolsname,
65        spirvHeadersReleaseName = spirvheadersname)
66
67def parseArgs ():
68    parser = argparse.ArgumentParser(description="Generate release info for build")
69    parser.add_argument('--name', dest='releaseName', default=None, help="Release name")
70    parser.add_argument('--id', dest='releaseId', default=None, help="Release ID (must be C integer literal)")
71    parser.add_argument('--git', dest='git', action='store_true', default=False, help="Development build, use git HEAD to identify")
72    parser.add_argument('--git-dir', dest='gitDir', default=None, help="Use specific git dir for extracting info")
73    parser.add_argument('--glsl-git-dir', dest='glslGitDir', default=None, help="Use specific git dir for extracting glsl version info")
74    parser.add_argument('--glsl-spirvtools-dir', dest='spirvToolsGitDir', default=None, help="Use specific git dir for extracting spirv tools version info")
75    parser.add_argument('--glsl-spirvheaders-dir', dest='spirvHeadersGitDir', default=None, help="Use specific git dir for extracting spirv headers version info")
76    parser.add_argument('--out', dest='out', default=None, help="Output file")
77
78    args = parser.parse_args()
79
80    if (args.releaseName == None) != (args.releaseId == None):
81        print("Both --name and --id must be specified")
82        parser.print_help()
83        sys.exit(-1)
84
85    if (args.releaseName != None) == args.git:
86        print("Either --name and --id, or --git must be specified")
87        parser.print_help()
88        sys.exit(-1)
89
90    return args
91
92if __name__ == "__main__":
93    curDir = os.path.dirname(__file__)
94    defaultGitDir = os.path.normpath(os.path.join(curDir, "..", "..", ".git"))
95    defaultGlslGitDir = os.path.normpath(os.path.join(curDir, "..", "..", "external", "glslang", "src", ".git"))
96    defaultSpirvToolsGitDir = os.path.normpath(os.path.join(curDir, "..", "..", "external", "spirv-tools", "src", ".git"))
97    defaultSpirvHeadersGitDir = os.path.normpath(os.path.join(curDir, "..", "..", "external", "spirv-headers", "src", ".git"))
98    defaultDstFile = os.path.join(curDir, "qpReleaseInfo.inl")
99
100    args = parseArgs()
101
102    if args.git:
103        gitDir = args.gitDir                if args.gitDir                != None else defaultGitDir
104        head = getHead(gitDir)
105        releaseName = getDescribe(gitDir)
106        releaseId = "0x%s" % head[0:8]
107    else:
108        releaseName = args.releaseName
109        releaseId = args.releaseId
110
111    if args.glslGitDir or os.path.exists(defaultGlslGitDir):
112        glslGitDir = args.glslGitDir            if args.glslGitDir            != None else defaultGlslGitDir
113        glslHead = getHead(glslGitDir)
114        glslName = "git-%s" % glslHead
115    elif args.git:
116        glslName = "unknown"
117    else:
118        glslName = args.releaseName
119
120    if args.spirvToolsGitDir or os.path.exists(defaultSpirvToolsGitDir):
121        spirvToolsGitDir = args.spirvToolsGitDir        if args.spirvToolsGitDir    != None else defaultSpirvToolsGitDir
122        spirvToolsHead = getHead(spirvToolsGitDir)
123        spirvToolsName = "git-%s" % spirvToolsHead
124    elif args.git:
125        spirvToolsName = "unknown"
126    else:
127        spirvToolsName = args.releaseName
128
129    if args.spirvHeadersGitDir or os.path.exists(defaultSpirvHeadersGitDir):
130        spirvHeadersGitDir = args.spirvHeadersGitDir    if args.spirvHeadersGitDir    != None else defaultSpirvHeadersGitDir
131        spirvHeadersHead = getHead(spirvHeadersGitDir)
132        spirvHeadersName = "git-%s" % spirvHeadersHead
133    elif args.git:
134        spirvHeadersName = "unknown"
135    else:
136        spirvHeadersName = args.releaseName
137
138    releaseInfo = makeReleaseInfo(releaseName, releaseId, glslName, spirvToolsName, spirvHeadersName)
139    dstFile = args.out if args.out != None else defaultDstFile
140
141    writeFile(dstFile, releaseInfo)
142