| # Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| # for details. All rights reserved. Use of this source code is governed by a |
| # BSD-style license that can be found in the LICENSE file. |
| |
| import("//build_overrides/build.gni") |
| import("//third_party/protobuf/proto_library.gni") |
| import("../../build/executable_suffix.gni") |
| import("../../sdk/lib/async/async_sources.gni") |
| import("../../sdk/lib/collection/collection_sources.gni") |
| import("../../sdk/lib/concurrent/concurrent_sources.gni") |
| import("../../sdk/lib/convert/convert_sources.gni") |
| import("../../sdk/lib/core/core_sources.gni") |
| import("../../sdk/lib/developer/developer_sources.gni") |
| import("../../sdk/lib/ffi/ffi_sources.gni") |
| import("../../sdk/lib/internal/internal_sources.gni") |
| import("../../sdk/lib/isolate/isolate_sources.gni") |
| import("../../sdk/lib/math/math_sources.gni") |
| import("../../sdk/lib/mirrors/mirrors_sources.gni") |
| import("../../sdk/lib/typed_data/typed_data_sources.gni") |
| import("../../sdk/lib/vmservice/vmservice_sources.gni") |
| import("../../sdk_args.gni") |
| import("../../utils/compile_platform.gni") |
| import("../bin/cli_sources.gni") |
| import("../bin/io_sources.gni") |
| import("../configs.gni") |
| import("../lib/async_sources.gni") |
| import("../lib/concurrent_sources.gni") |
| import("../lib/convert_sources.gni") |
| import("../lib/core_sources.gni") |
| import("../lib/developer_sources.gni") |
| import("../lib/ffi_sources.gni") |
| import("../lib/isolate_sources.gni") |
| import("../lib/math_sources.gni") |
| import("../lib/mirrors_sources.gni") |
| import("../lib/profiler_sources.gni") |
| import("../lib/typed_data_sources.gni") |
| import("../lib/vmservice_sources.gni") |
| import("../runtime_args.gni") |
| import("compiler/compiler_sources.gni") |
| import("ffi/ffi_sources.gni") |
| import("heap/heap_sources.gni") |
| import("vm_sources.gni") |
| |
| config("libdart_vm_config") { |
| if (is_fuchsia) { |
| libs = [ "zircon" ] |
| } else if (is_win) { |
| libs = [ |
| "advapi32.lib", |
| "shell32.lib", |
| "ntdll.lib", |
| ] |
| if (target_os != "winuwp") { |
| libs += [ "dbghelp.lib" ] |
| } |
| } else { |
| libs = [ "dl" ] |
| if (!is_android) { |
| libs += [ "pthread" ] |
| } |
| |
| # Clang with libc++ does not require an explicit atomic library reference. |
| # (similar to https://github.com/flutter/buildroot/blob/master/build/config/compiler/BUILD.gn#L562) |
| if (!is_clang) { |
| libs += [ "atomic" ] |
| } |
| } |
| } |
| |
| # This is a modified copy of Perfetto's template of the same name defined in |
| # //third_party/perfetto/gn/proto_library.gni. |
| # This is equivalent to the proto_library template (generation of .h/.cc from |
| # .proto files) but enables generation using the protozero plugin. |
| # The generated files will have the .pbzero.{cc,h} suffix, as opposed to the |
| # .pb.{cc,h} of the official proto library. |
| template("protozero_library") { |
| proto_library(target_name) { |
| if (!defined(perfetto_root_path)) { |
| perfetto_root_path = "//third_party/perfetto/" |
| } |
| |
| generate_cc = false |
| generate_python = false |
| generator_plugin_label = |
| perfetto_root_path + "src/protozero/protoc_plugin:protozero_plugin" |
| generator_plugin_suffix = ".pbzero" |
| |
| if (defined(invoker.deps)) { |
| deps = invoker.deps |
| } else { |
| deps = [] |
| } |
| |
| forward_variables_from(invoker, |
| [ |
| "defines", |
| "generator_plugin_options", |
| "include_dirs", |
| "proto_in_dir", |
| "proto_out_dir", |
| "sources", |
| "testonly", |
| "visibility", |
| "generate_descriptor", |
| "propagate_imports_configs", |
| "import_dirs", |
| ]) |
| } |
| } |
| |
| _perfetto_proto_definition_sources = [ |
| "protos/perfetto/common/builtin_clock.proto", |
| "protos/perfetto/trace/clock_snapshot.proto", |
| "protos/perfetto/trace/interned_data/interned_data.proto", |
| "protos/perfetto/trace/profiling/profile_common.proto", |
| "protos/perfetto/trace/profiling/profile_packet.proto", |
| "protos/perfetto/trace/trace.proto", |
| "protos/perfetto/trace/trace_packet.proto", |
| "protos/perfetto/trace/track_event/debug_annotation.proto", |
| "protos/perfetto/trace/track_event/process_descriptor.proto", |
| "protos/perfetto/trace/track_event/thread_descriptor.proto", |
| "protos/perfetto/trace/track_event/track_descriptor.proto", |
| "protos/perfetto/trace/track_event/track_event.proto", |
| ] |
| |
| # This target is not a dependency of any other GN target. It is required to make |
| # ./protos/tools/compile_perfetto_protos.dart work though. |
| protozero_library("perfetto_protos_protozero") { |
| proto_in_dir = "." |
| proto_out_dir = "//runtime/vm" |
| generator_plugin_options = "wrapper_namespace=pbzero" |
| sources = _perfetto_proto_definition_sources |
| } |
| |
| proto_library("perfetto_protos_dart") { |
| generate_cc = false |
| generate_python = false |
| generator_plugin_script = "protos/tools/protoc_gen_dart_wrapper" |
| generator_plugin_suffixes = [ ".pb.dart" ] |
| |
| proto_in_dir = "." |
| proto_out_dir = "//pkg/vm_service_protos/lib/src" |
| |
| sources = _perfetto_proto_definition_sources |
| } |
| |
| # This config needs to be propagated to all targets that depend on |
| # ":libprotozero". |
| config("libprotozero_config") { |
| if (!defined(perfetto_root_path)) { |
| perfetto_root_path = "//third_party/perfetto/" |
| } |
| |
| include_dirs = [ |
| "$perfetto_root_path/include", |
| "$root_gen_dir/$perfetto_root_path/build_config", |
| ] |
| } |
| |
| # This target includes Perfetto's protozero target, which we need to serialize |
| # proto messages. This target also propagates ":libprotozero_config". |
| source_set("libprotozero") { |
| if (!defined(perfetto_root_path)) { |
| perfetto_root_path = "//third_party/perfetto/" |
| } |
| |
| public_configs = [ ":libprotozero_config" ] |
| deps = [ "$perfetto_root_path/src/protozero:protozero" ] |
| } |
| |
| library_for_all_configs("libdart_vm") { |
| target_type = "source_set" |
| extra_product_deps = [] |
| extra_nonproduct_deps = [ ":libprotozero" ] |
| extra_deps = [ |
| "//third_party/icu:icui18n", |
| "//third_party/icu:icuuc", |
| ] |
| if (is_fuchsia) { |
| extra_deps += [ |
| "$fuchsia_sdk/fidl/fuchsia.intl", |
| "$fuchsia_sdk/pkg/async", |
| "$fuchsia_sdk/pkg/async-default", |
| "$fuchsia_sdk/pkg/async-loop", |
| "$fuchsia_sdk/pkg/async-loop-default", |
| "$fuchsia_sdk/pkg/inspect", |
| "$fuchsia_sdk/pkg/inspect_component_cpp", |
| "$fuchsia_sdk/pkg/sys_cpp", |
| "$fuchsia_sdk/pkg/trace-engine", |
| ] |
| } |
| public_configs = [ ":libdart_vm_config" ] |
| sources = vm_sources + rebase_path(compiler_api_sources, ".", "./compiler/") + |
| rebase_path(disassembler_sources, ".", "./compiler/") + |
| rebase_path(ffi_sources, ".", "./ffi/") + |
| rebase_path(heap_sources, ".", "./heap/") |
| if (is_android) { |
| # Android specific workaround for a kernel bug. This source file can't |
| # go into vm_sources list because it will break Windows build which |
| # uses different assembler syntax. |
| sources += [ "thread_interrupter_android_arm.S" ] |
| } |
| include_dirs = [ ".." ] |
| } |
| |
| library_for_all_configs_with_compiler("libdart_compiler") { |
| target_type = "source_set" |
| public_configs = [ ":libdart_vm_config" ] |
| sources = rebase_path(compiler_sources, ".", "./compiler/") |
| include_dirs = [ ".." ] |
| extra_nonproduct_deps = [ ":libprotozero" ] |
| extra_deps = [] |
| if (is_fuchsia) { |
| extra_deps += [ "$fuchsia_sdk/pkg/trace-engine" ] |
| } |
| } |
| |
| library_for_all_configs("libdart_lib") { |
| target_type = "source_set" |
| extra_nonproduct_deps = [ ":libprotozero" ] |
| extra_deps = [] |
| if (is_fuchsia) { |
| extra_deps += [ "$fuchsia_sdk/pkg/trace-engine" ] |
| } |
| include_dirs = [ ".." ] |
| allsources = async_runtime_cc_files + concurrent_runtime_cc_files + |
| core_runtime_cc_files + developer_runtime_cc_files + |
| ffi_runtime_cc_files + isolate_runtime_cc_files + |
| math_runtime_cc_files + mirrors_runtime_cc_files + |
| typed_data_runtime_cc_files + vmservice_runtime_cc_files |
| |
| sources = [ "bootstrap.cc" ] + rebase_path(allsources, ".", "../lib") |
| snapshot_sources = [] |
| } |
| |
| template("gen_vm_platform") { |
| assert(defined(invoker.output_postfix), |
| "Must define output postfix (e.g., '_strong'") |
| is_product_flag = dart_runtime_mode == "release" |
| if (defined(invoker.product_mode)) { |
| is_product_flag = invoker.product_mode |
| } |
| compile_platform(target_name) { |
| output_postfix = invoker.output_postfix |
| if (defined(invoker.add_implicit_vm_platform_dependency)) { |
| add_implicit_vm_platform_dependency = |
| invoker.add_implicit_vm_platform_dependency |
| } |
| single_root_scheme = "org-dartlang-sdk" |
| single_root_base = rebase_path("../../") |
| libraries_specification_uri = "org-dartlang-sdk:///sdk/lib/libraries.json" |
| outputs = [ |
| "$root_out_dir/vm_platform" + output_postfix + ".dill", |
| "$root_out_dir/vm_outline" + output_postfix + ".dill", |
| ] |
| args = [ "dart:core" ] |
| args += [ |
| "-Ddart.vm.product=$is_product_flag", |
| "-Ddart.isVM=true", |
| "--nnbd-strong", |
| ] |
| if (defined(invoker.exclude_source) && invoker.exclude_source) { |
| args += [ "--exclude-source" ] |
| } |
| outline = "vm_outline" + output_postfix + ".dill" |
| } |
| } |
| |
| gen_vm_platform("vm_platform") { |
| add_implicit_vm_platform_dependency = false |
| exclude_source = false |
| output_postfix = "_strong" |
| } |
| |
| gen_vm_platform("vm_platform_product") { |
| add_implicit_vm_platform_dependency = false |
| exclude_source = false |
| output_postfix = "_strong_product" |
| |
| # In Debug mode we use debug binaries for dart2native. |
| # (see also the "dart_product_config" config) |
| product_mode = !is_debug |
| } |
| |
| gen_vm_platform("vm_platform_stripped") { |
| add_implicit_vm_platform_dependency = false |
| exclude_source = true |
| output_postfix = "_strong_stripped" |
| } |
| |
| group("kernel_platform_files") { |
| public_deps = [ |
| ":vm_platform", |
| ":vm_platform_stripped", |
| ] |
| } |
| |
| executable("offsets_extractor") { |
| # The timeline cannot be accessed from the generated executable, so we define |
| # DART_DISABLE_TIMELINE to strip out the timeline source code. The precise |
| # reason why we do this is to avoid missing header errors, as the Perfetto |
| # proto headers are not built as a dependency of this target, but are |
| # transitively included in this target when DART_DISABLE_TIMELINE is not |
| # defined. |
| defines = [ "DART_DISABLE_TIMELINE" ] |
| configs += [ |
| "..:dart_arch_config", |
| "..:dart_config", |
| "..:dart_maybe_product_config", |
| ":libdart_vm_config", |
| ] |
| sources = [ "compiler/offsets_extractor.cc" ] |
| include_dirs = [ ".." ] |
| } |
| |
| executable("offsets_extractor_precompiled_runtime") { |
| # The timeline cannot be accessed from the generated executable, so we define |
| # DART_DISABLE_TIMELINE to strip out the timeline source code. The precise |
| # reason why we do this is to avoid missing header errors, as the Perfetto |
| # proto headers are not built as a dependency of this target, but are |
| # transitively included in this target when DART_DISABLE_TIMELINE is not |
| # defined. |
| defines = [ "DART_DISABLE_TIMELINE" ] |
| configs += [ |
| "..:dart_arch_config", |
| "..:dart_config", |
| "..:dart_precompiled_runtime_config", |
| "..:dart_maybe_product_config", |
| ":libdart_vm_config", |
| ] |
| sources = [ "compiler/offsets_extractor.cc" ] |
| include_dirs = [ ".." ] |
| } |