| # 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') |