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