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