blob: b97124fbe1e285798a9bf2b84fd3fb248bf64ed0 [file] [log] [blame]
# -*- python -*-
# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This file is used to build the libchrome package for Chrome OS:
# https://www.chromium.org/chromium-os/packages/libchrome
import os
env = Environment()
BASE_VER = os.environ.get('BASE_VER', '0')
PKG_CONFIG = os.environ.get('PKG_CONFIG', 'pkg-config')
CHROME_INCLUDE_PATH = os.environ.get('CHROME_INCLUDE_PATH', '.')
USE_CRYPTO = os.environ.get('USE_CRYPTO', '1')
USE_DBUS = os.environ.get('USE_DBUS', '1')
USE_TIMERS = os.environ.get('USE_TIMERS', '1')
# This block will need updating whenever libchrome gets updated. The order of
# the libs below doesn't matter (as scons will take care of building things in
# the required order). The split between them is purely to reduce excess
# linking of third-party libraries, i.e. 'core' should require only a minimal
# set of libraries, and other third-party libraries should get a unique 'xxx'
# name.
base_name = 'base'
base_libs = [
{
'name' : 'core',
'sources' : """
allocator/allocator_extension.cc
allocator/allocator_shim.cc
allocator/allocator_shim_default_dispatch_to_glibc.cc
at_exit.cc
base64.cc
base64url.cc
base_switches.cc
bind_helpers.cc
build_time.cc
callback_helpers.cc
callback_internal.cc
command_line.cc
cpu.cc
debug/activity_tracker.cc
debug/alias.cc
debug/crash_logging.cc
debug/debugger.cc
debug/debugger_posix.cc
debug/dump_without_crashing.cc
debug/stack_trace.cc
debug/stack_trace_posix.cc
debug/task_annotator.cc
environment.cc
feature_list.cc
files/file.cc
files/file_descriptor_watcher_posix.cc
files/file_enumerator.cc
files/file_enumerator_posix.cc
files/file_path.cc
files/file_path_constants.cc
files/file_path_watcher.cc
files/file_path_watcher_linux.cc
files/file_posix.cc
files/file_tracing.cc
files/file_util.cc
files/file_util_linux.cc
files/file_util_posix.cc
files/important_file_writer.cc
files/memory_mapped_file.cc
files/memory_mapped_file_posix.cc
files/scoped_file.cc
files/scoped_temp_dir.cc
guid.cc
hash.cc
json/json_file_value_serializer.cc
json/json_parser.cc
json/json_reader.cc
json/json_string_value_serializer.cc
json/json_value_converter.cc
json/json_writer.cc
json/string_escape.cc
lazy_instance.cc
location.cc
logging.cc
md5.cc
memory/aligned_memory.cc
memory/ref_counted.cc
memory/ref_counted_memory.cc
memory/shared_memory_helper.cc
memory/shared_memory_posix.cc
memory/shared_memory_tracker.cc
memory/singleton.cc
memory/weak_ptr.cc
message_loop/incoming_task_queue.cc
message_loop/message_loop.cc
message_loop/message_loop_task_runner.cc
message_loop/message_pump.cc
message_loop/message_pump_default.cc
message_loop/message_pump_glib.cc
message_loop/message_pump_libevent.cc
metrics/bucket_ranges.cc
metrics/field_trial.cc
metrics/field_trial_param_associator.cc
metrics/metrics_hashes.cc
metrics/histogram_base.cc
metrics/histogram.cc
metrics/histogram_samples.cc
metrics/histogram_snapshot_manager.cc
metrics/persistent_histogram_allocator.cc
metrics/persistent_memory_allocator.cc
metrics/persistent_sample_map.cc
metrics/sample_map.cc
metrics/sample_vector.cc
metrics/sparse_histogram.cc
metrics/statistics_recorder.cc
pending_task.cc
pickle.cc
posix/file_descriptor_shuffle.cc
posix/global_descriptors.cc
posix/safe_strerror.cc
posix/unix_domain_socket_linux.cc
process/internal_linux.cc
process/kill.cc
process/kill_posix.cc
process/launch.cc
process/launch_posix.cc
process/memory.cc
process/memory_linux.cc
process/process_handle.cc
process/process_handle_linux.cc
process/process_iterator.cc
process/process_iterator_linux.cc
process/process_handle_posix.cc
process/process_metrics.cc
process/process_metrics_linux.cc
process/process_metrics_posix.cc
process/process_posix.cc
profiler/scoped_profile.cc
profiler/scoped_tracker.cc
profiler/tracked_time.cc
rand_util.cc
rand_util_posix.cc
run_loop.cc
sequence_checker_impl.cc
sequenced_task_runner.cc
sequence_token.cc
sha1.cc
strings/pattern.cc
strings/safe_sprintf.cc
strings/string16.cc
strings/string_number_conversions.cc
strings/string_piece.cc
strings/stringprintf.cc
strings/string_split.cc
strings/string_util.cc
strings/string_util_constants.cc
strings/sys_string_conversions_posix.cc
strings/utf_string_conversions.cc
strings/utf_string_conversion_utils.cc
synchronization/atomic_flag.cc
synchronization/condition_variable_posix.cc
synchronization/lock.cc
synchronization/lock_impl_posix.cc
synchronization/read_write_lock_posix.cc
synchronization/waitable_event_posix.cc
synchronization/waitable_event_watcher_posix.cc
sync_socket_posix.cc
sys_info.cc
sys_info_chromeos.cc
sys_info_linux.cc
sys_info_posix.cc
task_runner.cc
task/cancelable_task_tracker.cc
task_scheduler/scheduler_lock_impl.cc
task_scheduler/scoped_set_task_priority_for_current_thread.cc
task_scheduler/sequence.cc
task_scheduler/sequence_sort_key.cc
task_scheduler/task.cc
task_scheduler/task_traits.cc
third_party/dynamic_annotations/dynamic_annotations.c
third_party/icu/icu_utf.cc
third_party/nspr/prtime.cc
threading/non_thread_safe_impl.cc
threading/platform_thread_internal_posix.cc
threading/platform_thread_linux.cc
threading/platform_thread_posix.cc
threading/post_task_and_reply_impl.cc
threading/sequenced_task_runner_handle.cc
threading/sequenced_worker_pool.cc
threading/simple_thread.cc
threading/thread.cc
threading/thread_checker_impl.cc
threading/thread_collision_warner.cc
threading/thread_id_name_manager.cc
threading/thread_local_storage.cc
threading/thread_local_storage_posix.cc
threading/thread_restrictions.cc
threading/thread_task_runner_handle.cc
threading/worker_pool.cc
threading/worker_pool_posix.cc
timer/elapsed_timer.cc
timer/timer.cc
time/clock.cc
time/default_clock.cc
time/default_tick_clock.cc
time/tick_clock.cc
time/time.cc
time/time_posix.cc
trace_event/category_registry.cc
trace_event/event_name_filter.cc
trace_event/malloc_dump_provider.cc
trace_event/heap_profiler_allocation_context.cc
trace_event/heap_profiler_allocation_context_tracker.cc
trace_event/heap_profiler_allocation_register.cc
trace_event/heap_profiler_allocation_register_posix.cc
trace_event/heap_profiler_event_filter.cc
trace_event/heap_profiler_heap_dump_writer.cc
trace_event/heap_profiler_stack_frame_deduplicator.cc
trace_event/heap_profiler_type_name_deduplicator.cc
trace_event/memory_allocator_dump.cc
trace_event/memory_allocator_dump_guid.cc
trace_event/memory_dump_manager.cc
trace_event/memory_dump_request_args.cc
trace_event/memory_dump_scheduler.cc
trace_event/memory_dump_session_state.cc
trace_event/memory_infra_background_whitelist.cc
trace_event/process_memory_dump.cc
trace_event/process_memory_maps.cc
trace_event/process_memory_totals.cc
trace_event/trace_buffer.cc
trace_event/trace_config.cc
trace_event/trace_event_argument.cc
trace_event/trace_event_filter.cc
trace_event/trace_event_impl.cc
trace_event/trace_event_memory_overhead.cc
trace_event/trace_event_synthetic_delay.cc
trace_event/trace_log.cc
trace_event/trace_log_constants.cc
tracked_objects.cc
tracking_info.cc
values.cc
version.cc
vlog.cc
""",
'prefix' : 'base',
'libs' : 'pthread rt libmodp_b64',
'pc_libs' : 'glib-2.0 libevent',
},
{
'name' : 'dl',
'sources' : """
native_library_posix.cc
""",
'prefix' : 'base',
'libs' : 'dl',
'pc_libs' : '',
},
{
'name' : 'policy',
'sources' : """
core/common/policy_load_status.cc
core/common/preg_parser.cc
core/common/registry_dict.cc
""",
'prefix' : 'components/policy',
'libs' : '',
'pc_libs' : '',
},
{
'name' : 'sandbox',
'sources' : """
linux/bpf_dsl/bpf_dsl.cc
linux/bpf_dsl/codegen.cc
linux/bpf_dsl/dump_bpf.cc
linux/bpf_dsl/policy.cc
linux/bpf_dsl/policy_compiler.cc
linux/bpf_dsl/syscall_set.cc
linux/bpf_dsl/verifier.cc
linux/seccomp-bpf/die.cc
linux/seccomp-bpf/sandbox_bpf.cc
linux/seccomp-bpf/syscall.cc
linux/seccomp-bpf/trap.cc
linux/seccomp-bpf-helpers/baseline_policy.cc
linux/seccomp-bpf-helpers/sigsys_handlers.cc
linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
linux/seccomp-bpf-helpers/syscall_sets.cc
linux/services/init_process_reaper.cc
linux/services/proc_util.cc
linux/services/resource_limits.cc
linux/services/scoped_process.cc
linux/services/syscall_wrappers.cc
linux/services/thread_helpers.cc
linux/services/yama.cc
linux/syscall_broker/broker_channel.cc
linux/syscall_broker/broker_client.cc
linux/syscall_broker/broker_file_permission.cc
linux/syscall_broker/broker_host.cc
linux/syscall_broker/broker_policy.cc
linux/syscall_broker/broker_process.cc
linux/services/credentials.cc
linux/services/namespace_sandbox.cc
linux/services/namespace_utils.cc
""",
'prefix' : 'sandbox',
'libs' : '',
'pc_libs' : '',
},
]
if USE_CRYPTO == '1':
base_libs.append({
'name' : 'crypto',
'sources' : """
hmac.cc
hmac_nss.cc
nss_key_util.cc
nss_util.cc
openssl_util.cc
p224.cc
p224_spake.cc
random.cc
rsa_private_key.cc
rsa_private_key_nss.cc
scoped_test_nss_db.cc
secure_hash.cc
secure_util.cc
sha2.cc
signature_creator_nss.cc
signature_verifier_nss.cc
symmetric_key_nss.cc
third_party/nss/rsawrapr.c
third_party/nss/sha512.cc
""",
'prefix' : 'crypto',
'libs' : '%s-dl-%s' % (base_name, BASE_VER),
'pc_libs' : 'nss openssl',
})
if USE_DBUS == '1':
base_libs.append({
'name' : 'dbus',
'sources' : """
bus.cc
dbus_statistics.cc
exported_object.cc
message.cc
object_manager.cc
object_path.cc
object_proxy.cc
property.cc
scoped_dbus_error.cc
string_util.cc
util.cc
values_util.cc
""",
'prefix' : 'dbus',
'libs' : '',
'pc_libs' : 'dbus-1 protobuf-lite',
})
if USE_TIMERS == '1':
base_libs.append({
'name' : 'timers',
'sources' : """
alarm_timer_chromeos.cc
""",
'prefix' : 'components/timers',
'libs' : '',
'pc_libs' : '',
})
env.Append(
CPPPATH=['files'],
CCFLAGS=['-g']
)
for key in Split('CC CXX AR RANLIB LD NM CFLAGS CXXFLAGS LDFLAGS'):
value = os.environ.get(key)
if value:
env[key] = Split(value)
if os.environ.has_key('CPPFLAGS'):
env['CCFLAGS'] += Split(os.environ['CPPFLAGS'])
env['CCFLAGS'] += ['-DOS_CHROMEOS',
'-DUSE_NSS_CERTS',
'-DUSE_SYSTEM_LIBEVENT',
'-DNO_TCMALLOC',
'-fPIC',
'-fno-exceptions',
'-Wall',
'-Werror',
'-Wno-deprecated-register',
'-Wno-narrowing',
'-Wno-psabi',
'-Wno-unused-local-typedefs',
# Various #defines are hardcoded near the top of
# build_config.h to ensure that they'll be set both when
# libchrome is built and when other packages include
# libchrome's headers.
'-I%s' % CHROME_INCLUDE_PATH]
env.Append(
CXXFLAGS=['-std=c++11']
)
# Flags for clang taken from build/common.gypi in the clang==1 section.
CLANG_FLAGS = (
'-Wno-char-subscripts',
)
env['CCFLAGS'] += ['-Xclang-only=%s' % x for x in CLANG_FLAGS]
# Fix issue with scons not passing some vars through the environment.
for key in Split('PKG_CONFIG SYSROOT'):
if os.environ.has_key(key):
env['ENV'][key] = os.environ[key]
all_base_libs = []
all_pc_libs = ''
all_libs = []
all_scons_libs = []
# Build all the shared libraries.
for lib in base_libs:
pc_libs = lib['pc_libs'].replace('${bslot}', BASE_VER)
all_pc_libs += ' ' + pc_libs
libs = Split(lib['libs'].replace('${bslot}', BASE_VER))
all_libs += libs
name = '%s-%s-%s' % (base_name, lib['name'], BASE_VER)
all_base_libs += [name]
corename = '%s-core-%s' % (base_name, BASE_VER)
# Automatically link the sub-libs against the main core lib.
# This is to keep from having to explicitly mention it in the
# table above (i.e. lazy).
if name != corename:
libs += [corename]
e = env.Clone()
e.Append(
LIBS = Split(libs),
LIBPATH = ['.'],
LINKFLAGS = ['-Wl,--as-needed', '-Wl,-z,defs',
'-Wl,-soname,lib%s.so' % name],
)
if pc_libs:
e.ParseConfig(PKG_CONFIG + ' --cflags --libs %s' % pc_libs)
# Prepend prefix to source filenames.
sources = [os.path.join(lib['prefix'], x) for x in Split(lib['sources'])]
all_scons_libs += [ e.SharedLibrary(name, sources) ]
# Build a static library of mocks for unittests to link against.
# Being static allows us to mask this library out of the image.
all_base_test_libs = []
all_test_pc_libs = ''
all_test_libs = []
test_libs = [
{
'name': 'base_test_support',
'sources': """
simple_test_clock.cc
simple_test_tick_clock.cc
test_file_util.cc
test_file_util_linux.cc
test_switches.cc
test_timeouts.cc
""",
'prefix': 'base/test',
'libs': '',
'pc_libs': '',
},
]
if USE_DBUS == '1':
test_libs.append({
'name': 'dbus_test_support',
'sources': """
mock_bus.cc
mock_exported_object.cc
mock_object_manager.cc
mock_object_proxy.cc
""",
'prefix': 'dbus',
'libs': '', # TODO(wiley) what should go here?
'pc_libs': 'dbus-1 protobuf-lite',
})
if USE_TIMERS == '1':
test_libs.append({
'name': 'timer_test_support',
'sources': """
mock_timer.cc
""",
'prefix': 'base/timer',
'libs': '',
'pc_libs': '',
})
for lib in test_libs:
pc_libs = lib['pc_libs'].replace('${bslot}', BASE_VER)
all_test_pc_libs += ' ' + pc_libs
libs = Split(lib['libs'].replace('${bslot}', BASE_VER))
all_test_libs += libs
name = '%s-%s-%s' % (base_name, lib['name'], BASE_VER)
all_base_test_libs += [name]
static_env = env.Clone()
if pc_libs:
static_env.ParseConfig(PKG_CONFIG + ' --cflags --libs %s' % pc_libs)
sources = [os.path.join(lib['prefix'], x)
for x in Split(lib['sources'])]
static_env.StaticLibrary(name, sources)
# Build the random text files (pkg-config and linker script).
def lib_list(libs):
return ' '.join(['-l' + l for l in libs])
prod_subst_dict = {
'@BSLOT@': BASE_VER,
'@PRIVATE_PC@': all_pc_libs,
'@BASE_LIBS@': lib_list(all_base_libs),
'@LIBS@': lib_list(all_libs),
'@NAME@': 'libchrome',
'@PKG_CFG_NAME@': 'libchrome-%s.pc' % BASE_VER,
'@LIB_NAME@': 'libbase-%s.so' % BASE_VER,
'@DESCRIPTION@': 'chrome base library',
# scons, in its infinite wisdom sees fit to expand this string if
# if we don't escape the $.
'@TARGET_LIB@': 'base-$${bslot}',
}
# Similarly, build text files related to the test libraries.
test_subst_dict = {
'@BSLOT@': BASE_VER,
'@PRIVATE_PC@': all_test_pc_libs,
'@BASE_LIBS@': lib_list(all_base_test_libs),
'@LIBS@': lib_list(all_test_libs),
'@NAME@': 'libchrome-test',
'@PKG_CFG_NAME@': 'libchrome-test-%s.pc' % BASE_VER,
'@LIB_NAME@': 'libbase-test-%s.a' % BASE_VER,
'@DESCRIPTION@': 'chrome base test library',
# scons, in its infinite wisdom sees fit to expand this string if
# if we don't escape the $.
'@TARGET_LIB@': 'base-test-$${bslot}',
}
pc_file_contents = """
prefix=/usr
includedir=${prefix}/include
bslot=@BSLOT@
Name: @NAME@
Description: @DESCRIPTION@
Version: ${bslot}
Requires:
Requires.private: @PRIVATE_PC@
Libs: -l@TARGET_LIB@
Libs.private: @BASE_LIBS@ @LIBS@
Cflags: -I${includedir}/@TARGET_LIB@ -Wno-c++11-extensions -Wno-unused-local-typedefs -DBASE_VER=${bslot}
"""
# https://sourceware.org/binutils/docs/ld/Scripts.html
so_file_contents = """GROUP ( AS_NEEDED ( @BASE_LIBS@ ) )"""
for subst_dict in (test_subst_dict, prod_subst_dict):
env = Environment(tools=['textfile'], SUBST_DICT=subst_dict)
env.Substfile(subst_dict['@LIB_NAME@'], [Value(so_file_contents)])
env.Substfile(subst_dict['@PKG_CFG_NAME@'], [Value(pc_file_contents)])