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