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

import os

Import(['env'])

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

install_targets = []


env.Prepend(
    CPPPATH = [
        'app',
        '$CHROME_DIR/third_party/wtl/include',
    ],
)


env_res.Append(
    CPPPATH = [
        '.',
        '#/..',
    ],
    RCFLAGS = [
        ['/l', '0x409'],
    ],
)

browser_res = env_res.RES('browser/browser_resources.rc')
chrome_dll_res = env_res.RES('app/chrome_dll.rc')
common_res = env_res.RES('common/common_resources.rc')
debugger_res = env_res.RES('browser/debugger/resources/debugger_resources.rc')
renderer_res = env_res.RES('renderer/renderer_resources.rc')
test_data_res = env_res.RES('test/data/resource.rc')
webkit_res = env_res.RES('$WEBKIT_DIR/glue/webkit_resources.rc')

net_res = '$NET_DIR/net_resources.res'

dll_resources = [
    browser_res,
    chrome_dll_res,
    common_res,
    debugger_res,
    net_res,
    renderer_res,
    webkit_res,
]

env_test['BROWSER_RES'] = browser_res[0]
env_test['TEST_DATA_RES'] = test_data_res[0]

env_dll = env.Clone()

env_dll.Prepend(
    CPPPATH = [
        "..",
    ],
    CPPDEFINES = [
        'U_STATIC_IMPLEMENTATION',
        'PNG_USER_CONFIG',
        'CHROME_PNG_WRITE_SUPPORT',
        'LIBXSLT_STATIC',
        'LIBXML_STATIC',
        '_WINDLL',
        'BROWSER_DLL',
        'RENDERER_DLL',
        'PLUGIN_DLL',
    ],
    CCFLAGS = [
        '/TP',
        '/Wp64',
    ],
)

env_dll.Append(
    CPPPATH = [
        '$CHROME_DIR/app',
        '$LIBPNG_DIR',
        '$SKIA_DIR/include',
        '$SKIA_DIR/include/corecg',
        '$SKIA_DIR/platform',
        '$LIBXSL_DIR',
        '$LIBXML_DIR/include',
        '$BREAKPAD_DIR/src',
    ],
    LIBS = [
        'base',
        'base_gfx',
        'breakpad_handler',
        'googleurl',
        'net',
        'skia',
        'bzip2',
        'icuuc',
        'libjpeg',
        'libpng',
        'libxml',
        'libxslt',
        'modp_b64',
        'zlib',

        'activex_shim',
        'WTF',
        'V8Bindings',
        'WebCore',
        'default_plugin',
        'Glue',
        'JavaScriptCore_pcre',
        'Port',
    ],
)

env_dll.Append(
    LIBS = [
        'comctl32.lib',
        'dwmapi.lib',
        'rpcrt4.lib',
        'shlwapi.lib',
        'winmm.lib',
        'wsock32.lib',
    ],
    LINKFLAGS = [
        '/INCREMENTAL',
        '/DEBUG',

        '/DELAYLOAD:"comdlg32.dll"',
        '/DELAYLOAD:"crypt32.dll"',
        '/DELAYLOAD:"cryptui.dll"',
        '/DELAYLOAD:"dwmapi.dll"',
        '/DELAYLOAD:"imagehlp.dll"',
        '/DELAYLOAD:"imm32.dll"',
        '/DELAYLOAD:"oleacc.dll"',
        '/DELAYLOAD:"oleaut32.dll"',
        '/DELAYLOAD:"psapi.dll"',
        '/DELAYLOAD:"urlmon.dll"',
        '/DELAYLOAD:"uxtheme.dll"',
        '/DELAYLOAD:"winhttp.dll"',
        '/DELAYLOAD:"wininet.dll"',
        '/DELAYLOAD:"winspool.drv"',
        '/DELAYLOAD:"ws2_32.dll"',
        '/DELAYLOAD:"wsock32.dll"',

        '/SUBSYSTEM:WINDOWS',
        '/BASE:"0x01000000"',
        '/MACHINE:X86',
        '/FIXED:No',

        '/safeseh',
        '/dynamicbase',
        '/ignore:4199',
        '/nxcompat',

        '/PDB:${TARGETS[1]}',
        '/IMPLIB:${TARGETS[2]}',
    ],
)

input_files = [
    'app/chrome_dll_main.cc',
]

