1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*-
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci# drawElements Quality Program utilities
5e5c31af7Sopenharmony_ci# --------------------------------------
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Copyright 2017 The Android Open Source Project
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci#
13e5c31af7Sopenharmony_ci#      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci#
15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci# limitations under the License.
20e5c31af7Sopenharmony_ci#
21e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_ciimport os
24e5c31af7Sopenharmony_ciimport posixpath
25e5c31af7Sopenharmony_cifrom fnmatch import fnmatch
26e5c31af7Sopenharmony_ci
27e5c31af7Sopenharmony_cifrom ctsbuild.common import DEQP_DIR, writeFile, which, execute
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_ciSRC_ROOTS = [
30e5c31af7Sopenharmony_ci	"execserver",
31e5c31af7Sopenharmony_ci	"executor",
32e5c31af7Sopenharmony_ci	"external/vulkancts",
33e5c31af7Sopenharmony_ci	"framework/common",
34e5c31af7Sopenharmony_ci	"framework/delibs",
35e5c31af7Sopenharmony_ci	"framework/egl",
36e5c31af7Sopenharmony_ci	"framework/opengl",
37e5c31af7Sopenharmony_ci	"framework/platform/android",
38e5c31af7Sopenharmony_ci	"framework/qphelper",
39e5c31af7Sopenharmony_ci	"framework/randomshaders",
40e5c31af7Sopenharmony_ci	"framework/referencerenderer",
41e5c31af7Sopenharmony_ci	"framework/xexml",
42e5c31af7Sopenharmony_ci	"modules",
43e5c31af7Sopenharmony_ci]
44e5c31af7Sopenharmony_ci
45e5c31af7Sopenharmony_ciINCLUDE_PATTERNS = [
46e5c31af7Sopenharmony_ci	"*.cpp",
47e5c31af7Sopenharmony_ci	"*.c",
48e5c31af7Sopenharmony_ci]
49e5c31af7Sopenharmony_ci
50e5c31af7Sopenharmony_ciEXCLUDE_PATTERNS = [
51e5c31af7Sopenharmony_ci	"execserver/xsWin32TestProcess.cpp",
52e5c31af7Sopenharmony_ci	"external/vulkancts/modules/vulkan/vktBuildPrograms.cpp",
53e5c31af7Sopenharmony_ci	"framework/delibs/dethread/standalone_test.c",
54e5c31af7Sopenharmony_ci	"framework/randomshaders/rsgTest.cpp",
55e5c31af7Sopenharmony_ci	"executor/tools/*",
56e5c31af7Sopenharmony_ci	"execserver/tools/*",
57e5c31af7Sopenharmony_ci	"external/vulkancts/framework/vulkan/vkRenderDocUtil.cpp",
58e5c31af7Sopenharmony_ci	"external/vulkancts/modules/vulkan/vktTestPackageEntrySC.cpp",
59e5c31af7Sopenharmony_ci	"external/vulkancts/modules/vulkan/sc/*",
60e5c31af7Sopenharmony_ci	"external/vulkancts/vkscserver/*",
61e5c31af7Sopenharmony_ci	"external/vulkancts/vkscpc/*",
62e5c31af7Sopenharmony_ci	"external/vulkancts/framework/vulkan/generated/vulkansc/*",
63e5c31af7Sopenharmony_ci	"external/vulkancts/modules/vulkan/video/*",
64e5c31af7Sopenharmony_ci]
65e5c31af7Sopenharmony_ci
66e5c31af7Sopenharmony_ci# These are include folders where there are no source c/cpp files
67e5c31af7Sopenharmony_ciEXTRA_INCLUDE_DIRS = [
68e5c31af7Sopenharmony_ci	# This only has headers, so is not caught with INCLUDE_PATTERNS
69e5c31af7Sopenharmony_ci	"external/vulkancts/framework/vulkan/generated/vulkan",
70e5c31af7Sopenharmony_ci]
71e5c31af7Sopenharmony_ci
72e5c31af7Sopenharmony_ciTEMPLATE = """
73e5c31af7Sopenharmony_ci// WARNING: This is auto-generated file. Do not modify, since changes will
74e5c31af7Sopenharmony_ci// be lost! Modify scripts/gen_android_bp.py instead.
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_cicc_defaults {
77e5c31af7Sopenharmony_ci    name: "libdeqp_gen",
78e5c31af7Sopenharmony_ci
79e5c31af7Sopenharmony_ci    srcs: [
80e5c31af7Sopenharmony_ci{SRC_FILES}    ],
81e5c31af7Sopenharmony_ci    local_include_dirs: [
82e5c31af7Sopenharmony_ci{INCLUDES}    ],
83e5c31af7Sopenharmony_ci}
84e5c31af7Sopenharmony_ci
85e5c31af7Sopenharmony_ci"""[1:-1]
86e5c31af7Sopenharmony_ci
87e5c31af7Sopenharmony_cidef matchesAny (filename, patterns):
88e5c31af7Sopenharmony_ci	for ptrn in patterns:
89e5c31af7Sopenharmony_ci		if fnmatch(filename, ptrn):
90e5c31af7Sopenharmony_ci			return True
91e5c31af7Sopenharmony_ci	return False
92e5c31af7Sopenharmony_ci
93e5c31af7Sopenharmony_cidef isSourceFile (filename):
94e5c31af7Sopenharmony_ci	return matchesAny(filename, INCLUDE_PATTERNS) and not matchesAny(filename, EXCLUDE_PATTERNS)
95e5c31af7Sopenharmony_ci
96e5c31af7Sopenharmony_cidef toPortablePath (nativePath):
97e5c31af7Sopenharmony_ci	# os.path is so convenient...
98e5c31af7Sopenharmony_ci	head, tail	= os.path.split(nativePath)
99e5c31af7Sopenharmony_ci	components	= [tail]
100e5c31af7Sopenharmony_ci
101e5c31af7Sopenharmony_ci	while head != None and head != '':
102e5c31af7Sopenharmony_ci		head, tail = os.path.split(head)
103e5c31af7Sopenharmony_ci		components.append(tail)
104e5c31af7Sopenharmony_ci
105e5c31af7Sopenharmony_ci	components.reverse()
106e5c31af7Sopenharmony_ci
107e5c31af7Sopenharmony_ci	portablePath = ""
108e5c31af7Sopenharmony_ci	for component in components:
109e5c31af7Sopenharmony_ci		portablePath = posixpath.join(portablePath, component)
110e5c31af7Sopenharmony_ci
111e5c31af7Sopenharmony_ci	return portablePath
112e5c31af7Sopenharmony_ci
113e5c31af7Sopenharmony_cidef getSourceFiles ():
114e5c31af7Sopenharmony_ci	sources = []
115e5c31af7Sopenharmony_ci
116e5c31af7Sopenharmony_ci	for srcRoot in SRC_ROOTS:
117e5c31af7Sopenharmony_ci		baseDir = os.path.join(DEQP_DIR, srcRoot)
118e5c31af7Sopenharmony_ci		for root, dirs, files in os.walk(baseDir):
119e5c31af7Sopenharmony_ci			for file in files:
120e5c31af7Sopenharmony_ci				absPath			= os.path.join(root, file)
121e5c31af7Sopenharmony_ci				nativeRelPath	= os.path.relpath(absPath, DEQP_DIR)
122e5c31af7Sopenharmony_ci				portablePath	= toPortablePath(nativeRelPath)
123e5c31af7Sopenharmony_ci
124e5c31af7Sopenharmony_ci				if isSourceFile(portablePath):
125e5c31af7Sopenharmony_ci					sources.append(portablePath)
126e5c31af7Sopenharmony_ci
127e5c31af7Sopenharmony_ci	sources.sort()
128e5c31af7Sopenharmony_ci
129e5c31af7Sopenharmony_ci	return sources
130e5c31af7Sopenharmony_ci
131e5c31af7Sopenharmony_cidef getSourceDirs (sourceFiles):
132e5c31af7Sopenharmony_ci	seenDirs	= set()
133e5c31af7Sopenharmony_ci	sourceDirs	= []
134e5c31af7Sopenharmony_ci
135e5c31af7Sopenharmony_ci	for sourceFile in sourceFiles:
136e5c31af7Sopenharmony_ci		sourceDir = posixpath.dirname(sourceFile)
137e5c31af7Sopenharmony_ci
138e5c31af7Sopenharmony_ci		if not sourceDir in seenDirs:
139e5c31af7Sopenharmony_ci			sourceDirs.append(sourceDir)
140e5c31af7Sopenharmony_ci			seenDirs.add(sourceDir)
141e5c31af7Sopenharmony_ci
142e5c31af7Sopenharmony_ci	sourceDirs.extend(EXTRA_INCLUDE_DIRS)
143e5c31af7Sopenharmony_ci	sourceDirs.sort()
144e5c31af7Sopenharmony_ci
145e5c31af7Sopenharmony_ci	return sourceDirs
146e5c31af7Sopenharmony_ci
147e5c31af7Sopenharmony_cidef genBpStringList (items):
148e5c31af7Sopenharmony_ci	src = ""
149e5c31af7Sopenharmony_ci
150e5c31af7Sopenharmony_ci	for item in items:
151e5c31af7Sopenharmony_ci		src += "        \"%s\",\n" % item
152e5c31af7Sopenharmony_ci
153e5c31af7Sopenharmony_ci	return src
154e5c31af7Sopenharmony_ci
155e5c31af7Sopenharmony_cidef genAndroidBp (sourceDirs, sourceFiles):
156e5c31af7Sopenharmony_ci	src = TEMPLATE
157e5c31af7Sopenharmony_ci	src = src.replace("{INCLUDES}", genBpStringList(sourceDirs))
158e5c31af7Sopenharmony_ci	src = src.replace("{SRC_FILES}", genBpStringList(sourceFiles))
159e5c31af7Sopenharmony_ci
160e5c31af7Sopenharmony_ci	return src
161e5c31af7Sopenharmony_ci
162e5c31af7Sopenharmony_ciif __name__ == "__main__":
163e5c31af7Sopenharmony_ci	sourceFiles		= getSourceFiles()
164e5c31af7Sopenharmony_ci	sourceDirs		= getSourceDirs(sourceFiles)
165e5c31af7Sopenharmony_ci	androidBpText	= genAndroidBp(sourceDirs, sourceFiles)
166e5c31af7Sopenharmony_ci
167e5c31af7Sopenharmony_ci	bpFilename = os.path.join(DEQP_DIR, "AndroidGen.bp")
168e5c31af7Sopenharmony_ci	writeFile(bpFilename, androidBpText)
169e5c31af7Sopenharmony_ci
170e5c31af7Sopenharmony_ci	# Format the generated file
171e5c31af7Sopenharmony_ci	if which("bpfmt") != None:
172e5c31af7Sopenharmony_ci		execute(["bpfmt", "-w", bpFilename])
173e5c31af7Sopenharmony_ci	else:
174e5c31af7Sopenharmony_ci		print("Warning: Could not find bpfmt, file won't be formatted.")
175