You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
540 lines
19 KiB
540 lines
19 KiB
# -*- 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', '.') |
|
|
|
# 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/alias.cc |
|
debug/debugger.cc |
|
debug/debugger_posix.cc |
|
debug/stack_trace.cc |
|
debug/stack_trace_posix.cc |
|
debug/task_annotator.cc |
|
environment.cc |
|
files/file.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_posix.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/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/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 |
|
sha1_portable.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/cancellation_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/sequence.cc |
|
task_scheduler/sequence_sort_key.cc |
|
task_scheduler/task.cc |
|
task_scheduler/task_traits.cc |
|
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_posix.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/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_heap_dump_writer.cc |
|
trace_event/heap_profiler_stack_frame_deduplicator.cc |
|
trace_event/heap_profiler_type_name_deduplicator.cc |
|
trace_event/malloc_dump_provider.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_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_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 |
|
trace_event/trace_sampling_thread.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' : 'dbus', |
|
'sources' : """ |
|
bus.cc |
|
dbus_statistics.cc |
|
exported_object.cc |
|
file_descriptor.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', |
|
}, |
|
{ |
|
'name' : 'timers', |
|
'sources' : """ |
|
alarm_timer_chromeos.cc |
|
""", |
|
'prefix' : 'components/timers', |
|
'libs' : '', |
|
'pc_libs' : '', |
|
}, |
|
{ |
|
'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', |
|
}, |
|
{ |
|
'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' : '', |
|
}, |
|
] |
|
|
|
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': '', |
|
}, |
|
{ |
|
'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', |
|
}, |
|
{ |
|
'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)])
|
|
|