-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.scons
819 lines (703 loc) · 27.9 KB
/
main.scons
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
#!/usr/bin/python2.4
#
# Copyright 2009-2010 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ========================================================================
# This main.scons file is the root description of the build specified in this
# directory and those under it. Individual components and the source files
# used to build them are described in subsidiary files called 'build.scons'.
#
# To build this project change the current directory to googleclient/Omaha.
# Then run hammer.bat
#
# A number of command line options can be specified. For a full list, use the
# -h and -H command options.
#
# Some useful options include:
# -h : Prints a list of which modules and build variants are available
# in this project.
# -H : Print SCons specific help. SCons is a build tool which this
# project uses in tandem with the Software Construction Toolkit
# to build.
# -c : Clean the project. I.e. delete all build output.
# -j3 : Run up to 3 build steps at once.
#
# Some useful build targets include:
# all_programs : Build all programs generated by this project.
# all_libraries : Build all libraries generated by this project.
# all_tests : Build all tests generated by this project.
# run_all_tests : Build and run all tests generated by this project.
#
# Some examples:
# Build all programs and libraries in debug mode:
# hammer
# Build and run all tests in debug mode on windows:
# hammer MODE=dbg-win run_all_tests
# Build arbitrary library in the default mode:
# hammer <library name>
import copy
import os
import sys
import omaha_version_utils
# To switch the build, simply change the value of the msc_ver variable below.
# VC2003/VC71 is 1310 but not supported by the current build.
# VC2005/VC80 is 1400.
# VC2008/VC90 is 1500.
_msc_ver = 1400
_sdk_path = os.environ['OMAHA_VISTASDK_DIR']
_signtool_path = os.path.join(_sdk_path, 'bin/signtool.exe')
# Build the "Google Update", the Google-specific version of Omaha.
# TODO(omaha): Set based on an environment variable and/or Hammer arg.
is_google_update_build = False
#
# Begin vendor-specific constants.
#
# These values must be changed when customizing open source Omaha.
# You may also wish to replace the language-neutral constants in the individual
# *generated_resources_*.rc files with localized strings.
_FULL_COMPANY_NAME = 'OmahaCompanyName Inc.'
_SHORT_COMPANY_NAME = 'OmahaCompanyName'
_PRODUCT_NAME = 'Update'
_COMPANY_DOMAIN_BASE = 'google'
_COMPANY_DOMAIN = _COMPANY_DOMAIN_BASE + '.com'
_MAIN_EXE_BASE_NAME = 'GoogleUpdate'
# TODO(omaha): Use this throughout the build files where goopdate and
# goopdateres are referenced.
_MAIN_DLL_BASE_NAME = 'goopdate'
# "Google Inc." must not be removed from the copyright string. This literal also
# appears as LegalCopyright in the VERSIONINFO section of .rc files.
# TODO(omaha): Use this variable in .wxs files, etc.
_OMAHA_COPYRIGHT_STRING_ENGLISH = 'Copyright 2007-2010 Google Inc.'
# TODO(omaha): Allow open source Omaha to be built without the Recovery MSI,
# which requires an extra certificate file and is unlikely to be used, or
# ClickOnce, which requires specifying a certificate hash. Disabling Recovery
# by default also means the open source build will work by default without
# having to check in SaveArguments.exe to SVN every 100 days.
# TODO(omaha3): Allow open source Omaha to be built without support for
# Omaha 2's COM APIs.
# The hash comes from the Thumbprint item in the Details tab of the file
# properties for the public key .cer file.
# TODO(omaha): Can we automate reading this and/or pass it on the command line?
_BUILD_SERVER_CERTIFICATE_HASH = 'cafd39335d6e76f0e26d81296e7cbbfbdf16a720'
#
# End vendor-specific constants.
#
# Windows is the only environment we bulid for, so create a specialized base
# environment for Windows.
win_env = Environment(
# For internal builds only, it is a good idea to have set before the
# 'component_setup' tool is used even though we add the SDK directories to
# the appropriate environment variables manually below.
PLATFORM_SDK_DIR = _sdk_path,
tools=[
'component_setup',
'target_platform_windows',
# Need to use 'masm' to override the 'as' tool currently used
# by default in 'target_platform_windows'
'masm',
'atlmfc_vc80',
'code_signing',
'component_targets_msvs',
'omaha_builders',
],
msc_ver = _msc_ver,
build_server_certificate_hash = _BUILD_SERVER_CERTIFICATE_HASH,
# Visual Studio 2008 does not ship the sign tool. Use the sign tool from
# the Platform SDK. This must come after the 'code_signing' tool is used.
# Remove this if http://code.google.com/p/swtoolkit/issues/detail?id=16 is
# fixed.
SIGNTOOL = '"' + _signtool_path + '"',
)
# Remove this value because it conflicts with a #define
# in shlwapi.h in the Vista SDK
win_env.FilterOut(CPPDEFINES = ['OS_WINDOWS=OS_WINDOWS'])
# We pre-generate our own manifests, so make sure hammer does not generate
# default ones for us
del win_env['MANIFEST_FILE']
# Hack to work around bug in Hammer (http://b/1585388).
# TODO(Omaha): Remove when bug is fixed.
if win_env['ENV'].has_key('SYSTEMROOT'):
if win_env['ENV'].has_key('SystemRoot'):
del win_env['ENV']['SYSTEMROOT']
del os.environ['SYSTEMROOT']
# Work around http://code.google.com/p/swtoolkit/issues/detail?id=10.
win_env['COMPONENT_TEST_SUBSYSTEM_WINDOWS'] = 1
# Declare command line options relating to code signing
# authenticode_file and authenticode_password are used by the normal signing
# tool and to sign manifests for ClickOnce.
# patching_certificate is used to create patchable MSI installers and MSPs.
# authenticode_file and authenticode_password are only used if !build_server.
# patching_certificate is used in all cases.
AddOption(
'--authenticode_file',
action='store',
nargs=1,
type='string',
default='$MAIN_DIR/data/OmahaTestCert.pfx'
)
default_cert_password = 'test'
AddOption(
'--authenticode_password',
action='store',
nargs=1,
type='string',
default=default_cert_password
)
AddOption(
'--patching_certificate',
action='store',
nargs=1,
type='string',
default='$MAIN_DIR/data/OmahaTestCert.cer'
)
# Declare option for specifying path to new official build files
AddOption(
'--official_build_path',
action='store',
nargs=1,
type='string',
default=None
)
# Declare option for specifying the set of official app installers to build.
# The value describes the name of the directory containing the official
# installer manifests and definitions.
AddOption(
'--official_installer_app',
action='store',
nargs=1,
type='string',
default=None
)
AddOption(
'--official_installer_file',
action='store',
nargs=1,
type='string',
default=None
)
AddOption(
'--build_number',
action='store',
nargs=1,
type='string',
default=''
)
# Declare various boolean states.
DeclareBit('use_precompiled_headers', 'Use precompiled headers in build')
DeclareBit('official_installers', 'Building using checked-in binaries')
DeclareBit('build_server', 'Running on the build server')
DeclareBit('build_two_versions', 'Build second version for self-update testing')
DeclareBit('test_certificate', 'Files will be signed with the test certificate')
DeclareBit('bin', 'Building from pre-built binaries')
DeclareBit('min', 'Building minimal set of projects')
DeclareBit('all', 'Building all Projects')
DeclareBit('msvs', 'Building Visual Studio solution files')
DeclareBit('no-tests', 'Do not build the unit tests')
# Build official installers if --official_installers is on the command line.
win_env.SetBitFromOption('official_installers', False)
# Build as a build server if --build_server is on the command line.
win_env.SetBitFromOption('build_server', False)
# Build two versions if --build_two_versions is on the command line.
win_env.SetBitFromOption('build_two_versions', False)
# Store new versions of pre-built binaries if --bin is on the command line.
win_env.SetBitFromOption('bin', False)
# Build minimal set of libs if --min is on the command line.
win_env.SetBitFromOption('min', False)
# Build all libs if --all is on the command line.
win_env.SetBitFromOption('all', False)
# Build Visual Studio solution files if --msvs is on the command line.
win_env.SetBitFromOption('msvs', False)
# Do not build the unit tests if the bit is set.
win_env.SetBitFromOption('no-tests', False)
# Build all directories and two versions if this is the build server.
if win_env.Bit('build_server'):
win_env.SetBits('all')
win_env.SetBits('build_two_versions')
# Make sure 'all' overrides 'min'.
if win_env.Bit('all'):
win_env.ClearBits('min')
# Allow use of command-line-specified certificates to sign with, but
# only if we're not on the build server.
if not win_env.Bit('build_server'):
win_env.Replace(
CERTIFICATE_PATH=GetOption('authenticode_file'),
CERTIFICATE_PASSWORD=GetOption('authenticode_password'),
)
# Store whether we're using the default test cert separately, because
# we won't always know what the default password was.
if GetOption('authenticode_password') is default_cert_password:
win_env.SetBits('test_certificate')
# The precompiled headers are to be used as an optional build speed up
# build facility. Individual compilation units in the project must build with
# or without precompiled headers. Building without precompiled headers is sort
# of meaningless, since all the time we should build with it. However,
# eliminating the dependency is desirable from a few reasons:
# 1. making sure the files in the project include all the definitions they need
# 2. creating different precompile headers if needed.
# 3. making sure the precompile headers do not add to the size bloat.
# There are two current limitations with the current setup.
# First, due to pushing the warning level to W4 and WAll, we rely on the
# common precompile.h to properly turn off the warnings inside system and
# library code.
# Second, to override the ATLASSERT, a file must be included before any of
# the atl headers. To do this on a case by case basis is impractical and
# error prone.
# Therefore, when building with precompile headers off, the code is
# building on W3 and it is not taking over the ATL asserts.
win_env.SetBitFromOption('use_precompiled_headers', True)
if win_env.Bit('use_precompiled_headers'):
print 'Using precompiled headers.'
#
# Set up version info.
#
omaha_version_info = omaha_version_utils.OmahaVersionInfo('VERSION')
omaha_versions_info = [omaha_version_info]
if win_env.Bit('build_two_versions'):
omaha_test_version_info = copy.deepcopy(omaha_version_info)
omaha_test_version_info.MakeTestVersion()
omaha_versions_info.append(omaha_test_version_info)
# Print the version(s) being built.
print 'Building versions: %s' % ', '.join(
[version_info.GetVersionString() for version_info in omaha_versions_info])
build_number = GetOption('build_number')
if build_number:
print 'Build number: %s' % build_number
win_env['omaha_versions_info'] = omaha_versions_info
if is_google_update_build:
win_env.Append(
CPPDEFINES = ['GOOGLE_UPDATE_BUILD'],
RCFLAGS = ['/DGOOGLE_UPDATE_BUILD=1'],
)
# Make sure python.exe can be located.
win_env.AppendENVPath('PATH', os.environ['OMAHA_PYTHON_DIR'])
win_env.Append(
# Add windows specific compiler flags.
CCFLAGS = [
'/nologo',
'/c',
'/Zc:forScope',
'/D_HAS_EXCEPTIONS=0',
'/DCOMPILER_MSVC',
'/J',
'/DSTL_MSVC',
'/GR-',
'/D_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES=1',
'/D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1',
'/D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1',
'/WX', # warnings as errors
#
# Disable the following level 4 warnings below.
#
'/wd4127', # conditional expression is constant
'/wd4189', # local variable is initialized but not referenced
'/wd4505', # unreferenced local function has been removed
#
# Disable the pedantic warnings below.
#
'/wd4191', # unsafe conversion from 'type of expression' to
# 'type required'
'/wd4217', # member template functions cannot be used for
# copy-assignment...
'/wd4365', # conversion from 'type_1' to 'type_2',
# signed/unsigned mismatch
'/wd4512', # assignment operator could not be generated
'/wd4514', # unreferenced inline function has been removed
'/wd4555', # expression has no effect
'/wd4619', # #pragma warning : there is no warning number 'number'
'/wd4623', # default constructor could not be generated...
'/wd4625', # copy constructor could not be generated...
'/wd4626', # assignment operator could not be generated...
'/wd4668', # not defined as a preprocessor macro, replacing with '0'.
'/wd4710', # function not inlined
'/wd4711', # function 'function' selected for inline expansion
'/wd4738', # storing 32-bit float result in memory...
'/wd4820', # bytes padding added after construct 'member_name'
],
# Where to look for include files.
CPPPATH = [
'$MAIN_DIR',
'$MAIN_DIR/..',
'$MAIN_DIR/third_party/chrome',
'$MAIN_DIR/third_party/gtest/include',
],
# Defines for windows environment.
CPPDEFINES = [
'WIN32', '_WINDOWS',
'UNICODE', '_UNICODE',
'WIN32_LEAN_AND_MEAN',
'STRICT',
'SECURITY_WIN32',
'_ATL_ALL_WARNINGS',
'_ATL_CSTRING_EXPLICIT_CONSTRUCTORS',
'_ATL_CSTRING_NO_CRT',
'_ATL_NO_ACLAPI',
'_ATL_NO_DEFAULT_LIBS',
'_ATL_NO_EXCEPTIONS',
'_ATL_NO_GLOBAL_SOCKET_STARTUP',
'_ATL_NO_PERF_SUPPORT',
'_ATL_NO_TRACK_HEAP',
'_ATL_NO_UUIDOF',
'_ATL_STATIC_REGISTRY',
'_CRT_RAND_S', # rand_s support available in Windows XP only.
'_WTL_NO_CSTRING', # WTL uses ATL CString instead.
# '_ATL_NO_CONNECTION_POINTS',
# '_ATL_NO_DOCHOSTUIHANDLER',
# '_ATL_NO_HOSTING',
# Set these C_DEFINES when APPVER=5.0
# (see win32.mak in Platform SDK)
# Target Windows XP and IE 6.0 and above.
'WINVER=0x0501',
'_WIN32_WINNT=0x0501',
'_WIN32_IE=0x0600',
'_RICHEDIT_VER=0x0010',
# don't define min and max in windef.h
'NOMINMAX',
# Logging is enabled in all modes for diagnostics purposes.
'LOGGING',
'FULL_COMPANY_NAME_ANSI=\\"%s\\"' % _FULL_COMPANY_NAME,
'SHORT_COMPANY_NAME_ANSI=\\"%s\\"' % _SHORT_COMPANY_NAME,
'PRODUCT_NAME_ANSI=\\"%s\\"' % _PRODUCT_NAME,
'COMPANY_DOMAIN_BASE_ANSI=\\"%s\\"' % _COMPANY_DOMAIN_BASE,
'COMPANY_DOMAIN_ANSI=\\"%s\\"' % _COMPANY_DOMAIN,
'OMAHA_APP_NAME_ANSI=\\"%s %s\\"' % (
_SHORT_COMPANY_NAME, _PRODUCT_NAME),
'MAIN_EXE_BASE_NAME_ANSI=\\"%s\\"' % _MAIN_EXE_BASE_NAME,
'MAIN_DLL_BASE_NAME_ANSI=\\"%s\\"' % _MAIN_DLL_BASE_NAME,
'OFFICIAL_BUILD=%d' % win_env.Bit('build_server'),
'TEST_CERTIFICATE=%d' % win_env.Bit('test_certificate'),
'ONECLICK_PLUGIN_NAME=_T(\\"%s\\")' % (
omaha_version_utils.GetONECLICK_PLUGIN_NAME()),
'ONECLICK_PLUGIN_VERSION_ANSI=\\"%d\\"' % (
omaha_version_info.oneclick_plugin_version),
'ONECLICK_PLUGIN_FILENAME=_T(\\"%s\\")' % (
omaha_version_info.oneclick_plugin_filename),
'UPDATE_PLUGIN_NAME=_T(\\"%s\\")' % (
omaha_version_utils.GetUPDATE_PLUGIN_NAME()),
'UPDATE_PLUGIN_VERSION_ANSI=\\"%d\\"' % (
omaha_version_info.update_plugin_version),
'UPDATE_PLUGIN_FILENAME=_T(\\"%s\\")' % (
omaha_version_info.update_plugin_filename),
'BHO_NAME=_T(\\"%s\\")' % omaha_version_utils.GetBHO_NAME(),
'BHO_FILENAME=_T(\\"%s\\")' % omaha_version_info.bho_filename,
'CRASH_HANDLER_NAME=_T(\\"%s\\")' % omaha_version_utils.GetCRASH_HANDLER_NAME(),
],
# Link in some windows libraries.
LIBS = [
'advapi32',
'comdlg32',
'gdi32',
'kernel32',
'odbc32',
'odbccp32',
'ole32',
'oleaut32',
'shell32',
'user32',
'uuid',
'winspool',
],
# Common linker flags.
LINKFLAGS = [
'/nologo',
'/SUBSYSTEM:WINDOWS',
'/MACHINE:X86',
'/RELEASE',
'/MAP',
'/NODEFAULTLIB',
'/DYNAMICBASE', # Enable ASLR. See http://goo.gl/k2IE.
'/NXCOMPAT', # Enable NX support. See http://goo.gl/k2IE.
'/SAFESEH',
],
# Shared library specific linker flags.
SHLINKFLAGS = [
'/nologo',
'/SUBSYSTEM:WINDOWS',
'/MACHINE:x86',
],
# Resource compiler flags.
# Defines in CCFLAGS are automatically included.
RCFLAGS = [
'/l 1033', # /l == default language ID
'/DBUILD_NUMBER=\\"%s\\"' % build_number,
'/DOMAHA_COPYRIGHT_STRING_ENGLISH=\\"%s\\"' % (
_OMAHA_COPYRIGHT_STRING_ENGLISH),
],
)
# Allow verification of these settings in the build log.
if win_env.Bit('build_server'):
print 'OFFICIAL_BUILD=1'
print 'TEST_CERTIFICATE=%d' % win_env.Bit('test_certificate')
# Add the parent directory of the main omaha directory to the Python path so
# that we can import using the format "omaha.subdir.module".
sys.path.append(os.path.split(win_env.Dir('$MAIN_DIR').abspath)[0])
# Make sure Vista SDK in all the important paths earlier in path than VC80.
for mid_dir in ['', 'vc']:
for env_var, sub_dir in [('PATH', 'bin'),
('INCLUDE', 'include'),
('LIB', 'lib')]:
var_path = os.path.join(_sdk_path, mid_dir, sub_dir)
if os.path.exists(var_path):
win_env.PrependENVPath(env_var, var_path)
if not win_env.Bit('official_installers'):
win_env.Append(CPPPATH = os.environ['OMAHA_WTL_DIR'])
# Make sure csc.exe can be located.
win_env.AppendENVPath('PATH', os.environ['OMAHA_NET_DIR'])
sys.path.append('tools') # for import proxy_clsid_utils.py
import proxy_clsid_utils
# Generate uniqe proxy CLSIDs for each build.
win_env.Execute('python $MAIN_DIR\\tools\\proxy_clsid_utils.py')
win_env.Append(
CPPDEFINES = [
'PROXY_CLSID_IS_MACHINE=%s' % proxy_clsid_utils.GetMachineProxyClsid(),
'PROXY_CLSID_IS_USER=%s' % proxy_clsid_utils.GetUserProxyClsid(),
],
)
# WiX path has to be added before the WiX tool can be called.
win_env.AppendENVPath('PATH', os.environ['OMAHA_WIX_DIR'])
win_env.Tool('wix')
_base_dirs = [
'.',
'base',
'clickonce',
'client',
'common',
'core',
'google_update',
'goopdate',
'net',
'service',
'setup',
'statsreport',
'third_party',
'tools',
'ui',
]
_normal_dirs = [
'installers',
'mi_exe_stub',
'plugins',
'recovery',
]
_official_installers_dirs = [
'installers',
]
_extra_dirs = [
'enterprise',
'standalone',
]
#
# Need to decide which subdirs need to be built.
#
_dirs_to_build_set = set()
if win_env.Bit('official_installers'):
# Only want to build very specific subdirs.
win_env.SetBits('no-tests')
_dirs_to_build_set.update(_official_installers_dirs)
elif not win_env.Bit('bin'):
# All other configs get the base dirs.
_dirs_to_build_set.update(_base_dirs)
if win_env.Bit('min'):
print '*** Building Minimal Set of Projects ***'
else:
_dirs_to_build_set.update(_normal_dirs)
if win_env.Bit('all'):
_dirs_to_build_set.update(_extra_dirs)
# Build Google application-specific metainstallers.
if os.path.exists(win_env.Dir('$MAIN_DIR/internal').abspath):
_dirs_to_build_set.update(['internal'])
_dirs_to_build = list(_dirs_to_build_set)
# This must be the last directory.
if not win_env.Bit('no-tests'):
_dirs_to_build.append('testing')
# Instruct Hammer which dirs to build.
win_env['BUILD_SCONSCRIPTS'] = _dirs_to_build
# These are used by the Omaha Builder OmahaUnittest(). They must be added to the
# environment because there must be one per-mode.
win_env['all_in_one_unittest_sources'] = []
win_env['all_in_one_unittest_libs'] = set()
# Create the leaf debug Windows environment.
windows_debug_env = win_env.Clone(
# Give this build a name and a description.
BUILD_TYPE = 'dbg-win',
BUILD_TYPE_DESCRIPTION = 'Windows debug build',
)
# Use common debug settings.
windows_debug_env.Tool('target_debug')
windows_debug_env.Append(
CCFLAGS = [
'/RTC1',
'/Od',
'/MTd',
],
CPPDEFINES = [
'_DEBUG',
'DEBUG',
],
)
# Create the leaf optimized Windows environment.
windows_optimized_env = win_env.Clone(
# Give this build a name and a description.
BUILD_TYPE = 'opt-win',
BUILD_TYPE_DESCRIPTION = 'Windows optimized build',
)
# Use common optimized settings.
windows_optimized_env.Tool('target_optimized')
windows_optimized_env.Append(
CCFLAGS = [
'/O1', # Optimize for small size.
'/GS',
'/FD',
'/GL', # Global optimization goes with link flag '/LTCG'
'/MT',
],
CPPDEFINES = [
'NDEBUG',
'SHIPPING' # code in 'common' needs this
],
ARFLAGS = [
'/LTCG', # Set LTCG for creation of .lib files too.
],
LINKFLAGS = [
'/incremental:no',
'/opt:ref',
'/opt:icf=32',
'/opt:nowin98',
'/LTCG', # Link-time code generation goes with cl flag '/GL'
],
)
# Create an environment for coverage test builds, based on the dbg build.
windows_coverage_env = windows_debug_env.Clone(
BUILD_TYPE = 'coverage-win',
BUILD_TYPE_DESCRIPTION = 'Windows coverage build',
)
# The Coverage build require additional tools that not everyone has. Therefore,
# it should build as part of the all group.
windows_coverage_env.FilterOut(BUILD_GROUPS=['all'])
windows_coverage_env.Tool('code_coverage')
# Coverage will run omaha_unittest.exe, which requires some extra environment.
for env_var in os.environ:
if not env_var in windows_coverage_env['ENV']:
windows_coverage_env['ENV'][env_var] = os.environ[env_var]
# Create a target that covers everything in the staging dir, as many of those
# files will be required for the unittests to run successfully.
# TODO(omaha3): This may not be necessary when using ComponentTestProgram. If it
# is, it needs to be changed to use test/ instead of $STAGING_DIR/.
windows_coverage_env.Alias(
'run_omaha_unittest_for_coverage',
'$STAGING_DIR',
'$STAGING_DIR/omaha_unittest.exe'
)
windows_coverage_env.Append(
# TODO(omaha): We cannot run our unit tests on the new build system. Ensure
# coverage works with the new test execution system.
# COVERAGE_TARGETS=['run_omaha_unittest_for_coverage'],
COVERAGE_INSTRUMENTATION_PATHS=['$STAGING_DIR'],
# This value should only be used in code if absolutely necessary.
CPPDEFINES=['COVERAGE_ENABLED'],
)
# TODO(omaha): Prevent the analyzer, which will fail, from running until we can
# run unit tests on the build system. See the TODO above.
windows_coverage_env['COVERAGE_START_CMD'] = '@echo Not starting coverage'
windows_coverage_env['COVERAGE_STOP_CMD'] = '@echo Not ending coverage'
# Skip signing in coverage build until the last step.
windows_coverage_env['SIGNTOOL_ORIG'] = windows_coverage_env['SIGNTOOL']
windows_coverage_env['SIGNTOOL'] = '@echo Signing deferred: '
def SigningCommand(env, filename):
# Only do signing if there is a certificate file or certificate name.
if env.subst('$CERTIFICATE_PATH') or env.subst('$CERTIFICATE_NAME'):
# The command used to do signing (target added on below).
signing_cmd = '$SIGNTOOL_ORIG sign '
# Add in certificate file if any.
if env.subst('$CERTIFICATE_PATH'):
signing_cmd += ' /f "$CERTIFICATE_PATH"'
# Add certificate password if any.
if env.subst('$CERTIFICATE_PASSWORD'):
signing_cmd += ' /p "$CERTIFICATE_PASSWORD"'
# Add certificate store if any.
if env.subst('$CERTIFICATE_NAME'):
# The command used to do signing (target added on below).
signing_cmd += ' /s "$CERTIFICATE_STORE" /n "$CERTIFICATE_NAME"'
# Add timestamp server if any.
if env.subst('$TIMESTAMP_SERVER'):
signing_cmd += ' /t "$TIMESTAMP_SERVER"'
# Add in target name
signing_cmd += ' "%s"' % filename
return signing_cmd
else:
return 'echo no signing needed'
def _IsInstrumentableFileType(file):
if (file.endswith('.exe') or
file.endswith('.dll')):
return True
return False
def _IsSignableFileType(file):
if (file.endswith('.exe') or
file.endswith('.dll') or
file.endswith('.msi') or
file.endswith('.msp')):
return True
return False
# Sign files during the install stage, since instrumentation invalidates the
# signature. Signing within the individual build files was disabled above.
# Do not sign intermediate "_unsigned" or "_unittest" files.
# Instrumented files must be signed after installing becuase install is what
# does the instrumentation. This also seems to be required to avoid
# unnecessarily rebuilding non-instrumentable files.
def _PostCoverageSigningInstall(dest, source, env):
if _IsInstrumentableFileType(dest) or not _IsSignableFileType(dest):
# Install the file to staging. Includes instrumentation if appropriate.
env['PRECOVERAGE_SIGN_INSTALL'](dest, source, env)
else:
# For signable but not instrumentable files, copy the files rather than
# using PRECOVERAGE_SIGN_INSTALL as this works around unnecessary rebuilds
# caused by http://code.google.com/p/swtoolkit/issues/detail?id=13.
env.Execute('copy "%s" "%s"' % (source, dest))
if (_IsSignableFileType(dest) and
(-1 == dest.find('_unsigned')) and
(-1 == dest.find('_unittest')) and
os.path.split(os.path.split(dest)[0])[1] == 'staging'):
env.Execute(SigningCommand(env, dest))
windows_coverage_env['PRECOVERAGE_SIGN_INSTALL'] = (
windows_coverage_env['INSTALL'])
windows_coverage_env['INSTALL'] = _PostCoverageSigningInstall
# Make debug the default build after any copies of it have been made.
windows_debug_env.Append(BUILD_GROUPS = ['default'])
# ----------------------------------------------------------
# Build the variants listed above.
# This step will call each of the SConscripts (build.scons) listed,
# once for each variant currently being built.
BuildEnvironments(
[ windows_debug_env,
windows_optimized_env,
windows_coverage_env,
]
)
if 'HAMMER_RUNS_TESTS' in os.environ.keys():
# Hammer sets the default target to 'scons-out'. This causes run_* aliases
# to also be built, which means the tests run by default. To avoid this, clear
# Default and set the default to just build the programs.
Default(None)
# TODO(omaha): Not all of our core binaries are included in these three
# aliases. This is because SignedBinary() and Command() do not add the outputs
# to a group. Fix this.
Default(['all_programs', 'all_libraries', 'all_test_programs'])
if win_env.Bit('msvs'):
source_project = win_env.ComponentVSDirProject('all_source', ['$MAIN_DIR'])
# 'all_*' values do not appear to be populated until after BuildEnvironments
# is called. Thus, the solution will be specific to either debug or optimized.
# ComponentVSSourceProject() might be more desirable, but it does not appear
# to work.
windows_debug_env.ComponentVSSolution('omaha_dbg',
['all_programs', 'all_libraries'],
projects=[source_project])