1*35238bceSAndroid Build Coastguard Worker# -*- coding: utf-8 -*- 2*35238bceSAndroid Build Coastguard Worker 3*35238bceSAndroid Build Coastguard Worker#------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker# drawElements Quality Program utilities 5*35238bceSAndroid Build Coastguard Worker# -------------------------------------- 6*35238bceSAndroid Build Coastguard Worker# 7*35238bceSAndroid Build Coastguard Worker# Copyright 2015 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker# 9*35238bceSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker# You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker# 13*35238bceSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker# 15*35238bceSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker# limitations under the License. 20*35238bceSAndroid Build Coastguard Worker# 21*35238bceSAndroid Build Coastguard Worker#------------------------------------------------------------------------- 22*35238bceSAndroid Build Coastguard Worker 23*35238bceSAndroid Build Coastguard Workerimport os 24*35238bceSAndroid Build Coastguard Workerimport sys 25*35238bceSAndroid Build Coastguard Workerimport shlex 26*35238bceSAndroid Build Coastguard Workerimport platform 27*35238bceSAndroid Build Coastguard Workerimport subprocess 28*35238bceSAndroid Build Coastguard Workerimport logging 29*35238bceSAndroid Build Coastguard Worker 30*35238bceSAndroid Build Coastguard WorkerDEQP_DIR = os.path.realpath(os.path.normpath(os.path.join(os.path.dirname(__file__), "..", ".."))) 31*35238bceSAndroid Build Coastguard Worker 32*35238bceSAndroid Build Coastguard Worker# HostInfo describes properties of the host where these scripts 33*35238bceSAndroid Build Coastguard Worker# are running on. 34*35238bceSAndroid Build Coastguard Workerclass HostInfo: 35*35238bceSAndroid Build Coastguard Worker OS_WINDOWS = 0 36*35238bceSAndroid Build Coastguard Worker OS_LINUX = 1 37*35238bceSAndroid Build Coastguard Worker OS_OSX = 2 38*35238bceSAndroid Build Coastguard Worker 39*35238bceSAndroid Build Coastguard Worker @staticmethod 40*35238bceSAndroid Build Coastguard Worker def getOs (): 41*35238bceSAndroid Build Coastguard Worker if sys.platform == 'darwin': 42*35238bceSAndroid Build Coastguard Worker return HostInfo.OS_OSX 43*35238bceSAndroid Build Coastguard Worker elif sys.platform == 'win32': 44*35238bceSAndroid Build Coastguard Worker return HostInfo.OS_WINDOWS 45*35238bceSAndroid Build Coastguard Worker elif sys.platform.startswith('linux'): 46*35238bceSAndroid Build Coastguard Worker return HostInfo.OS_LINUX 47*35238bceSAndroid Build Coastguard Worker else: 48*35238bceSAndroid Build Coastguard Worker raise Exception("Unknown sys.platform '%s'" % sys.platform) 49*35238bceSAndroid Build Coastguard Worker 50*35238bceSAndroid Build Coastguard Worker @staticmethod 51*35238bceSAndroid Build Coastguard Worker def getArchBits (): 52*35238bceSAndroid Build Coastguard Worker MACHINE_BITS = { 53*35238bceSAndroid Build Coastguard Worker "i386": 32, 54*35238bceSAndroid Build Coastguard Worker "i686": 32, 55*35238bceSAndroid Build Coastguard Worker "x86": 32, 56*35238bceSAndroid Build Coastguard Worker "x86_64": 64, 57*35238bceSAndroid Build Coastguard Worker "AMD64": 64, 58*35238bceSAndroid Build Coastguard Worker "arm64": 64 59*35238bceSAndroid Build Coastguard Worker } 60*35238bceSAndroid Build Coastguard Worker machine = platform.machine() 61*35238bceSAndroid Build Coastguard Worker 62*35238bceSAndroid Build Coastguard Worker if not machine in MACHINE_BITS: 63*35238bceSAndroid Build Coastguard Worker raise Exception("Unknown platform.machine() '%s'" % machine) 64*35238bceSAndroid Build Coastguard Worker 65*35238bceSAndroid Build Coastguard Worker return MACHINE_BITS[machine] 66*35238bceSAndroid Build Coastguard Worker 67*35238bceSAndroid Build Coastguard Workerdef die (msg): 68*35238bceSAndroid Build Coastguard Worker print(msg) 69*35238bceSAndroid Build Coastguard Worker exit(-1) 70*35238bceSAndroid Build Coastguard Worker 71*35238bceSAndroid Build Coastguard Workerdef shellquote(s): 72*35238bceSAndroid Build Coastguard Worker return '"%s"' % s.replace('\\', '\\\\').replace('"', '\"').replace('$', '\$').replace('`', '\`') 73*35238bceSAndroid Build Coastguard Worker 74*35238bceSAndroid Build Coastguard Workerg_workDirStack = [] 75*35238bceSAndroid Build Coastguard Worker 76*35238bceSAndroid Build Coastguard Workerdef pushWorkingDir (path): 77*35238bceSAndroid Build Coastguard Worker oldDir = os.getcwd() 78*35238bceSAndroid Build Coastguard Worker os.chdir(path) 79*35238bceSAndroid Build Coastguard Worker logging.debug("Current working directory: " + path) 80*35238bceSAndroid Build Coastguard Worker g_workDirStack.append(oldDir) 81*35238bceSAndroid Build Coastguard Worker 82*35238bceSAndroid Build Coastguard Workerdef popWorkingDir (): 83*35238bceSAndroid Build Coastguard Worker assert len(g_workDirStack) > 0 84*35238bceSAndroid Build Coastguard Worker newDir = g_workDirStack[-1] 85*35238bceSAndroid Build Coastguard Worker g_workDirStack.pop() 86*35238bceSAndroid Build Coastguard Worker os.chdir(newDir) 87*35238bceSAndroid Build Coastguard Worker logging.debug("Current working directory: " + newDir) 88*35238bceSAndroid Build Coastguard Worker 89*35238bceSAndroid Build Coastguard Workerdef execute (args): 90*35238bceSAndroid Build Coastguard Worker logging.debug("Running: " + " ".join(args)) 91*35238bceSAndroid Build Coastguard Worker retcode = subprocess.call(args) 92*35238bceSAndroid Build Coastguard Worker if retcode != 0: 93*35238bceSAndroid Build Coastguard Worker raise Exception("Failed to execute '%s', got %d" % (str(args), retcode)) 94*35238bceSAndroid Build Coastguard Worker 95*35238bceSAndroid Build Coastguard Workerdef readBinaryFile (filename): 96*35238bceSAndroid Build Coastguard Worker f = open(filename, 'rb') 97*35238bceSAndroid Build Coastguard Worker data = f.read() 98*35238bceSAndroid Build Coastguard Worker f.close() 99*35238bceSAndroid Build Coastguard Worker return data 100*35238bceSAndroid Build Coastguard Worker 101*35238bceSAndroid Build Coastguard Workerdef readFile (filename): 102*35238bceSAndroid Build Coastguard Worker f = open(filename, 'rt') 103*35238bceSAndroid Build Coastguard Worker data = f.read() 104*35238bceSAndroid Build Coastguard Worker f.close() 105*35238bceSAndroid Build Coastguard Worker return data 106*35238bceSAndroid Build Coastguard Worker 107*35238bceSAndroid Build Coastguard Workerdef writeBinaryFile (filename, data): 108*35238bceSAndroid Build Coastguard Worker logging.debug("Writing to binary file: " + filename) 109*35238bceSAndroid Build Coastguard Worker f = open(filename, 'wb') 110*35238bceSAndroid Build Coastguard Worker f.write(data) 111*35238bceSAndroid Build Coastguard Worker f.close() 112*35238bceSAndroid Build Coastguard Worker 113*35238bceSAndroid Build Coastguard Workerdef writeFile (filename, data): 114*35238bceSAndroid Build Coastguard Worker logging.debug("Writing to file: " + filename) 115*35238bceSAndroid Build Coastguard Worker if (sys.version_info < (3, 0)): 116*35238bceSAndroid Build Coastguard Worker f = open(filename, 'wt') 117*35238bceSAndroid Build Coastguard Worker else: 118*35238bceSAndroid Build Coastguard Worker f = open(filename, 'wt', newline='\n') 119*35238bceSAndroid Build Coastguard Worker f.write(data) 120*35238bceSAndroid Build Coastguard Worker f.close() 121*35238bceSAndroid Build Coastguard Worker 122*35238bceSAndroid Build Coastguard Workerdef which (binName, paths = None): 123*35238bceSAndroid Build Coastguard Worker if paths == None: 124*35238bceSAndroid Build Coastguard Worker paths = os.environ['PATH'].split(os.pathsep) 125*35238bceSAndroid Build Coastguard Worker 126*35238bceSAndroid Build Coastguard Worker def whichImpl (binWithExt): 127*35238bceSAndroid Build Coastguard Worker for path in paths: 128*35238bceSAndroid Build Coastguard Worker path = path.strip('"') 129*35238bceSAndroid Build Coastguard Worker fullPath = os.path.join(path, binWithExt) 130*35238bceSAndroid Build Coastguard Worker if os.path.isfile(fullPath) and os.access(fullPath, os.X_OK): 131*35238bceSAndroid Build Coastguard Worker return fullPath 132*35238bceSAndroid Build Coastguard Worker 133*35238bceSAndroid Build Coastguard Worker return None 134*35238bceSAndroid Build Coastguard Worker 135*35238bceSAndroid Build Coastguard Worker extensions = [""] 136*35238bceSAndroid Build Coastguard Worker if HostInfo.getOs() == HostInfo.OS_WINDOWS: 137*35238bceSAndroid Build Coastguard Worker extensions += [".exe", ".bat"] 138*35238bceSAndroid Build Coastguard Worker 139*35238bceSAndroid Build Coastguard Worker for extension in extensions: 140*35238bceSAndroid Build Coastguard Worker extResult = whichImpl(binName + extension) 141*35238bceSAndroid Build Coastguard Worker if extResult != None: 142*35238bceSAndroid Build Coastguard Worker logging.debug("which: found " + binName + " as " + extResult) 143*35238bceSAndroid Build Coastguard Worker return extResult 144*35238bceSAndroid Build Coastguard Worker 145*35238bceSAndroid Build Coastguard Worker return None 146*35238bceSAndroid Build Coastguard Worker 147*35238bceSAndroid Build Coastguard Workerdef initializeLogger(verbose): 148*35238bceSAndroid Build Coastguard Worker log_level = logging.INFO 149*35238bceSAndroid Build Coastguard Worker if verbose: 150*35238bceSAndroid Build Coastguard Worker log_level = logging.DEBUG 151*35238bceSAndroid Build Coastguard Worker logging.root.setLevel(level=log_level) 152*35238bceSAndroid Build Coastguard Worker logging.debug("Logging is set to " + str(log_level)) 153