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