# Copyright (c) 2006-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.

import os

Import(['env'])

env = env.Clone()
env_res = env.Clone()

# We use the SCons addRepository() call (an internal API that will
# at some point be made public) to "back" the build directory
# hierarchy with the source directory hierarchies in which we want to
# find the source .cpp and .h files.  Think of this kind of like
# Make's VPATH, but applied to entire directory hierarchies.  The
# upshot is that when searching for any file (source or target),
# SCons will search the subdirectory hierarchies under the following
# paths:
#
#   webkit/Hammer/port/
#   webkit/port/
#   third_party/WebKit/WebCore/
#
# SCons will replicate the compiler and linker -I and -L options so
# that the tools will find the right .h and library files.  This comes
# at the cost of tripling the number of -I or -L options on a command
# line, but with the benefit that the build should "just work"
# regardless of which tree the file lives in, and regardless of whether
# or not the file involved is a generated file or checked-in source.
#
# (Note that because the build/SConscript.main file also calls
# addRepository() for the entire $OBJ_ROOT tree, that adds an
# extra -I or -L option for the webkit/port/ subdirectory, after the
# third_party/WebKit/WebCore/ in the above list.  We'd like to
# eliminate that in the future, but that will require some
# deeper magic, and maybe a SCons modification.)

port_dir = env.Dir('$WEBKIT_DIR/port')
port_dir.addRepository(env.Dir('$CHROME_SRC_DIR/webkit/port'))
port_dir.addRepository(env.Dir('$CHROME_SRC_DIR/third_party/WebKit/WebCore'))

if env.Bit('windows'):
  env['WEBKIT_PLATFORM_SUBDIR'] = 'win'
elif env.Bit('mac'):
  env['WEBKIT_PLATFORM_SUBDIR'] = 'mac'
  env.Append(
      CCFLAGS = [
          '-Wno-reorder',
          '-Wno-unused',
      ],
  )
  env.Prepend(
      CPPPATH = [env.subst(x) for x in [
          '$CHROME_SRC_DIR/third_party/WebKit/WebCore/platform/graphics/cg',
          '$CHROME_SRC_DIR/third_party/WebKit/WebCore/loader/archive/cf',
      ]]
  )
elif env.Bit('linux'):
  env.Append(
      CPPDEFINES = [
        # We want webkit to use pthreads rather than gthread.
        'WTF_USE_PTHREADS=1',
      ],
  )

if env.Bit('posix'):
  env.Append(
      CCFLAGS = [
          '-Wno-parentheses',
      ],
  )

env.Append(
    WEBCORE_DIR = '$THIRD_PARTY_WEBKIT_DIR/WebCore',
    PENDING_DIR = "$WEBKIT_DIR/pending",
    PORT_DIR = "$WEBKIT_DIR/port",

    JAVASCRIPTCORE_DIR = "$THIRD_PARTY_WEBKIT_DIR/JavaScriptCore",
    WTF_DIR = "$JAVASCRIPTCORE_DIR/wtf",
    KJS_DIR = "$JAVASCRIPTCORE_DIR/kjs",
    PCRE_DIR = "$JAVASCRIPTCORE_DIR/pcre",

    V8BINDINGS_DIR = "$WEBKIT_DIR/V8Bindings",
    DERIVED_DIR = env.Dir("$WEBKIT_DIR/V8Bindings/DerivedSources"),
    SHARED_DIR = env.Dir("$WEBKIT_DIR/V8Bindings/SharedSources"),

    WEBKIT_DIR_PORT_INC = env.Dir("$CHROME_SRC_DIR/webkit/port"),
)

