1 # Copyright (C) 2013 Google Inc. All rights reserved.
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are
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
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.
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.
34 from in_file
import InFile
38 # Subclasses should override.
42 default_parameters
= None
44 def __init__(self
, in_files
):
45 if isinstance(in_files
, basestring
):
48 self
.in_file
= InFile
.load_from_files(in_files
, self
.defaults
, self
.valid_values
, self
.default_parameters
)
51 self
._outputs
= {} # file_name -> generator
53 def wrap_with_condition(self
, string
, condition
):
56 return "#if ENABLE(%(condition)s)\n%(string)s\n#endif" % { 'condition' : condition
, 'string' : string
}
58 def _write_file_if_changed(self
, output_dir
, contents
, file_name
):
59 path
= os
.path
.join(output_dir
, file_name
)
61 # The build system should ensure our output directory exists, but just in case.
62 directory
= os
.path
.dirname(path
)
63 if not os
.path
.exists(directory
):
64 os
.makedirs(directory
)
66 # Only write the file if the contents have changed. This allows ninja to
67 # skip rebuilding targets which depend on the output.
68 with
open(path
, "a+") as output_file
:
70 if output_file
.read() != contents
:
71 output_file
.truncate(0)
72 output_file
.write(contents
)
74 def write_files(self
, output_dir
):
75 for file_name
, generator
in self
._outputs
.items():
76 self
._write
_file
_if
_changed
(output_dir
, generator(), file_name
)
78 def set_gperf_path(self
, gperf_path
):
79 self
.gperf_path
= gperf_path
83 def __init__(self
, writer_class
):
84 self
._writer
_class
= writer_class
87 script_name
= os
.path
.basename(argv
[0])
90 print "USAGE: %s INPUT_FILES" % script_name
93 parser
= optparse
.OptionParser()
94 parser
.add_option("--gperf", default
="gperf")
95 parser
.add_option("--output_dir", default
=os
.getcwd())
96 options
, args
= parser
.parse_args()
98 writer
= self
._writer
_class
(args
)
99 writer
.set_gperf_path(options
.gperf
)
100 writer
.write_files(options
.output_dir
)