10f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#!/usr/bin/env python 20f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved. 30f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 40f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)# found in the LICENSE file. 50f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 60f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)"""Code generator for Ozone platform list. 70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)This script takes as arguments a list of platform names and generates a C++ 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)source file containing a list of those platforms. 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)Each platform gets an integer identifier that is used to find objects for that 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)platform (particularly constructors for platform-specific objects). 130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)Example Output: ./generate_ozone_platform_list.py --default wayland dri wayland 150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // platform_list.txt 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) wayland 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dri 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // platform_list.h 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) #ifndef UI_OZONE_PLATFORM_LIST_H_ 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) #define UI_OZONE_PLATFORM_LIST_H_ 250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) namespace ui { 270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const int kPlatformWayland = 0; 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const int kPlatformDri = 1; 300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extern const char *kPlatformNames[kPlatformCount]; 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } // namespace ui 340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // platform_list.cc 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) #include "ui/ozone/platform_list.h" 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) namespace ui { 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const char *kPlatformNames[] = { 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "wayland", // kPlatformWayland 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "dri", // kPlatformDri 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } // namespace ui 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) #endif // UI_OZONE_PLATFORM_LIST_H_ 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)""" 510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import optparse 530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import os 540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import collections 550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import re 560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import sys 570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import string 580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)def GetConstantName(name): 610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) """Determine name of static constructor function from platform name. 620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) We just capitalize the platform name and prepend "CreateOzonePlatform". 640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) """ 650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return 'kPlatform' + string.capitalize(name) 670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)def GeneratePlatformListText(out, platforms): 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) """Generate text file with list of platform names, in platform id order.""" 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for platform in platforms: 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write(platform) 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('\n') 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('\n') 770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)def GeneratePlatformListHeader(out, platforms): 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) """Generate ids of ozone platforms & declaration of static names array.""" 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('// DO NOT MODIFY. GENERATED BY generate_ozone_platform_list.py\n') 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('\n') 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('#ifndef UI_OZONE_PLATFORM_LIST_H_\n') 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('#define UI_OZONE_PLATFORM_LIST_H_\n') 870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) out.write('\n') 880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) out.write('namespace ui {\n') 900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) out.write('\n') 910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) # Prototypes for platform initializers. 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for plat_id, plat_name in enumerate(platforms): 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('const int %s = %d;\n' % (GetConstantName(plat_name), plat_id)) 950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) out.write('\n') 960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) # Platform count. 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('const int kPlatformCount = %d;\n' % len(platforms)) 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('\n') 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) # Declaration for names list. 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('extern const char* kPlatformNames[kPlatformCount];\n') 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('\n') 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('} // namespace ui\n') 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('\n') 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('#endif // UI_OZONE_PLATFORM_LIST_H_\n') 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('\n') 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)def GeneratePlatformListSource(out, platforms): 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) """Generate static array containing a list of ozone platforms.""" 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('// DO NOT MODIFY. GENERATED BY generate_ozone_platform_list.py\n') 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('\n') 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('#include "ui/ozone/platform_list.h"\n') 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('\n') 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('namespace ui {\n') 1220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) out.write('\n') 1230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) # Definition of names list. 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('const char* kPlatformNames[] = {\n') 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) # Prototypes for platform initializers. 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for plat_name in platforms: 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write(' "%s", // %s\n' % (plat_name, GetConstantName(plat_name))) 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('};\n') 1310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) out.write('\n') 1320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) out.write('} // namespace ui\n') 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out.write('\n') 1350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)def main(argv): 1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) parser = optparse.OptionParser() 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) parser.add_option('--output_cc') 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) parser.add_option('--output_h') 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) parser.add_option('--output_txt') 1420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) parser.add_option('--default') 1430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) options, platforms = parser.parse_args(argv) 1440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) # Reorder the platforms when --default is specified. 1460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) # The default platform must appear first in the platform list. 1470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if options.default and options.default in platforms: 1480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) platforms.remove(options.default) 1490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) platforms.insert(0, options.default) 1500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) # Write to standard output or file specified by --output_{cc,h}. 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out_cc = sys.stdout 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out_h = sys.stdout 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out_txt = sys.stdout 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if options.output_cc: 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out_cc = open(options.output_cc, 'wb') 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if options.output_h: 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out_h = open(options.output_h, 'wb') 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if options.output_txt: 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out_txt = open(options.output_txt, 'wb') 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GeneratePlatformListText(out_txt, platforms) 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GeneratePlatformListHeader(out_h, platforms) 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GeneratePlatformListSource(out_cc, platforms) 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if options.output_cc: 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out_cc.close() 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if options.output_h: 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out_h.close() 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if options.output_txt: 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) out_txt.close() 1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return 0 1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)if __name__ == '__main__': 1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) sys.exit(main(sys.argv[1:])) 178