env.Prepend(
    CPPPATH = [env.subst(x) for x in [

        # We put our grit generated headers in a common place.  This matches
        # what we do in Visual Studios.
        '$TARGET_ROOT/grit_derived_sources',
        '$WEBKIT_DIR/build/JSConfig/WebCore',

        # TODO(sgk):  This directory was at this point in the /I list
        # in the Visual Studio build of the merged webkit.  It breaks
        # the Linux build because of the pthread.h file there.
        # Leaving it out doesn't obviously break the Windows build,
        # but for now I'm leaving it commented out here in case it
        # introduced any hidden problems.
        #'$WEBKIT_DIR/build/JavaScriptCore',

        '$WEBKIT_DIR_PORT_INC/platform/image-decoders',
        '$WEBKIT_DIR_PORT_INC/platform/image-decoders/bmp',
        '$WEBKIT_DIR_PORT_INC/platform/image-decoders/gif',
        '$WEBKIT_DIR_PORT_INC/platform/image-decoders/ico',
        '$WEBKIT_DIR_PORT_INC/platform/image-decoders/jpeg',
        '$WEBKIT_DIR_PORT_INC/platform/image-decoders/png',
        '$WEBKIT_DIR_PORT_INC/platform/image-decoders/xbm',
        '$ZLIB_DIR',
        '$LIBPNG_DIR',
        '$LIBJPEG_DIR',
        '$LIBXSLT_DIR',
        '$LIBXML_DIR/include',
        '$LIBXML_DIR/DerivedSources/include',
        '$ICU38_DIR/public/common',
        '$ICU38_DIR/public/i18n',
        '$SKIA_DIR/include',
        '$SKIA_DIR/include/corecg',
        '$SKIA_DIR/platform',
        '$NPAPI_DIR',
        '$V8_DIR/include',
        '$WEBKIT_DIR/V8Bindings/DerivedSources',
        '$WEBKIT_DIR/V8Bindings/SharedSources',

        '$WEBKIT_DIR/pending',
        '$WEBKIT_DIR_PORT_INC/bindings/v8',
        '$WEBKIT_DIR_PORT_INC/css',
        '$WEBKIT_DIR_PORT_INC/dom',
        '$WEBKIT_DIR_PORT_INC/history',
        '$WEBKIT_DIR_PORT_INC/page/chromium',
        '$WEBKIT_DIR_PORT_INC/platform',
        '$WEBKIT_DIR_PORT_INC/platform/animation',
        '$WEBKIT_DIR_PORT_INC/platform/chromium',
        '$WEBKIT_DIR_PORT_INC/platform/graphics',
        '$WEBKIT_DIR_PORT_INC/platform/graphics/chromium',
        '$WEBKIT_DIR_PORT_INC/platform/graphics/skia',
        '$WEBKIT_DIR_PORT_INC/platform/graphics/transforms',
        '$WEBKIT_DIR_PORT_INC/platform/$WEBKIT_PLATFORM_SUBDIR',
        '$WEBKIT_DIR_PORT_INC/platform/network/chromium',
        '$WEBKIT_DIR_PORT_INC/rendering',

        '$JAVASCRIPTCORE_DIR',
        '$JAVASCRIPTCORE_DIR/wtf',

        # Directories in third_party/WebKit/Webcore that we pull headers
        # from.  We don't have to list directories that are listed in the
        # $WEBKIT_DIR_PORT_INC section above because they automatically fall
        # back to third_party/WebKit/Webcore.
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/editing',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/html',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/inspector',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/loader',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/loader/appcache',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/loader/archive',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/loader/icon',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/page',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/page/animation',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/platform/network',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/platform/sql',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/platform/text',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/plugins',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/rendering/style',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/storage',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/style',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/svg',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/svg/animation',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/svg/graphics',
        '$CHROME_SRC_DIR/third_party/WebKit/WebCore/xml',

        '$CHROME_SRC_DIR',
    ]],
)

