I tried running the browser in Purify and the browser crashed on me.
[chromium-blink-merge.git] / gears / SConscript
blobacf07231829e792d9ae5ef0fb68bbd0176f7e6bf
1 # Copyright (c) 2008 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 # Notes:
6 # This is the main Gears SConscript file.  From here, we include sub-scripts
7 # that handle building various targets (third party libs, common exes, the
8 # browser plugins themselves, and installers).  Some sub-scripts return a
9 # dictionary of variables to be appended to the environment, so other
10 # sub-scripts can use them.
12 # To check out the Gears sources, you need to make sure this directory is in
13 # your .gclient file, so its DEPS get processed.  Example:
14 #   { "name"        : "src/gears",
15 #     "url"         : "svn://chrome-svn/chrome/trunk/src/gears",
16 #   },
18 # This is a work-in-progress conversion of the current Gears set of Makefiles.
19 # A lot of the stuff doesn't translate to SCons-land well, and I'm not sure
20 # how faithful we want to be to the original.
22 # Questions:
23 # Should we flatten the output directory into
24 # Hammer/gears/platform/browser/*.obj like Gears does now?  If so, how?
26 # Notes to self:
27 # - os.path.abspath('.') (the CWD) is variant_dir if it exists, else it's the
28 # toplevel_dir (which contains the SConstruct).
29 # - env.Entry('.') is the entry representing the variant_dir.
30 # - env.Entry('#') is the entry representing the toplevel_dir.
31 # - str(entry) gives the path relative to variant_dir, or abspath if the entry
32 # is outside the variant_dir.
33 # - entry.path gives the path relative to toplevel_dir.
34 # - entry.abspath gives the absolute path.
36 import os
38 Import('env')
40 env = env.Clone(
41     OPEN_DIR = "gears",
42     PRIVATE_DIR = "gears_internal",
43     THIRD_PARTY_DIR = "third_party",
44     PRIVATE_THIRD_PARTY_DIR = "third_party_internal",
47 if not os.path.exists(env.Dir('#/$OPEN_DIR').abspath):
48   print 'Skipping Gears build: no perforce tree checked out.'
49   Return()
51 # Argument switches
53 # TODO: how do we detect linux vs osx?
54 os_guess = env['PLATFORM']
55 if os_guess == 'posix':
56   os_guess = 'linux'
57 elif os_guess == 'darwin':
58   os_guess = 'osx'
60 # Map of OS -> valid browser targets for that OS.
61 os_browsers_map = {
62     'win32': ['IE', 'FF2', 'FF3', 'NPAPI'],
63     'wince': ['IE'],
64     'linux': ['FF2', 'FF3'],
65     'osx': ['SF', 'FF2', 'FF3'],
66     'android': ['NPAPI'],
67     'symbian': ['NPAPI'],
70 vars = Variables(None, ARGUMENTS)
71 vars.AddVariables(
72     EnumVariable('OS',
73         'Which OS is the target', os_guess, os_browsers_map.keys()),
74     EnumVariable('MODE',
75         'Type of binary to generate', 'dbg', ['dbg', 'opt']),
76     BoolVariable('OFFICIAL_BUILD',
77         'Create a binary suitable for public release', 0)
79 vars.Update(env)
81 env['VALID_BROWSERS'] = os_browsers_map[env['OS']]
83 # Add BROWSER last, since its valid inputs depend on $OS.
84 vars.Add(
85     EnumVariable('BROWSER',
86         'Which browser we want to build the plugin for.  "all" builds all '
87         'browsers for this OS.',
88         'all', env['VALID_BROWSERS'] + ['all']))
89 vars.Update(env)
91 env.Replace(
92     USING_CCTESTS = (env['MODE'] == 'dbg' or not env['OFFICIAL_BUILD'])
95 # Version
96 env.Replace(
97     MAJOR = '0',
98     MINOR = '5',
99     BUILD = '2',
100     PATCH = '6',
101     VERSION = '${MAJOR}.${MINOR}.${BUILD}.${PATCH}',
103     FRIENDLY_NAME = 'Google Gears',
104     SHORT_NAME = 'gears',
107 # Platform
108 # TODO: Symbian builds will override this value.
109 # For other platforms we set just one value.
110 if env['OS'] in ['wince', 'android']:
111   env.Replace(ARCH = 'arm')
112 elif env['OS'] == 'osx':
113   # On OSX we build a fat binary.
114   env.Replace(ARCH = 'i386+ppc')
115 else:
116   env.Replace(ARCH = 'i386')
118 # Output dirs
119 env.Replace(
120     BASE_OUTDIR = '$GEARS_DIR/$OS-$ARCH-$MODE',
121     COMMON_OUTDIR = '$BASE_OUTDIR/common',
122     BROWSER_OUTDIR = '$BASE_OUTDIR/${BROWSER.lower()}',
123     IE_OUTDIR = '$BASE_OUTDIR/ie',
124     FF2_OUTDIR = '$BASE_OUTDIR/ff2',
125     FF3_OUTDIR = '$BASE_OUTDIR/ff3',
126     NPAPI_OUTDIR = '$BASE_OUTDIR/npapi',
127     SF_OUTDIR = '$BASE_OUTDIR/sf',
129     GENFILES_DIR = "$BROWSER_OUTDIR/genfiles",
130     COMMON_GENFILES_DIR = "$COMMON_OUTDIR/genfiles",
132     INSTALLER_OUTDIR = '$BASE_OUTDIR/installers',
135 # Outputs
136 env.Replace(
137     INSTALLER_BASENAME = 'gears-${OS}-${MODE}-${VERSION}',
139     FF_XPI = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.xpi',
140     WIN32_INSTALLER_MSI = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.msi',
141     WINCE_INSTALLER_CAB = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.cab',
142     # Keyston SF Metapackage installer, bundled with Keystone as part of a
143     # DMG.
144     SF_KEYSTONE_INSTALLER_DMG = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.dmg',
145     SF_KEYSTONE_INSTALLER_MPKG = '$INSTALLER_OUTDIR/Safari/${FRIENDLY_NAME}.mpkg',
147     SF_INSTALLER_PLUGIN_BUNDLE = '$INSTALLER_OUTDIR/Safari/StatsPane.bundle',
148     SF_PLUGIN_BUNDLE = '$INSTALLER_OUTDIR/Safari/Gears.bundle',
149     SF_PLUGIN_PROXY_BUNDLE = '$INSTALLER_OUTDIR/Safari/Gears.plugin',
150     SF_INPUTMANAGER_BUNDLE = '$INSTALLER_OUTDIR/Safari/GearsEnabler',
151     SF_INSTALLER_PKG = '$INSTALLER_OUTDIR/Safari/Gears.pkg',
154 # Library flags
155 env.Replace(
156     MOZJS_INCLUDE_PATHS = [
157         '$MOZJS_DIR',
158         '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include',
159         '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include/private',
160         '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include/obsolete',
161         '$OSX_SDK_ROOT/Developer/Headers/FlatCarbon/',
162     ],
163     MOZJS_DIR = '$THIRD_PARTY_DIR/spidermonkey',
166 # Add our tools to the PATH.
167 if env['OS'] in ['win32', 'wince']:
168   if os.path.exists(env.Dir('#/$PRIVATE_THIRD_PARTY_DIR').abspath):
169     # Clear out our environment so we don't accidentally use the system's
170     # libs.
171     env['ENV']['PATH'] = ''
172     env['ENV']['LIB'] = ''
173     env['ENV']['INCLUDE'] = ''
175     paths = []
177     # Keep system32 for 'xcopy'.
178     paths += [env.subst('${ENV["SYSTEMROOT"]}/system32')]
179     if env['OS'] == 'win32':
180       env.Append(
181           VC80 = env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/vc_80/files').abspath)
182       paths += [
183           env.subst('$VC80/common7/ide'),
184           env.subst('$VC80/vc/bin'),
185           env.subst('$VC80/common7/tools'),
186           env.subst('$VC80/common7/tools/bin'),
187           env.subst('$VC80/team_tools/performance_tools'),
188       ]
189     else:  # wince
190       env.Append(
191           VC80 = env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/vc_80ce/files').abspath)
192       paths += [
193           env.subst('$VC80/bin/x86_arm'),
194           env.subst('$VC80/common7/ide'),
195           env.subst('$VC80/common7/tools'),
196           env.subst('$VC80/common7/tools/bin'),
197           env.subst('$VC80/vc/bin'),
198           env.subst('$VC80/smartdevices/sdktools'),
199       ]
201     paths += [
202         env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/wix/v3_0_2925/files').abspath]
204     paths += [env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/gnu/files').abspath]
205     paths += [env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/python_24').abspath]
207     # Prepend them so our tools come first.
208     for each in reversed(paths):
209       env.PrependENVPath('PATH', each)
210   else:
211     # If we don't have a private third_party dir, we expect the system
212     # environment to be set up correctly to point to tool paths.
213     env['ENV']['PATH'] = os.environ['PATH']
214     env['ENV']['LIB'] = os.environ['LIB']
215     env['ENV']['INCLUDE'] = os.environ['INCLUDE']
217   mtcom = 'echo Manifest creation disabled, since it breaks a lot.'
218   env['MANIFEST_COM'] = mtcom
219   env['SHMANIFEST_COM'] = mtcom
221 # Building M4 files
222 env.Tool('m4')
224 env.Append(
225     M4ARCH = (env['ARCH'] == 'i386' and 'x86' or '$ARCH'),
226     M4FLAGS = [
227         '--prefix-builtins',
228         '-DPRODUCT_VERSION=$VERSION',
229         '-DPRODUCT_VERSION_MAJOR=$MAJOR',
230         '-DPRODUCT_VERSION_MINOR=$MINOR',
231         '-DPRODUCT_VERSION_BUILD=$BUILD',
232         '-DPRODUCT_VERSION_PATCH=$PATCH',
233         '-DPRODUCT_OS=$OS',
234         '-DPRODUCT_ARCH="$M4ARCH"',
235         '-DPRODUCT_GCC_VERSION="gcc3"',
236         '-DPRODUCT_MAINTAINER="google"',
237         '-DPRODUCT_FRIENDLY_NAME_UQ="$FRIENDLY_NAME"',
238         '-DPRODUCT_SHORT_NAME_UQ="$SHORT_NAME"',
239         '-DI18N_LANGUAGES="(${",".join(I18N_LANGS)})"',
240     ],
241     M4PATH = [
242         '$OPEN_DIR',
243         '.',
244     ],
247 # SCons magic to make M4PATH work.
248 env.Replace(
249     M4INCPREFIX = '-I',
250     M4INCSUFFIX = '',
251     _M4INCFLAGS = ('${_concat(M4INCPREFIX, M4PATH, M4INCSUFFIX, '
252                  '__env__, RDirs, TARGET, SOURCE)}'),
253     M4COM = '$M4 $M4FLAGS ${_M4INCFLAGS} $SOURCE > $TARGET',
256 # TODO: Dependency scanner for m4 files - doesn't work.  It can't detect files
257 # that don't exist!
258 #m4_include_re = re.compile(r'm4_include\((.*)\)', re.M)
259 #def m4_scan(node, env, path):
260 #  contents = node.get_contents()
261 #  includes = m4_include_re.findall(contents)
262 #  ret_includes = []
263 #  for include in includes:
264 #    for dir in path:
265 #      file = os.path.join(dir, include)
266 #      if os.path.exists(file):
267 #        ret_includes.append(file)
268 #        break
269 #  return ret_includes
271 #m4_scanner = Scanner(function = m4_scan, skeys = ['.m4', '.html_m4'])
272 #env.Append(SCANNERS = m4_scanner)
275 # OS X Iceberg package builder
277 env.Replace(ICEBERG = '/usr/local/bin/freeze')
278 if env.WhereIs('$ICEBERG'):
279   env.Replace(ICEBERGCOM = '"$ICEBERG" -v $SOURCE')
280 else:
281   env.Replace(ICEBERGCOM =
282       'echo To create a Safari installer for Gears, you must install Iceberg'
283       ' from http://s.sudre.free.fr/Software/Iceberg.html.  You can install'
284       ' the Safari version manually by running the'
285       ' $OPEN_DIR/tools/osx/install_gears.sh script.')
287 iceberg_builder = Builder(action = '$ICEBERGCOM',
288     suffix = '.pkg', src_suffix = '.packproj')
289 env.Append(BUILDERS = {'Iceberg': iceberg_builder})
292 # C++ build flags.
294 # Clear out the inherited defines from Chrome's build.  I want to match Gears'
295 # current build as closely as possible until we switch everyone to SCons, then
296 # gradually integrate.
297 env.Replace(
298     CPPPATH = [
299         '$OPEN_DIR',
300         '$OPEN_DIR/..',
301         '$THIRD_PARTY_DIR',
302         '$THIRD_PARTY_DIR/googleurl',
303         '$THIRD_PARTY_DIR/npapi',
304         '$THIRD_PARTY_DIR/zlib',
305         '$THIRD_PARTY_DIR/v8/bindings_local',
306         '.',
307         '$COMMON_OUTDIR',
308     ],
309     CFLAGS = [],
310     CCFLAGS = [],
311     CXXFLAGS = [],
312     CCPDBFLAGS = [],
313     CPPDEFINES = [
314     # SpiderMonkey (the Firefox JS engine)'s JS_GET_CLASS macro in jsapi.h needs
315     # this defined to work with the gecko SDK that we've built.
316     # The definition of JS_THREADSAFE must be kept in sync with MOZJS_CPPFLAGS.
317         'JS_THREADSAFE'
318     ],
319     FRAMEWORKPATH = [],
320     FRAMEWORKS = [],
321     LIBS = [],
322     LIBPATH = ['$COMPONENT_LIBRARY_DIR'],
323     COMMON_LINKFLAGS = [],  # for both executables and shared libs
324     LINKFLAGS = ['$COMMON_LINKFLAGS'],  # for executables
325     SHLINKFLAGS = ['$COMMON_LINKFLAGS'],  # for shared libs
326     COMPONENT_LIBRARY_DIR = '$COMMON_OUTDIR/lib',
329 if env['MODE'] == 'dbg':
330   env.Append(
331       CPPDEFINES = [
332           'DEBUG=1',
333           '_DEBUG=1',
334       ],
335       M4FLAGS = '-DDEBUG=1',
336   )
337 else:
338   env.Append(
339       CPPDEFINES = 'NDEBUG=1',
340       M4FLAGS = '-DNDEBUG=1',
341   )
342 if env['USING_CCTESTS']:
343   env.Append(
344       CPPDEFINES = 'USING_CCTESTS=1',
345       M4FLAGS = '-DUSING_CCTESTS=1',
346   )
347 if env['OFFICIAL_BUILD']:
348   env.Append(
349       CPPDEFINES = 'OFFICIAL_BUILD=1',
350       M4FLAGS = '-DOFFICIAL_BUILD=1',
351   )
353 # TODO: if USING_PNG
354 env.Append(CPPDEFINES = 'PNG_USER_CONFIG')
355 # TODO: if USING_ZLIB
356 env.Append(
357     CPPDEFINES = [
358         'NO_GZIP',
359         'NO_GZCOMPRESS',
360     ]
362 if env['OS'] == 'wince':
363   env.Append(CPPDEFINES = 'NO_ERRNO_H')
365 # Languages
367 env['I18N_LANGS'] = [
368     'en-US',
369     'ar',
370     'bg',
371     'ca',
372     'cs',
373     'da',
374     'de',
375     'el',
376     'en-GB',
377     'es',
378     'et',
379     'fa',
380     'fi',
381     'fil',
382     'fr',
383     'he',
384     'hi',
385     'hr',
386     'hu',
387     'id',
388     'is',
389     'it',
390     'ja',
391     'ko',
392     'lt',
393     'lv',
394     'ms',
395     'nl',
396     'no',
397     'pl',
398     'pt-BR',
399     'pt-PT',
400     'ro',
401     'ru',
402     'sk',
403     'sl',
404     'sr',
405     'sv',
406     'th',
407     'tr',
408     'uk',
409     'ur',
410     'vi',
411     'zh-CN',
412     'zh-TW',
413     'ml',
414     'te',
415     'gu',
416     'kn',
417     'or',
418     'bn',
419     'ta',
420     'mr',
423 # Platform-specific flags follow.
425 if env['OS'] in ['win32', 'wince']:
426   env.Replace(ARFLAGS = [])
427   env.Append(
428       CPPDEFINES = [
429           'STRICT',
430           '_UNICODE',
431           'UNICODE',
432           '_USRDLL',
433           'WIN32',
434           '_WINDLL',
435           '_CRT_SECURE_NO_DEPRECATE',
436           'NOMINMAX',
438 # In VC8, the way to disable exceptions is to remove all /EH* flags, and to
439 # define _HAS_EXCEPTIONS=0 (for C++ headers) and _ATL_NO_EXCEPTIONS (for ATL).
440           '_HAS_EXCEPTIONS=0',
441           '_ATL_NO_EXCEPTIONS',
442 # Do not export UTF functions.
443           'U_STATIC_IMPLEMENTATION',
444       ],
445 # Static lib flags.
446       ARFLAGS = [
447           '/NOLOGO',
448       ],
449 # Shared lib and exe flags.
450       COMMON_LINKFLAGS = [
451           '/NOLOGO',
452           '/DEBUG',
453           '/RELEASE',
454           '/PDB:${TARGET.base}.pdb',
455       ],
456       SHLINKFLAGS = [
457           '/DLL',
458 # Set the preferred base address.  This value was chosen because (a) it's near
459 # the top of the valid address range, and (b) it doesn't conflict with other
460 # DLLs loaded by Chrome in either the browser or plugin process.
461           '/BASE:0x65000000',
462       ],
463       CPPFLAGS = [
464           '/nologo',
465           '/Zc:wchar_t-',
466           '/c',
467           '/W3',
468           '/WX',
469           '/GR-',
470           '/Fd"${TARGET.base}.pdb"',
471       ],
472       CXXFLAGS = [
473           '/TP',
474           '/J',
475       ],
476       CPPPATH = [
477           '$VC80_CPPPATH',
478           '$THIRD_PARTY_DIR/breakpad/src',
479       ],
480       CCPDBFLAGS = [
481           '/Zi',  # TODO: Chrome defines /Z7, no idea what these are.
482       ],
483       LIBPATH = [
484           '$VC80_LIBPATH',
485       ],
486   )
487   if env['OS'] == 'win32':
488     env.Append(
489         CPPDEFINES = [
490 # We require APPVER=5.0 for things like HWND_MESSAGE.
491 # When APPVER=5.0, win32.mak in the Platform SDK sets:
492 #   C defines:  WINVER=0x0500
493 #               _WIN32_WINNT=0x0500
494 #               _WIN32_IE=0x0500
495 #               _RICHEDIT_VER=0x0010
496 #   RC defines: WINVER=0x0500
497 #   MIDL flags: /target NT50
498 # Note: _WIN32_WINDOWS was replaced by _WIN32_WINNT for post-Win95 builds.
499 # Note: XP_WIN is only used by Firefox headers
500             '_WINDOWS',
501             'WINVER=0x0500',
502             '_WIN32_WINNT=0x0500',
503             '_WIN32_IE=0x0500',
504             '_RICHEDIT_VER=0x0010',
505             '_MERGE_PROXYSTUB',
506             'BREAKPAD_AVOID_STREAMS',
507             'XP_WIN',
508         ],
509         ARFLAGS = [
510             '/MACHINE:X86',
511         ],
512         COMMON_LINKFLAGS = [
513             '/MACHINE:X86',
514             '/NODEFAULTLIB:msvcrt',
515 # Flags for security hardening (only available for win32, not wince).
516             '/DYNAMICBASE',
517             '/SAFESEH',
518         ],
519         SHLINKFLAGS = [
520 # We only use /SUBSYSTEM on DLLs. For EXEs we omit the flag, and
521 # the presence of main() or WinMain() determines the subsystem.
522             '/SUBSYSTEM:WINDOWS',
523         ],
524         VC80_CPPPATH = [
525 # TODO: switch over to Chrome's SDK.
526 # Note: these must come after $THIRD_PARTY_DIR/npapi because we want our own
527 # npapi.h to take precedence.
528             '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80/files/include',
529             '$PRIVATE_THIRD_PARTY_DIR/platformsdk_vc80/files/include',
530             '$PRIVATE_THIRD_PARTY_DIR/vc_80/files/vc/include',
531         ],
532         VC80_LIBPATH = [
533             '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80/files/lib',
534             '$PRIVATE_THIRD_PARTY_DIR/platformsdk_vc80/files/lib',
535             '$PRIVATE_THIRD_PARTY_DIR/vc_80/files/vc/lib',
536         ],
537     )
538   else:  # OS=wince
539     env.Append(
540         CPPDEFINES = [
541 # For Windows Mobile we need:
542 #   C defines:  _WIN32_WCE=0x0501
543 #               _UNDER_CE=0x0501
544             '_WIN32_WCE=0x501',
545             'WINVER=_WIN32_WCE',
546             'UNDER_CE=0x501',
547             'OS_WINCE',
548             'WIN32_PLATFORM_PSPC',
549             'ARM',
550             '_ARM_',
551             'POCKETPC2003_UI_MODEL',
552             '_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA',
553             '_CE_CRT_ALLOW_WIN_MINMAX',
554         ],
555         ARFLAGS = [
556             '/MACHINE:THUMB',
557         ],
558         COMMON_LINKFLAGS = [
559             '/MACHINE:THUMB',
560             '/NODEFAULTLIB:secchk.lib',
561             '/NODEFAULTLIB:oldnames.lib',
562         ],
563         SHLINKFLAGS = [
564             '/SUBSYSTEM:WINDOWSCE,5.01',
565         ],
566         VC80_CPPPATH = [
567             '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80ce/files/include',
568             '$PRIVATE_THIRD_PARTY_DIR/vc_80ce/files/include',
569 # Visual Studio must be setup before the PocketPC SDK.
570             '$PRIVATE_THIRD_PARTY_DIR/pocketpc_sdk_ce_50/files/include/armv4i',
571         ],
572         VC80_LIBPATH = [
573             '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80ce/files/lib/armv4i',
574             '$PRIVATE_THIRD_PARTY_DIR/vc_80ce/files/lib/armv4i',
575             '$PRIVATE_THIRD_PARTY_DIR/pocketpc_sdk_ce_50/files/lib/armv4i',
576         ],
577     )
579   if env['MODE'] == 'dbg':
580     env.Append(
581         CPPFLAGS = [
582           '/MTd',
583         ],
584     )
585   else:  # MODE=opt
586     env.Append(
587         CPPFLAGS = [
588           '/MT',
589           '/O2',
590         ],
591         COMMON_LINKFLAGS = [
592           '/INCREMENTAL:NO',
593           '/OPT:REF',
594           '/OPT:ICF',
595         ],
596     )
597 #--------------------------- LINUX ---------------------------
598 elif env['OS'] == 'linux':
599   env.Append(
600       CPPDEFINES = [
601           'LINUX',
602       ],
603       CPPPATH = [
604           '$THIRD_PARTY_DIR/gtk/include/gtk-2.0',
605           '$THIRD_PARTY_DIR/gtk/include/atk-1.0',
606           '$THIRD_PARTY_DIR/gtk/include/glib-2.0',
607           '$THIRD_PARTY_DIR/gtk/include/pango-1.0',
608           '$THIRD_PARTY_DIR/gtk/include/cairo',
609           '$THIRD_PARTY_DIR/gtk/lib/gtk-2.0/include',
610           '$THIRD_PARTY_DIR/gtk/lib/glib-2.0/include',
611       ],
612       CCFLAGS = [
613           '-fPIC',
614           '-fmessage-length=0',
615           '-Wall',
616           '-Werror',
617 # NS_LITERAL_STRING does not work properly without this compiler option
618           '-fshort-wchar',
619 # Additions to compile on hardy
620           '-Wno-unused-variable',
621           '-Wno-missing-braces',
622           '-Wno-address',
623           '-m32',
624       ],
625       CXXFLAGS = [
626           '-fno-exceptions',
627           '-fno-rtti',
628           '-Wno-non-virtual-dtor',
629           '-Wno-ctor-dtor-privacy',
630           '-funsigned-char',
631           '-Wno-char-subscripts',
632       ],
633       COMMON_LINKFLAGS = [
634           '-fPIC',
635           '-Bsymbolic',
636           '-pthread',
637       ],
638       SHLINKFLAGS = [
639           '-shared',
640           '-Wl,--version-script',
641           '-Wl,$OPEN_DIR/tools/xpcom-ld-script',
642 # for PortAudio: need pthread and math
643           '-lpthread',
644           '-lm',
645 # Additions to compile on hardy
646           '-m32',
647       ],
648   )
649   if env['MODE'] == 'dbg':
650     env.Append(
651       CPPFLAGS = [
652           '-g',
653           '-O0',
654       ],
655     )
656   else:  # MODE=opt
657     env.Append(
658       CPPFLAGS = [
659           '-O2',
660       ],
661     )
662 #--------------------------- OSX ---------------------------
663 elif env['OS'] == 'osx':
664 # Gears uses the 10.4 SDK, so we need to build with g++-4.0.
665 # Chrome uses g++-4.2 so we override this here.
666   env['CC'] = 'gcc-4.0'
667   env['CXX'] = 'g++-4.0'
668 # Compile assembly files with the same command line as C files.
669   env['ASCOM'] = '$CCCOM'
670   
671   env.Append(OSX_SDK_ROOT = '/Developer/SDKs/MacOSX10.4u.sdk')
673   env.Append(
674       CPPDEFINES = [
675           'OSX',
676           'OS_MACOSX',
677 # for breakpad
678           'USE_PROTECTED_ALLOCATIONS=1',
679       ],
680       CPPPATH = [
681 # Breakpad assumes it is in the include path
682           '$THIRD_PARTY_DIR/breakpad_osx/src',
683       ],
684       CCFLAGS = [
685            '-mmacosx-version-min=10.4',
686           ('-arch', 'ppc'),
687           ('-arch', 'i386'),
688           '-fPIC',
689           '-fmessage-length=0',
690 # TODO
691 #          '-Wall',
692 # NS_LITERAL_STRING does not work properly without this compiler option
693           '-fshort-wchar',
694           '-fvisibility=hidden',
695 # Breakpad on OSX needs debug symbols to use the STABS format, rather than the
696 # default DWARF debug symbols format. Note that we enable gstabs for debug &
697 # opt; we strip them later in opt.
698           '-gstabs+',
699       ],
700       CXXFLAGS = [
701           '-fvisibility-inlines-hidden',
702           '-fno-exceptions',
703           '-fno-rtti',
704           ('-Wall',
705            '-Wno-non-virtual-dtor',
706            '-Wno-ctor-dtor-privacy',
707            '-Wno-char-subscripts',
708 # When a function is deprecated in gcc, it stupidly warns about all functions
709 # and member functions that have the same name, regardless of signature.
710 # Example: Standard osx headers deprecate 'SetPort', which causes a warning for
711 # url_canon::Replacements::SetPort().
712            '-Wno-deprecated-declarations',
713           ),
714           '-funsigned-char',
715           ('-include', env.File('#/$OPEN_DIR/base/safari/prefix_header.h').abspath),
716           ('-isysroot', '$OSX_SDK_ROOT')
717       ],
718       COMMON_LINKFLAGS = [
719            '-mmacosx-version-min=10.4',
720            '-fPIC',
721            '-Bsymbolic',
722            ('-arch', 'ppc'),
723            ('-arch', 'i386'),
724            ('-isysroot', '$OSX_SDK_ROOT'),
725            '-Wl,-dead_strip',
726       ],
727       SHLINKFLAGS = [
728           '-bundle',  # DLLFLAGS
729       ],
730       FRAMEWORKS = [
731           'Carbon',
732           'CoreServices',
733           'Cocoa',
734           'WebKit',
735       ],
736       M4FLAGS = [
737           '-DGEARS_ENABLER_PATH="$SF_INPUTMANAGER_BUNDLE"',
738           '-DGEARS_PLUGIN_PATH="$SF_PLUGIN_PROXY_BUNDLE"',
739           '-DGEARS_INSTALLER_OUT_DIR="$INSTALLER_OUTDIR/Safari"',
741           # Keystone
742           '-DKEYSTONE_BASE_DIR="$MAIN_DIR/$PRIVATE_THIRD_PARTY_DIR/googlemac/Releases/Keystone/"',
743           '-DGEARS_INSTALLER_PACKAGE="$SF_INSTALLER_PKG"',
744           '-DGEARS_GENFILES_DIR="$SF_OUTDIR/genfiles"',
745           '-DGEARS_TOOLS_DIR="$MAIN_DIR/$PRIVATE_DIR/tools"',
746       ],
747   )
748   if not env['OFFICIAL_BUILD']:
749     # For PortAudio:
750     env.Append(FRAMEWORKS = [
751         'CoreAudio',
752         'AudioToolbox',
753         'AudioUnit',
754     ])
755   if env['MODE'] == 'dbg':
756     env.Append(
757         CPPFLAGS = [
758             '-g',
759             '-O0',
760         ],
761     )
762   else:  # MODE=opt
763     env.Append(
764         CPPFLAGS = [
765             '-O2',
766         ],
767     )
769 # Custom builder to work around a scons and/or hammer bug.  ComponentLibrary
770 # tries to install the library to COMPONENT_LIBRARY_DIR, but since we overrode
771 # that value, scons gets confused.  I'm not sure who is at fault here.
772 # See http://code.google.com/p/chromium/issues/detail?id=4177.
773 def GearsStaticLibrary(env, *args, **kw):
774   lib = env.ChromeStaticLibrary(*args, **kw)
775   env.Install('$COMPONENT_LIBRARY_DIR', lib[0])
776   return lib
777 env.AddMethod(GearsStaticLibrary)
779 # Load all the components
781 sconscripts = [
782     'SConscript.googleurl',
783     'SConscript.libjpeg',
784     'SConscript.libpng',
785     'SConscript.libmozjs',
786     'SConscript.sqlite',
787     'SConscript.zlib',
788     'SConscript.libbreakpad_osx',
789     'SConscript.libgd',
790     'SConscript.portaudio',
793 #if os.path.exists(env.Entry('#/$PRIVATE_DIR/SConscript').abspath):
794 #  env = env.SConscript('#/$PRIVATE_DIR/SConscript',
795 #      exports=['env', 'env_res'])
797 for each in sconscripts:
798   env.SConscript(each,
799                  exports=['env'],
800                  variant_dir='$COMMON_OUTDIR',
801                  duplicate=0)
803 # Order of execution is important here.  Each sub-script adds to the
804 # environment, for use by later scripts.
805 env = env.SConscript('SConscript.inputs', exports=['env'])
807 outputs = env.SConscript('SConscript.common',
808                exports=['env'],
809                variant_dir='$COMMON_OUTDIR',
810                duplicate=0)
811 env.Append(**outputs)
813 browsers = [env['BROWSER']]
814 if browsers[0] == 'all':
815   browsers = env['VALID_BROWSERS']
816 print 'Building:', browsers
818 # We run the browser script once for each browser target we want to build.
819 # Each script adds variables to the environment in the form of
820 # '${BROWSER}_foo = bar' for use by the installers script.
821 for each in browsers:
822   env.Replace(BROWSER = each)
823   outputs = env.SConscript('SConscript.browser',
824                  exports=['env'],
825                  variant_dir='$BROWSER_OUTDIR',
826                  duplicate=0)
827   browser_outputs = {}
828   for key, value in outputs.iteritems():
829     browser_outputs[each + '_' + key] = value
830   env.Append(**browser_outputs)
832 # Note: even though the installers write to $INSTALLER_OUTDIR, they need to
833 # read files from other dirs, so we give them a variant_dir at the toplevel.
834 env.SConscript('SConscript.installers',
835                exports=['env'],
836                variant_dir='$BASE_OUTDIR',
837                duplicate=0)
839 env.Alias('gears-installers', 'gears')