# Copyright (c) 2017, 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. # This GN file contains build rules for assembling the Dart SDK. There are # two possible variants: the "Full" SDK, and the "Platform" SDK. If you want # to make a new subset of the Full SDK, make it the same way we make # the Platform SDK. # # Warning: # If you need to copy something into dart-sdk/lib/foo in addition to the stuff # copied there by :copy_libraries, then you must depend on ":copy_libraries", # or ":copy_libraries" may delete/overwrite your addition, and the build will # fail. import("../build/dart/copy_tree.gni") import("../build/executable_suffix.gni") import("../sdk_args.gni") import("../utils/application_snapshot.gni") declare_args() { # Build a SDK with less stuff. It excludes dart2js, ddc, and web libraries. dart_platform_sdk = true # Path to stripped dart binaries relative to build output directory. dart_stripped_binary = "dart" dart_precompiled_runtime_stripped_binary = "dart_precompiled_runtime_product" gen_snapshot_stripped_binary = "gen_snapshot_product" analyze_snapshot_binary = "analyze_snapshot" wasm_opt_stripped_binary = "wasm-opt" dart_include_wasm_opt = true } # The directory layout of the SDK is as follows: # # ..dart-sdk/ # ....bin/ # ......dart or dart.exe (executable) # ......dart.lib (import library for VM native extensions on Windows) # ......dartaotruntime or dartaotruntime.exe (executable) # ......utils/gen_snapshot or utils/gen_snapshot.exe (if not on ia32) # ......snapshots/ # ........analysis_server.dart.snapshot # ........dart2js.dart.snapshot # ........dart2wasm_product.snapshot (if not on ia32) # ........dartdev.dart.snapshot (app-jit snapshot or kernel dill file) # ........dartdevc.dart.snapshot # ........dds.dart.snapshot # ........dart_tooling_daemon.dart.snapshot # ........frontend_server_aot.dart.snapshot (AOT snapshot, if not on ia32) # ........frontend_server.dart.snapshot (JIT snapshot only on ia32) # ........gen_kernel_aot.dart.snapshot (if not on ia32) # ........kernel-service.dart.snapshot # ........kernel_worker.dart.snapshot # ......resources/ # ........dartdoc/ # ..........resources/ # ..........templates/ # ....include/ # ......dart_api.h # ......dart_native_api.h # ......dart_tools_api.h # ....lib/ # ......libraries.json # ......_internal/ # ........dart2js_platform.dill # ........dart2js_platform_unsound.dill # ........dart2js_server_platform.dill # ........dart2js_server_platform_unsound.dill # ........dart2wasm_outline.dill (if not on ia32) # ........dart2wasm_platform.dill (if not on ia32) # ........dart2wasm_js_compatibility_outline.dill (if not on ia32) # ........dart2wasm_js_compatibility_platform.dill (if not on ia32) # ........ddc_outline.dill # ........ddc_platform.dill # ........vm_platform_strong.dill # ........js_dev_runtime/ # ........js_runtime/ # ........js_shared/ # ......async/ # ......collection/ # ......convert/ # ......core/ # ......dev_compiler/ #.........amd/require.js #.........ddc/ddc_module_loader.js #.........web/dart_stack_trace_mapper.js # ......developer/ # ......html/ # ......_http/ # ......internal/ # ......io/ # ......isolate/ # ......js/ # ......js_interop/ # ......js_interop_unsafe/ # ......js_util/ # ......math/ # ......mirrors/ # ......typed_data/ # ......api_readme.md # Scripts that go under bin/ _platform_sdk_scripts = [] _full_sdk_scripts = [] # Snapshots that go under bin/snapshots _platform_sdk_snapshots = [ [ "analysis_server", "../utils/analysis_server", ], [ "dartdev", "../utils/dartdev:dartdev", ], [ "dart_tooling_daemon", "../utils/dtd:dtd", ], [ "dds", "../utils/dds:dds", ], ] if (dart_target_arch != "ia32" && dart_target_arch != "x86") { _platform_sdk_snapshots += [ [ "frontend_server_aot", "../utils/kernel-service:frontend_server_aot", ] ] } else { _platform_sdk_snapshots += [ [ "frontend_server", "../utils/kernel-service:frontend_server", ] ] } if (dart_snapshot_kind == "app-jit") { _platform_sdk_snapshots += [ [ "kernel-service", "../utils/kernel-service:kernel-service_snapshot", ] ] } _full_sdk_snapshots = _platform_sdk_snapshots + [ [ "dart2js", "../utils/compiler:dart2js", ], [ "dartdevc", "../utils/ddc:dartdevc", ], [ "kernel_worker", "../utils/bazel:kernel_worker", ], ] # Libraries that go under lib/ _full_sdk_libraries = [ "_internal", "async", "cli", "collection", "convert", "core", "developer", "ffi", "html", "_http", "indexed_db", "internal", "io", "isolate", "js", "js_interop", "js_interop_unsafe", "js_util", "math", "mirrors", "svg", "typed_data", "_wasm", "web_audio", "web_gl", "web_sql", ] # Apps running on the platform SDK shouldn't be using Dart4Web libraries, but # the analyzer and dartdoc expect all the library sources to be present. # # _platform_sdk_libraries = [ # "_internal", # "async", # "cli", # "collection", # "convert", # "core", # "developer", # "html", # "_http", # "internal", # "io", # "isolate", # "math", # "mirrors", # "typed_data", # ] _platform_sdk_libraries = _full_sdk_libraries # This rule copies dartdoc templates to # bin/resources/dartdoc/templates copy_tree("copy_dartdoc_templates") { visibility = [ ":copy_dartdoc_files" ] source = "../third_party/pkg/dartdoc/lib/templates" dest = "$root_out_dir/$dart_sdk_output/bin/resources/dartdoc/templates" exclude = "{}" } # This rule copies dartdoc resources to # bin/resources/dartdoc/resources copy_tree("copy_dartdoc_resources") { visibility = [ ":copy_dartdoc_files" ] source = "../third_party/pkg/dartdoc/lib/resources" dest = "$root_out_dir/$dart_sdk_output/bin/resources/dartdoc/resources" exclude = "{}" } # This rule copies the pre-built DevTools application to # bin/resources/devtools/ copy_tree("copy_prebuilt_devtools") { visibility = [ ":create_common_sdk" ] source = "../third_party/devtools/web" dest = "$root_out_dir/$dart_sdk_output/bin/resources/devtools" exclude = "{}" } # This loop generates rules to copy libraries to lib/ foreach(library, _full_sdk_libraries) { copy_tree("copy_${library}_library") { visibility = [ ":copy_full_sdk_libraries", ":copy_platform_sdk_libraries", ] source = "lib/$library" dest = "$root_out_dir/$dart_sdk_output/lib/$library" exclude = "*.svn,doc,*.py,*.gypi,*.sh,.gitignore" } } _has_dot_sym = !is_win && rebase_path(".") == rebase_path("//sdk") # Copies the Dart VM binary into bin/ if (target_os != current_os && target_os == "fuchsia") { # In the Fuchsia build, this has to use a symlink for two reasons. # First, it makes the lookup of shared libraries relative to $ORIGIN # (Linux) or @loader_path (macOS) find the libraries where they are, # since those lookups use the directory of the symlink target rather # than of the link itself (as they would for a copy or hard link). # Second, when the dart binary is built as a "variant" (e.g. with a # sanitizer), then $root_out_dir/dart is itself a symlink to the real # binary in the selected variant toolchain's $root_out_dir and since # the "copy" tool is actually a hard link rather than a copy, it will # make a link to the symlink rather than the symlink's target, and the # relative symlink interpreted from a different containing directory # will not find the actual binary. action("copy_dart") { visibility = [ ":create_common_sdk" ] dart_label = "../runtime/bin:dart" deps = [ dart_label ] dart_out = get_label_info(dart_label, "root_out_dir") sources = [ "$dart_out/$dart_stripped_binary" ] outputs = [ "$root_out_dir/$dart_sdk_output/bin/$dart_stripped_binary" ] script = "/bin/ln" args = [ "-snf", rebase_path(sources[0], get_path_info(outputs[0], "dir")), rebase_path(outputs[0]), ] } } else { copy("copy_dart") { visibility = [ ":create_common_sdk" ] deps = [ "../runtime/bin:dart" ] dart_out = get_label_info("../runtime/bin:dart", "root_out_dir") sources = [ "$dart_out/${dart_stripped_binary}${executable_suffix}" ] if (is_win && dart_lib_export_symbols) { sources += [ "$dart_out/dart.lib" ] } if (_has_dot_sym) { sources += [ "$dart_out/dart.sym" ] } outputs = [ "$root_out_dir/$dart_sdk_output/bin/{{source_file_part}}" ] } } copy("copy_dartaotruntime") { visibility = [ ":group_dart2native" ] deps = [ "../runtime/bin:dart_precompiled_runtime_product" ] src_dir = get_label_info("../runtime/bin:dart_precompiled_runtime_product", "root_out_dir") sources = [ "$src_dir/${dart_precompiled_runtime_stripped_binary}${executable_suffix}", ] outputs = [ "$root_out_dir/$dart_sdk_output/bin/dartaotruntime${executable_suffix}", ] } group("copy_gen_snapshot") { visibility = [ ":group_dart2native" ] public_deps = [ ":copy_gen_snapshot_exe" ] if (_has_dot_sym) { public_deps += [ ":copy_gen_snapshot_sym" ] } } copy("copy_gen_snapshot_exe") { deps = [ "../runtime/bin:gen_snapshot_product" ] src_dir = get_label_info("../runtime/bin:gen_snapshot_product", "root_out_dir") sources = [ "$src_dir/${gen_snapshot_stripped_binary}${executable_suffix}" ] outputs = [ "$root_out_dir/$dart_sdk_output/bin/utils/gen_snapshot${executable_suffix}", ] } if (_has_dot_sym) { copy("copy_gen_snapshot_sym") { deps = [ "../runtime/bin:gen_snapshot_product" ] sources = [ "$root_out_dir/gen_snapshot_product.sym" ] outputs = [ "$root_out_dir/$dart_sdk_output/bin/utils/gen_snapshot${executable_suffix}.sym" ] } } copy("copy_vm_platform_strong_product") { visibility = [ ":group_dart2native" ] deps = [ "../runtime/vm:vm_platform_product" ] src_dir = get_label_info("../runtime/vm:vm_platform_product", "root_out_dir") sources = [ "$src_dir/vm_platform_strong_product.dill" ] outputs = [ "$root_out_dir/$dart_sdk_output/lib/_internal/{{source_file_part}}" ] } copy("copy_gen_kernel_snapshot") { visibility = [ ":group_dart2native" ] deps = [ "../utils/gen_kernel" ] sources = [ "$root_gen_dir/gen_kernel_aot.dart.snapshot" ] outputs = [ "$root_out_dir/$dart_sdk_output/bin/snapshots/{{source_file_part}}" ] } group("group_dart2native") { deps = [ ":copy_dartaotruntime", ":copy_gen_kernel_snapshot", ":copy_gen_snapshot", ":copy_vm_platform_strong_product", ] } # A template for copying the things in _platform_sdk_scripts and # _full_sdk_scripts into bin/ template("copy_sdk_script") { assert(defined(invoker.name), "copy_sdk_script must define 'name'") name = invoker.name ext = "" if (is_win) { ext = ".bat" } copy(target_name) { visibility = [ ":copy_full_sdk_scripts", ":copy_platform_sdk_scripts", ] sources = [ "bin/${name}_sdk$ext" ] outputs = [ "$root_out_dir/$dart_sdk_output/bin/$name$ext" ] } } foreach(sdk_script, _full_sdk_scripts) { copy_sdk_script("copy_${sdk_script}_script") { name = sdk_script } } # This is the main target for copying scripts in _platform_sdk_scripts to bin/ group("copy_platform_sdk_scripts") { visibility = [ ":_create_platform_sdk" ] public_deps = [] foreach(sdk_script, _platform_sdk_scripts) { public_deps += [ ":copy_${sdk_script}_script" ] } } # This is the main target for copying scripts in _full_sdk_scripts to bin/ group("copy_full_sdk_scripts") { visibility = [ ":create_full_sdk" ] public_deps = [] foreach(sdk_script, _full_sdk_scripts) { public_deps += [ ":copy_${sdk_script}_script" ] } } # This loop generates "copy" targets that put AppJIT snapshots into # bin/snapshots foreach(snapshot, _full_sdk_snapshots) { root = root_gen_dir # The frontend_server is output to root_out_dir so that it doesn't conflict # with the flutter snapshot by the same name under root_gen_dir. if (snapshot[0] == "frontend_server" || snapshot[0] == "frontend_server_aot") { root = root_out_dir } copy("copy_${snapshot[0]}_snapshot") { visibility = [ ":copy_full_sdk_snapshots", ":copy_platform_sdk_snapshots", ] deps = [ snapshot[1] ] sources = [ "$root/${snapshot[0]}.dart.snapshot" ] outputs = [ "$root_out_dir/$dart_sdk_output/bin/snapshots/{{source_file_part}}" ] } } # This is the main rule for copying snapshots from _platform_sdk_snapshots to # bin/snapshots group("copy_platform_sdk_snapshots") { visibility = [ ":_create_platform_sdk" ] public_deps = [] foreach(snapshot, _platform_sdk_snapshots) { public_deps += [ ":copy_${snapshot[0]}_snapshot" ] } } # This is the main rule for copying snapshots from _full_sdk_snapshots to # bin/snapshots group("copy_full_sdk_snapshots") { visibility = [ ":create_full_sdk" ] public_deps = [] foreach(snapshot, _full_sdk_snapshots) { public_deps += [ ":copy_${snapshot[0]}_snapshot" ] } } # This is the main rule for copying the files that dartdoc needs. group("copy_dartdoc_files") { visibility = [ ":create_common_sdk" ] public_deps = [ ":copy_dartdoc_resources", ":copy_dartdoc_templates", ] } # This rule copies dill files to lib/_internal. copy("copy_vm_dill_files") { visibility = [ ":create_common_sdk" ] deps = [ ":copy_libraries", "../runtime/vm:kernel_platform_files", ] sources = [ "$root_out_dir/vm_platform_strong.dill" ] outputs = [ "$root_out_dir/$dart_sdk_output/lib/_internal/{{source_file_part}}" ] } copy("copy_dart2js_dill_files") { visibility = [ ":create_full_sdk" ] deps = [ ":copy_libraries", "../utils/compiler:compile_dart2js_platform", "../utils/compiler:compile_dart2js_server_platform", ] sources = [ "$root_out_dir/dart2js_platform.dill", "$root_out_dir/dart2js_server_platform.dill", ] outputs = [ "$root_out_dir/$dart_sdk_output/lib/_internal/{{source_file_part}}" ] } copy("copy_dart2wasm_platform") { visibility = [ ":create_full_sdk" ] deps = [ ":copy_libraries", "../:dart2wasm_platform", "../utils/dart2wasm:compile_dart2wasm_js_compatibility_platform", "../utils/dart2wasm:compile_dart2wasm_platform", ] sources = [ "$root_out_dir/dart2wasm_js_compatibility_outline.dill", "$root_out_dir/dart2wasm_js_compatibility_platform.dill", "$root_out_dir/dart2wasm_outline.dill", "$root_out_dir/dart2wasm_platform.dill", ] outputs = [ "$root_out_dir/$dart_sdk_output/lib/_internal/{{source_file_part}}" ] } copy("copy_dart2wasm_snapshot") { visibility = [ ":create_full_sdk" ] deps = [ ":copy_libraries", "../utils/dart2wasm:dart2wasm_product_snapshot", ] sources = [ "$root_out_dir/dart2wasm_product.snapshot" ] outputs = [ "$root_out_dir/$dart_sdk_output/bin/snapshots/{{source_file_part}}" ] } copy("copy_wasm_opt") { visibility = [ ":create_full_sdk" ] deps = [ ":copy_libraries", "../third_party/binaryen:wasm-opt", ] sources = [ "$root_out_dir/${wasm_opt_stripped_binary}${executable_suffix}" ] outputs = [ "$root_out_dir/$dart_sdk_output/bin/utils/{{source_file_part}}" ] } # Copies DDC's SDK full and outline .dill files to lib/_internal. copy("copy_dev_compiler_dills") { visibility = [ ":copy_dev_compiler_sdk" ] deps = [ ":copy_libraries", "../utils/ddc:ddc_platform", ] sources = [ "$root_out_dir/ddc_outline.dill", "$root_out_dir/ddc_platform.dill", ] outputs = [ "$root_out_dir/$dart_sdk_output/lib/_internal/{{source_file_part}}" ] } # Copies require.js to lib/dev_compiler/amd. # Used to load DDC compiled amd modules. copy("copy_dev_compiler_amd_require_js") { visibility = [ ":copy_dev_compiler_sdk" ] sources = [ "../third_party/requirejs/require.js" ] outputs = [ "$root_out_dir/$dart_sdk_output/lib/dev_compiler/amd/{{source_file_part}}", ] } # Copies ddc_module_loader.js to lib/dev_compiler/ddc. # Used to manage DDC library and module loading. copy("copy_dev_compiler_ddc_module_loader_js") { visibility = [ ":copy_dev_compiler_sdk" ] sources = [ "../pkg/dev_compiler/lib/js/ddc/ddc_module_loader.js" ] outputs = [ "$root_out_dir/$dart_sdk_output/lib/dev_compiler/ddc/ddc_module_loader.js", ] } # Copies stack_trace_mapper tool to lib/dev_compiler/web. # Used when running DDC compiled applications. copy("copy_dev_compiler_stack_trace_mapper") { visibility = [ ":copy_dev_compiler_sdk" ] deps = [ "../utils/ddc:stack_trace_mapper" ] dart_out = get_label_info("../utils/ddc:stack_trace_mapper", "root_out_dir") sources = [ "$dart_out/dev_compiler/build/web/dart_stack_trace_mapper.js" ] outputs = [ "$root_out_dir/$dart_sdk_output/lib/dev_compiler/web/{{source_file_part}}", ] } # Main rule for copying all of DDC's dependencies to lib. group("copy_dev_compiler_sdk") { visibility = [ ":create_full_sdk" ] public_deps = [ ":copy_dev_compiler_amd_require_js", ":copy_dev_compiler_ddc_module_loader_js", ":copy_dev_compiler_dills", ":copy_dev_compiler_stack_trace_mapper", ] } # This rule copies header files to include/ group("copy_headers") { visibility = [ ":create_common_sdk" ] deps = [ "../runtime/include:copy_headers" ] } # This rule copies libraries.json files to lib/ copy("copy_libraries_specification") { visibility = [ ":create_common_sdk" ] sources = [ "lib/libraries.json" ] deps = [ ":copy_libraries" ] outputs = [ "$root_out_dir/$dart_sdk_output/lib/{{source_file_part}}" ] } # This is the main rule to copy libraries in _platform_sdk_libraries to lib/ group("copy_platform_sdk_libraries") { visibility = [ ":_create_platform_sdk", ":copy_libraries", ] public_deps = [] foreach(library, _platform_sdk_libraries) { public_deps += [ ":copy_${library}_library" ] } } # This is the main rule to copy libraries in _full_sdk_libraries to lib/ group("copy_full_sdk_libraries") { visibility = [ ":copy_libraries", ":create_full_sdk", ] public_deps = [] foreach(library, _full_sdk_libraries) { public_deps += [ ":copy_${library}_library" ] } } group("copy_libraries") { if (dart_platform_sdk) { public_deps = [ ":copy_platform_sdk_libraries" ] } else { public_deps = [ ":copy_full_sdk_libraries" ] } } # This rule writes the version file. action("write_version_file") { visibility = [ ":create_common_sdk" ] inputs = [ "../tools/VERSION", "$default_git_folder/logs/HEAD", ] output = "$root_out_dir/$dart_sdk_output/version" outputs = [ output ] script = "../tools/write_version_file.py" args = [ "--output", rebase_path(output), ] if (!dart_version_git_info) { args += [ "--no-git-hash" ] } } # This rule writes the revision file. action("write_revision_file") { visibility = [ ":create_common_sdk" ] inputs = [ "$default_git_folder/logs/HEAD" ] output = "$root_out_dir/$dart_sdk_output/revision" outputs = [ output ] script = "../tools/write_revision_file.py" args = [ "--output", rebase_path(output), ] if (!dart_version_git_info) { args += [ "--no-git-hash" ] } } # This rule copies the README file. copy("copy_readme") { visibility = [ ":create_common_sdk" ] sources = [ "../README.dart-sdk" ] outputs = [ "$root_out_dir/$dart_sdk_output/README" ] } # This rule copies the LICENSE file. copy("copy_license") { visibility = [ ":create_common_sdk" ] sources = [ "../LICENSE" ] outputs = [ "$root_out_dir/$dart_sdk_output/LICENSE" ] } # This rule generates a custom dartdoc_options.yaml file. action("write_dartdoc_options") { visibility = [ ":create_common_sdk" ] inputs = [ "$default_git_folder/logs/HEAD" ] output = "$root_out_dir/$dart_sdk_output/dartdoc_options.yaml" outputs = [ output ] script = "../tools/write_dartdoc_options_file.py" args = [ "--output", rebase_path(output), ] if (!dart_version_git_info) { args += [ "--no-git-hash" ] } } # This rule copies the API readme file to lib/ copy("copy_api_readme") { visibility = [ ":create_common_sdk" ] sources = [ "api_readme.md" ] outputs = [ "$root_out_dir/$dart_sdk_output/lib/api_readme.md" ] } # This rule copies the sdk_packages.yaml file to the root of the SDK, which # defines the locations of the vendored SDK packages. copy("copy_sdk_packages_yaml") { visibility = [ ":create_common_sdk" ] sources = [ "../sdk_packages.yaml" ] outputs = [ "$root_out_dir/$dart_sdk_output/sdk_packages.yaml" ] } # This rule copies pkg/_macros to pkg/_macros in the built SDK. This is a # vendored SDK package. copy_tree("copy_pkg_macros") { visibility = [ ":create_common_sdk" ] source = "../pkg/_macros" dest = "$root_out_dir/$dart_sdk_output/pkg/_macros" exclude = "{}" } # Parts common to both platform and full SDKs. group("create_common_sdk") { visibility = [ ":create_platform_sdk", ":create_sdk", ] public_deps = [ ":copy_api_readme", ":copy_dart", ":copy_dartdoc_files", ":copy_headers", ":copy_libraries_specification", ":copy_license", ":copy_pkg_macros", ":copy_prebuilt_devtools", ":copy_readme", ":copy_sdk_packages_yaml", ":copy_vm_dill_files", ":write_dartdoc_options", ":write_revision_file", ":write_version_file", ] # We do not support AOT on ia32 and should therefore not add the # dart native compilation files since there is no AOT compiler/runtime # available. if (dart_target_arch != "ia32" && dart_target_arch != "x86") { public_deps += [ ":group_dart2native" ] } } # Parts specific to the platform SDK. group("_create_platform_sdk") { visibility = [ ":create_platform_sdk", ":create_sdk", ] public_deps = [ ":copy_platform_sdk_libraries", ":copy_platform_sdk_scripts", ":copy_platform_sdk_snapshots", ] } # Parts specific to the full SDK. group("create_full_sdk") { visibility = [ ":create_sdk" ] public_deps = [ ":copy_dart2js_dill_files", ":copy_dev_compiler_sdk", ":copy_full_sdk_libraries", ":copy_full_sdk_scripts", ":copy_full_sdk_snapshots", ] if (dart_target_arch != "ia32" && dart_target_arch != "x86") { public_deps += [ ":copy_dart2wasm_platform", ":copy_dart2wasm_snapshot", ] if (dart_include_wasm_opt) { public_deps += [ ":copy_wasm_opt" ] } } } # Build a SDK with less stuff. It excludes dart2js, ddc, and web libraries. group("create_platform_sdk") { public_deps = [ ":_create_platform_sdk", ":create_common_sdk", ] } # The main target to depend on from ../BUILD.gn group("create_sdk") { public_deps = [ ":create_common_sdk" ] if (dart_platform_sdk) { public_deps += [ ":_create_platform_sdk" ] } else { public_deps += [ ":create_full_sdk" ] } }