# Copyright (c) 2008 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

__doc__ = """
Configuration for building the perf_tests{,.exe} executable.
"""

Import('env')

env = env.Clone()

env.ApplySConscript([
    '$BASE_DIR/using_base.scons',
    '$NET_DIR/using_net.scons',
    '$CHROME_SRC_DIR/build/using_googleurl.scons',
    '$GTEST_DIR/../using_gtest.scons',
    '$ICU38_DIR/using_icu38.scons',
    '$MODP_B64_DIR/using_modp_b64.scons',
])

env.Prepend(
    CPPDEFINES = [
        'PERF_TEST',
    ],
    LIBS = [
        'browser',
        'common',
        'sqlite',
    ],
)

if env.Bit('posix'):
  env.SConscript([
      '$LIBEVENT_DIR/using_libevent.scons',
  ], {'env':env})

if env.Bit('windows'):
  env.Prepend(
      LIBS = [
          'rpcrt4',
          'shlwapi',
          'winmm',
      ]
  )

input_files = ChromeFileList([
  # TODO(sgk):  violate standard indentation so we don't have to
  # reindent too much when we remove the explicit MSVSFilter() calls
  # in favor of generating the hierarchy to reflect the file system.
  MSVSFilter('TestVisitedLink', [
    '$CHROME_DIR/browser/visitedlink_master$OBJSUFFIX',
    '$CHROME_DIR/browser/visitedlink_perftest.cc',
  ]),
  MSVSFilter('Common', [
    'perftests.cc',
    '$BASE_DIR/perftimer$OBJSUFFIX',
  ]),
  MSVSFilter('TestURLParser', [
    'url_parse_perftest.cc',
  ]),
  MSVSFilter('TestJSONSerializer', [
    '$CHROME_DIR/common/json_value_serializer_perftest.cc',
  ]),
  MSVSFilter('TestSafeBrowsing', [
    '$CHROME_DIR/browser/safe_browsing/database_perftest.cc',
  ]),
])

if env.Bit('linux'):
  # TODO(port): Port these files.
  input_files.Remove(
      'url_parse_perftest.cc',
      '$CHROME_DIR/browser/visitedlink_master$OBJSUFFIX',
      '$CHROME_DIR/browser/visitedlink_perftest.cc',
  )

if env.Bit('mac'):
  # TODO(port): Port these files.
  input_files.Remove(
      'url_parse_perftest.cc',
      '$CHROME_DIR/browser/visitedlink_master$OBJSUFFIX',
      '$CHROME_DIR/browser/visitedlink_perftest.cc',
  )

if not env.Bit('mac'):
  env.ChromeTestProgram('perf_tests', input_files)

