| # -*- 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)]) |