141 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- Python -*-
 | |
| # Copyright 2008 Google Inc. All Rights Reserved.
 | |
| #
 | |
| # Redistribution and use in source and binary forms, with or without
 | |
| # modification, are permitted provided that the following conditions are
 | |
| # met:
 | |
| #
 | |
| #     * Redistributions of source code must retain the above copyright
 | |
| # notice, this list of conditions and the following disclaimer.
 | |
| #     * Redistributions in binary form must reproduce the above
 | |
| # copyright notice, this list of conditions and the following disclaimer
 | |
| # in the documentation and/or other materials provided with the
 | |
| # distribution.
 | |
| #     * Neither the name of Google Inc. nor the names of its
 | |
| # contributors may be used to endorse or promote products derived from
 | |
| # this software without specific prior written permission.
 | |
| #
 | |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
| #
 | |
| # Author: vladl@google.com (Vlad Losev)
 | |
| #
 | |
| # Shared SCons utilities for building Google Test's own tests.
 | |
| #
 | |
| 
 | |
| EnsurePythonVersion(2, 3)
 | |
| 
 | |
| 
 | |
| class EnvCreator:
 | |
|   """Creates new customized environments from a base one."""
 | |
| 
 | |
|   def _Remove(cls, env, attribute, value):
 | |
|     """Removes the given attribute value from the environment."""
 | |
| 
 | |
|     attribute_values = env[attribute]
 | |
|     if value in attribute_values:
 | |
|       attribute_values.remove(value)
 | |
|   _Remove = classmethod(_Remove)
 | |
| 
 | |
|   def Create(cls, base_env, modifier=None):
 | |
|     # User should NOT create more than one environment with the same
 | |
|     # modifier (including None).
 | |
|     env = base_env.Clone()
 | |
|     if modifier:
 | |
|       modifier(env)
 | |
|     return env;
 | |
|   Create = classmethod(Create)
 | |
| 
 | |
|   # Each of the following methods modifies the environment for a particular
 | |
|   # purpose and can be used by clients for creating new environments.  Each
 | |
|   # one needs to set the OBJ_SUFFIX variable to a unique suffix to
 | |
|   # differentiate targets built with that environment.  Otherwise, SCons may
 | |
|   # complain about same target built with different settings.
 | |
| 
 | |
|   def UseOwnTuple(cls, env):
 | |
|     """Instructs Google Test to use its internal implementation of tuple."""
 | |
| 
 | |
|     env['OBJ_SUFFIX'] = '_use_own_tuple'
 | |
|     env.Append(CPPDEFINES = 'GTEST_USE_OWN_TR1_TUPLE=1')
 | |
|   UseOwnTuple = classmethod(UseOwnTuple)
 | |
| 
 | |
|   def WarningOk(cls, env):
 | |
|     """Does not treat warnings as errors.
 | |
| 
 | |
|     Necessary for compiling gtest_unittest.cc, which triggers a gcc
 | |
|     warning when testing EXPECT_EQ(NULL, ptr)."""
 | |
| 
 | |
|     env['OBJ_SUFFIX'] = '_warning_ok'
 | |
|     if env['PLATFORM'] == 'win32':
 | |
|       cls._Remove(env, 'CCFLAGS', '-WX')
 | |
|     else:
 | |
|       cls._Remove(env, 'CCFLAGS', '-Werror')
 | |
|   WarningOk = classmethod(WarningOk)
 | |
| 
 | |
|   def WithExceptions(cls, env):
 | |
|     """Re-enables exceptions."""
 | |
| 
 | |
|     env['OBJ_SUFFIX'] = '_ex'
 | |
|     if env['PLATFORM'] == 'win32':
 | |
|       env.Append(CCFLAGS=['/EHsc'])
 | |
|       env.Append(CPPDEFINES='_HAS_EXCEPTIONS=1')
 | |
|       # Undoes the _TYPEINFO_ hack, which is unnecessary and only creates
 | |
|       # trouble when exceptions are enabled.
 | |
|       cls._Remove(env, 'CPPDEFINES', '_TYPEINFO_')
 | |
|       cls._Remove(env, 'CPPDEFINES', '_HAS_EXCEPTIONS=0')
 | |
|     else:
 | |
|       env.Append(CCFLAGS='-fexceptions')
 | |
|       cls._Remove(env, 'CCFLAGS', '-fno-exceptions')
 | |
|   WithExceptions = classmethod(WithExceptions)
 | |
| 
 | |
|   def LessOptimized(cls, env):
 | |
|     """Disables certain optimizations on Windows.
 | |
| 
 | |
|     We need to disable some optimization flags for some tests on
 | |
|     Windows; otherwise the redirection of stdout does not work
 | |
|     (apparently because of a compiler bug)."""
 | |
| 
 | |
|     env['OBJ_SUFFIX'] = '_less_optimized'
 | |
|     if env['PLATFORM'] == 'win32':
 | |
|       for flag in ['/O1', '/Os', '/Og', '/Oy']:
 | |
|         cls._Remove(env, 'LINKFLAGS', flag)
 | |
|   LessOptimized = classmethod(LessOptimized)
 | |
| 
 | |
|   def WithThreads(cls, env):
 | |
|     """Allows use of threads.
 | |
| 
 | |
|     Currently only enables pthreads under GCC."""
 | |
| 
 | |
|     env['OBJ_SUFFIX'] = '_with_threads'
 | |
|     if env['PLATFORM'] != 'win32':
 | |
|       # Assuming POSIX-like environment with GCC.
 | |
|       # TODO(vladl@google.com): sniff presence of pthread_atfork instead of
 | |
|       # selecting on a platform.
 | |
|       env.Append(CCFLAGS=['-pthread'])
 | |
|       env.Append(LINKFLAGS=['-pthread'])
 | |
|   WithThreads = classmethod(WithThreads)
 | |
| 
 | |
|   def NoRtti(cls, env):
 | |
|     """Disables RTTI support."""
 | |
| 
 | |
|     env['OBJ_SUFFIX'] = '_no_rtti'
 | |
|     if env['PLATFORM'] == 'win32':
 | |
|       env.Append(CCFLAGS=['/GR-'])
 | |
|     else:
 | |
|       env.Append(CCFLAGS=['-fno-rtti'])
 | |
|       env.Append(CPPDEFINES='GTEST_HAS_RTTI=0')
 | |
|   NoRtti = classmethod(NoRtti)
 | |
| 
 | |
| 
 | |
| sconscript_exports = {'EnvCreator': EnvCreator}
 | |
| Return('sconscript_exports')
 |