p = env.ChromeMSVSProject('perftests.vcproj',
                          name='perf_tests',
                          dest=('$CHROME_SRC_DIR/chrome/'
                                + 'test/perf/perftests.vcproj'),
                          guid='{9055E088-25C6-47FD-87D5-D9DD9FD75C9F}',
                          keyword='Win32Proj',
                          dependencies = [
                              '$BASE_DIR/build/base.vcproj',
                              '$WEBKIT_DIR/build/WebCore/WebCore.vcproj',
                              '$CHROME_DIR/plugin/plugin.vcproj',
                              '$LIBJPEG_DIR/libjpeg.vcproj',
                              '$BZIP2_DIR/bzip2.vcproj',
                              '$NET_DIR/build/net.vcproj',
                              ('$WEBKIT_DIR/build/'
                               + 'JavaScriptCore/JavaScriptCore_pcre.vcproj'),
                              '$WEBKIT_DIR/build/port/port.vcproj',
                              '$CHROME_DIR/browser/debugger/debugger.vcproj',
                              ('$WEBKIT_DIR/default_plugin/'
                               + 'default_plugin.vcproj'),
                              '$CHROME_DIR/browser/browser.vcproj',
                              '$WEBKIT_DIR/build/V8Bindings/V8Bindings.vcproj',
                              '$SQLITE_DIR/sqlite.vcproj',
                              '$CHROME_DIR/views/views.vcproj',
                              '$MODP_B64_DIR/modp_b64.vcproj',
                              '$ZLIB_DIR/zlib.vcproj',
                              '$CHROME_DIR/common/common.vcproj',
                              '$ICU38_DIR/build/icu.vcproj',
                              '$CHROME_DIR/renderer/renderer.vcproj',
                              '$BASE_DIR/build/base_gfx.vcproj',
                              '$WEBKIT_DIR/build/JavaScriptCore/WTF.vcproj',
                              '$TESTING_DIR/gtest.vcproj',
                              '$V8_DIR/tools/visual_studio/v8_snapshot.vcproj',
                              '$LIBPNG_DIR/libpng.vcproj',
                              '$WEBKIT_DIR/build/glue/glue.vcproj',
                              '$SKIA_DIR/skia.vcproj',
                              ('$CHROME_DIR/third_party/'
                               + 'hunspell/hunspell.vcproj'),
                              '$GOOGLEURL_DIR/build/googleurl.vcproj',
                              '$CHROME_DIR/installer/util/util.vcproj',
                              '$WEBKIT_DIR/activex_shim/activex_shim.vcproj',
                              '$SDCH_DIR/sdch.vcproj',
                              '$CHROME_DIR/browser/views/browser_views.vcproj',
                              '$LIBXSLT_DIR/build/libxslt.vcproj',
                          ],
                          # TODO(sgk):  when we can intuit the hierarchy
                          # from the built targets.
                          #buildtargets=TODO,
                          files=input_files,
                          local_directory_prefix='./',
                          tools=[
                              'VCPreBuildEventTool',
                              'VCCustomBuildTool',
                              'VCXMLDataGeneratorTool',
                              'VCWebServiceProxyGeneratorTool',
                              'VCMIDLTool',
                              MSVSTool('VCCLCompilerTool',
                                       PreprocessorDefinitions=[
                                           'PERF_TEST',
                                           '_CRT_RAND_S',
                                       ]),
                              'VCManagedResourceCompilerTool',
                              'VCResourceCompilerTool',
                              'VCPreLinkEventTool',
                              MSVSTool('VCLinkerTool',
                                       AdditionalDependencies=[
                                           'shlwapi.lib',
                                           'rpcrt4.lib',
                                           'winmm.lib',
                                       ],
                                       SubSystem='1'),
                              'VCALinkTool',
                              'VCManifestTool',
                              'VCXDCMakeTool',
                              'VCBscMakeTool',
                              'VCFxCopTool',
                              'VCAppVerifierTool',
                              'VCWebDeploymentTool',
                              'VCPostBuildEventTool',
                          ],
                          ConfigurationType='1')


p.AddConfig('Debug|Win32',
            InheritedPropertySheets=[
                '$(SolutionDir)../build/common.vsprops',
                '$(SolutionDir)../build/debug.vsprops',
                '$(SolutionDir)../third_party/icu38/build/using_icu.vsprops',
                ('$(SolutionDir)../'
                 + 'third_party/libxml/build/using_libxml.vsprops'),
                '$(SolutionDir)../testing/using_gtest.vsprops',
                '$(SolutionDir)../skia/using_skia.vsprops',
            ])

p.AddConfig('Release|Win32',
            InheritedPropertySheets=[
                '$(SolutionDir)../build/common.vsprops',
                '$(SolutionDir)../build/release.vsprops',
                '$(SolutionDir)../third_party/icu38/build/using_icu.vsprops',
                ('$(SolutionDir)../'
                 + 'third_party/libxml/build/using_libxml.vsprops'),
                '$(SolutionDir)../testing/using_gtest.vsprops',
                '$(SolutionDir)../skia/using_skia.vsprops',
            ])
