Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 1 | # Copyright (C) 2013 Google Inc. All rights reserved. |
| 2 | # |
| 3 | # Redistribution and use in source and binary forms, with or without |
| 4 | # modification, are permitted provided that the following conditions are |
| 5 | # met: |
| 6 | # |
| 7 | # * Redistributions of source code must retain the above copyright |
| 8 | # notice, this list of conditions and the following disclaimer. |
| 9 | # * Redistributions in binary form must reproduce the above |
| 10 | # copyright notice, this list of conditions and the following disclaimer |
| 11 | # in the documentation and/or other materials provided with the |
| 12 | # distribution. |
| 13 | # * Neither the name of Google Inc. nor the names of its |
| 14 | # contributors may be used to endorse or promote products derived from |
| 15 | # this software without specific prior written permission. |
| 16 | # |
| 17 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 18 | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 19 | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 20 | # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 21 | # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 22 | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 23 | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 24 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 25 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 26 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 27 | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 | |
| 29 | import os.path |
Torne (Richard Coles) | 93ac45c | 2013-05-29 14:40:20 +0100 | [diff] [blame] | 30 | import shlex |
Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 31 | import shutil |
Torne (Richard Coles) | 93ac45c | 2013-05-29 14:40:20 +0100 | [diff] [blame] | 32 | import optparse |
Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 33 | |
| 34 | from in_file import InFile |
| 35 | |
| 36 | |
| 37 | class Writer(object): |
| 38 | # Subclasses should override. |
| 39 | class_name = None |
| 40 | defaults = None |
Torne (Richard Coles) | 81a5157 | 2013-05-13 16:52:28 +0100 | [diff] [blame] | 41 | valid_values = None |
Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 42 | default_parameters = None |
| 43 | |
Torne (Richard Coles) | 93ac45c | 2013-05-29 14:40:20 +0100 | [diff] [blame] | 44 | def __init__(self, in_files, enabled_conditions): |
| 45 | if isinstance(in_files, basestring): |
| 46 | in_files = [in_files] |
| 47 | self.in_file = InFile.load_from_files(in_files, self.defaults, self.valid_values, self.default_parameters) |
| 48 | self._enabled_conditions = enabled_conditions |
Torne (Richard Coles) | 5267f70 | 2013-06-11 10:57:24 +0100 | [diff] [blame] | 49 | self._outputs = {} # file_name -> generator |
Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 50 | |
| 51 | def wrap_with_condition(self, string, condition): |
| 52 | if not condition: |
| 53 | return string |
| 54 | return "#if ENABLE(%(condition)s)\n%(string)s\n#endif" % { 'condition' : condition, 'string' : string } |
| 55 | |
| 56 | def _forcibly_create_text_file_at_path_with_contents(self, file_path, contents): |
| 57 | # FIXME: This method can be made less force-full anytime after 6/1/2013. |
| 58 | # A gyp error was briefly checked into the tree, causing |
| 59 | # a directory to have been generated in place of one of |
| 60 | # our output files. Clean up after that error so that |
| 61 | # all users don't need to clobber their output directories. |
| 62 | shutil.rmtree(file_path, ignore_errors=True) |
| 63 | # The build system should ensure our output directory exists, but just in case. |
| 64 | directory = os.path.dirname(file_path) |
| 65 | if not os.path.exists(directory): |
| 66 | os.makedirs(directory) |
| 67 | |
| 68 | with open(file_path, "w") as file_to_write: |
| 69 | file_to_write.write(contents) |
| 70 | |
Torne (Richard Coles) | 5267f70 | 2013-06-11 10:57:24 +0100 | [diff] [blame] | 71 | def _write_file(self, output_dir, contents, file_name): |
Torne (Richard Coles) | 81a5157 | 2013-05-13 16:52:28 +0100 | [diff] [blame] | 72 | path = os.path.join(output_dir, file_name) |
Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 73 | self._forcibly_create_text_file_at_path_with_contents(path, contents) |
| 74 | |
Torne (Richard Coles) | 5267f70 | 2013-06-11 10:57:24 +0100 | [diff] [blame] | 75 | def write_files(self, output_dir): |
| 76 | for file_name, generator in self._outputs.items(): |
| 77 | self._write_file(output_dir, generator(), file_name) |
Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 78 | |
| 79 | |
| 80 | class Maker(object): |
| 81 | def __init__(self, writer_class): |
| 82 | self._writer_class = writer_class |
| 83 | |
Torne (Richard Coles) | 93ac45c | 2013-05-29 14:40:20 +0100 | [diff] [blame] | 84 | def _enabled_conditions_from_defines(self, defines_arg_string): |
| 85 | if not defines_arg_string: |
| 86 | return [] |
| 87 | |
| 88 | defines_strings = shlex.split(defines_arg_string) |
| 89 | |
| 90 | # We only care about feature defines. |
| 91 | enable_prefix = 'ENABLE_' |
| 92 | |
| 93 | enabled_conditions = [] |
| 94 | for define_string in defines_strings: |
| 95 | split_define = define_string.split('=') |
| 96 | if split_define[1] != '1': |
| 97 | continue |
| 98 | define = split_define[0] |
| 99 | if not define.startswith(enable_prefix): |
| 100 | continue |
| 101 | enabled_conditions.append(define[len(enable_prefix):]) |
| 102 | return enabled_conditions |
| 103 | |
Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 104 | def main(self, argv): |
| 105 | script_name = os.path.basename(argv[0]) |
| 106 | args = argv[1:] |
| 107 | if len(args) < 1: |
Torne (Richard Coles) | 93ac45c | 2013-05-29 14:40:20 +0100 | [diff] [blame] | 108 | print "USAGE: %i INPUT_FILES" % script_name |
Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 109 | exit(1) |
Torne (Richard Coles) | 53e740f | 2013-05-09 18:38:43 +0100 | [diff] [blame] | 110 | |
Torne (Richard Coles) | 93ac45c | 2013-05-29 14:40:20 +0100 | [diff] [blame] | 111 | parser = optparse.OptionParser() |
| 112 | parser.add_option("--defines") |
| 113 | parser.add_option("--output_dir", default=os.getcwd()) |
| 114 | (options, args) = parser.parse_args() |
| 115 | |
| 116 | enabled_conditions = self._enabled_conditions_from_defines(options.defines) |
| 117 | |
| 118 | writer = self._writer_class(args, enabled_conditions) |
Torne (Richard Coles) | 5267f70 | 2013-06-11 10:57:24 +0100 | [diff] [blame] | 119 | writer.write_files(options.output_dir) |