1# -*- coding: utf-8 -*- 2 3#------------------------------------------------------------------------- 4# drawElements Quality Program utilities 5# -------------------------------------- 6# 7# Copyright 2024 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 24import posixpath 25from fnmatch import fnmatch 26 27from ctsbuild.common import DEQP_DIR, writeFile, which, execute 28 29# source code to compile into static lib libkhronoscts_common 30LIB_KHRONOS_CTS_COMMON_SRC_ROOTS = [ 31 "execserver", 32 "executor", 33 "framework/common", 34 "framework/delibs", 35 "framework/egl", 36 "framework/opengl", 37 "framework/qphelper", 38 "framework/randomshaders", 39 "framework/referencerenderer", 40 "framework/xexml", 41] 42 43LIB_KHRONOS_CTS_COMMON_INCLUDE_PATTERNS = [ 44 "*.cpp", 45 "*.c", 46] 47 48LIB_KHRONOS_CTS_COMMON_EXCLUDE_PATTERNS = [ 49 "execserver/xsWin32TestProcess.cpp", 50 "framework/delibs/dethread/standalone_test.c", 51 "framework/randomshaders/rsgTest.cpp", 52 "execserver/tools/*", 53 "executor/tools/*", 54] 55 56LIB_KHRONOS_CTS_COMMON_EXTRA_INCLUDE_DIRS = [] 57 58# source code to compile into static lib libkhronoscts_modules_gles 59LIB_KHRONOS_CTS_MODULES_SRC_ROOTS = [ 60 "modules", 61] 62 63LIB_KHRONOS_CTS_MODULES_INCLUDE_PATTERNS = [ 64 "*.cpp", 65 "*.c", 66] 67 68LIB_KHRONOS_CTS_MODULES_EXCLUDE_PATTERNS = [ 69 "modules/egl/teglTestPackageEntry.cpp", 70 "modules/gles2/tes2TestPackageEntry.cpp", 71 "modules/gles3/tes3TestPackageEntry.cpp", 72 "modules/gles31/tes31TestPackageEntry.cpp", 73 "modules/internal/ditTestPackageEntry.cpp", 74] 75 76LIB_KHRONOS_CTS_MODULES_EXTRA_INCLUDE_DIRS = [ 77 "external/vulkancts/framework/vulkan", 78 "external/vulkancts/framework/vulkan/generated/vulkan", 79] 80 81# source code to compile into static lib libkhronoscts_openglcts 82LIB_KHRONOS_CTS_OPENGLCTS_SRC_ROOTS = [ 83 "external/openglcts", 84] 85 86LIB_KHRONOS_CTS_OPENGLCTS_INCLUDE_PATTERNS = [ 87 "*.cpp", 88 "*.c", 89] 90 91LIB_KHRONOS_CTS_OPENGLCTS_EXCLUDE_PATTERNS = [ 92 "external/openglcts/modules/gl/gl4cContextFlushControlTests.cpp", 93 "external/openglcts/modules/glcTestPackageEntry.cpp", 94 "external/openglcts/modules/runner/glcAndroidMain.cpp", 95 "external/openglcts/modules/runner/glcAndroidTestActivity.cpp", 96 "external/openglcts/modules/runner/glcTestRunner.cpp", 97 "external/openglcts/modules/runner/glcTestRunnerMain.cpp", 98] 99 100LIB_KHRONOS_CTS_OPENGLCTS_EXTRA_INCLUDE_DIRS = [ 101] 102 103# source code to compile into static lib libkhronoscts_vulkancts 104LIB_KHRONOS_CTS_VULKANCTS_SRC_ROOTS = [ 105 "external/vulkancts", 106] 107 108LIB_KHRONOS_CTS_VULKANCTS_INCLUDE_PATTERNS = [ 109 "*.cpp", 110 "*.c", 111] 112 113LIB_KHRONOS_CTS_VULKANCTS_EXCLUDE_PATTERNS = [ 114 "external/vulkancts/framework/vulkan/vkRenderDocUtil.cpp", 115 "external/vulkancts/modules/vulkan/vktBuildPrograms.cpp", 116 "external/vulkancts/modules/vulkan/sc/*", 117 "external/vulkancts/modules/vulkan/vktTestPackageEntrySC.cpp", 118 "external/vulkancts/vkscpc/*", 119 "external/vulkancts/vkscserver/*", 120 "external/vulkancts/modules/vulkan/video/*", 121] 122 123LIB_KHRONOS_CTS_VULKANCTS_EXTRA_INCLUDE_DIRS = [ 124 "external/vulkancts/framework/vulkan/generated/vulkan", 125] 126 127# source code to compile into static lib libkhronoscts_platform 128LIB_KHRONOS_CTS_PLATFORM_SRC_ROOTS = [ 129 "framework/platform/android", 130 "framework/platform/surfaceless", 131 "external/openglcts/modules/runner", 132] 133 134LIB_KHRONOS_CTS_PLATFORM_INCLUDE_PATTERNS = [ 135 "*.cpp", 136 "*.c", 137] 138 139LIB_KHRONOS_CTS_PLATFORM_EXCLUDE_PATTERNS = [ 140 "external/openglcts/modules/runner/glcAndroidMain.cpp", 141 "framework/platform/android/tcuAndroidJNI.cpp", 142 "framework/platform/android/tcuAndroidMain.cpp", 143 "framework/platform/android/tcuAndroidPlatformCapabilityQueryJNI.cpp", 144] 145 146LIB_KHRONOS_CTS_PLATFORM_EXTRA_INCLUDE_DIRS = [ 147] 148 149AUTO_GEN_WARNING = """// WARNING: This is auto-generated file. Do not modify, since changes will 150// be lost! Modify scripts/gen_khronos_cts_bp.py instead. 151""" 152 153CC_LIBRARY_KHRONOS_COMPILE_OPTION = """ 154cc_defaults { 155 name: "khronosctscompilationflag_default", 156 cppflags: [ 157 "-fexceptions", 158 "-Wno-non-virtual-dtor", 159 "-Wno-delete-non-virtual-dtor", 160 "-Wno-implicit-int-conversion", 161 "-Wno-implicit-float-conversion", 162 "-Wno-unused-function", 163 "-Wno-enum-float-conversion", 164 "-Wno-missing-field-initializers", 165 "-Wno-switch", 166 "-Wno-unused-parameter", 167 "-Wno-unused-variable", 168 "-Wno-macro-redefined", 169 ], 170 171 cpp_std: "c++17", 172 cflags: [ 173 // Amber defines. 174 "-DAMBER_CTS_VULKAN_HEADER=1", 175 "-DAMBER_ENABLE_CLSPV=0", 176 "-DAMBER_ENABLE_DXC=0", 177 "-DAMBER_ENABLE_LODEPNG=1", // This has no effect. 178 "-DAMBER_ENABLE_RTTI=1", 179 "-DAMBER_ENABLE_SHADERC=0", 180 "-DAMBER_ENABLE_SPIRV_TOOLS=0", 181 "-DAMBER_ENABLE_VK_DEBUGGING=0", 182 "-DAMBER_ENGINE_DAWN=0", 183 "-DAMBER_ENGINE_VULKAN=1", 184 185 // glslang defines: 186 "-DENABLE_HLSL", 187 "-DENABLE_OPT=0", 188 "-DGLSLANG_OSINCLUDE_UNIX", 189 190 // SPIRV-Tools defines: 191 "-DSPIRV_ANDROID", 192 "-DSPIRV_CHECK_CONTEXT", 193 "-DSPIRV_COLOR_TERMINAL", 194 "-DSPIRV_TIMER_ENABLED", 195 196 // Android/Clang defines (not needed): 197 // -D_FORTIFY_SOURCE=2 198 // -DANDROID 199 // -DNDEBUG 200 201 // dEQP defines that we don't want/need: 202 // -DDE_DEBUG 203 // -DDEQP_USE_RELEASE_INFO_FILE 204 // -DPNG_DEBUG 205 206 // dEQP defines that are worked out in deDefs.h, without needing 207 // explicit defs: 208 // -DDE_PTR_SIZE=8 209 // -DDE_CPU=DE_CPU_ARM_64 210 //"-DDE_FENV_ACCESS_ON=_Pragma(\"STDC FENV_ACCESS ON\")", 211 212 // dEQP defines: 213 "-D_XOPEN_SOURCE=600", 214 "-DDE_ANDROID_API=28", 215 "-DDE_ASSERT_FAILURE_CALLBACK", 216 "-DDE_COMPILER=DE_COMPILER_CLANG", 217 "-DDE_MINGW=0", 218 "-DDE_OS=DE_OS_ANDROID", 219 "-DDEQP_GLES2_DIRECT_LINK=1", 220 "-DDEQP_HAVE_RENDERDOC_HEADER=0", // Needs to be 0. 221 "-DDEQP_EXCLUDE_VK_VIDEO_TESTS", 222 "-DDEQP_SUPPORT_DRM=0", 223 "-DDEQP_SUPPORT_GLES1=1", 224 "-DDEQP_TARGET_NAME=\\"Android\\"", 225 "-DQP_SUPPORT_PNG", 226 "-DCTS_USES_VULKAN", 227 228 "-Wall", 229 "-Werror", 230 "-Wconversion", 231 232 "-fwrapv", 233 234 "-Wno-implicit-fallthrough", 235 "-Wno-sign-conversion", 236 "-Wno-unused-private-field", 237 "-Wno-shorten-64-to-32", 238 ], 239 240 include_dirs: [ 241 "external/deqp-deps/SPIRV-Headers/include", 242 ], 243 244 header_libs: ["jni_headers"], 245 shared_libs: ["libandroid"], 246 247 sdk_version: "current", 248 rtti: true, 249 stl: "c++_static", 250} 251""" 252 253CC_LIBRARY_STATIC_TEMPLATE = """ 254 255cc_library_static { 256 name: "{CC_STATIC_LIB_NAME}", 257 258 defaults: ["khronosctscompilationflag_default"], 259 260 srcs: [ 261{SRC_FILES} ], 262 export_include_dirs: [ 263{EXPORT_INCLUDES} ], 264 static_libs: [ 265{STATIC_LIBS} ], 266} 267 268"""[1:-1] 269 270def matchesAny (filename, patterns): 271 for ptrn in patterns: 272 if fnmatch(filename, ptrn): 273 return True 274 return False 275 276def isSourceFile (filename, include_patterns, exclude_patterns): 277 return matchesAny(filename, include_patterns) and not matchesAny(filename, exclude_patterns) 278 279def toPortablePath (nativePath): 280 # os.path is so convenient... 281 head, tail = os.path.split(nativePath) 282 components = [tail] 283 284 while head != None and head != '': 285 head, tail = os.path.split(head) 286 components.append(tail) 287 288 components.reverse() 289 290 portablePath = "" 291 for component in components: 292 portablePath = posixpath.join(portablePath, component) 293 294 return portablePath 295 296def getSourceFiles (src_roots, include_patterns, exclude_patterns): 297 sources = [] 298 299 for srcRoot in src_roots: 300 baseDir = os.path.join(DEQP_DIR, srcRoot) 301 for root, dirs, files in os.walk(baseDir): 302 for file in files: 303 absPath = os.path.join(root, file) 304 nativeRelPath = os.path.relpath(absPath, DEQP_DIR) 305 portablePath = toPortablePath(nativeRelPath) 306 307 if isSourceFile(portablePath, include_patterns, exclude_patterns): 308 sources.append(portablePath) 309 310 sources.sort() 311 312 return sources 313 314def getSourceDirs (sourceFiles, extra_include_dirs): 315 seenDirs = set() 316 sourceDirs = [] 317 318 for sourceFile in sourceFiles: 319 sourceDir = posixpath.dirname(sourceFile) 320 321 if not sourceDir in seenDirs: 322 sourceDirs.append(sourceDir) 323 seenDirs.add(sourceDir) 324 325 sourceDirs.extend(extra_include_dirs) 326 sourceDirs.sort() 327 328 return sourceDirs 329 330def genBpStringList (items): 331 src = "" 332 333 for item in items: 334 src += " \"%s\",\n" % item 335 336 return src 337 338def genCCStaticLibrary (ccStaticLibName, sourceDirs, sourceFiles, staticLibs): 339 src = CC_LIBRARY_STATIC_TEMPLATE 340 src = src.replace("{EXPORT_INCLUDES}", genBpStringList(sourceDirs)) 341 src = src.replace("{SRC_FILES}", genBpStringList(sourceFiles)) 342 src = src.replace("{CC_STATIC_LIB_NAME}", ccStaticLibName) 343 src = src.replace("{STATIC_LIBS}", genBpStringList(staticLibs)) 344 345 return src 346 347if __name__ == "__main__": 348 # Android bp content for compiling static lib libkhronoscts_common 349 libKhronosCTSCommonSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_COMMON_SRC_ROOTS, 350 LIB_KHRONOS_CTS_COMMON_INCLUDE_PATTERNS, 351 LIB_KHRONOS_CTS_COMMON_EXCLUDE_PATTERNS) 352 libKhronosCTSCommonSourceDirs = getSourceDirs(libKhronosCTSCommonSourceFiles, 353 LIB_KHRONOS_CTS_COMMON_EXTRA_INCLUDE_DIRS) 354 libKhronosCTSCommonStaticLibs = ["libpng_ndk"] 355 libKhronosCTSCommonAndroidBpText = genCCStaticLibrary("libkhronoscts_common", 356 libKhronosCTSCommonSourceDirs, 357 libKhronosCTSCommonSourceFiles, 358 libKhronosCTSCommonStaticLibs) 359 360 # Android bp content for compiling static lib libkhronoscts_modules_gles 361 libKhronosCTSModulesSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_MODULES_SRC_ROOTS, 362 LIB_KHRONOS_CTS_MODULES_INCLUDE_PATTERNS, 363 LIB_KHRONOS_CTS_MODULES_EXCLUDE_PATTERNS) 364 libKhronosCTSModulesSourceDirs = getSourceDirs(libKhronosCTSModulesSourceFiles, 365 LIB_KHRONOS_CTS_MODULES_EXTRA_INCLUDE_DIRS) 366 libKhronosCTSModulesStaticLibs = ["libkhronoscts_common"] 367 libKhronosCTSModulesAndroidBpText = genCCStaticLibrary("libkhronoscts_modules_gles", 368 libKhronosCTSModulesSourceDirs, 369 libKhronosCTSModulesSourceFiles, 370 libKhronosCTSModulesStaticLibs) 371 372 # Android bp content for compiling static lib libkhronoscts_openglcts 373 libKhronosCTSOpenGLCTSSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_OPENGLCTS_SRC_ROOTS, 374 LIB_KHRONOS_CTS_OPENGLCTS_INCLUDE_PATTERNS, 375 LIB_KHRONOS_CTS_OPENGLCTS_EXCLUDE_PATTERNS) 376 libKhronosCTSOpenGLCTSSourceDirs = getSourceDirs(libKhronosCTSOpenGLCTSSourceFiles, 377 LIB_KHRONOS_CTS_OPENGLCTS_EXTRA_INCLUDE_DIRS) 378 libKhronosCTSOpenGLCTSStaticLibs = ["libkhronoscts_common", 379 "libkhronoscts_modules_gles", 380 "deqp_glslang_SPIRV", 381 "deqp_spirv-tools"] 382 libKhronosCTSOpenGLCTSAndroidBpText = genCCStaticLibrary("libkhronoscts_openglcts", 383 libKhronosCTSOpenGLCTSSourceDirs, 384 libKhronosCTSOpenGLCTSSourceFiles, 385 libKhronosCTSOpenGLCTSStaticLibs) 386 387 # Android bp content for compiling static lib libkhronoscts_vulkancts 388 libKhronosCTSVulkanCTSSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_VULKANCTS_SRC_ROOTS, 389 LIB_KHRONOS_CTS_VULKANCTS_INCLUDE_PATTERNS, 390 LIB_KHRONOS_CTS_VULKANCTS_EXCLUDE_PATTERNS) 391 libKhronosCTSVulkanCTSSourceDirs = getSourceDirs(libKhronosCTSVulkanCTSSourceFiles, 392 LIB_KHRONOS_CTS_VULKANCTS_EXTRA_INCLUDE_DIRS) 393 libKhronosCTSVulkanCTSStaticLibs = ["libkhronoscts_common", 394 "deqp_glslang_glslang", 395 "deqp_spirv-tools", 396 "deqp_amber"] 397 libKhronosCTSVulkanCTSAndroidBpText = genCCStaticLibrary("libkhronoscts_vulkancts", 398 libKhronosCTSVulkanCTSSourceDirs, 399 libKhronosCTSVulkanCTSSourceFiles, 400 libKhronosCTSVulkanCTSStaticLibs) 401 402 # Android bp content for compiling libkhronoscts_platform 403 libKhronosCTSPlatformSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_PLATFORM_SRC_ROOTS, 404 LIB_KHRONOS_CTS_PLATFORM_INCLUDE_PATTERNS, 405 LIB_KHRONOS_CTS_PLATFORM_EXCLUDE_PATTERNS) 406 libKhronosCTSPlatformSourceDirs = getSourceDirs(libKhronosCTSPlatformSourceFiles, 407 LIB_KHRONOS_CTS_PLATFORM_EXTRA_INCLUDE_DIRS) 408 libKhronosCTSPlatformStaticLibs = ["libkhronoscts_common", 409 "libkhronoscts_modules_gles", 410 "libkhronoscts_vulkancts", 411 "libkhronoscts_openglcts"] 412 libKhronosCTSPlatformAndroidBpText = genCCStaticLibrary("libkhronoscts_platform", 413 libKhronosCTSPlatformSourceDirs, 414 libKhronosCTSPlatformSourceFiles, 415 libKhronosCTSPlatformStaticLibs) 416 417 # put everything together into the final Android bp content 418 libKhronosCTSAndroidBpText = "".join([AUTO_GEN_WARNING, 419 CC_LIBRARY_KHRONOS_COMPILE_OPTION, 420 libKhronosCTSCommonAndroidBpText, 421 libKhronosCTSModulesAndroidBpText, 422 libKhronosCTSOpenGLCTSAndroidBpText, 423 libKhronosCTSVulkanCTSAndroidBpText, 424 libKhronosCTSPlatformAndroidBpText]) 425 writeFile(os.path.join(DEQP_DIR, "AndroidKhronosCTSGen.bp"), libKhronosCTSAndroidBpText) 426