libs = [
    'browser/browser.lib',
    'browser/views/browser_views.lib',
    'browser/debugger/debugger.lib',
    'common/common.lib',
    'installer/util/util.lib',
    'libjscre.lib',
    'plugin/plugin.lib',
    'renderer/renderer.lib',
    'third_party/hunspell/hunspell.lib',
    'third_party/sqlite/sqlite.lib',
    'views/views.lib',
    '$V8_DIR/v8.lib',
    '$V8_DIR/snapshot-empty.obj',
]

if env['PLATFORM'] == 'win32':
  targets = [
      'chrome.dll',
      'chrome_dll.pdb',
      'chrome_dll.lib',
  ]
else:
  targets = ['chrome']

dll_targets = env_dll.ChromeSharedLibrary(targets,
                                          dll_resources + input_files + libs)

install_targets.extend(dll_targets)



import os
import sys
sys.path.append(Dir('#/../tools/grit').abspath)
env_grd = env.Clone()
env_grd.Tool('scons', toolpath=['#/../tools/grit/grit'])
# NOTE: generated_target is fake, to cause a different target.
generated = env_grd.GRIT('app/resources/generated_target',
                         '#/../chrome/app/generated_resources.grd')
for g in [ g for g in generated if str(g).endswith('.rc') ]:
    env_res.RES(g)



def chrome_version_emitter(target, source, env):
    source.append('$CHROME_SRC_DIR/VERSION')
    source.append('$CHROME_SRC_DIR/BRANDING')
    return target, source

b = Builder(action = '$CHROME_VERSION_RC_COM',
            emitter = chrome_version_emitter)

env['BUILDERS']['ChromeVersionRC'] = b

env.Replace(
    CHROME_VERSION_RC_COM = '$VERSION_BAT $SOURCE $CHROME_SRC_DIR $PWD $TARGET',
    VERSION_BAT = File('#/../chrome/tools/build/win/version.bat'),
    CHROME_SRC_DIR = Dir('#/../chrome'),
    PWD = Dir('.'),
)

chrome_exe_version_rc = env.ChromeVersionRC(
    'chrome_exe_version.rc',
    'app/chrome_exe_version.rc.version'
)

chrome_dll_version_rc = env.ChromeVersionRC(
    'chrome_dll_version.rc',
    'app/chrome_dll_version.rc.version',
)

Depends(chrome_dll_res, chrome_dll_version_rc)

chrome_exe_version_res = env_res.RES(chrome_exe_version_rc)
chrome_dll_version_res = env_res.RES(chrome_dll_version_rc)

install_targets.extend(chrome_exe_version_rc)
install_targets.extend(chrome_exe_version_res)

install_targets.extend(chrome_dll_version_rc)
install_targets.extend(chrome_dll_version_res)



env_exe = env.Clone()

env_exe.Prepend(
    CPPPATH = [
        '..',
        '$BREAKPAD_DIR/src',
    ],
    LIBS = [
        'base',
        'breakpad_handler',
        'icuuc',
        'sandbox',
        'util',
    ],
)

env_exe.Append(
    LINKFLAGS = [
        '/INCREMENTAL',

        '/DELAYLOAD:"dwmapi.dll"',
        '/DELAYLOAD:"uxtheme.dll"',

        '/SUBSYSTEM:WINDOWS',
        '/MACHINE:X86',
        '/FIXED:No',

        '/safeseh',
        '/dynamicbase',
        '/ignore:4199',
        '/nxcompat',

        '/PDB:${TARGETS[1]}',
        '/IMPLIB:${TARGETS[2]}',
    ],
)

if env['PLATFORM'] == 'win32':
  targets = [
      'chrome.exe',
      'chrome_exe.pdb',
      'chrome_exe_implib.lib',
  ]
else:
  targets = ['chrome']

chrome_exe = env_exe.ChromeProgram(
    targets,
    [
        env_res.RES('app/chrome_exe.rc'),
        'app/breakpad.cc',
        'app/chrome_exe_main.cc',
        'app/google_update_client.cc',

        'common/common.lib',
        '$CHROME_DIR/chrome_dll.lib',
    ]
)

install_targets.extend(chrome_exe)
env.Requires(chrome_exe[0], ['$TARGET_ROOT/chrome.dll',
                             '$TARGET_ROOT/icudt38.dll',
                             '$TARGET_ROOT/rlz.dll',
                             '$TARGET_ROOT/First Run'])

