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