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

# Notes:
# This is the main Gears SConscript file.  From here, we include sub-scripts
# that handle building various targets (third party libs, common exes, the
# browser plugins themselves, and installers).  Some sub-scripts return a
# dictionary of variables to be appended to the environment, so other
# sub-scripts can use them.
#
# To check out the Gears sources, you need to make sure this directory is in
# your .gclient file, so its DEPS get processed.  Example:
#   { "name"        : "src/gears",
#     "url"         : "svn://chrome-svn/chrome/trunk/src/gears",
#   },
#
# This is a work-in-progress conversion of the current Gears set of Makefiles.
# A lot of the stuff doesn't translate to SCons-land well, and I'm not sure
# how faithful we want to be to the original.
#
# Questions:
# Should we flatten the output directory into
# Hammer/gears/platform/browser/*.obj like Gears does now?  If so, how?

# Notes to self:
# - os.path.abspath('.') (the CWD) is variant_dir if it exists, else it's the
# toplevel_dir (which contains the SConstruct).
# - env.Entry('.') is the entry representing the variant_dir.
# - env.Entry('#') is the entry representing the toplevel_dir.
# - str(entry) gives the path relative to variant_dir, or abspath if the entry
# is outside the variant_dir.
# - entry.path gives the path relative to toplevel_dir.
# - entry.abspath gives the absolute path.

import os

Import('env')

env = env.Clone(
    OPEN_DIR = "gears",
    PRIVATE_DIR = "gears_internal",
    THIRD_PARTY_DIR = "third_party",
    PRIVATE_THIRD_PARTY_DIR = "third_party_internal",
)

if not os.path.exists(env.Dir('#/$OPEN_DIR').abspath):
  print 'Skipping Gears build: no perforce tree checked out.'
  Return()

# Argument switches

# TODO: how do we detect linux vs osx?
os_guess = env['PLATFORM']
if os_guess == 'posix':
  os_guess = 'linux'
elif os_guess == 'darwin':
  os_guess = 'osx'

# Map of OS -> valid browser targets for that OS.
os_browsers_map = {
    'win32': ['IE', 'FF2', 'FF3', 'NPAPI'],
    'wince': ['IE'],
    'linux': ['FF2', 'FF3'],
    'osx': ['SF', 'FF2', 'FF3'],
    'android': ['NPAPI'],
    'symbian': ['NPAPI'],
}

vars = Variables(None, ARGUMENTS)
vars.AddVariables(
    EnumVariable('OS',
        'Which OS is the target', os_guess, os_browsers_map.keys()),
    EnumVariable('MODE',
        'Type of binary to generate', 'dbg', ['dbg', 'opt']),
    BoolVariable('OFFICIAL_BUILD',
        'Create a binary suitable for public release', 0),
    BoolVariable('GEARS_STATIC_LIB',
        'Create a static library for linking with Chrome', 0),
)
vars.Update(env)

env['VALID_BROWSERS'] = os_browsers_map[env['OS']]

# Add BROWSER last, since its valid inputs depend on $OS.
vars.Add(
    EnumVariable('BROWSER',
        'Which browser we want to build the plugin for.  "all" builds all '
        'browsers for this OS.',
        'all', env['VALID_BROWSERS'] + ['all']))
vars.Update(env)

env.Replace(
    USING_CCTESTS = (env['MODE'] == 'dbg' or not env['OFFICIAL_BUILD'])
)

# Version
env.Replace(
    MAJOR = '0',
    MINOR = '5',
    BUILD = '7',
    PATCH = '0',
    VERSION = '${MAJOR}.${MINOR}.${BUILD}.${PATCH}',

    FRIENDLY_NAME = 'Google Gears',
    SHORT_NAME = 'gears',
)

# Platform
# TODO: Symbian builds will override this value.
# For other platforms we set just one value.
if env['OS'] in ['wince', 'android']:
  env.Replace(ARCH = 'arm')
elif env['OS'] == 'osx':
  # On OSX we build a fat binary.
  env.Replace(ARCH = 'i386+ppc')
else:
  env.Replace(ARCH = 'i386')

# Output dirs
env.Replace(
    BASE_OUTDIR = '$GEARS_DIR/$OS-$ARCH-$MODE',
    COMMON_OUTDIR = '$BASE_OUTDIR/common',
    BROWSER_OUTDIR = '$BASE_OUTDIR/${BROWSER.lower()}',
    IE_OUTDIR = '$BASE_OUTDIR/ie',
    FF2_OUTDIR = '$BASE_OUTDIR/ff2',
    FF3_OUTDIR = '$BASE_OUTDIR/ff3',
    NPAPI_OUTDIR = '$BASE_OUTDIR/npapi',
    SF_OUTDIR = '$BASE_OUTDIR/sf',

    GENFILES_DIR = "$BROWSER_OUTDIR/genfiles",
    COMMON_GENFILES_DIR = "$COMMON_OUTDIR/genfiles",

    INSTALLER_OUTDIR = '$BASE_OUTDIR/installers',
)

