xref: /aosp_15_r20/external/deqp/scripts/gen_android_bp.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 2017 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 posixpath
25*35238bceSAndroid Build Coastguard Workerfrom fnmatch import fnmatch
26*35238bceSAndroid Build Coastguard Worker
27*35238bceSAndroid Build Coastguard Workerfrom ctsbuild.common import DEQP_DIR, writeFile, which, execute
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard WorkerSRC_ROOTS = [
30*35238bceSAndroid Build Coastguard Worker    "execserver",
31*35238bceSAndroid Build Coastguard Worker    "executor",
32*35238bceSAndroid Build Coastguard Worker    "external/vulkancts",
33*35238bceSAndroid Build Coastguard Worker    "framework/common",
34*35238bceSAndroid Build Coastguard Worker    "framework/delibs",
35*35238bceSAndroid Build Coastguard Worker    "framework/egl",
36*35238bceSAndroid Build Coastguard Worker    "framework/opengl",
37*35238bceSAndroid Build Coastguard Worker    "framework/platform/android",
38*35238bceSAndroid Build Coastguard Worker    "framework/qphelper",
39*35238bceSAndroid Build Coastguard Worker    "framework/randomshaders",
40*35238bceSAndroid Build Coastguard Worker    "framework/referencerenderer",
41*35238bceSAndroid Build Coastguard Worker    "framework/xexml",
42*35238bceSAndroid Build Coastguard Worker    "modules",
43*35238bceSAndroid Build Coastguard Worker]
44*35238bceSAndroid Build Coastguard Worker
45*35238bceSAndroid Build Coastguard WorkerINCLUDE_PATTERNS = [
46*35238bceSAndroid Build Coastguard Worker    "*.cpp",
47*35238bceSAndroid Build Coastguard Worker    "*.c",
48*35238bceSAndroid Build Coastguard Worker]
49*35238bceSAndroid Build Coastguard Worker
50*35238bceSAndroid Build Coastguard WorkerEXCLUDE_PATTERNS = [
51*35238bceSAndroid Build Coastguard Worker    "execserver/xsWin32TestProcess.cpp",
52*35238bceSAndroid Build Coastguard Worker    "external/vulkancts/modules/vulkan/vktBuildPrograms.cpp",
53*35238bceSAndroid Build Coastguard Worker    "framework/delibs/dethread/standalone_test.c",
54*35238bceSAndroid Build Coastguard Worker    "framework/randomshaders/rsgTest.cpp",
55*35238bceSAndroid Build Coastguard Worker    "executor/tools/*",
56*35238bceSAndroid Build Coastguard Worker    "execserver/tools/*",
57*35238bceSAndroid Build Coastguard Worker    "external/vulkancts/framework/vulkan/vkRenderDocUtil.cpp",
58*35238bceSAndroid Build Coastguard Worker    "external/vulkancts/modules/vulkan/vktTestPackageEntrySC.cpp",
59*35238bceSAndroid Build Coastguard Worker    "external/vulkancts/modules/vulkan/sc/*",
60*35238bceSAndroid Build Coastguard Worker    "external/vulkancts/vkscserver/*",
61*35238bceSAndroid Build Coastguard Worker    "external/vulkancts/vkscpc/*",
62*35238bceSAndroid Build Coastguard Worker    "external/vulkancts/framework/vulkan/generated/vulkansc/*",
63*35238bceSAndroid Build Coastguard Worker    "external/vulkancts/modules/vulkan/video/*",
64*35238bceSAndroid Build Coastguard Worker]
65*35238bceSAndroid Build Coastguard Worker
66*35238bceSAndroid Build Coastguard Worker# These are include folders where there are no source c/cpp files
67*35238bceSAndroid Build Coastguard WorkerEXTRA_INCLUDE_DIRS = [
68*35238bceSAndroid Build Coastguard Worker    # This only has headers, so is not caught with INCLUDE_PATTERNS
69*35238bceSAndroid Build Coastguard Worker    "external/vulkancts/framework/vulkan/generated/vulkan",
70*35238bceSAndroid Build Coastguard Worker]
71*35238bceSAndroid Build Coastguard Worker
72*35238bceSAndroid Build Coastguard WorkerTEMPLATE = """
73*35238bceSAndroid Build Coastguard Worker// WARNING: This is auto-generated file. Do not modify, since changes will
74*35238bceSAndroid Build Coastguard Worker// be lost! Modify scripts/gen_android_bp.py instead.
75*35238bceSAndroid Build Coastguard Worker
76*35238bceSAndroid Build Coastguard Workercc_defaults {
77*35238bceSAndroid Build Coastguard Worker    name: "libdeqp_gen",
78*35238bceSAndroid Build Coastguard Worker
79*35238bceSAndroid Build Coastguard Worker    srcs: [
80*35238bceSAndroid Build Coastguard Worker{SRC_FILES}    ],
81*35238bceSAndroid Build Coastguard Worker    local_include_dirs: [
82*35238bceSAndroid Build Coastguard Worker{INCLUDES}    ],
83*35238bceSAndroid Build Coastguard Worker}
84*35238bceSAndroid Build Coastguard Worker
85*35238bceSAndroid Build Coastguard Worker"""[1:-1]
86*35238bceSAndroid Build Coastguard Worker
87*35238bceSAndroid Build Coastguard Workerdef matchesAny (filename, patterns):
88*35238bceSAndroid Build Coastguard Worker    for ptrn in patterns:
89*35238bceSAndroid Build Coastguard Worker        if fnmatch(filename, ptrn):
90*35238bceSAndroid Build Coastguard Worker            return True
91*35238bceSAndroid Build Coastguard Worker    return False
92*35238bceSAndroid Build Coastguard Worker
93*35238bceSAndroid Build Coastguard Workerdef isSourceFile (filename):
94*35238bceSAndroid Build Coastguard Worker    return matchesAny(filename, INCLUDE_PATTERNS) and not matchesAny(filename, EXCLUDE_PATTERNS)
95*35238bceSAndroid Build Coastguard Worker
96*35238bceSAndroid Build Coastguard Workerdef toPortablePath (nativePath):
97*35238bceSAndroid Build Coastguard Worker    # os.path is so convenient...
98*35238bceSAndroid Build Coastguard Worker    head, tail = os.path.split(nativePath)
99*35238bceSAndroid Build Coastguard Worker    components = [tail]
100*35238bceSAndroid Build Coastguard Worker
101*35238bceSAndroid Build Coastguard Worker    while head != None and head != '':
102*35238bceSAndroid Build Coastguard Worker        head, tail = os.path.split(head)
103*35238bceSAndroid Build Coastguard Worker        components.append(tail)
104*35238bceSAndroid Build Coastguard Worker
105*35238bceSAndroid Build Coastguard Worker    components.reverse()
106*35238bceSAndroid Build Coastguard Worker
107*35238bceSAndroid Build Coastguard Worker    portablePath = ""
108*35238bceSAndroid Build Coastguard Worker    for component in components:
109*35238bceSAndroid Build Coastguard Worker        portablePath = posixpath.join(portablePath, component)
110*35238bceSAndroid Build Coastguard Worker
111*35238bceSAndroid Build Coastguard Worker    return portablePath
112*35238bceSAndroid Build Coastguard Worker
113*35238bceSAndroid Build Coastguard Workerdef getSourceFiles ():
114*35238bceSAndroid Build Coastguard Worker    sources = []
115*35238bceSAndroid Build Coastguard Worker
116*35238bceSAndroid Build Coastguard Worker    for srcRoot in SRC_ROOTS:
117*35238bceSAndroid Build Coastguard Worker        baseDir = os.path.join(DEQP_DIR, srcRoot)
118*35238bceSAndroid Build Coastguard Worker        for root, dirs, files in os.walk(baseDir):
119*35238bceSAndroid Build Coastguard Worker            for file in files:
120*35238bceSAndroid Build Coastguard Worker                absPath = os.path.join(root, file)
121*35238bceSAndroid Build Coastguard Worker                nativeRelPath = os.path.relpath(absPath, DEQP_DIR)
122*35238bceSAndroid Build Coastguard Worker                portablePath = toPortablePath(nativeRelPath)
123*35238bceSAndroid Build Coastguard Worker
124*35238bceSAndroid Build Coastguard Worker                if isSourceFile(portablePath):
125*35238bceSAndroid Build Coastguard Worker                    sources.append(portablePath)
126*35238bceSAndroid Build Coastguard Worker
127*35238bceSAndroid Build Coastguard Worker    sources.sort()
128*35238bceSAndroid Build Coastguard Worker
129*35238bceSAndroid Build Coastguard Worker    return sources
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Workerdef getSourceDirs (sourceFiles):
132*35238bceSAndroid Build Coastguard Worker    seenDirs = set()
133*35238bceSAndroid Build Coastguard Worker    sourceDirs = []
134*35238bceSAndroid Build Coastguard Worker
135*35238bceSAndroid Build Coastguard Worker    for sourceFile in sourceFiles:
136*35238bceSAndroid Build Coastguard Worker        sourceDir = posixpath.dirname(sourceFile)
137*35238bceSAndroid Build Coastguard Worker
138*35238bceSAndroid Build Coastguard Worker        if not sourceDir in seenDirs:
139*35238bceSAndroid Build Coastguard Worker            sourceDirs.append(sourceDir)
140*35238bceSAndroid Build Coastguard Worker            seenDirs.add(sourceDir)
141*35238bceSAndroid Build Coastguard Worker
142*35238bceSAndroid Build Coastguard Worker    sourceDirs.extend(EXTRA_INCLUDE_DIRS)
143*35238bceSAndroid Build Coastguard Worker    sourceDirs.sort()
144*35238bceSAndroid Build Coastguard Worker
145*35238bceSAndroid Build Coastguard Worker    return sourceDirs
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Workerdef genBpStringList (items):
148*35238bceSAndroid Build Coastguard Worker    src = ""
149*35238bceSAndroid Build Coastguard Worker
150*35238bceSAndroid Build Coastguard Worker    for item in items:
151*35238bceSAndroid Build Coastguard Worker        src += "        \"%s\",\n" % item
152*35238bceSAndroid Build Coastguard Worker
153*35238bceSAndroid Build Coastguard Worker    return src
154*35238bceSAndroid Build Coastguard Worker
155*35238bceSAndroid Build Coastguard Workerdef genAndroidBp (sourceDirs, sourceFiles):
156*35238bceSAndroid Build Coastguard Worker    src = TEMPLATE
157*35238bceSAndroid Build Coastguard Worker    src = src.replace("{INCLUDES}", genBpStringList(sourceDirs))
158*35238bceSAndroid Build Coastguard Worker    src = src.replace("{SRC_FILES}", genBpStringList(sourceFiles))
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker    return src
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Workerif __name__ == "__main__":
163*35238bceSAndroid Build Coastguard Worker    sourceFiles = getSourceFiles()
164*35238bceSAndroid Build Coastguard Worker    sourceDirs = getSourceDirs(sourceFiles)
165*35238bceSAndroid Build Coastguard Worker    androidBpText = genAndroidBp(sourceDirs, sourceFiles)
166*35238bceSAndroid Build Coastguard Worker
167*35238bceSAndroid Build Coastguard Worker    bpFilename = os.path.join(DEQP_DIR, "AndroidGen.bp")
168*35238bceSAndroid Build Coastguard Worker    writeFile(bpFilename, androidBpText)
169*35238bceSAndroid Build Coastguard Worker
170*35238bceSAndroid Build Coastguard Worker    # Format the generated file
171*35238bceSAndroid Build Coastguard Worker    if which("bpfmt") != None:
172*35238bceSAndroid Build Coastguard Worker        execute(["bpfmt", "-w", bpFilename])
173*35238bceSAndroid Build Coastguard Worker    else:
174*35238bceSAndroid Build Coastguard Worker        print("Warning: Could not find bpfmt, file won't be formatted.")
175