env.Command('$TARGET_ROOT/First Run', '$CHROME_DIR/app/FirstRun',
            Copy('$TARGET', '$SOURCE'))

# For release we want to run dependencies.py, may look something like:
#env.AddPostAction('$TARGET_ROOT/chrome.exe',
#                  '$PYTHON tools/build/win/dependencies.py $(TargetPath) chrome.exe.deps')


env_snapshot = env.Clone()

env_snapshot.Prepend(
    CPPPATH = [
        '$V8_DIR/src',
        '$V8_DIR/src/pcre/jscre',
        '..',
    ],
    CPPDEFINES = [
        'ENABLE_DISASSEMBLER',
    ],
    CCFLAGS = [
        '/wd4099',
        '/wd4355',
        '/wd4800',
    ],
)

env_snapshot.ChromeStaticLibrary('snapshotv8', 'snapshot.cc')

env_snapshot.Command('snapshot.cc', '#/../v8/bin/debug/mksnapshot.exe',
                     '$SOURCE $TARGET')



env_flat = env.Clone(
    BROWSER_RESOURCES = Dir('browser_resources'),
    HTML_INLINE = File('#/../chrome/tools/build/win/html_inline.py'),
    FLATTEN_HTML_COM = '$PYTHON $HTML_INLINE $SOURCE $TARGET',
)

flats = [
    'about_memory',
    'about_version',
    'incognito_tab',
    'new_tab',
    'safe_browsing_malware_block',
    'safe_browsing_phishing_block',
    'ssl_error',
]

flats_out = []
for i in flats:
  flats_out += env_flat.Command(
      '$BROWSER_RESOURCES/' + i + '_flat.html',
      'browser/resources/' + i + '.html', '$FLATTEN_HTML_COM')

flats_out += env_flat.Command(
    '$BROWSER_RESOURCES/ssl_roadblock_flat.html',
    'browser/security/resources/ssl_roadblock.html', '$FLATTEN_HTML_COM')

env_flat.Depends(browser_res, flats_out)



env_test.Object('test/test_file_util.cc',
                CPPPATH=['..'] + env['CPPPATH'])

test_sconscript_files = [
    'SConscript.automated_ui_tests',
    'SConscript.unit_tests',
    'SConscript.ui_tests',
]

env.SConscript(test_sconscript_files, exports=['env_test'])


sconscript_files = [
    'app/resources/SConscript',
    'app/theme/SConscript',
    'browser/SConscript',
    'browser/views/SConscript',
    'common/SConscript',
    'installer/mini_installer/SConscript',
    'installer/setup/SConscript',
    'installer/util/SConscript',
    'plugin/SConscript',
    'renderer/SConscript',
    'test/activex_test_control/SConscript',
    'test/automation/SConscript',
    'test/chrome_plugin/SConscript',
    'test/interactive_ui/SConscript',
    'test/memory_test/SConscript',
    'test/mini_installer_test/SConscript',
    'test/page_cycler/SConscript',
    'test/plugin/SConscript',
    'test/reliability/SConscript',
    'test/security_tests/SConscript',
    'test/selenium/SConscript',
    'test/startup/SConscript',
    'test/tab_switching/SConscript',
    'tools/crash_service/SConscript',
    'tools/perf/flush_cache/SConscript',
    'tools/test/image_diff/SConscript',
    'third_party/hunspell/SConscript',
    'third_party/sqlite/SConscript',
    'views/SConscript',
]

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


env.InstallAs('libjscre.lib', '$WEBKIT_DIR/JavaScriptCore_pcre.lib')


i = env.Install('$TARGET_ROOT', install_targets)
env.Alias('chrome', i)


gears_plugins = [
    '$GEARS_DIR/binaries/gears.dll',
    '$GEARS_DIR/binaries/gears.pdb',
]

i = env.Install('$TARGET_ROOT/plugins/gears', gears_plugins)
env.Alias('chrome', i)


i = env.Command('$TARGET_ROOT/resources/inspector',
            '#/../webkit/port/page/inspector',
            Copy('$TARGET', '$SOURCE'),
            source_scanner=DirScanner)
env.Alias('chrome', i)

env.Alias('chrome', env.Alias('webkit'))