# 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/copy_tree.gni") declare_args() { # Build a SDK with less stuff. It excludes dart2js, ddc, and web libraries. dart_platform_sdk = false } if (is_fuchsia || is_fuchsia_host || current_cpu == "arm64" || current_cpu == "arm") { dart_platform_sdk = 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) # ......dartdoc # ......dartfmt # ......dart2js # ......dartanalyzer # ......dartdevc # ......pub # ......snapshots/ # ........analysis_server.dart.snapshot # ........dart2js.dart.snapshot # ........dartanalyzer.dart.snapshot # ........dartdoc.dart.snapshot # ........dartfmt.dart.snapshot # ........dartdevc.dart.snapshot # ........pub.dart.snapshot # ........utils_wrapper.dart.snapshot #.........resources/ #...........dartdoc/ #..............packages #.............resources/ #.............templates/ # ....include/ # ......dart_api.h # ......dart_mirrors_api.h # ......dart_native_api.h # ......dart_tools_api.h # ....lib/ # ......dart_client.platform # ......dart_server.platform # ......dart_shared.platform # ......_internal/ #.........spec.sum #.........strong.sum #.........dev_compiler/ # ......analysis_server/ # ......analyzer/ # ......async/ # ......collection/ # ......convert/ # ......core/ # ......front_end/ # ......html/ # ......internal/ # ......io/ # ......isolate/ # ......js/ # ......js_util/ # ......kernel/ # ......math/ # ......mirrors/ # ......typed_data/ # ......api_readme.md # Scripts that go under bin/ _platform_sdk_scripts = [ "dartanalyzer", "dartfmt", "pub", ] _full_sdk_scripts = [ "dart2js", "dartanalyzer", "dartdevc", "dartfmt", "pub", ] # Scripts not ending in _sdk that go under bin/ _scripts = [ "dartdoc" ] # Snapshots that go under bin/snapshots _platform_sdk_snapshots = [ [ "analysis_server", "../utils/analysis_server", ], [ "dartanalyzer", "../utils/dartanalyzer:generate_dartanalyzer_snapshot", ], [ "dartdoc", "../utils/dartdoc", ], [ "dartfmt", "../utils/dartfmt", ], [ "pub", "../utils/pub", ], ] _full_sdk_snapshots = [ [ "analysis_server", "../utils/analysis_server", ], [ "dart2js", "../utils/compiler:dart2js", ], [ "dartanalyzer", "../utils/dartanalyzer:generate_dartanalyzer_snapshot", ], [ "dartdevc", "../utils/dartdevc", ], [ "dartdoc", "../utils/dartdoc", ], [ "dartfmt", "../utils/dartfmt", ], [ "pub", "../utils/pub", ], [ "utils_wrapper", "../utils/compiler:utils_wrapper", ], ] # Libraries that go under lib/ _platform_sdk_libraries = [ "_internal", "async", "collection", "convert", "core", "developer", "internal", "io", "isolate", "math", "mirrors", "profiler", "typed_data", ] _full_sdk_libraries = [ "_blink", "_chrome", "_internal", "async", "collection", "convert", "core", "developer", "html", "indexed_db", "internal", "io", "isolate", "js", "js_util", "math", "mirrors", "profiler", "svg", "typed_data", "web_audio", "web_gl", "web_sql", ] # Package sources copied to lib/ _analyzer_source_dirs = [ "analyzer", "analysis_server", "front_end", "kernel", ] # Copies the Dart VM binary into bin/ copy("copy_dart") { visibility = [ ":create_common_sdk" ] deps = [ "../runtime/bin:dart", ] dart_out = get_label_info("../runtime/bin:dart", "root_out_dir") if (is_win) { sources = [ "$dart_out/dart.exe", ] } else if (is_fuchsia || is_fuchsia_host) { sources = [ "$dart_out/dart", ] } else { sources = [ "$dart_out/exe.stripped/dart", ] } if (is_win) { sources += [ "$dart_out/dart.lib" ] } outputs = [ "$root_out_dir/dart-sdk/bin/{{source_file_part}}", ] } # Copies dynamically linked libraries into bin/. This is currently only needed # for Fuchsia when building for Linux hosts. if (is_fuchsia_host && is_linux) { copy("copy_dylibs") { visibility = [ ":create_common_sdk" ] deps = [ "//third_party/boringssl:crypto", "//third_party/boringssl:ssl", "//third_party/zlib", ] crypto_out = get_label_info("//third_party/boringssl:crypto", "root_out_dir") crypto_name = get_label_info("//third_party/boringssl:crypto", "name") ssl_out = get_label_info("//third_party/boringssl:ssl", "root_out_dir") ssl_name = get_label_info("//third_party/boringssl:ssl", "name") zlib_out = get_label_info("//third_party/zlib", "root_out_dir") sources = [ "$crypto_out/lib${crypto_name}.so", "$ssl_out/lib${ssl_name}.so", "$zlib_out/libz.so", ] outputs = [ "$root_out_dir/dart-sdk/bin/{{source_file_part}}", ] } } # 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_platform_sdk_scripts", ":copy_full_sdk_scripts", ] sources = [ "bin/${name}_sdk$ext", ] outputs = [ "$root_out_dir/dart-sdk/bin/$name$ext", ] } } foreach(sdk_script, _full_sdk_scripts) { copy_sdk_script("copy_${sdk_script}_script") { name = sdk_script } } foreach(script, _scripts) { copy("copy_${script}_script") { visibility = [ ":copy_platform_sdk_scripts", ":copy_full_sdk_scripts", ] ext = "" if (is_win) { ext = ".bat" } sources = [ "bin/$script$ext", ] outputs = [ "$root_out_dir/dart-sdk/bin/{{source_file_part}}", ] } } # This is the main target for copying scripts in _platform_sdk_scripts to bin/ group("copy_platform_sdk_scripts") { visibility = [ ":create_platform_sdk" ] deps = [] foreach(sdk_script, _platform_sdk_scripts) { deps += [ ":copy_${sdk_script}_script" ] } foreach(script, _scripts) { deps += [ ":copy_${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" ] deps = [] foreach(sdk_script, _full_sdk_scripts) { deps += [ ":copy_${sdk_script}_script" ] } foreach(script, _scripts) { deps += [ ":copy_${script}_script" ] } } # This loop generates "copy" targets that put snapshots into bin/snapshots foreach(snapshot, _full_sdk_snapshots) { copy("copy_${snapshot[0]}_snapshot") { visibility = [ ":copy_platform_sdk_snapshots", ":copy_full_sdk_snapshots", ] deps = [ snapshot[1], ] sources = [ "$root_gen_dir/${snapshot[0]}.dart.snapshot", ] outputs = [ "$root_out_dir/dart-sdk/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" ] deps = [] foreach(snapshot, _platform_sdk_snapshots) { 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" ] deps = [] foreach(snapshot, _full_sdk_snapshots) { deps += [ ":copy_${snapshot[0]}_snapshot" ] } } # This loop generates rules for copying analyzer sources into lib/ foreach(analyzer_source_dir, _analyzer_source_dirs) { copy_tree("copy_${analyzer_source_dir}_source_dir") { visibility = [ ":copy_analyzer_sources" ] source = "../pkg/$analyzer_source_dir" dest = "$root_out_dir/dart-sdk/lib/$analyzer_source_dir" exclude = "*.svn,doc,*.py,*.gypi,*.sh,.gitignore,packages,test,testcases" } } # This is the main rule for copying analyzer sources to lib/ group("copy_analyzer_sources") { visibility = [ ":create_common_sdk" ] deps = [] foreach(analyzer_source_dir, _analyzer_source_dirs) { deps += [ ":copy_${analyzer_source_dir}_source_dir" ] } } # This rule copies dartdoc templates to # bin/snapshots/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/bin/snapshots/resources/dartdoc/templates" } # This rule copies dartdoc resources to # bin/snapshots/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/bin/snapshots/resources/dartdoc/resources" } # This rule writes the .packages file for dartdoc resources. write_file("$root_out_dir/dart-sdk/bin/snapshots/resources/dartdoc/.packages", "dartdoc:.") # This is the main rule for copying the files that dartdoc needs. group("copy_dartdoc_files") { visibility = [ ":create_common_sdk" ] deps = [ ":copy_dartdoc_resources", ":copy_dartdoc_templates", ] } # This rule copies analyzer summaries to lib/_internal copy("copy_analysis_summaries") { visibility = [ ":create_common_sdk" ] deps = [ ":copy_libraries", "../utils/dartanalyzer:generate_summary_spec", "../utils/dartanalyzer:generate_summary_strong", ] sources = [ "$root_gen_dir/spec.sum", "$root_gen_dir/strong.sum", ] outputs = [ "$root_out_dir/dart-sdk/lib/_internal/{{source_file_part}}", ] } # This rule copies ddc summaries to lib/_internal copy("copy_dev_compiler_summary") { visibility = [ ":copy_dev_compiler_sdk" ] deps = [ ":copy_libraries", ] sources = [ "../pkg/dev_compiler/lib/sdk/ddc_sdk.sum", ] outputs = [ "$root_out_dir/dart-sdk/lib/_internal/{{source_file_part}}", ] } # This rule copies js needed by ddc to lib/dev_compiler copy_tree("copy_dev_compiler_js") { visibility = [ ":copy_dev_compiler_sdk", ":copy_dev_compiler_require_js", ":copy_dev_compiler_tools", ] source = "../pkg/dev_compiler/lib/js" dest = "$root_out_dir/dart-sdk/lib/dev_compiler" } # This rule copies require.js to lib/dev_compiler/amd copy("copy_dev_compiler_require_js") { visibility = [ ":copy_dev_compiler_sdk" ] deps = [ ":copy_dev_compiler_js", ] sources = [ "../third_party/requirejs/require.js", ] outputs = [ "$root_out_dir/dart-sdk/lib/dev_compiler/amd/{{source_file_part}}", ] } # This rule copies tools to go along with ddc. copy("copy_dev_compiler_tools") { visibility = [ ":copy_dev_compiler_sdk" ] deps = [ ":copy_dev_compiler_js", "../utils/dartdevc:dartdevc_web", "../utils/dartdevc:stack_trace_mapper", ] dart_out = get_label_info("../utils/dartdevc:dartdevc_web", "root_out_dir") sources = [ "$dart_out/dev_compiler/build/web/dart_stack_trace_mapper.js", "$dart_out/dev_compiler/build/web/ddc_web_compiler.js", ] outputs = [ "$root_out_dir/dart-sdk/lib/dev_compiler/web/{{source_file_part}}", ] } # This is the main rule for copying ddc's dependencies to lib/ group("copy_dev_compiler_sdk") { visibility = [ ":create_full_sdk" ] deps = [ ":copy_dev_compiler_js", ":copy_dev_compiler_require_js", ":copy_dev_compiler_summary", ":copy_dev_compiler_tools", ] } # This rule copies header files to include/ copy("copy_headers") { visibility = [ ":create_common_sdk" ] sources = [ "../runtime/include/dart_api.h", "../runtime/include/dart_mirrors_api.h", "../runtime/include/dart_native_api.h", "../runtime/include/dart_tools_api.h", ] outputs = [ "$root_out_dir/dart-sdk/include/{{source_file_part}}", ] } # This rule copies .platform files to lib/ copy("copy_platform_files") { visibility = [ ":create_common_sdk" ] sources = [ "lib/dart_client.platform", "lib/dart_server.platform", "lib/dart_shared.platform", ] outputs = [ "$root_out_dir/dart-sdk/lib/{{source_file_part}}", ] } # This rule copies pub assets to lib/_internal/pub/asset copy_tree("copy_pub_assets") { visibility = [ ":create_common_sdk", ":copy_7zip", ] deps = [ ":copy_libraries", ] source = "../third_party/pkg/pub/lib/src/asset" dest = "$root_out_dir/dart-sdk/lib/_internal/pub/asset" } # This loop generates rules to copy libraries to lib/ foreach(library, _full_sdk_libraries) { copy_tree("copy_${library}_library") { visibility = [ ":copy_platform_sdk_libraries", ":copy_full_sdk_libraries", ] source = "lib/$library" dest = "$root_out_dir/dart-sdk/lib/$library" exclude = "*.svn,doc,*.py,*.gypi,*.sh,.gitignore" } } # 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", ] deps = [] foreach(library, _platform_sdk_libraries) { deps += [ ":copy_${library}_library" ] } } # This is the main rule to copy libraries in _full_sdk_libraries to lib/ group("copy_full_sdk_libraries") { visibility = [ ":create_full_sdk", ":copy_libraries", ] deps = [] foreach(library, _full_sdk_libraries) { deps += [ ":copy_${library}_library" ] } } group("copy_libraries") { if (dart_platform_sdk) { deps = [ ":copy_platform_sdk_libraries", ] } else { deps = [ ":copy_full_sdk_libraries", ] } } if (is_win) { copy_tree("copy_7zip") { visibility = [ ":create_common_sdk" ] deps = [ ":copy_libraries", ":copy_pub_assets", ] source = "../third_party/7zip" dest = "$root_out_dir/dart-sdk/lib/_internal/pub/asset/7zip" exclude = ".svn" } } # This rule writes the version file. action("write_version_file") { visibility = [ ":create_common_sdk" ] output = "$root_out_dir/dart-sdk/version" outputs = [ output, ] script = "../tools/write_version_file.py" args = [ "--output", rebase_path(output), ] } # This rule writes the revision file. action("write_revision_file") { visibility = [ ":create_common_sdk" ] output = "$root_out_dir/dart-sdk/revision" outputs = [ output, ] script = "../tools/write_revision_file.py" args = [ "--output", rebase_path(output), ] } # Copy libraries.dart to lib/_internal/libraries.dart for backwards # compatibility. # # TODO(sigmund): stop copying libraries.dart. Old versions (<=0.25.1-alpha.4) # of the analyzer package do not support the new location of this file. We # should be able to remove the old file once we release a newer version of # analyzer and popular frameworks have migrated to use it. copy("copy_libraries_dart") { visibility = [ ":create_common_sdk" ] deps = [ ":copy_libraries", ] sources = [ "lib/_internal/sdk_library_metadata/lib/libraries.dart", ] outputs = [ "$root_out_dir/dart-sdk/lib/_internal/{{source_file_part}}", ] } # This rule copies the README file. copy("copy_readme") { visibility = [ ":create_common_sdk" ] sources = [ "../README.dart-sdk", ] outputs = [ "$root_out_dir/dart-sdk/README", ] } # This rule copies the LICENSE file. copy("copy_license") { visibility = [ ":create_common_sdk" ] sources = [ "../LICENSE", ] outputs = [ "$root_out_dir/dart-sdk/LICENSE", ] } # 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/lib/api_readme.md", ] } # Parts common to both platform and full SDKs. group("create_common_sdk") { visibility = [ ":create_sdk" ] deps = [ ":copy_analysis_summaries", ":copy_analyzer_sources", ":copy_api_readme", ":copy_dart", ":copy_dartdoc_files", ":copy_headers", ":copy_libraries_dart", ":copy_license", ":copy_platform_files", ":copy_pub_assets", ":copy_readme", ":write_revision_file", ":write_version_file", ] if (is_win) { deps += [ ":copy_7zip" ] } if (is_fuchsia_host && is_linux) { deps += [ ":copy_dylibs" ] } } # Parts specific to the platform SDK. group("create_platform_sdk") { visibility = [ ":create_sdk" ] 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", ] deps = [ ":copy_dev_compiler_sdk", ":copy_full_sdk_libraries", ":copy_full_sdk_scripts", ":copy_full_sdk_snapshots", ] } # The main target to depend on from ../BUILD.gn group("create_sdk") { deps = [ ":create_common_sdk", ] if (dart_platform_sdk) { deps += [ ":create_platform_sdk" ] } else { deps += [ ":create_full_sdk" ] } }