env.Append(
    CPPDEFINES = [
      'U_STATIC_IMPLEMENTATION',
      '_SCL_SECURE_NO_DEPRECATE',
      '_SCL_SECURE_NO_WARNINGS',
      ['ENABLE_DASHBOARD_SUPPORT', '0'],
      ['ENABLE_JAVASCRIPT_DEBUGGER', '0'],
      ['ENABLE_JSC_MULTIPLE_THREADS', '0'],
      ['ENABLE_ICONDATABASE', '0'],
      ['ENABLE_DATABASE', '1'],
      ['ENABLE_XSLT', '1'],
      ['ENABLE_XPATH', '1'],
      ['ENABLE_SVG', '1'],
      ['ENABLE_SVG_ANIMATION', '1'],
      ['ENABLE_SVG_AS_IMAGE', '1'],
      ['ENABLE_SVG_USE', '1'],
      ['ENABLE_SVG_FOREIGN_OBJECT', '1'],
      ['ENABLE_SVG_FONTS', '1'],
      ['WEBCORE_NAVIGATOR_PLATFORM', '"\\"Win32\\""'],
      'USE_GOOGLE_URL_LIBRARY',
      ['BUILDING_CHROMIUM__', '1'],
      'CHROMIUM_BUILD',
      '_SECURE_ATL',

      'LIBXSLT_STATIC',
      'LIBXML_STATIC',
      'PNG_USER_CONFIG',
      'CHROME_PNG_WRITE_SUPPORT',
      ['__PRETTY_FUNCTION__', '__FUNCTION__'],
      'DISABLE_ACTIVEX_TYPE_CONVERSION_MPLAYER2',

      '__STD_C',
      ['USE_SYSTEM_MALLOC', '1'],
    ],
)

# This addRepository call causes our webkit/port include paths to include both
# webkit/port and third_party/WebKit/WebCore.
webkit_port_inc = env.Dir("$WEBKIT_DIR_PORT_INC")
webkit_port_inc.addRepository(
    env.Dir('$CHROME_SRC_DIR/third_party/WebKit/WebCore'))

# This list is the SConscripts that work on Windows and Linux.
sconscript_dirs = env.ChromiumLoadComponentSConscripts(
  LOAD_NAMES = ['webkit'],
  port = 'SConscript.port',
  JavaScriptCore_pcre = 'SConscript.javascriptcore_pcre',
  WebCore_config_h = 'build/JSConfig/SConscript',
  JavaScriptCore = 'build/JavaScriptCore/SConscript',
  webkit_strings = 'build/localized_strings/SConscript',
  bindings = 'build/port/SConscript',
  V8Bindings = 'build/V8Bindings/SConscript',
  WebCore = 'build/WebCore/SConscript',
  default_plugin = 'default_plugin/SConscript',
  glue = 'glue/SConscript',
  npapi_test_plugin = 'glue/plugins/test/SConscript',
  npapi_layout_test_plugin = 'tools/npapi_layout_test_plugin/SConscript',
  test_shell = 'tools/test_shell/SConscript',
)

if env.Bit('windows'):
  # These extra dirs aren't win32-specific, they're just the dirs that
  # haven't yet been made portable.
  sconscript_dirs.extend(env.ChromiumLoadComponentSConscripts(
    LOAD_NAMES = ['webkit'],
    activex_shim = 'activex_shim/SConscript',
    npaxshim = 'activex_shim_dll/SConscript',
  ))

  env.Append(
    CPPDEFINES = [
      '_CRT_SECURE_NO_DEPRECATE',
      '_CRT_NONSTDC_NO_WARNINGS',
      '_CRT_NONSTDC_NO_DEPRECATE',
      ['CRASH', '__debugbreak'],
    ])

  env.Prepend(
    CPPPATH = [
      # Windows precompiled headers are here
      '$WEBKIT_DIR/build',

      '$JAVASCRIPTCORE_DIR/os-win32',
    ])
else:
  env.Append(
      CXXFLAGS = ['-Wno-multichar'],
  )

env.SConscript(sconscript_dirs, exports=['env', 'env_res'])

# Setup alias for all webkit related targets.
# We'd like to do this as follows, but it leads to out-of-memory
# errors when SCons tries to use the entire contents of the
# directory tree as a huge content-signature string.
# Instead we're going to let all the subsidiary SConscript files
# add their own individual targets to the 'webkit' Alias.
#env.Alias('webkit', ['.', '$DESTINATION_ROOT/icudt38.dll'])
if env.Bit('windows'):
  env.Alias('webkit', ['$DESTINATION_ROOT/icudt38.dll'])

version = env.Command('$WEBKIT_DIR/build/WebCore/webkit_version.h',
                      ['$WEBCORE_DIR/Configurations/Version.xcconfig',
                       '$CHROME_SRC_DIR/webkit/build/webkit_version.py'],
                      "$PYTHON ${SOURCES[1]} ${SOURCES[0]} ${TARGET.dir}")
env.AlwaysBuild(version)