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