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