xref: /aosp_15_r20/external/deqp/scripts/ctsbuild/common.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
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