# -*- 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.


"""Builds the Google Test (gtest) lib. This has been tested on Windows,
Linux, Mac OS X, and Cygwin.  The compilation settings from your project
will be used, with some specific flags required for gtest added.

You should be able to call this file from more or less any SConscript
file.

You can optionally set a variable on the construction environment to
have the unit test executables copied to your output directory.  The
variable should be env['EXE_OUTPUT'].

Another optional variable is env['LIB_OUTPUT'].  If set, the generated
libraries are copied to the folder indicated by the variable.

If you place the gtest sources within your own project's source
directory, you should be able to call this SConscript file simply as
follows:

# -- cut here --
# Build gtest library; first tell it where to copy executables.
env['EXE_OUTPUT'] = '#/mybuilddir/mybuildmode'  # example, optional
env['LIB_OUTPUT'] = '#/mybuilddir/mybuildmode/lib'
env.SConscript('whateverpath/gtest/scons/SConscript')
# -- cut here --

If on the other hand you place the gtest sources in a directory
outside of your project's source tree, you would use a snippet similar
to the following:

# -- cut here --

# The following assumes that $BUILD_DIR refers to the root of the
# directory for your current build mode, e.g. "#/mybuilddir/mybuildmode"

# Build gtest library; as it is outside of our source root, we need to
# tell SCons that the directory it will refer to as
# e.g. $BUILD_DIR/gtest is actually on disk in original form as
# ../../gtest (relative to your project root directory).  Recall that
# SCons by default copies all source files into the build directory
# before building.
gtest_dir = env.Dir('$BUILD_DIR/gtest')

# Modify this part to point to gtest relative to the current
# SConscript or SConstruct file's directory.  The ../.. path would
# be different per project, to locate the base directory for gtest.
gtest_dir.addRepository(env.Dir('../../gtest'))

# Tell the gtest SCons file where to copy executables.
env['EXE_OUTPUT'] = '$BUILD_DIR'  # example, optional

# Call the gtest SConscript to build gtest.lib and unit tests.  The
# location of the library should end up as
# '$BUILD_DIR/gtest/scons/gtest.lib'
env.SConscript(env.File('scons/SConscript', gtest_dir))

# -- cut here --
"""


__author__ = 'joi@google.com (Joi Sigurdsson)'


import os

############################################################
# Environments for building the targets, sorted by name.

Import('env')
env = env.Clone()

BUILD_TESTS = env.get('GTEST_BUILD_TESTS', False)
common_exports = SConscript('SConscript.common')
EnvCreator = common_exports['EnvCreator']

# Note: The relative paths in SConscript files are relative to the location
# of the SConscript file itself. To make a path relative to the location of
# the main SConstruct file, prepend the path with the # sign.
#
# But if a project uses variant builds without source duplication (see
# http://www.scons.org/wiki/VariantDir%28%29 for more information), the
# above rule gets muddied a bit. In that case the paths must be counted from
# the location of the copy of the SConscript file in
# scons/build/<config>/gtest/scons.
#
# Include paths to gtest headers are relative to either the gtest
# directory or the 'include' subdirectory of it, and this SConscript
# file is one directory deeper than the gtest directory.
env.Prepend(CPPPATH = ['..', '../include'])

env_use_own_tuple = EnvCreator.Create(env, EnvCreator.UseOwnTuple)
env_less_optimized = EnvCreator.Create(env, EnvCreator.LessOptimized)
env_with_threads = EnvCreator.Create(env, EnvCreator.WithThreads)
# The following environments are used to compile gtest_unittest.cc, which
# triggers a warning  in all but the most recent GCC versions when compiling
# the EXPECT_EQ(NULL, ptr) statement.
env_warning_ok = EnvCreator.Create(env, EnvCreator.WarningOk)
env_with_exceptions = EnvCreator.Create(env_warning_ok,
                                        EnvCreator.WithExceptions)
env_without_rtti = EnvCreator.Create(env_warning_ok, EnvCreator.NoRtti)

############################################################
# Helpers for creating build targets.

# Caches object file targets built by GtestObject to allow passing the
# same source file with the same environment twice into the function as a
# convenience.
_all_objects = {}


def GetObjSuffix(env):
  return env.get('OBJ_SUFFIX', '')

