13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# -*- coding: utf-8 -*-
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
33c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#-------------------------------------------------------------------------
43c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# drawElements Quality Program utilities
53c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# --------------------------------------
63c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
73c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# Copyright 2015 The Android Open Source Project
83c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
93c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# Licensed under the Apache License, Version 2.0 (the "License");
103c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# you may not use this file except in compliance with the License.
113c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# You may obtain a copy of the License at
123c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
133c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#      http://www.apache.org/licenses/LICENSE-2.0
143c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
153c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# Unless required by applicable law or agreed to in writing, software
163c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# distributed under the License is distributed on an "AS IS" BASIS,
173c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
183c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# See the License for the specific language governing permissions and
193c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# limitations under the License.
203c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
213c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#-------------------------------------------------------------------------
223c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryimport os
2489e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosimport re
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyryimport sys
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryimport shlex
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyryimport subprocess
2889e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosimport multiprocessing
29c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raitaimport string
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyrytry:
32842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	import threading
33842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyryexcept ImportError:
34842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	import dummy_threading as threading
35842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeLib:
37b6d3233c28958278a188948f3989d6ba2be23600Jarkko Pöyry	def __init__ (self, apiVersion, abiVersion, prebuiltDir):
38b6d3233c28958278a188948f3989d6ba2be23600Jarkko Pöyry		self.apiVersion		= apiVersion
39b6d3233c28958278a188948f3989d6ba2be23600Jarkko Pöyry		self.abiVersion		= abiVersion
40b6d3233c28958278a188948f3989d6ba2be23600Jarkko Pöyry		self.prebuiltDir	= prebuiltDir
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
42c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	def __str__ (self):
43c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita		return "(API: %s, ABI: %s)" % (self.apiVersion, self.abiVersion)
44c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita
45c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	def __repr__ (self):
46c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita		return "(API: %s, ABI: %s)" % (self.apiVersion, self.abiVersion)
47c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita
48c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef getPlatform ():
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if sys.platform.startswith('linux'):
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return 'linux'
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else:
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return sys.platform
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5589e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosdef selectByOS (variants):
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	platform = getPlatform()
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if platform in variants:
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return variants[platform]
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	elif 'other' in variants:
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return variants['other']
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else:
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		raise Exception("No configuration for '%s'" % platform)
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef isExecutable (path):
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return os.path.isfile(path) and os.access(path, os.X_OK)
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef which (binName):
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for path in os.environ['PATH'].split(os.pathsep):
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		path = path.strip('"')
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		fullPath = os.path.join(path, binName)
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isExecutable(fullPath):
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return fullPath
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return None
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef isBinaryInPath (binName):
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return which(binName) != None
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7989e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosdef selectFirstExistingBinary (filenames):
8089e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	for filename in filenames:
8189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		if filename != None and isExecutable(filename):
8289e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos			return filename
8389e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
8489e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	return None
8589e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
8689e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosdef selectFirstExistingDir (paths):
8789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	for path in paths:
8889e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		if path != None and os.path.isdir(path):
8989e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos			return path
9089e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
9189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	return None
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef die (msg):
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	print msg
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	exit(-1)
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef shellquote(s):
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return '"%s"' % s.replace('\\', '\\\\').replace('"', '\"').replace('$', '\$').replace('`', '\`')
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef execute (commandLine):
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	args	= shlex.split(commandLine)
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	retcode	= subprocess.call(args)
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if retcode != 0:
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		raise Exception("Failed to execute '%s', got %d" % (commandLine, retcode))
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef execArgs (args):
107c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	# Make sure previous stdout prints have been written out.
108c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	sys.stdout.flush()
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	retcode	= subprocess.call(args)
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if retcode != 0:
111842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		raise Exception("Failed to execute '%s', got %d" % (str(args), retcode))
112842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry
113a8253801a60532d892e7c320b37e09960b87c609Kalle Raitadef execArgsInDirectory (args, cwd, linePrefix="", failOnNonZeroExit=True):
114d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry
115d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry	def readApplyPrefixAndPrint (source, prefix, sink):
116d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry		while True:
117d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry			line = source.readline()
118d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry			if len(line) == 0: # EOF
119d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry				break;
120d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry			sink.write(prefix + line)
121d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry
122d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry	process = subprocess.Popen(args, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
123d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry	stdoutJob = threading.Thread(target=readApplyPrefixAndPrint, args=(process.stdout, linePrefix, sys.stdout))
124a31fb7a56b8518185135ca0b67f01ba258539055Jarkko Pöyry	stderrJob = threading.Thread(target=readApplyPrefixAndPrint, args=(process.stderr, linePrefix, sys.stderr))
125d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry	stdoutJob.start()
126d1ae94f048b946fab81c468b0833976bf30bbca8Jarkko Pöyry	stderrJob.start()
127842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	retcode = process.wait()
128a8253801a60532d892e7c320b37e09960b87c609Kalle Raita	if failOnNonZeroExit and retcode != 0:
129842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		raise Exception("Failed to execute '%s', got %d" % (str(args), retcode))
130842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry
131842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyrydef serialApply(f, argsList):
132842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	for args in argsList:
133842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		f(*args)
134842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry
135842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyrydef parallelApply(f, argsList):
136842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	class ErrorCode:
137842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		def __init__ (self):
138842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry			self.error = None;
139842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry
140842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	def applyAndCaptureError (func, args, errorCode):
141842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		try:
142842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry			func(*args)
143842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		except:
144842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry			errorCode.error = sys.exc_info()
145842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry
146842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	errorCode = ErrorCode()
147842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	jobs = []
148842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	for args in argsList:
149842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		job = threading.Thread(target=applyAndCaptureError, args=(f, args, errorCode))
150842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		job.start()
151842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		jobs.append(job)
152842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry
153842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	for job in jobs:
154842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		job.join()
155842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry
156842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry	if errorCode.error:
157842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		raise errorCode.error[0], errorCode.error[1], errorCode.error[2]
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15989e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosclass Device:
16089e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	def __init__(self, serial, product, model, device):
16189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		self.serial		= serial
16289e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		self.product	= product
16389e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		self.model		= model
16489e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		self.device		= device
16589e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
16689e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	def __str__ (self):
16789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		return "%s: {product: %s, model: %s, device: %s}" % (self.serial, self.product, self.model, self.device)
16889e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
16989e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosdef getDevices (adb):
17089e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	proc = subprocess.Popen([adb, 'devices', '-l'], stdout=subprocess.PIPE)
17189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	(stdout, stderr) = proc.communicate()
17289e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
17389e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	if proc.returncode != 0:
174842a87c8cfd9eb5321eccd22c0f2def118d79b88Jarkko Pöyry		raise Exception("adb devices -l failed, got %d" % proc.returncode)
17589e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
176dbf97155094231242208a7b3c3e74359041a6f97Nicolas Boichat	ptrn = re.compile(r'^([a-zA-Z0-9\.:]+)\s+.*product:([^\s]+)\s+model:([^\s]+)\s+device:([^\s]+)')
17789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	devices = []
17889e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	for line in stdout.splitlines()[1:]:
17989e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		if len(line.strip()) == 0:
18089e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos			continue
18189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
18289e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		m = ptrn.match(line)
18389e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		if m == None:
184a78b661ed0327eedf8b13a6debc0b98d0e37b0e5Pyry Haulos			print "WARNING: Failed to parse device info '%s'" % line
185a78b661ed0327eedf8b13a6debc0b98d0e37b0e5Pyry Haulos			continue
18689e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
18789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		devices.append(Device(m.group(1), m.group(2), m.group(3), m.group(4)))
18889e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
18989e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	return devices
19089e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
19189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosdef getWin32Generator ():
19289e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	if which("jom.exe") != None:
19389e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		return "NMake Makefiles JOM"
19489e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	else:
19589e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		return "NMake Makefiles"
19689e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
19789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosdef isNinjaSupported ():
19889e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	return which("ninja") != None
19989e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
20089e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosdef getUnixGenerator ():
20189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	if isNinjaSupported():
20289e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		return "Ninja"
20389e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	else:
20489e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		return "Unix Makefiles"
20589e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
20689e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosdef getExtraBuildArgs (generator):
20789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	if generator == "Unix Makefiles":
20889e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		return ["--", "-j%d" % multiprocessing.cpu_count()]
20989e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	else:
21089e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		return []
21189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
21289e0405021b883114cca9e748166c17bd7ebcc98Pyry HaulosNDK_HOST_OS_NAMES = [
21389e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	"windows",
214993a280cf87e868a4d1264f0a8ea6d7c68b7997dMaciej Jesionowski	"windows-x86_64",
21589e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	"darwin-x86",
216c198d02e1a3c433f5d580273e1dbc7396d8fcf0aJesse Hall	"darwin-x86_64",
21789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	"linux-x86",
21889e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	"linux-x86_64"
21989e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos]
22089e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
22189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulosdef getNDKHostOsName (ndkPath):
22289e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	for name in NDK_HOST_OS_NAMES:
22389e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		if os.path.exists(os.path.join(ndkPath, "prebuilt", name)):
22489e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos			return name
22589e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
22689e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	raise Exception("Couldn't determine NDK host OS")
22789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# deqp/android path
2293c827367444ee418f129b2c238299f49d3264554Jarkko PoyryANDROID_DIR				= os.path.realpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Build configuration
2323c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNATIVE_LIBS				= [
233b6d3233c28958278a188948f3989d6ba2be23600Jarkko Pöyry		#		  API		ABI				prebuiltsDir
234b6d3233c28958278a188948f3989d6ba2be23600Jarkko Pöyry		NativeLib(13,		"armeabi-v7a",	'android-arm'),		# ARM v7a ABI
235b6d3233c28958278a188948f3989d6ba2be23600Jarkko Pöyry		NativeLib(13,		"x86",			'android-x86'),		# x86
236b6d3233c28958278a188948f3989d6ba2be23600Jarkko Pöyry		NativeLib(21,		"arm64-v8a",	'android-arm64'),	# ARM64 v8a ABI
23761beab4daa69358a9113d26338c9deca5d685300Slawomir Cygan		NativeLib(21,		"x86_64",		'android-x86_64'),	# x86_64
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	]
239b6d3233c28958278a188948f3989d6ba2be23600Jarkko Pöyry
240d290dcd9952c852b74c77c9a85da6d0296fb1233Daniel KochANDROID_JAVA_API		= "android-22"
24103700a8505debaeae47e63e156ec15350398ce83Pyry HaulosNATIVE_LIB_NAME			= "libdeqp.so"
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2436bc20e4f05d2bd76e2c630e9e5db7e10f2c17023Kalle Raitadef makeNdkVersionString (version):
2446bc20e4f05d2bd76e2c630e9e5db7e10f2c17023Kalle Raita	minorVersionString = (chr(ord('a') + version[1]) if version[1] > 0 else "")
2456bc20e4f05d2bd76e2c630e9e5db7e10f2c17023Kalle Raita	return "r%d%s" % (version[0], minorVersionString)
2466bc20e4f05d2bd76e2c630e9e5db7e10f2c17023Kalle Raita
2476bc20e4f05d2bd76e2c630e9e5db7e10f2c17023Kalle RaitaANDROID_NDK_VERSION			= (11,0)
2486bc20e4f05d2bd76e2c630e9e5db7e10f2c17023Kalle RaitaANDROID_NDK_VERSION_STRING	= makeNdkVersionString(ANDROID_NDK_VERSION)
249c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raitadef selectNDKPath ():
250c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	candidates =  [
2516bc20e4f05d2bd76e2c630e9e5db7e10f2c17023Kalle Raita		os.path.expanduser("~/android-ndk-" + ANDROID_NDK_VERSION_STRING),
2526bc20e4f05d2bd76e2c630e9e5db7e10f2c17023Kalle Raita		"C:/android/android-ndk-" + ANDROID_NDK_VERSION_STRING,
253fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita		os.environ.get("ANDROID_NDK_PATH", None), # If not defined, return None
254c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	]
255c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita
256c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	ndkPath = selectFirstExistingDir(candidates)
257c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita
258c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	if ndkPath == None:
259c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita		raise Exception("None of NDK directory candidates exist: %s. Check ANDROID_NDK_PATH in common.py" % candidates)
260c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita
261c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	return ndkPath
262c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita
263fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raitadef noneSafePathJoin (*components):
264fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita	if None in components:
265fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita		return None
266fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita	return os.path.join(*components)
267fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita
268fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita
269c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita# NDK paths
270c9f7674b9be01e0f50a53178d3776903e2c3587aKalle RaitaANDROID_NDK_PATH				= selectNDKPath()
27189e0405021b883114cca9e748166c17bd7ebcc98Pyry HaulosANDROID_NDK_HOST_OS				= getNDKHostOsName(ANDROID_NDK_PATH)
272de7fb14fc30a8dd60e0215c333950b6a996c825aPyry HaulosANDROID_NDK_TOOLCHAIN_VERSION	= "r11" # Toolchain file is selected based on this
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Native code build settings
27589e0405021b883114cca9e748166c17bd7ebcc98Pyry HaulosCMAKE_GENERATOR			= selectByOS({
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		'win32':	getWin32Generator(),
27789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		'other':	getUnixGenerator()
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	})
27989e0405021b883114cca9e748166c17bd7ebcc98Pyry HaulosEXTRA_BUILD_ARGS		= getExtraBuildArgs(CMAKE_GENERATOR)
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# SDK paths
28289e0405021b883114cca9e748166c17bd7ebcc98Pyry HaulosANDROID_SDK_PATH		= selectFirstExistingDir([
283c198d02e1a3c433f5d580273e1dbc7396d8fcf0aJesse Hall		os.environ.get("ANDROID_SDK_PATH", None),
28489e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		os.path.expanduser("~/android-sdk-linux"),
28589e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		os.path.expanduser("~/android-sdk-mac_x86"),
28689e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		"C:/android/android-sdk-windows",
28789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	])
28889e0405021b883114cca9e748166c17bd7ebcc98Pyry HaulosANDROID_BIN				= selectFirstExistingBinary([
289fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita		noneSafePathJoin(ANDROID_SDK_PATH, "tools", "android"),
290fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita		noneSafePathJoin(ANDROID_SDK_PATH, "tools", "android.bat"),
29189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		which('android'),
29289e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	])
29389e0405021b883114cca9e748166c17bd7ebcc98Pyry HaulosADB_BIN					= selectFirstExistingBinary([
29489e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		which('adb'), # \note Prefer adb in path to avoid version issues on dev machines
295fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita		noneSafePathJoin(ANDROID_SDK_PATH, "platform-tools", "adb"),
296fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita		noneSafePathJoin(ANDROID_SDK_PATH, "platform-tools", "adb.exe"),
29789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	])
29889e0405021b883114cca9e748166c17bd7ebcc98Pyry HaulosZIPALIGN_BIN			= selectFirstExistingBinary([
299fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita		noneSafePathJoin(ANDROID_SDK_PATH, "tools", "zipalign"),
300fee3a5f955aff1db01cc42e615ec052cd7fb1f7dKalle Raita		noneSafePathJoin(ANDROID_SDK_PATH, "tools", "zipalign.exe"),
30189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		which('zipalign'),
30289e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	])
30389e0405021b883114cca9e748166c17bd7ebcc98Pyry HaulosJARSIGNER_BIN			= which('jarsigner')
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Apache ant
30689e0405021b883114cca9e748166c17bd7ebcc98Pyry HaulosANT_BIN					= selectFirstExistingBinary([
30789e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		which('ant'),
30889e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		"C:/android/apache-ant-1.8.4/bin/ant.bat",
30989e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		"C:/android/apache-ant-1.9.2/bin/ant.bat",
31089e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		"C:/android/apache-ant-1.9.3/bin/ant.bat",
31189e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos		"C:/android/apache-ant-1.9.4/bin/ant.bat",
31289e0405021b883114cca9e748166c17bd7ebcc98Pyry Haulos	])
313c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita
314c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raitadef makeNameValueTuple (name):
315c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	return (name, str(eval(name)))
316c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita
3176b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry HaulosCONFIG_VAR_NAMES = [
3186b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"ANDROID_DIR",
3196b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"NATIVE_LIBS",
3206b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"ANDROID_JAVA_API",
3216b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"NATIVE_LIB_NAME",
3226b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"ANDROID_NDK_PATH",
3236b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"ANDROID_NDK_HOST_OS",
3246b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"ANDROID_NDK_TOOLCHAIN_VERSION",
3256b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"CMAKE_GENERATOR",
3266b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"EXTRA_BUILD_ARGS",
3276b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"ANDROID_SDK_PATH",
3286b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"ANDROID_BIN",
3296b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"ADB_BIN",
3306b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"ZIPALIGN_BIN",
3316b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"JARSIGNER_BIN",
3326b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry Haulos		"ANT_BIN",
333c9f7674b9be01e0f50a53178d3776903e2c3587aKalle Raita	]
3346b1f7dc8fa0584715bdbb98fdee051d06f90ec17Pyry HaulosCONFIG_STRINGS = [makeNameValueTuple(x) for x in CONFIG_VAR_NAMES]
335