123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- #!/usr/bin/env python
- # Copyright 2014 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 PlatformObject<> constructor list.
- This script takes as arguments a list of platform names as a text file and
- a list of types and generates a C++ source file containing a list of
- the constructors for that object in platform order.
- Example Output: ./ui/ozone/generate_constructor_list.py \
- --platform test \
- --platform dri \
- --export OZONE \
- --namespace ui \
- --typename OzonePlatform \
- --include '"ui/ozone/ozone_platform.h"'
- // DO NOT MODIFY. GENERATED BY generate_constructor_list.py
- #include "ui/ozone/platform_object_internal.h"
- #include "ui/ozone/ozone_platform.h"
- namespace ui {
- OzonePlatform* CreateOzonePlatformTest();
- OzonePlatform* CreateOzonePlatformDri();
- } // namespace ui
- namespace ui {
- typedef ui::OzonePlatform* (*OzonePlatformConstructor)();
- template <> const OzonePlatformConstructor
- PlatformConstructorList<ui::OzonePlatform>::kConstructors[] = {
- &ui::CreateOzonePlatformTest,
- &ui::CreateOzonePlatformDri,
- };
- template class COMPONENT_EXPORT(OZONE) PlatformObject<ui::OzonePlatform>;
- } // namespace ui
- """
- try:
- from StringIO import StringIO # for Python 2
- except ImportError:
- from io import StringIO # for Python 3
- import optparse
- import os
- import collections
- import re
- import sys
- def GetTypedefName(typename):
- """Determine typedef name of constructor for typename.
- This is just typename + "Constructor".
- """
- return typename + 'Constructor'
- def GetConstructorName(typename, platform):
- """Determine name of static constructor function from platform name.
- This is just "Create" + typename + platform.
- """
- return 'Create' + typename + platform.capitalize()
- def GenerateConstructorList(out, namespace, export, typenames, platforms,
- includes, usings):
- """Generate static array containing a list of constructors."""
- out.write('// DO NOT MODIFY. GENERATED BY generate_constructor_list.py\n')
- out.write('\n')
- out.write('#include "ui/ozone/platform_object_internal.h"\n')
- out.write('\n')
- for include in includes:
- out.write('#include %(include)s\n' % {'include': include})
- out.write('\n')
- for using in usings:
- out.write('using %(using)s;\n' % {'using': using})
- out.write('\n')
- out.write('namespace %(namespace)s {\n' % {'namespace': namespace})
- out.write('\n')
- # Declarations of constructor functions.
- for typename in typenames:
- for platform in platforms:
- constructor = GetConstructorName(typename, platform)
- out.write('%(typename)s* %(constructor)s();\n'
- % {'typename': typename,
- 'constructor': constructor})
- out.write('\n')
- out.write('} // namespace %(namespace)s\n' % {'namespace': namespace})
- out.write('\n')
- out.write('namespace ui {\n')
- out.write('\n')
- # Handy typedefs for constructor types.
- for typename in typenames:
- out.write('typedef %(typename)s* (*%(typedef)s)();\n'
- % {'typename': typename,
- 'typedef': GetTypedefName(typename)})
- out.write('\n')
- # The actual constructor lists.
- for typename in typenames:
- out.write('template <> const %(typedef)s\n'
- % {'typedef': GetTypedefName(typename)})
- out.write('PlatformConstructorList<%(typename)s>::kConstructors[] = {\n'
- % {'typename': typename})
- for platform in platforms:
- constructor = GetConstructorName(typename, platform)
- out.write(' &%(namespace)s::%(constructor)s,\n'
- % {'namespace': namespace, 'constructor': constructor})
- out.write('};\n')
- out.write('\n')
- # Exported template instantiation.
- for typename in typenames:
- out.write('template class COMPONENT_EXPORT(%(export)s)' \
- ' PlatformObject<%(typename)s>;\n'
- % {'export': export, 'typename': typename})
- out.write('\n')
- out.write('} // namespace ui\n')
- out.write('\n')
- def main(argv):
- parser = optparse.OptionParser()
- parser.add_option('--namespace', default='ozone')
- parser.add_option('--export', default='OZONE')
- parser.add_option('--platform_list')
- parser.add_option('--output_cc')
- parser.add_option('--include', action='append', default=[])
- parser.add_option('--platform', action='append', default=[])
- parser.add_option('--typename', action='append', default=[])
- parser.add_option('--using', action='append', default=[])
- options, _ = parser.parse_args(argv)
- platforms = list(options.platform)
- typenames = list(options.typename)
- includes = list(options.include)
- usings = list(options.using)
- if options.platform_list:
- platforms = open(options.platform_list, 'r').read().strip().split('\n')
- if not platforms:
- sys.stderr.write('No platforms are selected!')
- sys.exit(1)
- # Write to standard output or file specified by --output_cc.
- out_cc = getattr(sys.stdout, 'buffer', sys.stdout)
- if options.output_cc:
- out_cc = open(options.output_cc, 'wb')
- out_cc_str = StringIO()
- GenerateConstructorList(out_cc_str, options.namespace, options.export,
- typenames, platforms, includes, usings)
- out_cc.write(out_cc_str.getvalue().encode('utf-8'))
- if options.output_cc:
- out_cc.close()
- return 0
- if __name__ == '__main__':
- sys.exit(main(sys.argv[1:]))
|