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