def GtestObject(build_env, source):
  """Returns a target to build an object file from the given .cc source file."""

  object_name = os.path.basename(source).rstrip('.cc') + GetObjSuffix(build_env)
  if object_name not in _all_objects:
    _all_objects[object_name] = build_env.Object(target=object_name,
                                                 source=source)
  return _all_objects[object_name]


def GtestStaticLibraries(build_env):
  """Builds static libraries for gtest and gtest_main in build_env.

  Args:
    build_env: An environment in which to build libraries.

  Returns:
    A pair (gtest library, gtest_main library) built in the given environment.
  """

  gtest_object = GtestObject(build_env, '../src/gtest-all.cc')
  gtest_main_object = GtestObject(build_env, '../src/gtest_main.cc')

  return (build_env.StaticLibrary(target='gtest' + GetObjSuffix(build_env),
                                  source=[gtest_object]),
          build_env.StaticLibrary(target='gtest_main' + GetObjSuffix(build_env),
                                  source=[gtest_object, gtest_main_object]))


def GtestBinary(build_env, target, gtest_libs, sources):
  """Creates a target to build a binary (either test or sample).

  Args:
    build_env:  The SCons construction environment to use to build.
    target:     The basename of the target's main source file, also used as the
                target name.
    gtest_libs: The gtest library or the list of libraries to link.
    sources:    A list of source files in the target.
  """
  srcs = []  # The object targets corresponding to sources.
  for src in sources:
    if type(src) is str:
      srcs.append(GtestObject(build_env, src))
    else:
      srcs.append(src)

  if not gtest_libs:
    gtest_libs = []
  elif type(gtest_libs) != type(list()):
    gtest_libs = [gtest_libs]
  binary = build_env.Program(target=target, source=srcs, LIBS=gtest_libs)
  if 'EXE_OUTPUT' in build_env.Dictionary():
    build_env.Install('$EXE_OUTPUT', source=[binary])


def GtestTest(build_env, target, gtest_libs, additional_sources=None):
  """Creates a target to build the given test.

  Args:
    build_env:  The SCons construction environment to use to build.
    target:     The basename of the target test .cc file.
    gtest_libs: The gtest library or the list of libraries to use.
    additional_sources: A list of additional source files in the target.
  """

  GtestBinary(build_env, target, gtest_libs,
              ['../test/%s.cc' % target] + (additional_sources or []))


def GtestSample(build_env, target, additional_sources=None):
  """Creates a target to build the given sample.

  Args:
    build_env:  The SCons construction environment to use to build.
    target:     The basename of the target sample .cc file.
    gtest_libs: The gtest library or the list of libraries to use.
    additional_sources: A list of additional source files in the target.
  """
  GtestBinary(build_env, target, gtest_main,
              ['../samples/%s.cc' % target] + (additional_sources or []))


############################################################
# Object and library targets.

# gtest.lib to be used by most apps (if you have your own main function).
# gtest_main.lib can be used if you just want a basic main function; it is also
# used by some tests for Google Test itself.
gtest, gtest_main = GtestStaticLibraries(env)
gtest_ex, gtest_main_ex = GtestStaticLibraries(env_with_exceptions)
gtest_no_rtti, gtest_main_no_rtti = GtestStaticLibraries(env_without_rtti)
gtest_use_own_tuple, gtest_main_use_own_tuple = GtestStaticLibraries(
      env_use_own_tuple)

# Install the libraries if needed.
if 'LIB_OUTPUT' in env.Dictionary():
  env.Install('$LIB_OUTPUT', source=[gtest, gtest_main])

