| # -*- coding: utf-8 -*- |
| |
| #------------------------------------------------------------------------- |
| # drawElements Quality Program utilities |
| # -------------------------------------- |
| # |
| # Copyright 2024 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| #------------------------------------------------------------------------- |
| |
| import os |
| import posixpath |
| from fnmatch import fnmatch |
| |
| from ctsbuild.common import DEQP_DIR, writeFile, which, execute |
| |
| # source code to compile into static lib libkhronoscts_common |
| LIB_KHRONOS_CTS_COMMON_SRC_ROOTS = [ |
| "execserver", |
| "executor", |
| "framework/common", |
| "framework/delibs", |
| "framework/egl", |
| "framework/opengl", |
| "framework/qphelper", |
| "framework/randomshaders", |
| "framework/referencerenderer", |
| "framework/xexml", |
| ] |
| |
| LIB_KHRONOS_CTS_COMMON_INCLUDE_PATTERNS = [ |
| "*.cpp", |
| "*.c", |
| ] |
| |
| LIB_KHRONOS_CTS_COMMON_EXCLUDE_PATTERNS = [ |
| "execserver/xsWin32TestProcess.cpp", |
| "framework/delibs/dethread/standalone_test.c", |
| "framework/randomshaders/rsgTest.cpp", |
| "execserver/tools/*", |
| "executor/tools/*", |
| ] |
| |
| LIB_KHRONOS_CTS_COMMON_EXTRA_INCLUDE_DIRS = [] |
| |
| # source code to compile into static lib libkhronoscts_modules_gles |
| LIB_KHRONOS_CTS_MODULES_SRC_ROOTS = [ |
| "modules", |
| ] |
| |
| LIB_KHRONOS_CTS_MODULES_INCLUDE_PATTERNS = [ |
| "*.cpp", |
| "*.c", |
| ] |
| |
| LIB_KHRONOS_CTS_MODULES_EXCLUDE_PATTERNS = [ |
| "modules/egl/teglTestPackageEntry.cpp", |
| "modules/gles2/tes2TestPackageEntry.cpp", |
| "modules/gles3/tes3TestPackageEntry.cpp", |
| "modules/gles31/tes31TestPackageEntry.cpp", |
| "modules/internal/ditTestPackageEntry.cpp", |
| ] |
| |
| LIB_KHRONOS_CTS_MODULES_EXTRA_INCLUDE_DIRS = [ |
| "external/vulkancts/framework/vulkan", |
| "external/vulkancts/framework/vulkan/generated/vulkan", |
| ] |
| |
| # source code to compile into static lib libkhronoscts_openglcts |
| LIB_KHRONOS_CTS_OPENGLCTS_SRC_ROOTS = [ |
| "external/openglcts", |
| ] |
| |
| LIB_KHRONOS_CTS_OPENGLCTS_INCLUDE_PATTERNS = [ |
| "*.cpp", |
| "*.c", |
| ] |
| |
| LIB_KHRONOS_CTS_OPENGLCTS_EXCLUDE_PATTERNS = [ |
| "external/openglcts/modules/gl/gl4cContextFlushControlTests.cpp", |
| "external/openglcts/modules/glcTestPackageEntry.cpp", |
| "external/openglcts/modules/runner/glcAndroidMain.cpp", |
| "external/openglcts/modules/runner/glcAndroidTestActivity.cpp", |
| "external/openglcts/modules/runner/glcTestRunner.cpp", |
| "external/openglcts/modules/runner/glcTestRunnerMain.cpp", |
| ] |
| |
| LIB_KHRONOS_CTS_OPENGLCTS_EXTRA_INCLUDE_DIRS = [ |
| ] |
| |
| # source code to compile into static lib libkhronoscts_vulkancts |
| LIB_KHRONOS_CTS_VULKANCTS_SRC_ROOTS = [ |
| "external/vulkancts", |
| ] |
| |
| LIB_KHRONOS_CTS_VULKANCTS_INCLUDE_PATTERNS = [ |
| "*.cpp", |
| "*.c", |
| ] |
| |
| LIB_KHRONOS_CTS_VULKANCTS_EXCLUDE_PATTERNS = [ |
| "external/vulkancts/framework/vulkan/vkRenderDocUtil.cpp", |
| "external/vulkancts/modules/vulkan/vktBuildPrograms.cpp", |
| "external/vulkancts/modules/vulkan/sc/*", |
| "external/vulkancts/modules/vulkan/vktTestPackageEntrySC.cpp", |
| "external/vulkancts/vkscpc/*", |
| "external/vulkancts/vkscserver/*", |
| "external/vulkancts/modules/vulkan/video/*", |
| ] |
| |
| LIB_KHRONOS_CTS_VULKANCTS_EXTRA_INCLUDE_DIRS = [ |
| "external/vulkancts/framework/vulkan/generated/vulkan", |
| ] |
| |
| # source code to compile into static lib libkhronoscts_platform |
| LIB_KHRONOS_CTS_PLATFORM_SRC_ROOTS = [ |
| "framework/platform/android", |
| "framework/platform/surfaceless", |
| "external/openglcts/modules/runner", |
| ] |
| |
| LIB_KHRONOS_CTS_PLATFORM_INCLUDE_PATTERNS = [ |
| "*.cpp", |
| "*.c", |
| ] |
| |
| LIB_KHRONOS_CTS_PLATFORM_EXCLUDE_PATTERNS = [ |
| "external/openglcts/modules/runner/glcAndroidMain.cpp", |
| "framework/platform/android/tcuAndroidJNI.cpp", |
| "framework/platform/android/tcuAndroidMain.cpp", |
| "framework/platform/android/tcuAndroidPlatformCapabilityQueryJNI.cpp", |
| ] |
| |
| LIB_KHRONOS_CTS_PLATFORM_EXTRA_INCLUDE_DIRS = [ |
| ] |
| |
| AUTO_GEN_WARNING = """ |
| // WARNING: This is auto-generated file. Do not modify, since changes will |
| // be lost! Modify scripts/gen_khronos_cts_bp.py instead. |
| """ |
| |
| CC_LIBRARY_KHRONOS_COMPILE_OPTION = """ |
| cc_defaults { |
| name: "khronosctscompilationflag_default", |
| cppflags: [ |
| "-fexceptions", |
| "-Wno-non-virtual-dtor", |
| "-Wno-delete-non-virtual-dtor", |
| "-Wno-implicit-int-conversion", |
| "-Wno-implicit-float-conversion", |
| "-Wno-unused-function", |
| "-Wno-enum-float-conversion", |
| "-Wno-missing-field-initializers", |
| "-Wno-switch", |
| "-Wno-unused-parameter", |
| "-Wno-unused-variable", |
| ], |
| |
| cpp_std: "c++17", |
| cflags: [ |
| // Amber defines. |
| "-DAMBER_CTS_VULKAN_HEADER=1", |
| "-DAMBER_ENABLE_CLSPV=0", |
| "-DAMBER_ENABLE_DXC=0", |
| "-DAMBER_ENABLE_LODEPNG=1", // This has no effect. |
| "-DAMBER_ENABLE_RTTI=1", |
| "-DAMBER_ENABLE_SHADERC=0", |
| "-DAMBER_ENABLE_SPIRV_TOOLS=0", |
| "-DAMBER_ENABLE_VK_DEBUGGING=0", |
| "-DAMBER_ENGINE_DAWN=0", |
| "-DAMBER_ENGINE_VULKAN=1", |
| |
| // glslang defines: |
| "-DENABLE_HLSL", |
| "-DENABLE_OPT=0", |
| "-DGLSLANG_OSINCLUDE_UNIX", |
| |
| // SPIRV-Tools defines: |
| "-DSPIRV_ANDROID", |
| "-DSPIRV_CHECK_CONTEXT", |
| "-DSPIRV_COLOR_TERMINAL", |
| "-DSPIRV_TIMER_ENABLED", |
| |
| // Android/Clang defines (not needed): |
| // -D_FORTIFY_SOURCE=2 |
| // -DANDROID |
| // -DNDEBUG |
| |
| // dEQP defines that we don't want/need: |
| // -DDE_DEBUG |
| // -DDEQP_USE_RELEASE_INFO_FILE |
| // -DPNG_DEBUG |
| |
| // dEQP defines that are worked out in deDefs.h, without needing |
| // explicit defs: |
| // -DDE_PTR_SIZE=8 |
| // -DDE_CPU=DE_CPU_ARM_64 |
| //"-DDE_FENV_ACCESS_ON=_Pragma(\"STDC FENV_ACCESS ON\")", |
| |
| // dEQP defines: |
| "-D_XOPEN_SOURCE=600", |
| "-DDE_ANDROID_API=28", |
| "-DDE_ASSERT_FAILURE_CALLBACK", |
| "-DDE_COMPILER=DE_COMPILER_CLANG", |
| "-DDE_MINGW=0", |
| "-DDE_OS=DE_OS_ANDROID", |
| "-DDEQP_GLES2_DIRECT_LINK=1", |
| "-DDEQP_HAVE_RENDERDOC_HEADER=0", // Needs to be 0. |
| "-DDEQP_EXCLUDE_VK_VIDEO_TESTS", |
| "-DDEQP_SUPPORT_DRM=0", |
| "-DDEQP_SUPPORT_GLES1=1", |
| "-DDEQP_TARGET_NAME=\\"Android\\"", |
| "-DQP_SUPPORT_PNG", |
| "-DCTS_USES_VULKAN", |
| |
| "-Wall", |
| "-Werror", |
| "-Wconversion", |
| |
| "-fwrapv", |
| |
| "-Wno-implicit-fallthrough", |
| "-Wno-sign-conversion", |
| "-Wno-unused-private-field", |
| "-Wno-shorten-64-to-32", |
| ], |
| |
| include_dirs: [ |
| "external/deqp-deps/SPIRV-Headers/include", |
| ], |
| |
| sdk_version: "current", |
| rtti: true, |
| stl: "c++_static", |
| } |
| """ |
| |
| CC_LIBRARY_STATIC_TEMPLATE = """ |
| |
| cc_library_static { |
| name: "{CC_STATIC_LIB_NAME}", |
| |
| defaults: ["khronosctscompilationflag_default"], |
| |
| srcs: [ |
| {SRC_FILES} ], |
| export_include_dirs: [ |
| {EXPORT_INCLUDES} ], |
| static_libs: [ |
| {STATIC_LIBS} ], |
| } |
| |
| """[1:-1] |
| |
| def matchesAny (filename, patterns): |
| for ptrn in patterns: |
| if fnmatch(filename, ptrn): |
| return True |
| return False |
| |
| def isSourceFile (filename, include_patterns, exclude_patterns): |
| return matchesAny(filename, include_patterns) and not matchesAny(filename, exclude_patterns) |
| |
| def toPortablePath (nativePath): |
| # os.path is so convenient... |
| head, tail = os.path.split(nativePath) |
| components = [tail] |
| |
| while head != None and head != '': |
| head, tail = os.path.split(head) |
| components.append(tail) |
| |
| components.reverse() |
| |
| portablePath = "" |
| for component in components: |
| portablePath = posixpath.join(portablePath, component) |
| |
| return portablePath |
| |
| def getSourceFiles (src_roots, include_patterns, exclude_patterns): |
| sources = [] |
| |
| for srcRoot in src_roots: |
| baseDir = os.path.join(DEQP_DIR, srcRoot) |
| for root, dirs, files in os.walk(baseDir): |
| for file in files: |
| absPath = os.path.join(root, file) |
| nativeRelPath = os.path.relpath(absPath, DEQP_DIR) |
| portablePath = toPortablePath(nativeRelPath) |
| |
| if isSourceFile(portablePath, include_patterns, exclude_patterns): |
| sources.append(portablePath) |
| |
| sources.sort() |
| |
| return sources |
| |
| def getSourceDirs (sourceFiles, extra_include_dirs): |
| seenDirs = set() |
| sourceDirs = [] |
| |
| for sourceFile in sourceFiles: |
| sourceDir = posixpath.dirname(sourceFile) |
| |
| if not sourceDir in seenDirs: |
| sourceDirs.append(sourceDir) |
| seenDirs.add(sourceDir) |
| |
| sourceDirs.extend(extra_include_dirs) |
| sourceDirs.sort() |
| |
| return sourceDirs |
| |
| def genBpStringList (items): |
| src = "" |
| |
| for item in items: |
| src += " \"%s\",\n" % item |
| |
| return src |
| |
| def genCCStaticLibrary (ccStaticLibName, sourceDirs, sourceFiles, staticLibs): |
| src = CC_LIBRARY_STATIC_TEMPLATE |
| src = src.replace("{EXPORT_INCLUDES}", genBpStringList(sourceDirs)) |
| src = src.replace("{SRC_FILES}", genBpStringList(sourceFiles)) |
| src = src.replace("{CC_STATIC_LIB_NAME}", ccStaticLibName) |
| src = src.replace("{STATIC_LIBS}", genBpStringList(staticLibs)) |
| |
| return src |
| |
| if __name__ == "__main__": |
| # Android bp content for compiling static lib libkhronoscts_common |
| libKhronosCTSCommonSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_COMMON_SRC_ROOTS, |
| LIB_KHRONOS_CTS_COMMON_INCLUDE_PATTERNS, |
| LIB_KHRONOS_CTS_COMMON_EXCLUDE_PATTERNS) |
| libKhronosCTSCommonSourceDirs = getSourceDirs(libKhronosCTSCommonSourceFiles, |
| LIB_KHRONOS_CTS_COMMON_EXTRA_INCLUDE_DIRS) |
| libKhronosCTSCommonStaticLibs = ["libpng_ndk"] |
| libKhronosCTSCommonAndroidBpText = genCCStaticLibrary("libkhronoscts_common", |
| libKhronosCTSCommonSourceDirs, |
| libKhronosCTSCommonSourceFiles, |
| libKhronosCTSCommonStaticLibs) |
| |
| # Android bp content for compiling static lib libkhronoscts_modules_gles |
| libKhronosCTSModulesSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_MODULES_SRC_ROOTS, |
| LIB_KHRONOS_CTS_MODULES_INCLUDE_PATTERNS, |
| LIB_KHRONOS_CTS_MODULES_EXCLUDE_PATTERNS) |
| libKhronosCTSModulesSourceDirs = getSourceDirs(libKhronosCTSModulesSourceFiles, |
| LIB_KHRONOS_CTS_MODULES_EXTRA_INCLUDE_DIRS) |
| libKhronosCTSModulesStaticLibs = ["libkhronoscts_common"] |
| libKhronosCTSModulesAndroidBpText = genCCStaticLibrary("libkhronoscts_modules_gles", |
| libKhronosCTSModulesSourceDirs, |
| libKhronosCTSModulesSourceFiles, |
| libKhronosCTSModulesStaticLibs) |
| |
| # Android bp content for compiling static lib libkhronoscts_openglcts |
| libKhronosCTSOpenGLCTSSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_OPENGLCTS_SRC_ROOTS, |
| LIB_KHRONOS_CTS_OPENGLCTS_INCLUDE_PATTERNS, |
| LIB_KHRONOS_CTS_OPENGLCTS_EXCLUDE_PATTERNS) |
| libKhronosCTSOpenGLCTSSourceDirs = getSourceDirs(libKhronosCTSOpenGLCTSSourceFiles, |
| LIB_KHRONOS_CTS_OPENGLCTS_EXTRA_INCLUDE_DIRS) |
| libKhronosCTSOpenGLCTSStaticLibs = ["libkhronoscts_common", |
| "libkhronoscts_modules_gles", |
| "deqp_glslang_SPIRV", |
| "deqp_spirv-tools"] |
| libKhronosCTSOpenGLCTSAndroidBpText = genCCStaticLibrary("libkhronoscts_openglcts", |
| libKhronosCTSOpenGLCTSSourceDirs, |
| libKhronosCTSOpenGLCTSSourceFiles, |
| libKhronosCTSOpenGLCTSStaticLibs) |
| |
| # Android bp content for compiling static lib libkhronoscts_vulkancts |
| libKhronosCTSVulkanCTSSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_VULKANCTS_SRC_ROOTS, |
| LIB_KHRONOS_CTS_VULKANCTS_INCLUDE_PATTERNS, |
| LIB_KHRONOS_CTS_VULKANCTS_EXCLUDE_PATTERNS) |
| libKhronosCTSVulkanCTSSourceDirs = getSourceDirs(libKhronosCTSVulkanCTSSourceFiles, |
| LIB_KHRONOS_CTS_VULKANCTS_EXTRA_INCLUDE_DIRS) |
| libKhronosCTSVulkanCTSStaticLibs = ["libkhronoscts_common", |
| "deqp_glslang_glslang", |
| "deqp_spirv-tools", |
| "deqp_amber"] |
| libKhronosCTSVulkanCTSAndroidBpText = genCCStaticLibrary("libkhronoscts_vulkancts", |
| libKhronosCTSVulkanCTSSourceDirs, |
| libKhronosCTSVulkanCTSSourceFiles, |
| libKhronosCTSVulkanCTSStaticLibs) |
| |
| # Android bp content for compiling libkhronoscts_platform |
| libKhronosCTSPlatformSourceFiles = getSourceFiles(LIB_KHRONOS_CTS_PLATFORM_SRC_ROOTS, |
| LIB_KHRONOS_CTS_PLATFORM_INCLUDE_PATTERNS, |
| LIB_KHRONOS_CTS_PLATFORM_EXCLUDE_PATTERNS) |
| libKhronosCTSPlatformSourceDirs = getSourceDirs(libKhronosCTSPlatformSourceFiles, |
| LIB_KHRONOS_CTS_PLATFORM_EXTRA_INCLUDE_DIRS) |
| libKhronosCTSPlatformStaticLibs = ["libkhronoscts_common", |
| "libkhronoscts_modules_gles", |
| "libkhronoscts_vulkancts", |
| "libkhronoscts_openglcts"] |
| libKhronosCTSPlatformAndroidBpText = genCCStaticLibrary("libkhronoscts_platform", |
| libKhronosCTSPlatformSourceDirs, |
| libKhronosCTSPlatformSourceFiles, |
| libKhronosCTSPlatformStaticLibs) |
| |
| # put everything together into the final Android bp content |
| libKhronosCTSAndroidBpText = "\n".join([AUTO_GEN_WARNING, |
| CC_LIBRARY_KHRONOS_COMPILE_OPTION, |
| libKhronosCTSCommonAndroidBpText, |
| libKhronosCTSModulesAndroidBpText, |
| libKhronosCTSOpenGLCTSAndroidBpText, |
| libKhronosCTSVulkanCTSAndroidBpText, |
| libKhronosCTSPlatformAndroidBpText]) |
| writeFile(os.path.join(DEQP_DIR, "AndroidKhronosCTSGen.bp"), libKhronosCTSAndroidBpText) |