xref: /aosp_15_r20/external/deqp/scripts/launchcontrol_build.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
1# -*- coding: utf-8 -*-
2
3#-------------------------------------------------------------------------
4# drawElements Quality Program utilities
5# --------------------------------------
6#
7# Copyright 2015 The Android Open Source Project
8#
9# Licensed under the Apache License, Version 2.0 (the "License");
10# you may not use this file except in compliance with the License.
11# You may obtain a copy of the License at
12#
13#      http://www.apache.org/licenses/LICENSE-2.0
14#
15# Unless required by applicable law or agreed to in writing, software
16# distributed under the License is distributed on an "AS IS" BASIS,
17# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18# See the License for the specific language governing permissions and
19# limitations under the License.
20#
21#-------------------------------------------------------------------------
22
23import os
24from ctsbuild.common import *
25from ctsbuild.build import *
26from argparse import ArgumentParser
27import multiprocessing
28from build_android_mustpass import *
29
30class LaunchControlConfig:
31    def __init__ (self, buildArgs, checkMustpassLists):
32        self.buildArgs = buildArgs
33        self.checkMustpassLists = checkMustpassLists
34
35    def getBuildArgs (self):
36        return self.buildArgs
37
38    def getCheckMustpassLists (self):
39        return self.checkMustpassLists
40
41COMMON_GCC_CFLAGS = ["-Werror"]
42COMMON_CLANG_CFLAGS = COMMON_GCC_CFLAGS + ["-Wno-error=unused-command-line-argument"]
43X86_64_GCC_CFLAGS = COMMON_GCC_CFLAGS + ["-m64"]
44X86_64_CLANG_CFLAGS = COMMON_CLANG_CFLAGS + ["-m64"]
45
46def makeCflagsArgs (cflags):
47    cflagsStr = " ".join(cflags)
48    return ["-DCMAKE_C_FLAGS=%s" % cflagsStr, "-DCMAKE_CXX_FLAGS=%s" % cflagsStr]
49
50BUILD_CONFIGS = {
51    "gcc-x86_64-x11_glx":   LaunchControlConfig(["-DDEQP_TARGET=x11_glx"] + makeCflagsArgs(X86_64_GCC_CFLAGS), False),
52    "clang-x86_64-x11_glx": LaunchControlConfig(["-DDEQP_TARGET=x11_glx", "-DCMAKE_C_COMPILER=clang", "-DCMAKE_CXX_COMPILER=clang++"] + makeCflagsArgs(X86_64_CLANG_CFLAGS), False),
53    "gcc-x86_64-null": LaunchControlConfig(["-DDEQP_TARGET=null"] + makeCflagsArgs(X86_64_GCC_CFLAGS), True)
54}
55
56def buildWithMake (workingDir):
57    pushWorkingDir(workingDir)
58    # CMake docs advised this to be the best magic formula...
59    threadCount = multiprocessing.cpu_count() + 1
60    print("Invoke make with %d threads" % threadCount)
61    execute(["make", "-j%d" % threadCount])
62    popWorkingDir()
63
64def checkForChanges ():
65    pushWorkingDir(DEQP_DIR)
66    # If there are changed files, exit code will be non-zero and the script terminates immediately.
67    execute(["git", "diff", "--exit-code"])
68    popWorkingDir()
69
70def parseOptions ():
71    parser = ArgumentParser()
72
73    parser.add_argument("-d",
74                        "--build-dir",
75                        dest="buildDir",
76                        default="out",
77                        help="Temporary build directory")
78    parser.add_argument("-c",
79                        "--config",
80                        dest="config",
81                        choices=BUILD_CONFIGS.keys(),
82                        required=True,
83                        help="Build configuration name")
84    parser.add_argument("-t",
85                        "--build-type",
86                        dest="buildType",
87                        choices=["Debug", "Release"],
88                        default="Debug",
89                        help="Build type")
90    return parser.parse_args()
91
92if __name__ == "__main__":
93    options = parseOptions()
94
95    print("\n############################################################")
96    print("# %s %s BUILD" % (options.config.upper(), options.buildType.upper()))
97    print("############################################################\n")
98
99    launchControlConfig = BUILD_CONFIGS[options.config]
100    buildDir = os.path.realpath(os.path.normpath(options.buildDir))
101    config = BuildConfig(buildDir, options.buildType, launchControlConfig.getBuildArgs())
102    initBuildDir(config, MAKEFILE_GENERATOR)
103    buildWithMake(buildDir)
104
105    if launchControlConfig.getCheckMustpassLists():
106        genMustpassLists(MUSTPASS_LISTS, MAKEFILE_GENERATOR, config)
107        checkForChanges()
108
109    print("\n--- BUILD SCRIPT COMPLETE")
110