blob: 09e27b0419c2c06933c638d28a1da9dc95e1ee91 [file] [log] [blame]
rspangler@google.com49fdf182009-10-10 00:57:34 +00001# Copyright (c) 2009 The Chromium OS 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
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
rspangler@google.com49fdf182009-10-10 00:57:34 +0000122env = Environment()
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700123for key in Split('CC CXX AR RANLIB LD NM'):
124 value = os.environ.get(key)
125 if value != None:
126 env[key] = value
127for key in Split('CFLAGS CCFLAGS CPPPATH LIBPATH'):
128 value = os.environ.get(key)
129 if value != None:
130 env[key] = Split(value)
131
132for key in Split('PKG_CONFIG_LIBDIR PKG_CONFIG_PATH SYSROOT'):
133 if os.environ.has_key(key):
134 env['ENV'][key] = os.environ[key]
135
136
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000137env['CCFLAGS'] = ' '.join("""-g
138 -fno-exceptions
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700139 -fno-strict-aliasing
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000140 -Wall
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000141 -Wclobbered
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700142 -Wclobbered
143 -Wempty-body
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000144 -Wempty-body
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700145 -Werror
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000146 -Wignored-qualifiers
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700147 -Wignored-qualifiers
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000148 -Wmissing-field-initializers
149 -Wsign-compare
150 -Wtype-limits
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700151 -Wtype-limits
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000152 -Wuninitialized
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700153 -D__STDC_FORMAT_MACROS=1
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000154 -D_FILE_OFFSET_BITS=64
155 -I/usr/include/libxml2""".split());
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700156env['CCFLAGS'] += (' ' + ' '.join(env['CFLAGS']))
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000157
158env['LIBS'] = Split("""base
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700159 bz2
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000160 curl
161 gflags
162 glib-2.0
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000163 gthread-2.0
164 libpcrecpp
165 protobuf
166 pthread
167 ssl
168 xml2
169 z""")
170env['CPPPATH'] = ['..', '../../third_party/chrome/files', '../../common']
171env['LIBPATH'] = ['../../third_party/chrome']
172env['BUILDERS']['ProtocolBuffer'] = proto_builder
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700173env['BUILDERS']['DbusBindings'] = dbus_bindings_builder
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700174env['BUILDERS']['GlibMarshal'] = glib_marshal_builder
Colin Watsonf2c29ec2010-01-08 18:50:56 +0000175
Sean Parenta5deaca2010-06-23 16:44:42 -0700176# Hack to fix dependencies from auto generated headers.
177# Some files indirectly included update_metatadata.pb.h
178# which is built as a side effect of building update_metadata.pb.cc
179env.Depends('bzip_extent_writer_unittest.cc', 'update_metadata.pb.cc');
180env.Depends('bzip_extent_writer.cc', 'update_metadata.pb.cc');
Sean Parent540bb902010-06-23 23:12:40 -0700181env.Depends('cycle_breaker.cc', 'update_metadata.pb.cc');
Sean Parenta5deaca2010-06-23 16:44:42 -0700182
183# Some files indirectly include marshal.glibmarshal.h
184# which is built as a side effect of the .c file
185env.Depends('dbus_service.cc', 'marshal.glibmarshal.c');
186
187# Some files indirectly include update_engine.dbusserver.h
188# which is built as a side effect of the dbusclient.h file
189env.Depends('mock_http_fetcher.cc', 'update_engine.dbusclient.h');
Sean Parent540bb902010-06-23 23:12:40 -0700190env.Depends('main.cc', 'update_engine.dbusclient.h');
Sean Parenta5deaca2010-06-23 16:44:42 -0700191
Colin Watsonf2c29ec2010-01-08 18:50:56 +0000192# Fix issue with scons not passing pkg-config vars through the environment.
193for key in Split('PKG_CONFIG_LIBDIR PKG_CONFIG_PATH'):
194 if os.environ.has_key(key):
195 env['ENV'][key] = os.environ[key]
196
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700197env.ParseConfig('pkg-config --cflags --libs '
198 'dbus-1 dbus-glib-1 gio-2.0 gio-unix-2.0 glib-2.0')
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000199env.ProtocolBuffer('update_metadata.pb.cc', 'update_metadata.proto')
rspangler@google.com49fdf182009-10-10 00:57:34 +0000200
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700201env.DbusBindings('update_engine.dbusclient.h', 'update_engine.xml')
202
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700203env.GlibMarshal('marshal.glibmarshal.c', 'marshal.list')
204
rspangler@google.com49fdf182009-10-10 00:57:34 +0000205if ARGUMENTS.get('debug', 0):
206 env['CCFLAGS'] += ' -fprofile-arcs -ftest-coverage'
Andrew de los Reyes80061062010-02-04 14:25:00 -0800207 env['LIBS'] += ['bz2', 'gcov']
rspangler@google.com49fdf182009-10-10 00:57:34 +0000208
209sources = Split("""action_processor.cc
Andrew de los Reyesd2135f32010-03-11 16:00:28 -0800210 bzip.cc
Andrew de los Reyes80061062010-02-04 14:25:00 -0800211 bzip_extent_writer.cc
Andrew de los Reyes35a7af12010-03-10 16:33:26 -0800212 cycle_breaker.cc
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700213 dbus_service.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000214 decompressing_file_writer.cc
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700215 delta_diff_generator.cc
216 delta_performer.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000217 download_action.cc
Andrew de los Reyesb4025e62010-02-23 17:47:03 -0800218 extent_mapper.cc
Andrew de los Reyes80061062010-02-04 14:25:00 -0800219 extent_writer.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000220 filesystem_copier_action.cc
221 filesystem_iterator.cc
222 file_writer.cc
Andrew de los Reyes0ce161b2010-02-22 15:27:01 -0800223 graph_utils.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000224 gzip.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000225 libcurl_http_fetcher.cc
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700226 marshal.glibmarshal.c
rspangler@google.com49fdf182009-10-10 00:57:34 +0000227 omaha_hash_calculator.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000228 omaha_request_prep_action.cc
229 omaha_response_handler_action.cc
230 postinstall_runner_action.cc
231 set_bootable_flag_action.cc
Andrew de los Reyes785bc352010-05-26 12:34:53 -0700232 simple_key_value_store.cc
Andrew de los Reyes0cca4212010-04-29 14:00:58 -0700233 split_file_writer.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000234 subprocess.cc
Andrew de los Reyes81ebcd82010-03-09 15:56:18 -0800235 tarjan.cc
Andrew de los Reyes58151552010-03-10 20:07:08 -0800236 topological_sort.cc
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700237 update_attempter.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000238 update_check_action.cc
239 update_metadata.pb.cc
240 utils.cc""")
rspangler@google.com49fdf182009-10-10 00:57:34 +0000241main = ['main.cc']
242
243unittest_sources = Split("""action_unittest.cc
244 action_pipe_unittest.cc
245 action_processor_unittest.cc
Andrew de los Reyes80061062010-02-04 14:25:00 -0800246 bzip_extent_writer_unittest.cc
Andrew de los Reyes35a7af12010-03-10 16:33:26 -0800247 cycle_breaker_unittest.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000248 decompressing_file_writer_unittest.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000249 delta_diff_generator_unittest.cc
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700250 delta_performer_unittest.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000251 download_action_unittest.cc
Andrew de los Reyesb4025e62010-02-23 17:47:03 -0800252 extent_mapper_unittest.cc
Andrew de los Reyes80061062010-02-04 14:25:00 -0800253 extent_writer_unittest.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000254 file_writer_unittest.cc
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700255 filesystem_copier_action_unittest.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000256 filesystem_iterator_unittest.cc
Andrew de los Reyes0ce161b2010-02-22 15:27:01 -0800257 graph_utils_unittest.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000258 http_fetcher_unittest.cc
259 mock_http_fetcher.cc
260 omaha_hash_calculator_unittest.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000261 omaha_request_prep_action_unittest.cc
262 omaha_response_handler_action_unittest.cc
263 postinstall_runner_action_unittest.cc
264 set_bootable_flag_action_unittest.cc
Andrew de los Reyes785bc352010-05-26 12:34:53 -0700265 simple_key_value_store_unittest.cc
Andrew de los Reyes0cca4212010-04-29 14:00:58 -0700266 split_file_writer_unittest.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000267 subprocess_unittest.cc
Andrew de los Reyes81ebcd82010-03-09 15:56:18 -0800268 tarjan_unittest.cc
rspangler@google.com49fdf182009-10-10 00:57:34 +0000269 test_utils.cc
Andrew de los Reyes58151552010-03-10 20:07:08 -0800270 topological_sort_unittest.cc
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000271 update_check_action_unittest.cc
Andrew de los Reyesd2135f32010-03-11 16:00:28 -0800272 utils_unittest.cc
273 zip_unittest.cc""")
rspangler@google.com49fdf182009-10-10 00:57:34 +0000274unittest_main = ['testrunner.cc']
275
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700276client_main = ['update_engine_client.cc']
277
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800278delta_generator_main = ['generate_delta_main.cc']
279
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -0800280
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700281update_engine_core = env.Library('update_engine_core', sources)
282env.Prepend(LIBS=[update_engine_core])
Andrew de los Reyes4e9b9f42010-04-26 15:06:43 -0700283
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700284env.Program('update_engine', main)
285
286client_cmd = env.Program('update_engine_client', client_main);
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000287
288delta_generator_cmd = env.Program('delta_generator',
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700289 delta_generator_main)
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000290
291http_server_cmd = env.Program('test_http_server', 'test_http_server.cc')
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700292
293unittest_env = env.Clone()
294unittest_env.Append(LIBS=['gtest'])
295unittest_cmd = unittest_env.Program('update_engine_unittests',
296 unittest_sources + unittest_main)
297Clean(unittest_cmd, Glob('*.gcda') + Glob('*.gcno') + Glob('*.gcov') +
298 Split('html app.info'))