1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#!/usr/bin/env python
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# Copyright 2009, Google Inc.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# All rights reserved.
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# Redistribution and use in source and binary forms, with or without
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# modification, are permitted provided that the following conditions are
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# met:
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#     * Redistributions of source code must retain the above copyright
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# notice, this list of conditions and the following disclaimer.
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#     * Redistributions in binary form must reproduce the above
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# copyright notice, this list of conditions and the following disclaimer
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# in the documentation and/or other materials provided with the
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# distribution.
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#     * Neither the name of Google Inc. nor the names of its
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# contributors may be used to endorse or promote products derived from
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# this software without specific prior written permission.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch"""fuse_gtest_files.py v0.2.0
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFuses Google Test source code into a .h file and a .cc file.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSYNOPSIS
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       fuse_gtest_files.py [GTEST_ROOT_DIR] OUTPUT_DIR
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       Scans GTEST_ROOT_DIR for Google Test source code, and generates
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       two files: OUTPUT_DIR/gtest/gtest.h and OUTPUT_DIR/gtest/gtest-all.cc.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       Then you can build your tests by adding OUTPUT_DIR to the include
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       search path and linking with OUTPUT_DIR/gtest/gtest-all.cc.  These
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       two files contain everything you need to use Google Test.  Hence
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       you can "install" Google Test by copying them to wherever you want.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       GTEST_ROOT_DIR can be omitted and defaults to the parent
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       directory of the directory holding this script.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochEXAMPLES
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ./fuse_gtest_files.py fused_gtest
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ./fuse_gtest_files.py path/to/unpacked/gtest fused_gtest
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochThis tool is experimental.  In particular, it assumes that there is no
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconditional inclusion of Google Test headers.  Please report any
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochproblems to googletestframework@googlegroups.com.  You can read
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochhttp://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide for
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochmore information.
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch"""
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch__author__ = 'wan@google.com (Zhanyong Wan)'
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochimport os
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochimport re
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochimport sets
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochimport sys
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# We assume that this file is in the scripts/ directory in the Google
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# Test root directory.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDEFAULT_GTEST_ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick# Regex for matching '#include "gtest/..."'.
71731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickINCLUDE_GTEST_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(gtest/.+)"')
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# Regex for matching '#include "src/..."'.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochINCLUDE_SRC_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(src/.+)"')
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# Where to find the source seed files.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGTEST_H_SEED = 'include/gtest/gtest.h'
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGTEST_SPI_H_SEED = 'include/gtest/gtest-spi.h'
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGTEST_ALL_CC_SEED = 'src/gtest-all.cc'
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch# Where to put the generated files.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGTEST_H_OUTPUT = 'gtest/gtest.h'
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGTEST_ALL_CC_OUTPUT = 'gtest/gtest-all.cc'
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochdef VerifyFileExists(directory, relative_path):
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """Verifies that the given file exists; aborts on failure.
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  relative_path is the file path relative to the given directory.
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if not os.path.isfile(os.path.join(directory, relative_path)):
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    print 'ERROR: Cannot find %s in directory %s.' % (relative_path,
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                      directory)
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    print ('Please either specify a valid project root directory '
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           'or omit it on the command line.')
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    sys.exit(1)
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochdef ValidateGTestRootDir(gtest_root):
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """Makes sure gtest_root points to a valid gtest root directory.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  The function aborts the program on failure.
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  VerifyFileExists(gtest_root, GTEST_H_SEED)
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  VerifyFileExists(gtest_root, GTEST_ALL_CC_SEED)
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochdef VerifyOutputFile(output_dir, relative_path):
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """Verifies that the given output file path is valid.
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  relative_path is relative to the output_dir directory.
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  # Makes sure the output file either doesn't exist or can be overwritten.
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  output_file = os.path.join(output_dir, relative_path)
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if os.path.exists(output_file):
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    # TODO(wan@google.com): The following user-interaction doesn't
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    # work with automated processes.  We should provide a way for the
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    # Makefile to force overwriting the files.
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    print ('%s already exists in directory %s - overwrite it? (y/N) ' %
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           (relative_path, output_dir))
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    answer = sys.stdin.readline().strip()
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if answer not in ['y', 'Y']:
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      print 'ABORTED.'
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      sys.exit(1)
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  # Makes sure the directory holding the output file exists; creates
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  # it and all its ancestors if necessary.
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  parent_directory = os.path.dirname(output_file)
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if not os.path.isdir(parent_directory):
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    os.makedirs(parent_directory)
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochdef ValidateOutputDir(output_dir):
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """Makes sure output_dir points to a valid output directory.
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  The function aborts the program on failure.
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  VerifyOutputFile(output_dir, GTEST_H_OUTPUT)
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  VerifyOutputFile(output_dir, GTEST_ALL_CC_OUTPUT)
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochdef FuseGTestH(gtest_root, output_dir):
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """Scans folder gtest_root to generate gtest/gtest.h in output_dir."""
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  output_file = file(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  processed_files = sets.Set()  # Holds all gtest headers we've processed.
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  def ProcessFile(gtest_header_path):
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    """Processes the given gtest header file."""
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    # We don't process the same header twice.
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if gtest_header_path in processed_files:
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    processed_files.add(gtest_header_path)
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    # Reads each line in the given gtest header.
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for line in file(os.path.join(gtest_root, gtest_header_path), 'r'):
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      m = INCLUDE_GTEST_FILE_REGEX.match(line)
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if m:
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        # It's '#include "gtest/..."' - let's process it recursively.
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ProcessFile('include/' + m.group(1))
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      else:
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        # Otherwise we copy the line unchanged to the output file.
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        output_file.write(line)
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ProcessFile(GTEST_H_SEED)
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  output_file.close()
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochdef FuseGTestAllCcToFile(gtest_root, output_file):
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """Scans folder gtest_root to generate gtest/gtest-all.cc in output_file."""
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  processed_files = sets.Set()
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  def ProcessFile(gtest_source_file):
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    """Processes the given gtest source file."""
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    # We don't process the same #included file twice.
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if gtest_source_file in processed_files:
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    processed_files.add(gtest_source_file)
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    # Reads each line in the given gtest source file.
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for line in file(os.path.join(gtest_root, gtest_source_file), 'r'):
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      m = INCLUDE_GTEST_FILE_REGEX.match(line)
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if m:
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if 'include/' + m.group(1) == GTEST_SPI_H_SEED:
194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          # It's '#include "gtest/gtest-spi.h"'.  This file is not
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          # #included by "gtest/gtest.h", so we need to process it.
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          ProcessFile(GTEST_SPI_H_SEED)
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        else:
198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          # It's '#include "gtest/foo.h"' where foo is not gtest-spi.
199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          # We treat it as '#include "gtest/gtest.h"', as all other
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          # gtest headers are being fused into gtest.h and cannot be
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          # #included directly.
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          # There is no need to #include "gtest/gtest.h" more than once.
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          if not GTEST_H_SEED in processed_files:
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            processed_files.add(GTEST_H_SEED)
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            output_file.write('#include "%s"\n' % (GTEST_H_OUTPUT,))
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      else:
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        m = INCLUDE_SRC_FILE_REGEX.match(line)
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if m:
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          # It's '#include "src/foo"' - let's process it recursively.
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          ProcessFile(m.group(1))
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        else:
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          output_file.write(line)
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ProcessFile(GTEST_ALL_CC_SEED)
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochdef FuseGTestAllCc(gtest_root, output_dir):
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir."""
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  output_file = file(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FuseGTestAllCcToFile(gtest_root, output_file)
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  output_file.close()
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochdef FuseGTest(gtest_root, output_dir):
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  """Fuses gtest.h and gtest-all.cc."""
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ValidateGTestRootDir(gtest_root)
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ValidateOutputDir(output_dir)
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FuseGTestH(gtest_root, output_dir)
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FuseGTestAllCc(gtest_root, output_dir)
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochdef main():
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  argc = len(sys.argv)
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if argc == 2:
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    # fuse_gtest_files.py OUTPUT_DIR
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FuseGTest(DEFAULT_GTEST_ROOT_DIR, sys.argv[1])
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  elif argc == 3:
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    # fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FuseGTest(sys.argv[1], sys.argv[2])
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  else:
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    print __doc__
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    sys.exit(1)
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochif __name__ == '__main__':
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  main()
251