# Outputs
env.Replace(
    INSTALLER_BASENAME = 'gears-${OS}-${MODE}-${VERSION}',

    FF_XPI = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.xpi',
    WIN32_INSTALLER_MSI = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.msi',
    WINCE_INSTALLER_CAB = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.cab',
    # Keyston SF Metapackage installer, bundled with Keystone as part of a
    # DMG.
    SF_KEYSTONE_INSTALLER_DMG = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.dmg',
    SF_KEYSTONE_INSTALLER_MPKG = '$INSTALLER_OUTDIR/Safari/${FRIENDLY_NAME}.mpkg',

    SF_INSTALLER_PLUGIN_BUNDLE = '$INSTALLER_OUTDIR/Safari/StatsPane.bundle',
    SF_PLUGIN_BUNDLE = '$INSTALLER_OUTDIR/Safari/Gears.bundle',
    SF_PLUGIN_PROXY_BUNDLE = '$INSTALLER_OUTDIR/Safari/Gears.plugin',
    SF_INPUTMANAGER_BUNDLE = '$INSTALLER_OUTDIR/Safari/GearsEnabler',
    SF_INSTALLER_PKG = '$INSTALLER_OUTDIR/Safari/Gears.pkg',
)

# Library flags
env.Replace(
    MOZJS_INCLUDE_PATHS = [
        '$MOZJS_DIR',
        '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include',
        '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include/private',
        '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include/obsolete',
        '$OSX_SDK_ROOT/Developer/Headers/FlatCarbon/',
    ],
    MOZJS_DIR = '$THIRD_PARTY_DIR/spidermonkey',
)

