blob: d73c4e8728e4454583f0c23adfb0bf04be109440 [file] [log] [blame]
Darin Petkov7ed561b2011-10-04 02:59:03 -07001# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
rspangler@google.com49fdf182009-10-10 00:57:34 +00002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
Andrew de los Reyes1e338b82010-01-22 14:57:27 -08005import os
6
adlr@google.comc98a7ed2009-12-04 18:54:03 +00007# Protobuffer compilation
adlr@google.comc98a7ed2009-12-04 18:54:03 +00008def ProtocolBufferEmitter(target, source, env):
Andrew de los Reyes63b96d72010-05-10 13:08:54 -07009 """ Inputs:
10 target: list of targets to compile to
11 source: list of sources to compile
12 env: the scons environment in which we are compiling
13 Outputs:
14 target: the list of targets we'll emit
15 source: the list of sources we'll compile"""
adlr@google.comc98a7ed2009-12-04 18:54:03 +000016 output = str(source[0])
17 output = output[0:output.rfind('.proto')]
18 target = [
19 output + '.pb.cc',
20 output + '.pb.h',
21 ]
22 return target, source
23
adlr@google.comc98a7ed2009-12-04 18:54:03 +000024def ProtocolBufferGenerator(source, target, env, for_signature):
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070025 """ Inputs:
26 source: list of sources to process
27 target: list of targets to generate
28 env: scons environment in which we are working
29 for_signature: unused
30 Outputs: a list of commands to execute to generate the targets from
31 the sources."""
adlr@google.comc98a7ed2009-12-04 18:54:03 +000032 commands = [
33 '/usr/bin/protoc '
34 ' --proto_path . ${SOURCES} --cpp_out .']
35 return commands
36
37proto_builder = Builder(generator = ProtocolBufferGenerator,
38 emitter = ProtocolBufferEmitter,
39 single_source = 1,
40 suffix = '.pb.cc')
41
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070042def DbusBindingsEmitter(target, source, env):
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070043 """ Inputs:
44 target: unused
45 source: list containing the source .xml file
46 env: the scons environment in which we are compiling
47 Outputs:
48 target: the list of targets we'll emit
49 source: the list of sources we'll process"""
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070050 output = str(source[0])
51 output = output[0:output.rfind('.xml')]
52 target = [
53 output + '.dbusserver.h',
54 output + '.dbusclient.h'
55 ]
56 return target, source
57
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070058def DbusBindingsGenerator(source, target, env, for_signature):
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070059 """ Inputs:
60 source: list of sources to process
61 target: list of targets to generate
62 env: scons environment in which we are working
63 for_signature: unused
64 Outputs: a list of commands to execute to generate the targets from
65 the sources."""
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -070066 commands = []
67 for target_file in target:
68 if str(target_file).endswith('.dbusserver.h'):
69 mode_flag = '--mode=glib-server '
70 else:
71 mode_flag = '--mode=glib-client '
72 cmd = '/usr/bin/dbus-binding-tool %s --prefix=update_engine_service ' \
73 '%s > %s' % (mode_flag, str(source[0]), str(target_file))
74 commands.append(cmd)
75 return commands
76
77dbus_bindings_builder = Builder(generator = DbusBindingsGenerator,
78 emitter = DbusBindingsEmitter,
79 single_source = 1,
80 suffix = 'dbusclient.h')
81
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070082def GlibMarshalEmitter(target, source, env):
83 """ Inputs:
84 target: unused
85 source: list containing the source .list file
86 env: the scons environment in which we are compiling
87 Outputs:
88 target: the list of targets we'll emit
89 source: the list of sources we'll process"""
90 output = str(source[0])
91 output = output[0:output.rfind('.list')]
92 target = [
93 output + '.glibmarshal.c',
94 output + '.glibmarshal.h'
95 ]
96 return target, source
97
98def GlibMarshalGenerator(source, target, env, for_signature):
99 """ Inputs:
100 source: list of sources to process
101 target: list of targets to generate
102 env: scons environment in which we are working
103 for_signature: unused
104 Outputs: a list of commands to execute to generate the targets from
105 the sources."""
106 commands = []
107 for target_file in target:
108 if str(target_file).endswith('.glibmarshal.h'):
109 mode_flag = '--header '
110 else:
111 mode_flag = '--body '
112 cmd = '/usr/bin/glib-genmarshal %s --prefix=update_engine ' \
113 '%s > %s' % (mode_flag, str(source[0]), str(target_file))
114 commands.append(cmd)
115 return commands
116
117glib_marshal_builder = Builder(generator = GlibMarshalGenerator,
118 emitter = GlibMarshalEmitter,
119 single_source = 1,
120 suffix = 'glibmarshal.c')
121
Darin Petkovd7061ab2010-10-06 14:37:09 -0700122# Public key generation
123def PublicKeyEmitter(target, source, env):
124 """ Inputs:
125 target: list of targets to compile to
126 source: list of sources to compile
127 env: the scons environment in which we are compiling
128 Outputs:
129 target: the list of targets we'll emit
130 source: the list of sources we'll compile"""
131 targets = []
132 for source_file in source:
133 output = str(source_file)
134 output = output[0:output.rfind('.pem')]
135 output += '.pub.pem'
136 targets.append(output)
137 return targets, source
138
139def PublicKeyGenerator(source, target, env, for_signature):
140 """ Inputs:
141 source: list of sources to process
142 target: list of targets to generate
143 env: scons environment in which we are working
144 for_signature: unused
145 Outputs: a list of commands to execute to generate the targets from
146 the sources."""
147 commands = []
148 for source_file in source:
149 output = str(source_file)
150 output = output[0:output.rfind('.pem')]
151 output += '.pub.pem'
152 cmd = '/usr/bin/openssl rsa -in %s -pubout -out %s' % (source_file, output)
153 commands.append(cmd)
154 return commands
155
156public_key_builder = Builder(generator = PublicKeyGenerator,
157 emitter = PublicKeyEmitter,
158 suffix = '.pub.pem')
159
rspangler@google.com49fdf182009-10-10 00:57:34 +0000160env = Environment()
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700161for key in Split('CC CXX AR RANLIB LD NM'):
162 value = os.environ.get(key)
163 if value != None:
164 env[key] = value
165for key in Split('CFLAGS CCFLAGS CPPPATH LIBPATH'):
166 value = os.environ.get(key)
167 if value != None:
168 env[key] = Split(value)
169
170for key in Split('PKG_CONFIG_LIBDIR PKG_CONFIG_PATH SYSROOT'):
171 if os.environ.has_key(key):
172 env['ENV'][key] = os.environ[key]
173
174
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000175env['CCFLAGS'] = ' '.join("""-g
176 -fno-exceptions
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700177 -fno-strict-aliasing
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000178 -Wall
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000179 -Wclobbered
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700180 -Wclobbered
181 -Wempty-body
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000182 -Wempty-body
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700183 -Werror
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000184 -Wignored-qualifiers
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700185 -Wignored-qualifiers
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000186 -Wmissing-field-initializers
187 -Wsign-compare
188 -Wtype-limits
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700189 -Wtype-limits
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000190 -Wuninitialized
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700191 -D__STDC_FORMAT_MACROS=1
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000192 -D_FILE_OFFSET_BITS=64
193 -I/usr/include/libxml2""".split());
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700194env['CCFLAGS'] += (' ' + ' '.join(env['CFLAGS']))
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000195
196env['LIBS'] = Split("""base
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700197 bz2
Raymes Khourye3d8d4c2010-09-17 10:35:54 -0700198 crypto
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000199 curl
Thieu Le5c7d9752010-12-15 16:09:28 -0800200 ext2fs
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000201 gflags
202 glib-2.0
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000203 gthread-2.0
204 libpcrecpp
Darin Petkov9d65b7b2010-07-20 09:13:01 -0700205 metrics
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200206 policy
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000207 protobuf
208 pthread
Will Drewry8f71da82010-08-30 14:07:11 -0500209 rootdev
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000210 ssl
Darin Petkov7ed561b2011-10-04 02:59:03 -0700211 xml2""")
Andrew de los Reyesb70e33d2010-08-12 21:49:02 -0700212env['CPPPATH'] = ['..']
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000213env['BUILDERS']['ProtocolBuffer'] = proto_builder
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700214env['BUILDERS']['DbusBindings'] = dbus_bindings_builder
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700215env['BUILDERS']['GlibMarshal'] = glib_marshal_builder
Darin Petkovd7061ab2010-10-06 14:37:09 -0700216env['BUILDERS']['PublicKey'] = public_key_builder
Colin Watsonf2c29ec2010-01-08 18:50:56 +0000217
218# Fix issue with scons not passing pkg-config vars through the environment.
219for key in Split('PKG_CONFIG_LIBDIR PKG_CONFIG_PATH'):
220 if os.environ.has_key(key):
221 env['ENV'][key] = os.environ[key]
222
Diego Elio Pettenò8707b5b2011-05-15 18:22:29 +0200223pkgconfig = os.environ.get('PKG_CONFIG', 'pkg-config')
224
225env.ParseConfig(pkgconfig + ' --cflags --libs '
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700226 'dbus-1 dbus-glib-1 gio-2.0 gio-unix-2.0 glib-2.0')
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000227env.ProtocolBuffer('update_metadata.pb.cc', 'update_metadata.proto')
Darin Petkovd7061ab2010-10-06 14:37:09 -0700228env.PublicKey('unittest_key.pub.pem', 'unittest_key.pem')
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700229env.PublicKey('unittest_key2.pub.pem', 'unittest_key2.pem')
rspangler@google.com49fdf182009-10-10 00:57:34 +0000230
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700231env.DbusBindings('update_engine.dbusclient.h', 'update_engine.xml')
232
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700233env.GlibMarshal('marshal.glibmarshal.c', 'marshal.list')
234
rspangler@google.com49fdf182009-10-10 00:57:34 +0000235if ARGUMENTS.get('debug', 0):
Andrew de los Reyes819fef22010-12-17 11:33:58 -0800236 env['CCFLAGS'] += ['-fprofile-arcs', '-ftest-coverage']
Andrew de los Reyes80061062010-02-04 14:25:00 -0800237 env['LIBS'] += ['bz2', 'gcov']
rspangler@google.com49fdf182009-10-10 00:57:34 +0000238
239sources = Split("""action_processor.cc
Andrew de los Reyesd2135f32010-03-11 16:00:28 -0800240 bzip.cc
Andrew de los Reyes80061062010-02-04 14:25:00 -0800241 bzip_extent_writer.cc
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700242 certificate_checker.cc
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800243 chrome_browser_proxy_resolver.cc
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -0800244 chrome_proxy_resolver.cc
Andrew de los Reyes35a7af12010-03-10 16:33:26 -0800245 cycle_breaker.cc
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700246 dbus_service.cc
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700247 delta_diff_generator.cc
248 delta_performer.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000249 download_action.cc
Andrew de los Reyesb4025e62010-02-23 17:47:03 -0800250 extent_mapper.cc
Andrew de los Reyes5fdae4a2010-10-05 10:47:42 -0700251 extent_ranges.cc
Andrew de los Reyes80061062010-02-04 14:25:00 -0800252 extent_writer.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000253 filesystem_copier_action.cc
254 filesystem_iterator.cc
255 file_writer.cc
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700256 flimflam_proxy.cc
Darin Petkov7a22d792010-11-08 14:10:00 -0800257 full_update_generator.cc
Andrew de los Reyes0ce161b2010-02-22 15:27:01 -0800258 graph_utils.cc
Gilad Arnold9bedeb52011-11-17 16:19:57 -0800259 http_common.cc
Andrew de los Reyes45168102010-11-22 11:13:50 -0800260 http_fetcher.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000261 libcurl_http_fetcher.cc
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700262 marshal.glibmarshal.c
Thieu Le5c7d9752010-12-15 16:09:28 -0800263 metadata.cc
Andrew de los Reyes819fef22010-12-17 11:33:58 -0800264 multi_range_http_fetcher.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000265 omaha_hash_calculator.cc
Darin Petkov6a5b3222010-07-13 14:55:28 -0700266 omaha_request_action.cc
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700267 omaha_request_params.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000268 omaha_response_handler_action.cc
Andrew de los Reyes0c440052010-08-20 11:25:54 -0700269 payload_signer.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000270 postinstall_runner_action.cc
Darin Petkov30030592010-07-27 13:53:20 -0700271 prefs.cc
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -0800272 proxy_resolver.cc
Andrew de los Reyes785bc352010-05-26 12:34:53 -0700273 simple_key_value_store.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000274 subprocess.cc
Andrew de los Reyes81ebcd82010-03-09 15:56:18 -0800275 tarjan.cc
Darin Petkov9c0baf82010-10-07 13:44:48 -0700276 terminator.cc
Andrew de los Reyes58151552010-03-10 20:07:08 -0800277 topological_sort.cc
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700278 update_attempter.cc
Darin Petkov1023a602010-08-30 13:47:51 -0700279 update_check_scheduler.cc
Andrew de los Reyes82d86792010-06-30 17:00:44 -0700280 update_metadata.pb.cc
281 utils.cc""")
rspangler@google.com49fdf182009-10-10 00:57:34 +0000282main = ['main.cc']
283
284unittest_sources = Split("""action_unittest.cc
285 action_pipe_unittest.cc
286 action_processor_unittest.cc
Andrew de los Reyes80061062010-02-04 14:25:00 -0800287 bzip_extent_writer_unittest.cc
Bruno Rocha7f9aea22011-09-12 14:31:24 -0700288 certificate_checker_unittest.cc
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800289 chrome_browser_proxy_resolver_unittest.cc
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -0800290 chrome_proxy_resolver_unittest.cc
Andrew de los Reyes35a7af12010-03-10 16:33:26 -0800291 cycle_breaker_unittest.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000292 delta_diff_generator_unittest.cc
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700293 delta_performer_unittest.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000294 download_action_unittest.cc
Andrew de los Reyesb4025e62010-02-23 17:47:03 -0800295 extent_mapper_unittest.cc
Andrew de los Reyes5fdae4a2010-10-05 10:47:42 -0700296 extent_ranges_unittest.cc
Andrew de los Reyes80061062010-02-04 14:25:00 -0800297 extent_writer_unittest.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000298 file_writer_unittest.cc
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700299 filesystem_copier_action_unittest.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000300 filesystem_iterator_unittest.cc
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700301 flimflam_proxy_unittest.cc
Darin Petkov7a22d792010-11-08 14:10:00 -0800302 full_update_generator_unittest.cc
Andrew de los Reyes0ce161b2010-02-22 15:27:01 -0800303 graph_utils_unittest.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000304 http_fetcher_unittest.cc
Thieu Le5c7d9752010-12-15 16:09:28 -0800305 metadata_unittest.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000306 mock_http_fetcher.cc
307 omaha_hash_calculator_unittest.cc
Darin Petkov6a5b3222010-07-13 14:55:28 -0700308 omaha_request_action_unittest.cc
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700309 omaha_request_params_unittest.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000310 omaha_response_handler_action_unittest.cc
Andrew de los Reyes0c440052010-08-20 11:25:54 -0700311 payload_signer_unittest.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000312 postinstall_runner_action_unittest.cc
Darin Petkov30030592010-07-27 13:53:20 -0700313 prefs_unittest.cc
Andrew de los Reyes785bc352010-05-26 12:34:53 -0700314 simple_key_value_store_unittest.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000315 subprocess_unittest.cc
Andrew de los Reyes81ebcd82010-03-09 15:56:18 -0800316 tarjan_unittest.cc
Darin Petkov80f19562010-11-19 12:00:15 -0800317 terminator_unittest.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000318 test_utils.cc
Andrew de los Reyes58151552010-03-10 20:07:08 -0800319 topological_sort_unittest.cc
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700320 update_attempter_unittest.cc
Darin Petkov1023a602010-08-30 13:47:51 -0700321 update_check_scheduler_unittest.cc
Andrew de los Reyesd2135f32010-03-11 16:00:28 -0800322 utils_unittest.cc
323 zip_unittest.cc""")
rspangler@google.com49fdf182009-10-10 00:57:34 +0000324unittest_main = ['testrunner.cc']
325
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700326client_main = ['update_engine_client.cc']
327
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800328delta_generator_main = ['generate_delta_main.cc']
329
Andrew de los Reyes82d86792010-06-30 17:00:44 -0700330# Hack to generate header files first. They are generated as a side effect
331# of generating other files (usually their corresponding .c(c) files),
332# so we make all sources depend on those other files.
333all_sources = []
334all_sources.extend(sources)
335all_sources.extend(unittest_sources)
336all_sources.extend(main)
337all_sources.extend(unittest_main)
338all_sources.extend(client_main)
339all_sources.extend(delta_generator_main)
340for source in all_sources:
Darin Petkovd7061ab2010-10-06 14:37:09 -0700341 if source.endswith('_unittest.cc'):
342 env.Depends(source, 'unittest_key.pub.pem')
Andrew de los Reyes82d86792010-06-30 17:00:44 -0700343 if source.endswith('.glibmarshal.c') or source.endswith('.pb.cc'):
344 continue
345 env.Depends(source, 'update_metadata.pb.cc')
346 env.Depends(source, 'marshal.glibmarshal.c')
347 env.Depends(source, 'update_engine.dbusclient.h')
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800348
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700349update_engine_core = env.Library('update_engine_core', sources)
350env.Prepend(LIBS=[update_engine_core])
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700351
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700352env.Program('update_engine', main)
353
354client_cmd = env.Program('update_engine_client', client_main);
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000355
356delta_generator_cmd = env.Program('delta_generator',
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700357 delta_generator_main)
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000358
359http_server_cmd = env.Program('test_http_server', 'test_http_server.cc')
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700360
361unittest_env = env.Clone()
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700362unittest_env.Append(LIBS=['gmock', 'gtest'])
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700363unittest_cmd = unittest_env.Program('update_engine_unittests',
364 unittest_sources + unittest_main)
365Clean(unittest_cmd, Glob('*.gcda') + Glob('*.gcno') + Glob('*.gcov') +
Andrew de los Reyes819fef22010-12-17 11:33:58 -0800366 Split('html app.info'))