OLD | NEW |
| (Empty) |
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. | |
4 | |
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. | |
11 # | |
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 # }, | |
17 # | |
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. | |
21 # | |
22 # Questions: | |
23 # Should we flatten the output directory into | |
24 # Hammer/gears/platform/browser/*.obj like Gears does now? If so, how? | |
25 | |
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. | |
35 | |
36 import os | |
37 | |
38 Import('env') | |
39 | |
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", | |
45 ) | |
46 | |
47 if not os.path.exists(env.Dir('#/$OPEN_DIR').abspath): | |
48 print 'Skipping Gears build: no perforce tree checked out.' | |
49 Return() | |
50 | |
51 # Argument switches | |
52 | |
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' | |
59 | |
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'], | |
68 } | |
69 | |
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), | |
78 BoolVariable('GEARS_STATIC_LIB', | |
79 'Create a static library for linking with Chrome', 0), | |
80 ) | |
81 vars.Update(env) | |
82 | |
83 env['VALID_BROWSERS'] = os_browsers_map[env['OS']] | |
84 | |
85 # Add BROWSER last, since its valid inputs depend on $OS. | |
86 vars.Add( | |
87 EnumVariable('BROWSER', | |
88 'Which browser we want to build the plugin for. "all" builds all ' | |
89 'browsers for this OS.', | |
90 'all', env['VALID_BROWSERS'] + ['all'])) | |
91 vars.Update(env) | |
92 | |
93 env.Replace( | |
94 USING_CCTESTS = (env['MODE'] == 'dbg' or not env['OFFICIAL_BUILD']) | |
95 ) | |
96 | |
97 # Version | |
98 env.Replace( | |
99 MAJOR = '0', | |
100 MINOR = '5', | |
101 BUILD = '7', | |
102 PATCH = '0', | |
103 VERSION = '${MAJOR}.${MINOR}.${BUILD}.${PATCH}', | |
104 | |
105 FRIENDLY_NAME = 'Google Gears', | |
106 SHORT_NAME = 'gears', | |
107 ) | |
108 | |
109 # Platform | |
110 # TODO: Symbian builds will override this value. | |
111 # For other platforms we set just one value. | |
112 if env['OS'] in ['wince', 'android']: | |
113 env.Replace(ARCH = 'arm') | |
114 elif env['OS'] == 'osx': | |
115 # On OSX we build a fat binary. | |
116 env.Replace(ARCH = 'i386+ppc') | |
117 else: | |
118 env.Replace(ARCH = 'i386') | |
119 | |
120 # Output dirs | |
121 env.Replace( | |
122 BASE_OUTDIR = '$GEARS_DIR/$OS-$ARCH-$MODE', | |
123 COMMON_OUTDIR = '$BASE_OUTDIR/common', | |
124 BROWSER_OUTDIR = '$BASE_OUTDIR/${BROWSER.lower()}', | |
125 IE_OUTDIR = '$BASE_OUTDIR/ie', | |
126 FF2_OUTDIR = '$BASE_OUTDIR/ff2', | |
127 FF3_OUTDIR = '$BASE_OUTDIR/ff3', | |
128 NPAPI_OUTDIR = '$BASE_OUTDIR/npapi', | |
129 SF_OUTDIR = '$BASE_OUTDIR/sf', | |
130 | |
131 GENFILES_DIR = "$BROWSER_OUTDIR/genfiles", | |
132 COMMON_GENFILES_DIR = "$COMMON_OUTDIR/genfiles", | |
133 | |
134 INSTALLER_OUTDIR = '$BASE_OUTDIR/installers', | |
135 ) | |
136 | |
137 # Outputs | |
138 env.Replace( | |
139 INSTALLER_BASENAME = 'gears-${OS}-${MODE}-${VERSION}', | |
140 | |
141 FF_XPI = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.xpi', | |
142 WIN32_INSTALLER_MSI = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.msi', | |
143 WINCE_INSTALLER_CAB = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.cab', | |
144 # Keyston SF Metapackage installer, bundled with Keystone as part of a | |
145 # DMG. | |
146 SF_KEYSTONE_INSTALLER_DMG = '$INSTALLER_OUTDIR/${INSTALLER_BASENAME}.dmg', | |
147 SF_KEYSTONE_INSTALLER_MPKG = '$INSTALLER_OUTDIR/Safari/${FRIENDLY_NAME}.mpkg
', | |
148 | |
149 SF_INSTALLER_PLUGIN_BUNDLE = '$INSTALLER_OUTDIR/Safari/StatsPane.bundle', | |
150 SF_PLUGIN_BUNDLE = '$INSTALLER_OUTDIR/Safari/Gears.bundle', | |
151 SF_PLUGIN_PROXY_BUNDLE = '$INSTALLER_OUTDIR/Safari/Gears.plugin', | |
152 SF_INPUTMANAGER_BUNDLE = '$INSTALLER_OUTDIR/Safari/GearsEnabler', | |
153 SF_INSTALLER_PKG = '$INSTALLER_OUTDIR/Safari/Gears.pkg', | |
154 ) | |
155 | |
156 # Library flags | |
157 env.Replace( | |
158 MOZJS_INCLUDE_PATHS = [ | |
159 '$MOZJS_DIR', | |
160 '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include', | |
161 '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include/private', | |
162 '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include/obsolete', | |
163 '$OSX_SDK_ROOT/Developer/Headers/FlatCarbon/', | |
164 ], | |
165 MOZJS_DIR = '$THIRD_PARTY_DIR/spidermonkey', | |
166 ) | |
167 | |
168 # Add our tools to the PATH. | |
169 if env['OS'] in ['win32', 'wince']: | |
170 if os.path.exists(env.Dir('#/$PRIVATE_THIRD_PARTY_DIR').abspath): | |
171 # Clear out our environment so we don't accidentally use the system's | |
172 # libs. | |
173 env['ENV']['PATH'] = '' | |
174 env['ENV']['LIB'] = '' | |
175 env['ENV']['INCLUDE'] = '' | |
176 | |
177 paths = [] | |
178 | |
179 # Keep system32 for 'xcopy'. | |
180 paths += [env.subst('${ENV["SYSTEMROOT"]}/system32')] | |
181 if env['OS'] == 'win32': | |
182 env.Append( | |
183 VC80 = env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/vc_80/files').abspath) | |
184 paths += [ | |
185 env.subst('$VC80/common7/ide'), | |
186 env.subst('$VC80/vc/bin'), | |
187 env.subst('$VC80/common7/tools'), | |
188 env.subst('$VC80/common7/tools/bin'), | |
189 env.subst('$VC80/team_tools/performance_tools'), | |
190 ] | |
191 else: # wince | |
192 env.Append( | |
193 VC80 = env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/vc_80ce/files').abspath) | |
194 paths += [ | |
195 env.subst('$VC80/bin/x86_arm'), | |
196 env.subst('$VC80/common7/ide'), | |
197 env.subst('$VC80/common7/tools'), | |
198 env.subst('$VC80/common7/tools/bin'), | |
199 env.subst('$VC80/vc/bin'), | |
200 env.subst('$VC80/smartdevices/sdktools'), | |
201 ] | |
202 | |
203 paths += [ | |
204 env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/wix/v3_0_2925/files').abspath] | |
205 | |
206 paths += [env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/gnu/files').abspath] | |
207 paths += [env.Dir('#/$PRIVATE_THIRD_PARTY_DIR/python_24').abspath] | |
208 | |
209 # Prepend them so our tools come first. | |
210 for each in reversed(paths): | |
211 env.PrependENVPath('PATH', each) | |
212 else: | |
213 # If we don't have a private third_party dir, we expect the system | |
214 # environment to be set up correctly to point to tool paths. | |
215 env['ENV']['PATH'] = os.environ['PATH'] | |
216 env['ENV']['LIB'] = os.environ['LIB'] | |
217 env['ENV']['INCLUDE'] = os.environ['INCLUDE'] | |
218 | |
219 mtcom = 'echo Manifest creation disabled, since it breaks a lot.' | |
220 env['MANIFEST_COM'] = mtcom | |
221 env['SHMANIFEST_COM'] = mtcom | |
222 | |
223 # Building M4 files | |
224 env.Tool('m4') | |
225 | |
226 env.Append( | |
227 M4ARCH = (env['ARCH'] == 'i386' and 'x86' or '$ARCH'), | |
228 M4FLAGS = [ | |
229 '--prefix-builtins', | |
230 '-DPRODUCT_VERSION=$VERSION', | |
231 '-DPRODUCT_VERSION_MAJOR=$MAJOR', | |
232 '-DPRODUCT_VERSION_MINOR=$MINOR', | |
233 '-DPRODUCT_VERSION_BUILD=$BUILD', | |
234 '-DPRODUCT_VERSION_PATCH=$PATCH', | |
235 '-DPRODUCT_OS=$OS', | |
236 '-DPRODUCT_ARCH="$M4ARCH"', | |
237 '-DPRODUCT_GCC_VERSION="gcc3"', | |
238 '-DPRODUCT_MAINTAINER="google"', | |
239 '-DPRODUCT_FRIENDLY_NAME_UQ="$FRIENDLY_NAME"', | |
240 '-DPRODUCT_SHORT_NAME_UQ="$SHORT_NAME"', | |
241 '-DI18N_LANGUAGES="(${",".join(I18N_LANGS)})"', | |
242 ], | |
243 M4PATH = [ | |
244 '$OPEN_DIR', | |
245 '.', | |
246 ], | |
247 ) | |
248 | |
249 # SCons magic to make M4PATH work. | |
250 env.Replace( | |
251 M4INCPREFIX = '-I', | |
252 M4INCSUFFIX = '', | |
253 _M4INCFLAGS = ('${_concat(M4INCPREFIX, M4PATH, M4INCSUFFIX, ' | |
254 '__env__, RDirs, TARGET, SOURCE)}'), | |
255 M4COM = '$M4 $M4FLAGS ${_M4INCFLAGS} $SOURCE > $TARGET', | |
256 ) | |
257 | |
258 # TODO: Dependency scanner for m4 files - doesn't work. It can't detect files | |
259 # that don't exist! | |
260 #m4_include_re = re.compile(r'm4_include\((.*)\)', re.M) | |
261 #def m4_scan(node, env, path): | |
262 # contents = node.get_contents() | |
263 # includes = m4_include_re.findall(contents) | |
264 # ret_includes = [] | |
265 # for include in includes: | |
266 # for dir in path: | |
267 # file = os.path.join(dir, include) | |
268 # if os.path.exists(file): | |
269 # ret_includes.append(file) | |
270 # break | |
271 # return ret_includes | |
272 # | |
273 #m4_scanner = Scanner(function = m4_scan, skeys = ['.m4', '.html_m4']) | |
274 #env.Append(SCANNERS = m4_scanner) | |
275 | |
276 | |
277 # OS X Iceberg package builder | |
278 | |
279 env.Replace(ICEBERG = '/usr/local/bin/freeze') | |
280 if env.WhereIs('$ICEBERG'): | |
281 env.Replace(ICEBERGCOM = '"$ICEBERG" -v $SOURCE') | |
282 else: | |
283 env.Replace(ICEBERGCOM = | |
284 'echo To create a Safari installer for Gears, you must install Iceberg' | |
285 ' from http://s.sudre.free.fr/Software/Iceberg.html. You can install' | |
286 ' the Safari version manually by running the' | |
287 ' $OPEN_DIR/tools/osx/install_gears.sh script.') | |
288 | |
289 iceberg_builder = Builder(action = '$ICEBERGCOM', | |
290 suffix = '.pkg', src_suffix = '.packproj') | |
291 env.Append(BUILDERS = {'Iceberg': iceberg_builder}) | |
292 | |
293 | |
294 # C++ build flags. | |
295 | |
296 # Clear out the inherited defines from Chrome's build. I want to match Gears' | |
297 # current build as closely as possible until we switch everyone to SCons, then | |
298 # gradually integrate. | |
299 env.Replace( | |
300 CPPPATH = [ | |
301 '$OPEN_DIR', | |
302 '$OPEN_DIR/..', | |
303 '$THIRD_PARTY_DIR', | |
304 '$THIRD_PARTY_DIR/googleurl', | |
305 '$THIRD_PARTY_DIR/npapi', | |
306 '$THIRD_PARTY_DIR/zlib', | |
307 '$THIRD_PARTY_DIR/v8/bindings_local', | |
308 '.', | |
309 '$COMMON_OUTDIR', | |
310 ], | |
311 CFLAGS = [], | |
312 CCFLAGS = [], | |
313 CXXFLAGS = [], | |
314 CCPDBFLAGS = [], | |
315 CPPDEFINES = [ | |
316 # SpiderMonkey (the Firefox JS engine)'s JS_GET_CLASS macro in jsapi.h needs | |
317 # this defined to work with the gecko SDK that we've built. | |
318 # The definition of JS_THREADSAFE must be kept in sync with MOZJS_CPPFLAGS. | |
319 'JS_THREADSAFE' | |
320 ], | |
321 FRAMEWORKPATH = [], | |
322 FRAMEWORKS = [], | |
323 LIBS = [], | |
324 LIBPATH = ['$COMPONENT_LIBRARY_DIR'], | |
325 COMMON_LINKFLAGS = [], # for both executables and shared libs | |
326 LINKFLAGS = ['$COMMON_LINKFLAGS'], # for executables | |
327 SHLINKFLAGS = ['$COMMON_LINKFLAGS'], # for shared libs | |
328 COMPONENT_LIBRARY_DIR = '$COMMON_OUTDIR/lib', | |
329 ) | |
330 | |
331 if env['MODE'] == 'dbg': | |
332 env.Append( | |
333 CPPDEFINES = [ | |
334 'DEBUG=1', | |
335 '_DEBUG=1', | |
336 ], | |
337 M4FLAGS = '-DDEBUG=1', | |
338 ) | |
339 else: | |
340 env.Append( | |
341 CPPDEFINES = 'NDEBUG=1', | |
342 M4FLAGS = '-DNDEBUG=1', | |
343 ) | |
344 if env['USING_CCTESTS']: | |
345 env.Append( | |
346 CPPDEFINES = 'USING_CCTESTS=1', | |
347 M4FLAGS = '-DUSING_CCTESTS=1', | |
348 ) | |
349 if env['OFFICIAL_BUILD']: | |
350 env.Append( | |
351 CPPDEFINES = 'OFFICIAL_BUILD=1', | |
352 M4FLAGS = '-DOFFICIAL_BUILD=1', | |
353 ) | |
354 if env['GEARS_STATIC_LIB']: | |
355 env.Append( | |
356 CPPDEFINES = 'GEARS_STATIC_LIB=1', | |
357 ) | |
358 | |
359 # TODO: if USING_LIBPNG | |
360 env.Append( | |
361 CPPDEFINES = [ | |
362 'PNG_USER_CONFIG', | |
363 'CHROME_PNG_WRITE_SUPPORT', | |
364 ] | |
365 ) | |
366 if not env['GEARS_STATIC_LIB']: | |
367 # If we're not linking with Chrome, don't prefix all the symbols with | |
368 # webkit_. | |
369 env.Append(CPPDEFINES = ['GEARS_PNG_BUILD']) | |
370 | |
371 | |
372 # TODO: if USING_ZLIB | |
373 env.Append( | |
374 CPPDEFINES = [ | |
375 'NO_GZIP', | |
376 'NO_GZCOMPRESS', | |
377 ] | |
378 ) | |
379 if env['OS'] == 'wince': | |
380 env.Append(CPPDEFINES = 'NO_ERRNO_H') | |
381 | |
382 # Languages | |
383 | |
384 env['I18N_LANGS'] = [ | |
385 'en-US', | |
386 'ar', | |
387 'bg', | |
388 'ca', | |
389 'cs', | |
390 'da', | |
391 'de', | |
392 'el', | |
393 'en-GB', | |
394 'es', | |
395 'et', | |
396 'fa', | |
397 'fi', | |
398 'fil', | |
399 'fr', | |
400 'he', | |
401 'hi', | |
402 'hr', | |
403 'hu', | |
404 'id', | |
405 'is', | |
406 'it', | |
407 'ja', | |
408 'ko', | |
409 'lt', | |
410 'lv', | |
411 'ms', | |
412 'nl', | |
413 'no', | |
414 'pl', | |
415 'pt-BR', | |
416 'pt-PT', | |
417 'ro', | |
418 'ru', | |
419 'sk', | |
420 'sl', | |
421 'sr', | |
422 'sv', | |
423 'th', | |
424 'tr', | |
425 'uk', | |
426 'ur', | |
427 'vi', | |
428 'zh-CN', | |
429 'zh-TW', | |
430 'ml', | |
431 'te', | |
432 'gu', | |
433 'kn', | |
434 'or', | |
435 'bn', | |
436 'ta', | |
437 'mr', | |
438 ] | |
439 | |
440 # Platform-specific flags follow. | |
441 | |
442 if env['OS'] in ['win32', 'wince']: | |
443 env.Replace(ARFLAGS = []) | |
444 env.Append( | |
445 CPPDEFINES = [ | |
446 'STRICT', | |
447 '_UNICODE', | |
448 'UNICODE', | |
449 '_USRDLL', | |
450 'WIN32', | |
451 '_WINDLL', | |
452 '_CRT_SECURE_NO_DEPRECATE', | |
453 'NOMINMAX', | |
454 | |
455 # In VC8, the way to disable exceptions is to remove all /EH* flags, and to | |
456 # define _HAS_EXCEPTIONS=0 (for C++ headers) and _ATL_NO_EXCEPTIONS (for ATL). | |
457 '_HAS_EXCEPTIONS=0', | |
458 '_ATL_NO_EXCEPTIONS', | |
459 # Do not export UTF functions. | |
460 'U_STATIC_IMPLEMENTATION', | |
461 ], | |
462 # Static lib flags. | |
463 ARFLAGS = [ | |
464 '/NOLOGO', | |
465 ], | |
466 # Shared lib and exe flags. | |
467 COMMON_LINKFLAGS = [ | |
468 '/NOLOGO', | |
469 '/DEBUG', | |
470 '/RELEASE', | |
471 '/PDB:${TARGET.base}.pdb', | |
472 ], | |
473 SHLINKFLAGS = [ | |
474 '/DLL', | |
475 # Set the preferred base address. This value was chosen because (a) it's near | |
476 # the top of the valid address range, and (b) it doesn't conflict with other | |
477 # DLLs loaded by Chrome in either the browser or plugin process. | |
478 '/BASE:0x65000000', | |
479 ], | |
480 CPPFLAGS = [ | |
481 '/nologo', | |
482 '/c', | |
483 '/W3', | |
484 '/WX', | |
485 '/GR-', | |
486 '/Fd"${TARGET.base}.pdb"', | |
487 ], | |
488 CXXFLAGS = [ | |
489 '/TP', | |
490 '/J', | |
491 ], | |
492 CPPPATH = [ | |
493 '$VC80_CPPPATH', | |
494 '$THIRD_PARTY_DIR/breakpad/src', | |
495 ], | |
496 CCPDBFLAGS = [ | |
497 '/Zi', # TODO: Chrome defines /Z7, no idea what these are. | |
498 ], | |
499 LIBPATH = [ | |
500 '$VC80_LIBPATH', | |
501 ], | |
502 ) | |
503 if env['OS'] == 'win32': | |
504 env.Append( | |
505 CPPDEFINES = [ | |
506 # We require APPVER=5.0 for things like HWND_MESSAGE. | |
507 # When APPVER=5.0, win32.mak in the Platform SDK sets: | |
508 # C defines: WINVER=0x0500 | |
509 # _WIN32_WINNT=0x0500 | |
510 # _WIN32_IE=0x0500 | |
511 # _RICHEDIT_VER=0x0010 | |
512 # RC defines: WINVER=0x0500 | |
513 # MIDL flags: /target NT50 | |
514 # Note: _WIN32_WINDOWS was replaced by _WIN32_WINNT for post-Win95 builds. | |
515 # Note: XP_WIN is only used by Firefox headers | |
516 '_WINDOWS', | |
517 'WINVER=0x0500', | |
518 '_WIN32_WINNT=0x0500', | |
519 '_WIN32_IE=0x0500', | |
520 '_RICHEDIT_VER=0x0010', | |
521 '_MERGE_PROXYSTUB', | |
522 'BREAKPAD_AVOID_STREAMS', | |
523 'XP_WIN', | |
524 ], | |
525 ARFLAGS = [ | |
526 '/MACHINE:X86', | |
527 ], | |
528 COMMON_LINKFLAGS = [ | |
529 '/MACHINE:X86', | |
530 '/NODEFAULTLIB:msvcrt', | |
531 # Flags for security hardening (only available for win32, not wince). | |
532 '/DYNAMICBASE', | |
533 '/SAFESEH', | |
534 ], | |
535 SHLINKFLAGS = [ | |
536 # We only use /SUBSYSTEM on DLLs. For EXEs we omit the flag, and | |
537 # the presence of main() or WinMain() determines the subsystem. | |
538 '/SUBSYSTEM:WINDOWS', | |
539 ], | |
540 VC80_CPPPATH = [ | |
541 # TODO: switch over to Chrome's SDK. | |
542 # Note: these must come after $THIRD_PARTY_DIR/npapi because we want our own | |
543 # npapi.h to take precedence. | |
544 '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80/files/include', | |
545 '$PRIVATE_THIRD_PARTY_DIR/platformsdk_vc80/files/include', | |
546 '$PRIVATE_THIRD_PARTY_DIR/vc_80/files/vc/include', | |
547 ], | |
548 VC80_LIBPATH = [ | |
549 '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80/files/lib', | |
550 '$PRIVATE_THIRD_PARTY_DIR/platformsdk_vc80/files/lib', | |
551 '$PRIVATE_THIRD_PARTY_DIR/vc_80/files/vc/lib', | |
552 ], | |
553 ) | |
554 else: # OS=wince | |
555 env.Append( | |
556 CPPDEFINES = [ | |
557 # For Windows Mobile we need: | |
558 # C defines: _WIN32_WCE=0x0501 | |
559 # _UNDER_CE=0x0501 | |
560 '_WIN32_WCE=0x501', | |
561 'WINVER=_WIN32_WCE', | |
562 'UNDER_CE=0x501', | |
563 'OS_WINCE', | |
564 'WIN32_PLATFORM_PSPC', | |
565 'ARM', | |
566 '_ARM_', | |
567 'POCKETPC2003_UI_MODEL', | |
568 '_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA', | |
569 '_CE_CRT_ALLOW_WIN_MINMAX', | |
570 ], | |
571 ARFLAGS = [ | |
572 '/MACHINE:THUMB', | |
573 ], | |
574 COMMON_LINKFLAGS = [ | |
575 '/MACHINE:THUMB', | |
576 '/NODEFAULTLIB:secchk.lib', | |
577 '/NODEFAULTLIB:oldnames.lib', | |
578 ], | |
579 SHLINKFLAGS = [ | |
580 '/SUBSYSTEM:WINDOWSCE,5.01', | |
581 ], | |
582 VC80_CPPPATH = [ | |
583 '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80ce/files/include', | |
584 '$PRIVATE_THIRD_PARTY_DIR/vc_80ce/files/include', | |
585 # Visual Studio must be setup before the PocketPC SDK. | |
586 '$PRIVATE_THIRD_PARTY_DIR/pocketpc_sdk_ce_50/files/include/armv4i', | |
587 ], | |
588 VC80_LIBPATH = [ | |
589 '$PRIVATE_THIRD_PARTY_DIR/atlmfc_vc80ce/files/lib/armv4i', | |
590 '$PRIVATE_THIRD_PARTY_DIR/vc_80ce/files/lib/armv4i', | |
591 '$PRIVATE_THIRD_PARTY_DIR/pocketpc_sdk_ce_50/files/lib/armv4i', | |
592 ], | |
593 ) | |
594 | |
595 if env['MODE'] == 'dbg': | |
596 env.Append( | |
597 CPPFLAGS = [ | |
598 '/MTd', | |
599 ], | |
600 ) | |
601 else: # MODE=opt | |
602 env.Append( | |
603 CPPFLAGS = [ | |
604 '/MT', | |
605 '/O2', | |
606 ], | |
607 COMMON_LINKFLAGS = [ | |
608 '/INCREMENTAL:NO', | |
609 '/OPT:REF', | |
610 '/OPT:ICF', | |
611 ], | |
612 ) | |
613 if not env['GEARS_STATIC_LIB']: | |
614 # Build with 2-byte wchar_t's only if we're building a DLL. To link with | |
615 # Chrome, we need 4-byte wchar_t. | |
616 env.Append( | |
617 CPPFLAGS = [ | |
618 '/Zc:wchar_t-', | |
619 ], | |
620 ) | |
621 | |
622 #--------------------------- LINUX --------------------------- | |
623 elif env['OS'] == 'linux': | |
624 env.Append( | |
625 CPPDEFINES = [ | |
626 'LINUX', | |
627 ], | |
628 CPPPATH = [ | |
629 '$THIRD_PARTY_DIR/gtk/include/gtk-2.0', | |
630 '$THIRD_PARTY_DIR/gtk/include/atk-1.0', | |
631 '$THIRD_PARTY_DIR/gtk/include/glib-2.0', | |
632 '$THIRD_PARTY_DIR/gtk/include/pango-1.0', | |
633 '$THIRD_PARTY_DIR/gtk/include/cairo', | |
634 '$THIRD_PARTY_DIR/gtk/lib/gtk-2.0/include', | |
635 '$THIRD_PARTY_DIR/gtk/lib/glib-2.0/include', | |
636 ], | |
637 CCFLAGS = [ | |
638 '-fPIC', | |
639 '-fmessage-length=0', | |
640 '-Wall', | |
641 '-Werror', | |
642 # NS_LITERAL_STRING does not work properly without this compiler option | |
643 '-fshort-wchar', | |
644 # Additions to compile on hardy | |
645 '-Wno-unused-variable', | |
646 '-Wno-missing-braces', | |
647 '-Wno-address', | |
648 '-m32', | |
649 ], | |
650 CXXFLAGS = [ | |
651 '-fno-exceptions', | |
652 '-fno-rtti', | |
653 '-Wno-non-virtual-dtor', | |
654 '-Wno-ctor-dtor-privacy', | |
655 '-funsigned-char', | |
656 '-Wno-char-subscripts', | |
657 ], | |
658 COMMON_LINKFLAGS = [ | |
659 '-fPIC', | |
660 '-Bsymbolic', | |
661 '-pthread', | |
662 ], | |
663 SHLINKFLAGS = [ | |
664 '-shared', | |
665 '-Wl,--version-script', | |
666 '-Wl,$OPEN_DIR/tools/xpcom-ld-script', | |
667 # Additions to compile on hardy | |
668 '-m32', | |
669 ], | |
670 ) | |
671 if env['MODE'] == 'dbg': | |
672 env.Append( | |
673 CPPFLAGS = [ | |
674 '-g', | |
675 '-O0', | |
676 ], | |
677 ) | |
678 else: # MODE=opt | |
679 env.Append( | |
680 CPPFLAGS = [ | |
681 '-O2', | |
682 ], | |
683 ) | |
684 #--------------------------- OSX --------------------------- | |
685 elif env['OS'] == 'osx': | |
686 # Gears uses the 10.4 SDK, so we need to build with g++-4.0. | |
687 # Chrome uses g++-4.2 so we override this here. | |
688 env['CC'] = 'gcc-4.0' | |
689 env['CXX'] = 'g++-4.0' | |
690 # Compile assembly files with the same command line as C files. | |
691 env['ASCOM'] = '$CCCOM' | |
692 | |
693 env.Append(OSX_SDK_ROOT = '/Developer/SDKs/MacOSX10.4u.sdk') | |
694 | |
695 env.Append( | |
696 CPPDEFINES = [ | |
697 'OSX', | |
698 'OS_MACOSX', | |
699 # for breakpad | |
700 'USE_PROTECTED_ALLOCATIONS=1', | |
701 ], | |
702 CPPPATH = [ | |
703 # Breakpad assumes it is in the include path | |
704 '$THIRD_PARTY_DIR/breakpad_osx/src', | |
705 ], | |
706 CCFLAGS = [ | |
707 '-mmacosx-version-min=10.4', | |
708 ('-arch', 'ppc'), | |
709 ('-arch', 'i386'), | |
710 '-fPIC', | |
711 '-fmessage-length=0', | |
712 # TODO | |
713 # '-Wall', | |
714 # NS_LITERAL_STRING does not work properly without this compiler option | |
715 '-fshort-wchar', | |
716 '-fvisibility=hidden', | |
717 # Breakpad on OSX needs debug symbols to use the STABS format, rather than the | |
718 # default DWARF debug symbols format. Note that we enable gstabs for debug & | |
719 # opt; we strip them later in opt. | |
720 '-gstabs+', | |
721 ], | |
722 CXXFLAGS = [ | |
723 '-fvisibility-inlines-hidden', | |
724 '-fno-exceptions', | |
725 '-fno-rtti', | |
726 ('-Wall', | |
727 '-Wno-non-virtual-dtor', | |
728 '-Wno-ctor-dtor-privacy', | |
729 '-Wno-char-subscripts', | |
730 # When a function is deprecated in gcc, it stupidly warns about all functions | |
731 # and member functions that have the same name, regardless of signature. | |
732 # Example: Standard osx headers deprecate 'SetPort', which causes a warning for | |
733 # url_canon::Replacements::SetPort(). | |
734 '-Wno-deprecated-declarations', | |
735 ), | |
736 '-funsigned-char', | |
737 ('-include', env.File('#/$OPEN_DIR/base/safari/prefix_header.h').abspa
th), | |
738 ('-isysroot', '$OSX_SDK_ROOT') | |
739 ], | |
740 COMMON_LINKFLAGS = [ | |
741 '-mmacosx-version-min=10.4', | |
742 '-fPIC', | |
743 '-Bsymbolic', | |
744 ('-arch', 'ppc'), | |
745 ('-arch', 'i386'), | |
746 ('-isysroot', '$OSX_SDK_ROOT'), | |
747 '-Wl,-dead_strip', | |
748 ], | |
749 SHLINKFLAGS = [ | |
750 '-bundle', # DLLFLAGS | |
751 ], | |
752 FRAMEWORKS = [ | |
753 'Carbon', | |
754 'CoreServices', | |
755 'Cocoa', | |
756 'WebKit', | |
757 ], | |
758 M4FLAGS = [ | |
759 '-DGEARS_ENABLER_PATH="$SF_INPUTMANAGER_BUNDLE"', | |
760 '-DGEARS_PLUGIN_PATH="$SF_PLUGIN_PROXY_BUNDLE"', | |
761 '-DGEARS_INSTALLER_OUT_DIR="$INSTALLER_OUTDIR/Safari"', | |
762 | |
763 # Keystone | |
764 '-DKEYSTONE_BASE_DIR="$MAIN_DIR/$PRIVATE_THIRD_PARTY_DIR/googlemac/Rel
eases/Keystone/"', | |
765 '-DGEARS_INSTALLER_PACKAGE="$SF_INSTALLER_PKG"', | |
766 '-DGEARS_GENFILES_DIR="$SF_OUTDIR/genfiles"', | |
767 '-DGEARS_TOOLS_DIR="$MAIN_DIR/$PRIVATE_DIR/tools"', | |
768 ], | |
769 ) | |
770 if env['MODE'] == 'dbg': | |
771 env.Append( | |
772 CPPFLAGS = [ | |
773 '-g', | |
774 '-O0', | |
775 ], | |
776 ) | |
777 else: # MODE=opt | |
778 env.Append( | |
779 CPPFLAGS = [ | |
780 '-O2', | |
781 ], | |
782 ) | |
783 #--------------------------- ANDROID --------------------------- | |
784 elif env['OS'] == 'android': | |
785 if not os.environ['ANDROID_BUILD_TOP']: | |
786 print ("Please set ANDROID_BUILD_TOP to the top" | |
787 " level of your Android source.") | |
788 Return() | |
789 | |
790 if not os.environ['ANDROID_TOOLCHAIN']: | |
791 print ("Cannot determine location of the target toolchain." | |
792 " Please set ANDROID_TOOLCHAIN manually.") | |
793 Return() | |
794 | |
795 env['ANDROID_BUILD_TOP'] = os.environ['ANDROID_BUILD_TOP'] | |
796 | |
797 # Figure out the cross-compile prefix by finding the *-gcc executable | |
798 # and taking the '*' as the prefix for the rest. | |
799 cross_prefix_command = os.popen( | |
800 r"ls %s/*-gcc | sed 's|\(.*/.*\-\)gcc|\1|g'" % | |
801 os.environ['ANDROID_TOOLCHAIN']) | |
802 cross_prefix = cross_prefix_command.read().strip() | |
803 if cross_prefix_command.close() != None: | |
804 Return() | |
805 | |
806 # Find the output directory. Assume the only target output directory. | |
807 product_out_command = os.popen("ls %s/out/target/product/*" % | |
808 os.environ['ANDROID_BUILD_TOP']) | |
809 product_out = product_out_command.read().strip() | |
810 if product_out_command.close() != None: | |
811 Return() | |
812 | |
813 env['CC'] = cross_prefix + 'gcc' | |
814 env['CXX'] = cross_prefix + 'g++' | |
815 | |
816 env.Append( | |
817 CPPPATH = [ | |
818 '$OPEN_DIR/base/android', | |
819 '$THIRD_PARTY_DIR/stlport/stlport', | |
820 '$THIRD_PARTY_DIR/stlport/stlport/stl', | |
821 '$THIRD_PARTY_DIR/stlport/stlport/stl/config', | |
822 '$THIRD_PARTY_DIR/spidermonkey/nspr/pr/include', | |
823 '$ANDROID_BUILD_TOP/include', | |
824 '$ANDROID_BUILD_TOP/include/nativehelper', | |
825 '$ANDROID_BUILD_TOP/system', | |
826 '$ANDROID_BUILD_TOP/system/bionic/include', | |
827 '$ANDROID_BUILD_TOP/system/bionic/arch-arm/include', | |
828 '$ANDROID_BUILD_TOP/system/kernel_headers', | |
829 '$ANDROID_BUILD_TOP/system/bionic/kernel/arch-arm', | |
830 '$ANDROID_BUILD_TOP/system/bionic/kernel/common', | |
831 '$ANDROID_BUILD_TOP/system/libm/include ', | |
832 '$ANDROID_BUILD_TOP/bionic', | |
833 '$ANDROID_BUILD_TOP/bionic/libc/include', | |
834 '$ANDROID_BUILD_TOP/bionic/libc/arch-arm', | |
835 '$ANDROID_BUILD_TOP/bionic/libc/arch-arm/include', | |
836 '$ANDROID_BUILD_TOP/bionic/libc/kernel/arch-arm', | |
837 '$ANDROID_BUILD_TOP/bionic/libc/kernel/common', | |
838 '$ANDROID_BUILD_TOP/bionic/libm/include', | |
839 '$ANDROID_BUILD_TOP/dalvik/libnativehelper/include', | |
840 '$ANDROID_BUILD_TOP/extlibs', | |
841 '$ANDROID_BUILD_TOP/extlibs/icu4c-3.8/common', | |
842 '$ANDROID_BUILD_TOP/extlibs/icu4c-3.8/i18n', | |
843 '$ANDROID_BUILD_TOP/extlibs/jpeg-6b', | |
844 '$ANDROID_BUILD_TOP/extlibs/sqlite', | |
845 '$ANDROID_BUILD_TOP/extlibs/zlib-1.2.3', | |
846 '$ANDROID_BUILD_TOP/external', | |
847 '$ANDROID_BUILD_TOP/external/icu4c/common', | |
848 '$ANDROID_BUILD_TOP/external/icu4c/i18n', | |
849 '$ANDROID_BUILD_TOP/external/jpeg', | |
850 '$ANDROID_BUILD_TOP/external/sqlite/dist', | |
851 '$ANDROID_BUILD_TOP/external/zlib', | |
852 '$ANDROID_BUILD_TOP/frameworks/base/include', | |
853 '$ANDROID_BUILD_TOP/system/core/include', | |
854 ], | |
855 CPPFLAGS = [ | |
856 '-g', | |
857 '-c', | |
858 '-fPIC', | |
859 '-fmessage-length=0', | |
860 '-Wall', | |
861 '-fvisibility=hidden', | |
862 # NS_LITERAL_STRING does not work properly without this compiler option | |
863 '-fshort-wchar', | |
864 '-funsigned-char', | |
865 '-march=armv5te', | |
866 '-mtune=xscale', | |
867 '-mthumb-interwork', | |
868 '-ffunction-sections', | |
869 '-fdata-sections', | |
870 '-fno-exceptions', | |
871 ], | |
872 CXXFLAGS = [ | |
873 '-fno-rtti', | |
874 '-fvisibility-inlines-hidden', | |
875 '-Wno-non-virtual-dtor', | |
876 '-Wno-ctor-dtor-privacy', | |
877 ], | |
878 CPPDEFINES = [ | |
879 'OS_ANDROID', | |
880 'ANDROID', | |
881 'TARGET_OS=android', | |
882 'BUILD_OSNAME=android', | |
883 'OSNAME=android', | |
884 'COMPILER_NAME=gcc', | |
885 '__SGI_STL_INTERNAL_PAIR_H', | |
886 '_CPP_UTILITY', | |
887 '_LITTLE_ENDIAN=1234', | |
888 '_BIG_ENDIAN=4321', | |
889 '_PDP_ENDIAN=3412', | |
890 '_BYTE_ORDER=_LITTLE_ENDIAN', | |
891 ], | |
892 COMMON_LINKFLAGS = [ | |
893 '-g', | |
894 '-fPIC', | |
895 '-Bsymbolic', | |
896 '-nostdlib', | |
897 ], | |
898 SHLINKFLAGS = [ | |
899 '-shared', | |
900 '-Wl,--gc-sections', | |
901 '-L$ANDROID_PRODUCT_OUT/system/lib', | |
902 # Workaround for the Android C library not implementing | |
903 # __aeabi_atexit, which is used to destruct static C++ objects. This | |
904 # causes all calls to be rewritten by the linker to | |
905 # __wrap___aeabi_atexit, which we then implement. | |
906 '-Wl,--wrap,__aeabi_atexit', | |
907 ], | |
908 ) | |
909 if env['MODE'] == 'dbg': | |
910 env.Append( | |
911 CPPFLAGS = [ | |
912 '-g', | |
913 '-O', | |
914 '-funwind-tables', | |
915 '-mapcs-frame', | |
916 ], | |
917 ) | |
918 else: # MODE=opt | |
919 env.Append( | |
920 CPPFLAGS = [ | |
921 '-O2', | |
922 '-mthumb', | |
923 '-fomit-frame-pointer', | |
924 ], | |
925 ) | |
926 | |
927 # Custom builder to work around a scons and/or hammer bug. ComponentLibrary | |
928 # tries to install the library to COMPONENT_LIBRARY_DIR, but since we overrode | |
929 # that value, scons gets confused. I'm not sure who is at fault here. | |
930 # See http://code.google.com/p/chromium/issues/detail?id=4177. | |
931 def GearsStaticLibrary(env, *args, **kw): | |
932 lib = env.ChromeLibrary(*args, **kw) | |
933 env.Install('$COMPONENT_LIBRARY_DIR', lib[0]) | |
934 return lib | |
935 env.AddMethod(GearsStaticLibrary) | |
936 | |
937 # Load all the components | |
938 | |
939 sconscripts = [ | |
940 'SConscript.googleurl', | |
941 'SConscript.libjpeg', | |
942 'SConscript.libpng', | |
943 'SConscript.libmozjs', | |
944 'SConscript.sqlite', | |
945 'SConscript.zlib', | |
946 'SConscript.libbreakpad_osx', | |
947 'SConscript.libgd', | |
948 ] | |
949 | |
950 for each in sconscripts: | |
951 env.SConscript(each, | |
952 exports=['env'], | |
953 variant_dir='$COMMON_OUTDIR', | |
954 duplicate=0) | |
955 | |
956 # Order of execution is important here. Each sub-script adds to the | |
957 # environment, for use by later scripts. | |
958 env = env.SConscript('SConscript.inputs', exports=['env']) | |
959 | |
960 outputs = env.SConscript('SConscript.common', | |
961 exports=['env'], | |
962 variant_dir='$COMMON_OUTDIR', | |
963 duplicate=0) | |
964 env.Append(**outputs) | |
965 | |
966 browsers = [env['BROWSER']] | |
967 if browsers[0] == 'all': | |
968 browsers = env['VALID_BROWSERS'] | |
969 print 'Building:', browsers | |
970 | |
971 # We run the browser script once for each browser target we want to build. | |
972 # Each script adds variables to the environment in the form of | |
973 # '${BROWSER}_foo = bar' for use by the installers script. | |
974 for each in browsers: | |
975 env.Replace(BROWSER = each) | |
976 outputs = env.SConscript('SConscript.browser', | |
977 exports=['env'], | |
978 variant_dir='$BROWSER_OUTDIR', | |
979 duplicate=0) | |
980 browser_outputs = {} | |
981 for key, value in outputs.iteritems(): | |
982 browser_outputs[each + '_' + key] = value | |
983 env.Append(**browser_outputs) | |
984 | |
985 # Note: even though the installers write to $INSTALLER_OUTDIR, they need to | |
986 # read files from other dirs, so we give them a variant_dir at the toplevel. | |
987 env.SConscript('SConscript.installers', | |
988 exports=['env'], | |
989 variant_dir='$BASE_OUTDIR', | |
990 duplicate=0) | |
991 | |
992 env.Alias('gears-installers', 'gears') | |
OLD | NEW |