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