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