if BUILD_TESTS:
  ############################################################
  # Test targets using the standard environment.
  GtestTest(env, 'gtest-filepath_test', gtest_main)
  GtestTest(env, 'gtest-message_test', gtest_main)
  GtestTest(env, 'gtest-options_test', gtest_main)
  GtestTest(env, 'gtest_environment_test', gtest)
  GtestTest(env, 'gtest_main_unittest', gtest_main)
  GtestTest(env, 'gtest_no_test_unittest', gtest)
  GtestTest(env, 'gtest_pred_impl_unittest', gtest_main)
  GtestTest(env, 'gtest_prod_test', gtest_main,
            additional_sources=['../test/production.cc'])
  GtestTest(env, 'gtest_repeat_test', gtest)
  GtestTest(env, 'gtest_sole_header_test', gtest_main)
  GtestTest(env, 'gtest-test-part_test', gtest_main)
  GtestTest(env, 'gtest-typed-test_test', gtest_main,
            additional_sources=['../test/gtest-typed-test2_test.cc'])
  GtestTest(env, 'gtest-param-test_test', gtest,
            additional_sources=['../test/gtest-param-test2_test.cc'])
  GtestTest(env, 'gtest_color_test_', gtest)
  GtestTest(env, 'gtest-linked_ptr_test', gtest_main)
  GtestTest(env, 'gtest-port_test', gtest_main)
  GtestTest(env, 'gtest_break_on_failure_unittest_', gtest)
  GtestTest(env, 'gtest_filter_unittest_', gtest)
  GtestTest(env, 'gtest_help_test_', gtest_main)
  GtestTest(env, 'gtest_list_tests_unittest_', gtest)
  GtestTest(env, 'gtest_throw_on_failure_test_', gtest)
  GtestTest(env, 'gtest_xml_outfile1_test_', gtest_main)
  GtestTest(env, 'gtest_xml_outfile2_test_', gtest_main)
  GtestTest(env, 'gtest_xml_output_unittest_', gtest)
  GtestTest(env, 'gtest-unittest-api_test', gtest)
  GtestTest(env, 'gtest-listener_test', gtest)
  GtestTest(env, 'gtest_shuffle_test_', gtest)

  ############################################################
  # Tests targets using custom environments.
  GtestTest(env_warning_ok, 'gtest_unittest', gtest_main)
  GtestTest(env_with_exceptions, 'gtest_output_test_', gtest_ex)
  GtestTest(env_with_exceptions, 'gtest_throw_on_failure_ex_test', gtest_ex)
  GtestTest(env_with_threads, 'gtest-death-test_test', gtest_main)
  GtestTest(env_with_threads, 'gtest_stress_test', gtest)
  GtestTest(env_less_optimized, 'gtest_env_var_test_', gtest)
  GtestTest(env_less_optimized, 'gtest_uninitialized_test_', gtest)
  GtestTest(env_use_own_tuple, 'gtest-tuple_test', gtest_main_use_own_tuple)
  GtestBinary(env_use_own_tuple,
              'gtest_use_own_tuple_test',
              gtest_main_use_own_tuple,
              ['../test/gtest-param-test_test.cc',
               '../test/gtest-param-test2_test.cc'])
  GtestBinary(env_with_exceptions, 'gtest_ex_unittest', gtest_main_ex,
              ['../test/gtest_unittest.cc'])
  GtestBinary(env_without_rtti, 'gtest_no_rtti_test', gtest_main_no_rtti,
              ['../test/gtest_unittest.cc'])

############################################################
# Sample targets.

# Use the GTEST_BUILD_SAMPLES build variable to control building of samples.
# In your SConstruct file, add
#   vars = Variables()
#   vars.Add(BoolVariable('GTEST_BUILD_SAMPLES', 'Build samples', False))
#   my_environment = Environment(variables = vars, ...)
# Then, in the command line use GTEST_BUILD_SAMPLES=true to enable them.
if env.get('GTEST_BUILD_SAMPLES', False):
  GtestSample(env, 'sample1_unittest',
              additional_sources=['../samples/sample1.cc'])
  GtestSample(env, 'sample2_unittest',
              additional_sources=['../samples/sample2.cc'])
  GtestSample(env, 'sample3_unittest')
  GtestSample(env, 'sample4_unittest',
              additional_sources=['../samples/sample4.cc'])
  GtestSample(env, 'sample5_unittest',
              additional_sources=['../samples/sample1.cc'])
  GtestSample(env, 'sample6_unittest')
  GtestSample(env, 'sample7_unittest')
  GtestSample(env, 'sample8_unittest')
  GtestSample(env, 'sample9_unittest')
  GtestSample(env, 'sample10_unittest')

gtest_exports = {'gtest': gtest,
                 'gtest_main': gtest_main,
                 'gtest_ex': gtest_ex,
                 'gtest_main_ex': gtest_main_ex,
                 'gtest_no_rtti': gtest_no_rtti,
                 'gtest_main_no_rtti': gtest_main_no_rtti,
                 'gtest_use_own_tuple': gtest_use_own_tuple,
                 'gtest_main_use_own_tuple': gtest_main_use_own_tuple,
                 # These exports are used by Google Mock.
                 'GtestObject': GtestObject,
                 'GtestBinary': GtestBinary,
                 'GtestTest': GtestTest}

# Makes the gtest_exports dictionary available to the invoking SConstruct.
Return('gtest_exports')