# Add our tools to the PATH.
if env['OS'] in ['win32', 'wince']:
  if os.path.exists(env.Dir('#/$PRIVATE_THIRD_PARTY_DIR').abspath):
    # Clear out our environment so we don't accidentally use the system's
    # libs.
    env['ENV']['PATH'] = ''
    env['ENV']['LIB'] = ''
    env['ENV']['INCLUDE'] = ''

    paths = []

    # Keep system32 for 'xcopy'.
    paths += [env.subst('${ENV["SYSTEMROOT"]}/system32')]
    if env['OS'] == 'win32':
      env.Append(
          VC80 = env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/vc_80/files').abspath)
      paths += [
          env.subst('$VC80/common7/ide'),
          env.subst('$VC80/vc/bin'),
          env.subst('$VC80/common7/tools'),
          env.subst('$VC80/common7/tools/bin'),
          env.subst('$VC80/team_tools/performance_tools'),
      ]
    else:  # wince
      env.Append(
          VC80 = env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/vc_80ce/files').abspath)
      paths += [
          env.subst('$VC80/bin/x86_arm'),
          env.subst('$VC80/common7/ide'),
          env.subst('$VC80/common7/tools'),
          env.subst('$VC80/common7/tools/bin'),
          env.subst('$VC80/vc/bin'),
          env.subst('$VC80/smartdevices/sdktools'),
      ]

    paths += [
        env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/wix/v3_0_2925/files').abspath]

    paths += [env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/gnu/files').abspath]
    paths += [env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/python_24').abspath]

    # Prepend them so our tools come first.
    for each in reversed(paths):
      env.PrependENVPath('PATH', each)
  else:
    # If we don't have a private third_party dir, we expect the system
    # environment to be set up correctly to point to tool paths.
    env['ENV']['PATH'] = os.environ['PATH']
    env['ENV']['LIB'] = os.environ['LIB']
    env['ENV']['INCLUDE'] = os.environ['INCLUDE']

  mtcom = 'echo Manifest creation disabled, since it breaks a lot.'
  env['MANIFEST_COM'] = mtcom
  env['SHMANIFEST_COM'] = mtcom

# Building M4 files
env.Tool('m4')

env.Append(
    M4ARCH = (env['ARCH'] == 'i386' and 'x86' or '$ARCH'),
    M4FLAGS = [
        '--prefix-builtins',
        '-DPRODUCT_VERSION=$VERSION',
        '-DPRODUCT_VERSION_MAJOR=$MAJOR',
        '-DPRODUCT_VERSION_MINOR=$MINOR',
        '-DPRODUCT_VERSION_BUILD=$BUILD',
        '-DPRODUCT_VERSION_PATCH=$PATCH',
        '-DPRODUCT_OS=$OS',
        '-DPRODUCT_ARCH="$M4ARCH"',
        '-DPRODUCT_GCC_VERSION="gcc3"',
        '-DPRODUCT_MAINTAINER="google"',
        '-DPRODUCT_FRIENDLY_NAME_UQ="$FRIENDLY_NAME"',
        '-DPRODUCT_SHORT_NAME_UQ="$SHORT_NAME"',
        '-DI18N_LANGUAGES="(${",".join(I18N_LANGS)})"',
    ],
    M4PATH = [
        '$OPEN_DIR',
        '.',
    ],
)

# SCons magic to make M4PATH work.
env.Replace(
    M4INCPREFIX = '-I',
    M4INCSUFFIX = '',
    _M4INCFLAGS = ('${_concat(M4INCPREFIX, M4PATH, M4INCSUFFIX, '
                 '__env__, RDirs, TARGET, SOURCE)}'),
    M4COM = '$M4 $M4FLAGS ${_M4INCFLAGS} $SOURCE > $TARGET',
)

# TODO: Dependency scanner for m4 files - doesn't work.  It can't detect files
# that don't exist!
#m4_include_re = re.compile(r'm4_include\((.*)\)', re.M)
#def m4_scan(node, env, path):
#  contents = node.get_contents()
#  includes = m4_include_re.findall(contents)
#  ret_includes = []
#  for include in includes:
#    for dir in path:
#      file = os.path.join(dir, include)
#      if os.path.exists(file):
#        ret_includes.append(file)
#        break
#  return ret_includes
#
#m4_scanner = Scanner(function = m4_scan, skeys = ['.m4', '.html_m4'])
#env.Append(SCANNERS = m4_scanner)


# OS X Iceberg package builder

env.Replace(ICEBERG = '/usr/local/bin/freeze')
if env.WhereIs('$ICEBERG'):
  env.Replace(ICEBERGCOM = '"$ICEBERG" -v $SOURCE')
else:
  env.Replace(ICEBERGCOM =
      'echo To create a Safari installer for Gears, you must install Iceberg'
      ' from http://s.sudre.free.fr/Software/Iceberg.html.  You can install'
      ' the Safari version manually by running the'
      ' $OPEN_DIR/tools/osx/install_gears.sh script.')

iceberg_builder = Builder(action = '$ICEBERGCOM',
    suffix = '.pkg', src_suffix = '.packproj')
env.Append(BUILDERS = {'Iceberg': iceberg_builder})


# C++ build flags.

# Clear out the inherited defines from Chrome's build.  I want to match Gears'
# current build as closely as possible until we switch everyone to SCons, then
# gradually integrate.
env.Replace(
    CPPPATH = [
        '$OPEN_DIR',
        '$OPEN_DIR/..',
        '$THIRD_PARTY_DIR',
        '$THIRD_PARTY_DIR/googleurl',
        '$THIRD_PARTY_DIR/npapi',
        '$THIRD_PARTY_DIR/zlib',
        '$THIRD_PARTY_DIR/v8/bindings_local',
        '.',
        '$COMMON_OUTDIR',
    ],
    CFLAGS = [],
    CCFLAGS = [],
    CXXFLAGS = [],
    CCPDBFLAGS = [],
    CPPDEFINES = [
    # SpiderMonkey (the Firefox JS engine)'s JS_GET_CLASS macro in jsapi.h needs
    # this defined to work with the gecko SDK that we've built.
    # The definition of JS_THREADSAFE must be kept in sync with MOZJS_CPPFLAGS.
        'JS_THREADSAFE'
    ],
    FRAMEWORKPATH = [],
    FRAMEWORKS = [],
    LIBS = [],
    LIBPATH = ['$COMPONENT_LIBRARY_DIR'],
    COMMON_LINKFLAGS = [],  # for both executables and shared libs
    LINKFLAGS = ['$COMMON_LINKFLAGS'],  # for executables
    SHLINKFLAGS = ['$COMMON_LINKFLAGS'],  # for shared libs
    COMPONENT_LIBRARY_DIR = '$COMMON_OUTDIR/lib',
)

if env['MODE'] == 'dbg':
  env.Append(
      CPPDEFINES = [
          'DEBUG=1',
          '_DEBUG=1',
      ],
      M4FLAGS = '-DDEBUG=1',
  )
else:
  env.Append(
      CPPDEFINES = 'NDEBUG=1',
      M4FLAGS = '-DNDEBUG=1',
  )
if env['USING_CCTESTS']:
  env.Append(
      CPPDEFINES = 'USING_CCTESTS=1',
      M4FLAGS = '-DUSING_CCTESTS=1',
  )
if env['OFFICIAL_BUILD']:
  env.Append(
      CPPDEFINES = 'OFFICIAL_BUILD=1',
      M4FLAGS = '-DOFFICIAL_BUILD=1',
  )
if env['GEARS_STATIC_LIB']:
  env.Append(
      CPPDEFINES = 'GEARS_STATIC_LIB=1',
  )

# TODO: if USING_LIBPNG
env.Append(
    CPPDEFINES = [
        'PNG_USER_CONFIG',
        'CHROME_PNG_WRITE_SUPPORT',
    ]
)
if not env['GEARS_STATIC_LIB']:
  # If we're not linking with Chrome, don't prefix all the symbols with
  # webkit_.
  env.Append(CPPDEFINES = ['GEARS_PNG_BUILD'])


# TODO: if USING_ZLIB
env.Append(
    CPPDEFINES = [
        'NO_GZIP',
        'NO_GZCOMPRESS',
    ]
)
if env['OS'] == 'wince':
  env.Append(CPPDEFINES = 'NO_ERRNO_H')

# Languages

env['I18N_LANGS'] = [
    'en-US',
    'ar',
    'bg',
    'ca',
    'cs',
    'da',
    'de',
    'el',
    'en-GB',
    'es',
    'et',
    'fa',
    'fi',
    'fil',
    'fr',
    'he',
    'hi',
    'hr',
    'hu',
    'id',
    'is',
    'it',
    'ja',
    'ko',
    'lt',
    'lv',
    'ms',
    'nl',
    'no',
    'pl',
    'pt-BR',
    'pt-PT',
    'ro',
    'ru',
    'sk',
    'sl',
    'sr',
    'sv',
    'th',
    'tr',
    'uk',
    'ur',
    'vi',
    'zh-CN',
    'zh-TW',
    'ml',
    'te',
    'gu',
    'kn',
    'or',
    'bn',
    'ta',
    'mr',
]

# Platform-specific flags follow.

if env['OS'] in ['win32', 'wince']:
  env.Replace(ARFLAGS = [])
  env.Append(
      CPPDEFINES = [
          'STRICT',
          '_UNICODE',
          'UNICODE',
          '_USRDLL',
          'WIN32',
          '_WINDLL',
          '_CRT_SECURE_NO_DEPRECATE',
          'NOMINMAX',

# In VC8, the way to disable exceptions is to remove all /EH* flags, and to
# define _HAS_EXCEPTIONS=0 (for C++ headers) and _ATL_NO_EXCEPTIONS (for ATL).
          '_HAS_EXCEPTIONS=0',
          '_ATL_NO_EXCEPTIONS',
# Do not export UTF functions.
          'U_STATIC_IMPLEMENTATION',
      ],
# Static lib flags.
      ARFLAGS = [
          '/NOLOGO',
      ],
# Shared lib and exe flags.
      COMMON_LINKFLAGS = [
          '/NOLOGO',
          '/DEBUG',
          '/RELEASE',
          '/PDB:${TARGET.base}.pdb',
      ],
      SHLINKFLAGS = [
          '/DLL',
# Set the preferred base address.  This value was chosen because (a) it's near
# the top of the valid address range, and (b) it doesn't conflict with other
# DLLs loaded by Chrome in either the browser or plugin process.
          '/BASE:0x65000000',
      ],
      CPPFLAGS = [
          '/nologo',
          '/c',
          '/W3',
          '/WX',
          '/GR-',
          '/Fd"${TARGET.base}.pdb"',
      ],
      CXXFLAGS = [
          '/TP',
          '/J',
      ],
      CPPPATH = [
          '$VC80_CPPPATH',
          '$THIRD_PARTY_DIR/breakpad/src',
      ],
      CCPDBFLAGS = [
          '/Zi',  # TODO: Chrome defines /Z7, no idea what these are.
      ],
      LIBPATH = [
          '$VC80_LIBPATH',
      ],
  )
  if env['OS'] == 'win32':
    env.Append(
        CPPDEFINES = [
# We require APPVER=5.0 for things like HWND_MESSAGE.
# When APPVER=5.0, win32.mak in the Platform SDK sets:
#   C defines:  WINVER=0x0500
#               _WIN32_WINNT=0x0500
#               _WIN32_IE=0x0500
#               _RICHEDIT_VER=0x0010
#   RC defines: WINVER=0x0500
#   MIDL flags: /target NT50
# Note: _WIN32_WINDOWS was replaced by _WIN32_WINNT for post-Win95 builds.
# Note: XP_WIN is only used by Firefox headers
            '_WINDOWS',
            'WINVER=0x0500',
            '_WIN32_WINNT=0x0500',
            '_WIN32_IE=0x0500',
            '_RICHEDIT_VER=0x0010',
            '_MERGE_PROXYSTUB',
            'BREAKPAD_AVOID_STREAMS',
            'XP_WIN',
        ],
        ARFLAGS = [
            '/MACHINE:X86',
        ],
        COMMON_LINKFLAGS = [
            '/MACHINE:X86',
            '/NODEFAULTLIB:msvcrt',
# Flags for security hardening (only available for win32, not wince).
            '/DYNAMICBASE',
            '/SAFESEH',
        ],
        SHLINKFLAGS = [
# We only use /SUBSYSTEM on DLLs. For EXEs we omit the flag, and
# the presence of main() or WinMain() determines the subsystem.
            '/SUBSYSTEM:WINDOWS',
        ],
        VC80_CPPPATH = [
# TODO: switch over to Chrome's SDK.
# Note: these must come after $THIRD_PARTY_DIR/npapi because we want our own
# npapi.h to take precedence.
            '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80/files/include',
            '$PRIVATE_THIRD_PARTY_DIR/platformsdk_vc80/files/include',
            '$PRIVATE_THIRD_PARTY_DIR/vc_80/files/vc/include',
        ],
        VC80_LIBPATH = [
            '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80/files/lib',
            '$PRIVATE_THIRD_PARTY_DIR/platformsdk_vc80/files/lib',
            '$PRIVATE_THIRD_PARTY_DIR/vc_80/files/vc/lib',
        ],
    )
  else:  # OS=wince
    env.Append(
        CPPDEFINES = [
# For Windows Mobile we need:
#   C defines:  _WIN32_WCE=0x0501
#               _UNDER_CE=0x0501
            '_WIN32_WCE=0x501',
            'WINVER=_WIN32_WCE',
            'UNDER_CE=0x501',
            'OS_WINCE',
            'WIN32_PLATFORM_PSPC',
            'ARM',
            '_ARM_',
            'POCKETPC2003_UI_MODEL',
            '_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA',
            '_CE_CRT_ALLOW_WIN_MINMAX',
        ],
        ARFLAGS = [
            '/MACHINE:THUMB',
        ],
        COMMON_LINKFLAGS = [
            '/MACHINE:THUMB',
            '/NODEFAULTLIB:secchk.lib',
            '/NODEFAULTLIB:oldnames.lib',
        ],
        SHLINKFLAGS = [
            '/SUBSYSTEM:WINDOWSCE,5.01',
        ],
        VC80_CPPPATH = [
            '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80ce/files/include',
            '$PRIVATE_THIRD_PARTY_DIR/vc_80ce/files/include',
# Visual Studio must be setup before the PocketPC SDK.
            '$PRIVATE_THIRD_PARTY_DIR/pocketpc_sdk_ce_50/files/include/armv4i',
        ],
        VC80_LIBPATH = [
            '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80ce/files/lib/armv4i',
            '$PRIVATE_THIRD_PARTY_DIR/vc_80ce/files/lib/armv4i',
            '$PRIVATE_THIRD_PARTY_DIR/pocketpc_sdk_ce_50/files/lib/armv4i',
        ],
    )

  if env['MODE'] == 'dbg':
    env.Append(
        CPPFLAGS = [
          '/MTd',
        ],
    )
  else:  # MODE=opt
    env.Append(
        CPPFLAGS = [
          '/MT',
          '/O2',
        ],
        COMMON_LINKFLAGS = [
          '/INCREMENTAL:NO',
          '/OPT:REF',
          '/OPT:ICF',
        ],
    )
  if not env['GEARS_STATIC_LIB']:
    # Build with 2-byte wchar_t's only if we're building a DLL.  To link with
    # Chrome, we need 4-byte wchar_t.
    env.Append(
        CPPFLAGS = [
          '/Zc:wchar_t-',
        ],
    )
        
#--------------------------- LINUX ---------------------------
elif env['OS'] == 'linux':
  env.Append(
      CPPDEFINES = [
          'LINUX',
      ],
      CPPPATH = [
          '$THIRD_PARTY_DIR/gtk/include/gtk-2.0',
          '$THIRD_PARTY_DIR/gtk/include/atk-1.0',
          '$THIRD_PARTY_DIR/gtk/include/glib-2.0',
          '$THIRD_PARTY_DIR/gtk/include/pango-1.0',
          '$THIRD_PARTY_DIR/gtk/include/cairo',
          '$THIRD_PARTY_DIR/gtk/lib/gtk-2.0/include',
          '$THIRD_PARTY_DIR/gtk/lib/glib-2.0/include',
      ],
      CCFLAGS = [
          '-fPIC',
          '-fmessage-length=0',
          '-Wall',
          '-Werror',
# NS_LITERAL_STRING does not work properly without this compiler option
          '-fshort-wchar',
# Additions to compile on hardy
          '-Wno-unused-variable',
          '-Wno-missing-braces',
          '-Wno-address',
          '-m32',
      ],
      CXXFLAGS = [
          '-fno-exceptions',
          '-fno-rtti',
          '-Wno-non-virtual-dtor',
          '-Wno-ctor-dtor-privacy',
          '-funsigned-char',
          '-Wno-char-subscripts',
      ],
      COMMON_LINKFLAGS = [
          '-fPIC',
          '-Bsymbolic',
          '-pthread',
      ],
      SHLINKFLAGS = [
          '-shared',
          '-Wl,--version-script',
          '-Wl,$OPEN_DIR/tools/xpcom-ld-script',
# Additions to compile on hardy
          '-m32',
      ],
  )
  if env['MODE'] == 'dbg':
    env.Append(
      CPPFLAGS = [
          '-g',
          '-O0',
      ],
    )
  else:  # MODE=opt
    env.Append(
      CPPFLAGS = [
          '-O2',
      ],
    )
#--------------------------- OSX ---------------------------
elif env['OS'] == 'osx':
# Gears uses the 10.4 SDK, so we need to build with g++-4.0.
# Chrome uses g++-4.2 so we override this here.
  env['CC'] = 'gcc-4.0'
  env['CXX'] = 'g++-4.0'
# Compile assembly files with the same command line as C files.
  env['ASCOM'] = '$CCCOM'
  
  env.Append(OSX_SDK_ROOT = '/Developer/SDKs/MacOSX10.4u.sdk')

  env.Append(
      CPPDEFINES = [
          'OSX',
          'OS_MACOSX',
# for breakpad
          'USE_PROTECTED_ALLOCATIONS=1',
      ],
      CPPPATH = [
# Breakpad assumes it is in the include path
          '$THIRD_PARTY_DIR/breakpad_osx/src',
      ],
      CCFLAGS = [
           '-mmacosx-version-min=10.4',
          ('-arch', 'ppc'),
          ('-arch', 'i386'),
          '-fPIC',
          '-fmessage-length=0',
# TODO
#          '-Wall',
# NS_LITERAL_STRING does not work properly without this compiler option
          '-fshort-wchar',
          '-fvisibility=hidden',
# Breakpad on OSX needs debug symbols to use the STABS format, rather than the
# default DWARF debug symbols format. Note that we enable gstabs for debug &
# opt; we strip them later in opt.
          '-gstabs+',
      ],
      CXXFLAGS = [
          '-fvisibility-inlines-hidden',
          '-fno-exceptions',
          '-fno-rtti',
          ('-Wall',
           '-Wno-non-virtual-dtor',
           '-Wno-ctor-dtor-privacy',
           '-Wno-char-subscripts',
# When a function is deprecated in gcc, it stupidly warns about all functions
# and member functions that have the same name, regardless of signature.
# Example: Standard osx headers deprecate 'SetPort', which causes a warning for
# url_canon::Replacements::SetPort().
           '-Wno-deprecated-declarations',
          ),
          '-funsigned-char',
          ('-include', env.File('#/$OPEN_DIR/base/safari/prefix_header.h').abspath),
          ('-isysroot', '$OSX_SDK_ROOT')
      ],
      COMMON_LINKFLAGS = [
           '-mmacosx-version-min=10.4',
           '-fPIC',
           '-Bsymbolic',
           ('-arch', 'ppc'),
           ('-arch', 'i386'),
           ('-isysroot', '$OSX_SDK_ROOT'),
           '-Wl,-dead_strip',
      ],
      SHLINKFLAGS = [
          '-bundle',  # DLLFLAGS
      ],
      FRAMEWORKS = [
          'Carbon',
          'CoreServices',
          'Cocoa',
          'WebKit',
      ],
      M4FLAGS = [
          '-DGEARS_ENABLER_PATH="$SF_INPUTMANAGER_BUNDLE"',
          '-DGEARS_PLUGIN_PATH="$SF_PLUGIN_PROXY_BUNDLE"',
          '-DGEARS_INSTALLER_OUT_DIR="$INSTALLER_OUTDIR/Safari"',

          # Keystone
          '-DKEYSTONE_BASE_DIR="$MAIN_DIR/$PRIVATE_THIRD_PARTY_DIR/googlemac/Releases/Keystone/"',
          '-DGEARS_INSTALLER_PACKAGE="$SF_INSTALLER_PKG"',
          '-DGEARS_GENFILES_DIR="$SF_OUTDIR/genfiles"',
          '-DGEARS_TOOLS_DIR="$MAIN_DIR/$PRIVATE_DIR/tools"',
      ],
  )
  if env['MODE'] == 'dbg':
    env.Append(
        CPPFLAGS = [
            '-g',
            '-O0',
        ],
    )
  else:  # MODE=opt
    env.Append(
        CPPFLAGS = [
            '-O2',
        ],
    )
#--------------------------- ANDROID ---------------------------
elif env['OS'] == 'android':
  if not os.environ['ANDROID_BUILD_TOP']:
    print ("Please set ANDROID_BUILD_TOP to the top"
           " level of your Android source.")
    Return()

  if not os.environ['ANDROID_TOOLCHAIN']:
    print ("Cannot determine location of the target toolchain."
           " Please set ANDROID_TOOLCHAIN manually.")
    Return()

  env['ANDROID_BUILD_TOP'] = os.environ['ANDROID_BUILD_TOP']

  # Figure out the cross-compile prefix by finding the *-gcc executable
  # and taking the '*' as the prefix for the rest.
  cross_prefix_command = os.popen(
    r"ls %s/*-gcc | sed 's|\(.*/.*\-\)gcc|\1|g'" %
    os.environ['ANDROID_TOOLCHAIN'])
  cross_prefix = cross_prefix_command.read().strip()
  if cross_prefix_command.close() != None:
    Return()

  # Find the output directory. Assume the only target output directory.
  product_out_command = os.popen("ls %s/out/target/product/*" %
                                 os.environ['ANDROID_BUILD_TOP'])
  product_out = product_out_command.read().strip()
  if product_out_command.close() != None:
    Return()

  env['CC'] = cross_prefix + 'gcc'
  env['CXX'] = cross_prefix + 'g++'

  env.Append(
      CPPPATH = [
          '$OPEN_DIR/base/android',
          '$THIRD_PARTY_DIR/stlport/stlport',
          '$THIRD_PARTY_DIR/stlport/stlport/stl',
          '$THIRD_PARTY_DIR/stlport/stlport/stl/config',
          '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include',
          '$ANDROID_BUILD_TOP/include',
          '$ANDROID_BUILD_TOP/include/nativehelper',
          '$ANDROID_BUILD_TOP/system',
          '$ANDROID_BUILD_TOP/system/bionic/include',
          '$ANDROID_BUILD_TOP/system/bionic/arch-arm/include',
          '$ANDROID_BUILD_TOP/system/kernel_headers',
          '$ANDROID_BUILD_TOP/system/bionic/kernel/arch-arm',
          '$ANDROID_BUILD_TOP/system/bionic/kernel/common',
          '$ANDROID_BUILD_TOP/system/libm/include ',
          '$ANDROID_BUILD_TOP/bionic',
          '$ANDROID_BUILD_TOP/bionic/libc/include',
          '$ANDROID_BUILD_TOP/bionic/libc/arch-arm',
          '$ANDROID_BUILD_TOP/bionic/libc/arch-arm/include',
          '$ANDROID_BUILD_TOP/bionic/libc/kernel/arch-arm',
          '$ANDROID_BUILD_TOP/bionic/libc/kernel/common',
          '$ANDROID_BUILD_TOP/bionic/libm/include',
          '$ANDROID_BUILD_TOP/dalvik/libnativehelper/include',
          '$ANDROID_BUILD_TOP/extlibs',
          '$ANDROID_BUILD_TOP/extlibs/icu4c-3.8/common',
          '$ANDROID_BUILD_TOP/extlibs/icu4c-3.8/i18n',
          '$ANDROID_BUILD_TOP/extlibs/jpeg-6b',
          '$ANDROID_BUILD_TOP/extlibs/sqlite',
          '$ANDROID_BUILD_TOP/extlibs/zlib-1.2.3',
          '$ANDROID_BUILD_TOP/external',
          '$ANDROID_BUILD_TOP/external/icu4c/common',
          '$ANDROID_BUILD_TOP/external/icu4c/i18n',
          '$ANDROID_BUILD_TOP/external/jpeg',
          '$ANDROID_BUILD_TOP/external/sqlite/dist',
          '$ANDROID_BUILD_TOP/external/zlib',
          '$ANDROID_BUILD_TOP/frameworks/base/include',
          '$ANDROID_BUILD_TOP/system/core/include',
      ],
      CPPFLAGS = [
          '-g',
          '-c',
          '-fPIC',
          '-fmessage-length=0',
          '-Wall',
          '-fvisibility=hidden',
# NS_LITERAL_STRING does not work properly without this compiler option
          '-fshort-wchar',
          '-funsigned-char',
          '-march=armv5te',
          '-mtune=xscale',
          '-mthumb-interwork',
          '-ffunction-sections',
          '-fdata-sections',
          '-fno-exceptions',
      ],
      CXXFLAGS = [
          '-fno-rtti',
          '-fvisibility-inlines-hidden',
          '-Wno-non-virtual-dtor',
          '-Wno-ctor-dtor-privacy',
      ],
      CPPDEFINES = [
          'OS_ANDROID',
          'ANDROID',
          'TARGET_OS=android',
          'BUILD_OSNAME=android',
          'OSNAME=android',
          'COMPILER_NAME=gcc',
          '__SGI_STL_INTERNAL_PAIR_H',
          '_CPP_UTILITY',
          '_LITTLE_ENDIAN=1234',
          '_BIG_ENDIAN=4321',
          '_PDP_ENDIAN=3412',
          '_BYTE_ORDER=_LITTLE_ENDIAN',
      ],
      COMMON_LINKFLAGS = [
          '-g',
          '-fPIC',
          '-Bsymbolic',
          '-nostdlib',
      ],
      SHLINKFLAGS = [
          '-shared',
          '-Wl,--gc-sections',
          '-L$ANDROID_PRODUCT_OUT/system/lib',
# Workaround for the Android C library not implementing
# __aeabi_atexit, which is used to destruct static C++ objects.  This
# causes all calls to be rewritten by the linker to
# __wrap___aeabi_atexit, which we then implement.
          '-Wl,--wrap,__aeabi_atexit',
      ],
  )
  if env['MODE'] == 'dbg':
    env.Append(
      CPPFLAGS = [
          '-g',
          '-O',
          '-funwind-tables',
          '-mapcs-frame',
      ],
    )
  else:  # MODE=opt
    env.Append(
      CPPFLAGS = [
          '-O2',
          '-mthumb',
          '-fomit-frame-pointer',
      ],
    )

# Custom builder to work around a scons and/or hammer bug.  ComponentLibrary
# tries to install the library to COMPONENT_LIBRARY_DIR, but since we overrode
# that value, scons gets confused.  I'm not sure who is at fault here.
# See http://code.google.com/p/chromium/issues/detail?id=4177.
def GearsStaticLibrary(env, *args, **kw):
  lib = env.ChromeLibrary(*args, **kw)
  env.Install('$COMPONENT_LIBRARY_DIR', lib[0])
  return lib
env.AddMethod(GearsStaticLibrary)

# Load all the components

sconscripts = [
    'SConscript.googleurl',
    'SConscript.libjpeg',
    'SConscript.libpng',
    'SConscript.libmozjs',
    'SConscript.sqlite',
    'SConscript.zlib',
    'SConscript.libbreakpad_osx',
    'SConscript.libgd',
]

for each in sconscripts:
  env.SConscript(each,
                 exports=['env'],
                 variant_dir='$COMMON_OUTDIR',
                 duplicate=0)

# Order of execution is important here.  Each sub-script adds to the
# environment, for use by later scripts.
env = env.SConscript('SConscript.inputs', exports=['env'])

outputs = env.SConscript('SConscript.common',
               exports=['env'],
               variant_dir='$COMMON_OUTDIR',
               duplicate=0)
env.Append(**outputs)

browsers = [env['BROWSER']]
if browsers[0] == 'all':
  browsers = env['VALID_BROWSERS']
print 'Building:', browsers

# We run the browser script once for each browser target we want to build.
# Each script adds variables to the environment in the form of
# '${BROWSER}_foo = bar' for use by the installers script.
for each in browsers:
  env.Replace(BROWSER = each)
  outputs = env.SConscript('SConscript.browser',
                 exports=['env'],
                 variant_dir='$BROWSER_OUTDIR',
                 duplicate=0)
  browser_outputs = {}
  for key, value in outputs.iteritems():
    browser_outputs[each + '_' + key] = value
  env.Append(**browser_outputs)

# Note: even though the installers write to $INSTALLER_OUTDIR, they need to
# read files from other dirs, so we give them a variant_dir at the toplevel.
env.SConscript('SConscript.installers',
               exports=['env'],
               variant_dir='$BASE_OUTDIR',
               duplicate=0)

env.Alias('gears-installers', 'gears')
