Path: blob/main_old/scripts/gen_vk_gl_cts_build.py
1693 views
#!/usr/bin/python21# Copyright 2019 The ANGLE Project Authors. All rights reserved.2# Use of this source code is governed by a BSD-style license that can be3# found in the LICENSE file.4#5# Code generation for:6# - src/tests/deqp_support/BUILD.gn7# - src/tests/deqp_data.gni8# NOTE: don't run this script directly. Run scripts/run_code_generation.py.910import errno11import os12import sys13import shutil141516def initDataDirectories(dataDirectories):17dataDirectories.append(os.path.join("data", "gles2"))18dataDirectories.append(os.path.join("data", "gles3"))19dataDirectories.append(os.path.join("data", "gles31"))20dataDirectories.append(os.path.join("external", "graphicsfuzz", "data", "gles3"))21dataDirectories.append(os.path.join("external", "openglcts", "data", "gles3"))222324def initPathReplacements(pathReplacements):25# The GraphicsFuzz data files need the 'external/graphicsfuzz/' prefix removed26pathToReplace = os.path.join("external", "graphicsfuzz", "") # Include trailing slash27pathReplacements[pathToReplace] = ""28# The KHR dEQP tests expect a root prefix of "gl_cts" for some reason.29pathToReplace = os.path.join("external", "openglcts", "") # Include trailing slash30pathReplacements[pathToReplace] = os.path.join("data", "gl_cts", "")313233def createBuildGnFile(buildGnPath):34# Cleanup the old file35if os.path.exists(buildGnPath):36os.remove(buildGnPath)37# Make the new one38return open(buildGnPath, "w+")394041def createGniFile(gniFilename):42# Cleanup the old file43if os.path.exists(gniFilename):44os.remove(gniFilename)45# Make the new one46return open(gniFilename, "w+")474849def writeFileHeader(fileIn):50templateFileHeader = """# GENERATED FILE - DO NOT EDIT.51# Generated by: {script_name}52#53# Copyright 2019 The ANGLE Project Authors. All rights reserved.54# Use of this source code is governed by a BSD-style license that can be55# found in the LICENSE file.5657"""5859fileHeader = templateFileHeader.format(script_name=os.path.basename(__file__))60fileIn.write(fileHeader)616263def fixDestinationDirectory(pathReplacements, relativeDirectory):64for pathReplacement in pathReplacements:65if pathReplacement in relativeDirectory:66return relativeDirectory.replace(pathReplacement, pathReplacements[pathReplacement])67return relativeDirectory686970def convertPathToVarName(path):71return path.replace(os.sep, "_")727374def getCMakeLists(deqpSrcDir):75cmakeLists = []76for root, directories, filenames in os.walk(deqpSrcDir):77for filename in filenames:78relativeDirectory = os.path.relpath(root, deqpSrcDir)79if filename == "CMakeLists.txt":80cmakeLists.append(os.path.join(relativeDirectory, filename))81return cmakeLists828384def main():85# List of directories containing data files86dataDirectories = []87# List of directories to exclude from the copy88excludedDirectories = [89".git",90]91# List of files to exclude from the copy92excludedFilenames = [93"LICENSE",94]95# Dictionary of parts of paths that need to be replaced96# Key: Part of path to be replaced97# Value: What to replace it with98pathReplacements = {}99# List of unique relative directories for the copy() command outputs100relativeDirectories = []101# VK-GL-CTS source directory102deqpSourceDirectory = os.path.join("..", "third_party", "VK-GL-CTS", "src")103# Tests Directory104testsDirectory = os.path.join("..", "src", "tests")105# dEQP Support Directory106deqpSupportDirectory = "deqp_support"107# BUILD.gn file to write to108buildGnFilename = "BUILD.gn"109# Path to BUILD.gn110buildGnPath = os.path.join(testsDirectory, deqpSupportDirectory, buildGnFilename)111# dEQP data GNI File to write to112dataGniFilename = os.path.join(testsDirectory, deqpSupportDirectory, "deqp_data_autogen.gni")113114# run_code_generation.py parameters.115if len(sys.argv) > 1:116# All CMakeLists.txt in the dEQP source tree (at the time)117cmakeDirs = getCMakeLists(deqpSourceDirectory)118inputs = [os.path.join(deqpSourceDirectory, "%s" % dir) for dir in cmakeDirs]119outputs = [dataGniFilename, buildGnPath]120121if sys.argv[1] == 'inputs':122print(','.join(inputs))123elif sys.argv[1] == 'outputs':124print(','.join(outputs))125else:126print('Invalid script parameters')127return 1128return 0129130deqpSrcDir = os.path.abspath(os.path.join(sys.path[0], deqpSourceDirectory))131132initDataDirectories(dataDirectories)133initPathReplacements(pathReplacements)134135dataFiles = []136for dataDir in dataDirectories:137dataPath = os.path.join(deqpSrcDir, dataDir)138for root, directories, filenames in os.walk(dataPath):139for filename in filenames:140relativeDirectory = os.path.relpath(root, deqpSrcDir)141# Skip any excluded directories142if any(directory in relativeDirectory for directory in excludedDirectories):143continue144# Skip any excluded files145if any(excludedFilename in filename for excludedFilename in excludedFilenames):146continue147# Record the relative directories and full paths to each data file148if relativeDirectory not in relativeDirectories:149relativeDirectories.append(relativeDirectory)150dataFiles.append(os.path.join(relativeDirectory, filename))151152dataFiles.sort()153relativeDirectories.sort(key=convertPathToVarName)154155#156# BUILD.gn157#158buildGnFile = createBuildGnFile(buildGnPath)159writeFileHeader(buildGnFile)160# Definitions161buildGnFile.write("deqp_path = \"../../../third_party/VK-GL-CTS/src\"\n")162# Create the copy() commands163templateFilesToCopy = """ "$deqp_path/{dataFile}",164"""165templateCopyCommand = """166copy("vk_gl_cts_data_{relDir}") {{167sources = [168{filesToCopy}169]170outputs = [ "$root_gen_dir/vk_gl_cts_data/{destDir}/{{{{source_file_part}}}}" ]171}}172"""173for relativeDirectory in relativeDirectories:174filesToCopy = ""175for dataFile in dataFiles:176path, filename = os.path.split(dataFile)177if relativeDirectory == path:178filesToCopy += templateFilesToCopy.format(dataFile=dataFile.replace(os.sep, '/'))179copyCommand = ""180destDir = fixDestinationDirectory(pathReplacements, relativeDirectory)181copyCommand += templateCopyCommand.format(182relDir=convertPathToVarName(relativeDirectory),183filesToCopy=filesToCopy,184destDir=destDir.replace(os.sep, '/'))185buildGnFile.write(copyCommand)186187#188# .gni189#190gniFile = createGniFile(dataGniFilename)191writeFileHeader(gniFile)192# Imports193templateImports = """import("deqp.gni")194"""195gniFile.write(templateImports)196# Write the lists of data file dependencies197templateDataFiles = """ "$root_gen_dir/vk_gl_cts_data/{dataFile}",198"""199templateDataFileDeps = """200{dataDepName} = [201{files}]202"""203for dataDirectory in dataDirectories:204files = ""205for dataFile in dataFiles:206if dataDirectory + os.sep in dataFile:207files += templateDataFiles.format(208dataFile=fixDestinationDirectory(pathReplacements, dataFile).replace(209os.sep, '/'))210dataDepName = "angle_deqp_" + convertPathToVarName(dataDirectory)211fileDeps = templateDataFileDeps.format(dataDepName=dataDepName, files=files)212gniFile.write(fileDeps)213214templateCopyTarget = """ "{deqpSupportDirectory}:vk_gl_cts_data_{relDir}",215"""216templateCopyTargets = """217angle_deqp_data_copy_targets = [218{targets}]219"""220targets = ""221for relativeDirectory in relativeDirectories:222targets += templateCopyTarget.format(223deqpSupportDirectory=deqpSupportDirectory,224relDir=convertPathToVarName(relativeDirectory))225gniFile.write(templateCopyTargets.format(targets=targets))226227228if __name__ == '__main__':229sys.exit(main())230231232