blob: 3d16d3e08eece7c77273591995711272a8b12872 [file] [log] [blame]
# 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')