#!/usr/bin/env python # Copyright (c) 2018 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """code generator for gpu workaround definitions""" import os import os.path import sys from optparse import OptionParser _LICENSE = """// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. """ _DO_NOT_EDIT_WARNING = ("// This file is auto-generated from " + os.path.basename(__file__) + "\n" + "// DO NOT EDIT!\n\n") def merge_files_into_workarounds(files): workarounds = set() for filename in files: with open(filename, 'r') as f: workarounds.update([workaround.strip() for workaround in f]) return sorted(list(workarounds)) def write_header(filename, workarounds): max_workaround_len = len(max(workarounds, key=len)) with open(filename, 'w') as f: f.write(_LICENSE) f.write(_DO_NOT_EDIT_WARNING) indent = ' ' macro = 'GPU_OP' # length of max string passed to write + 1 max_len = len(indent) + len(macro) + 1 + max_workaround_len + 1 + 1 write = lambda line: f.write(line + ' ' * (max_len - len(line)) + '\\\n') write('#define GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)') for w in workarounds: write(indent + macro + '(' + w.upper() + ',') write(indent + ' ' * (len(macro) + 1) + w + ')') # one extra line to put 'The End' comment. f.write('// The End\n') def main(argv): usage = "usage: %prog [options] file1 file2 file3 etc" parser = OptionParser(usage=usage) parser.add_option( "--output-file", dest="output_file", default="gpu_driver_bug_workaround_autogen.h", help="the name of the header file to write") (options, _) = parser.parse_args(args=argv) workarounds = merge_files_into_workarounds(parser.largs) write_header(options.output_file, workarounds) if __name__ == '__main__': sys.exit(main(sys.argv[1:]))