| OLD | NEW |
| (Empty) |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 # This file has rules for making Dart packages and Dart-based Mojo applications. | |
| 6 # The entrypoint is the dart_pkg rule. | |
| 7 | |
| 8 import("../mojo.gni") | |
| 9 import("//build/module_args/mojo.gni") | |
| 10 import("//build/module_args/dart.gni") | |
| 11 | |
| 12 template("dartx") { | |
| 13 bundle_prefix = target_name | |
| 14 bundle = "$target_gen_dir/${bundle_prefix}.dartx" | |
| 15 snapshot = "$target_gen_dir/${bundle_prefix}_snapshot.bin" | |
| 16 depfile_path = "${snapshot}.d" | |
| 17 | |
| 18 if (mojo_use_prebuilt_dart_snapshotter) { | |
| 19 dart_snapshotter_path = | |
| 20 rebase_path("mojo/public/tools:copy_dart_snapshotter", ".", mojo_root) | |
| 21 dart_snapshotter_rule = "$dart_snapshotter_path($host_toolchain)" | |
| 22 } else { | |
| 23 dart_snapshotter_rule = dart_snapshotter_bin | |
| 24 } | |
| 25 dart_snapshotter_dir = | |
| 26 get_label_info("$dart_snapshotter_rule", "root_out_dir") | |
| 27 dart_snapshotter = "$dart_snapshotter_dir/dart_snapshotter" | |
| 28 | |
| 29 action("gen_${bundle_prefix}_snapshot") { | |
| 30 main_dart = invoker.main_dart | |
| 31 | |
| 32 depfile = depfile_path | |
| 33 | |
| 34 inputs = [ | |
| 35 dart_snapshotter, | |
| 36 ] | |
| 37 outputs = [ | |
| 38 snapshot, | |
| 39 ] | |
| 40 | |
| 41 if (defined(invoker.sources)) { | |
| 42 sources = invoker.sources | |
| 43 } | |
| 44 | |
| 45 script = | |
| 46 rebase_path("mojo/public/tools/dart_snapshotter.py", ".", mojo_sdk_root) | |
| 47 | |
| 48 args = [ | |
| 49 rebase_path(dart_snapshotter), | |
| 50 rebase_path(main_dart), | |
| 51 "--package-root", | |
| 52 rebase_path("$root_gen_dir/dart-pkg/packages"), | |
| 53 "--snapshot", | |
| 54 rebase_path(snapshot), | |
| 55 "--depfile", | |
| 56 rebase_path(depfile_path), | |
| 57 "--build-output", | |
| 58 rebase_path(snapshot, root_build_dir), # Relative to build directory | |
| 59 ] | |
| 60 | |
| 61 deps = [ | |
| 62 dart_snapshotter_rule, | |
| 63 ] | |
| 64 if (defined(invoker.deps)) { | |
| 65 deps += invoker.deps | |
| 66 } | |
| 67 } | |
| 68 | |
| 69 action("gen_${bundle_prefix}_bundle") { | |
| 70 sources = [ | |
| 71 rebase_path("mojo/public/tools/dartx.py", ".", mojo_sdk_root), | |
| 72 snapshot, | |
| 73 ] | |
| 74 | |
| 75 outputs = [ | |
| 76 bundle, | |
| 77 ] | |
| 78 | |
| 79 script = rebase_path("mojo/public/tools/dartx.py", ".", mojo_sdk_root) | |
| 80 args = [ | |
| 81 "--snapshot", | |
| 82 rebase_path(snapshot), | |
| 83 "--output", | |
| 84 rebase_path(bundle), | |
| 85 ] | |
| 86 | |
| 87 deps = [ | |
| 88 ":gen_${bundle_prefix}_snapshot", | |
| 89 ] | |
| 90 } | |
| 91 | |
| 92 group(target_name) { | |
| 93 public_deps = [ | |
| 94 ":gen_${bundle_prefix}_bundle", | |
| 95 ] | |
| 96 } | |
| 97 } | |
| 98 | |
| 99 template("dartx_application") { | |
| 100 dartx_name = "${target_name}_dartx" | |
| 101 | |
| 102 dartx(dartx_name) { | |
| 103 main_dart = invoker.main_dart | |
| 104 if (defined(invoker.sources)) { | |
| 105 sources = invoker.sources | |
| 106 } | |
| 107 if (defined(invoker.deps)) { | |
| 108 deps = invoker.deps | |
| 109 } | |
| 110 } | |
| 111 | |
| 112 if (defined(invoker.output_name)) { | |
| 113 mojo_output = "$root_out_dir/" + invoker.output_name + ".mojo" | |
| 114 } else { | |
| 115 mojo_output = "$root_out_dir/" + target_name + ".mojo" | |
| 116 } | |
| 117 | |
| 118 action(target_name) { | |
| 119 script = rebase_path("mojo/public/tools/prepend.py", ".", mojo_sdk_root) | |
| 120 | |
| 121 input = "$target_gen_dir/${dartx_name}.dartx" | |
| 122 inputs = [ | |
| 123 input, | |
| 124 ] | |
| 125 | |
| 126 output = mojo_output | |
| 127 outputs = [ | |
| 128 output, | |
| 129 ] | |
| 130 | |
| 131 deps = [ | |
| 132 ":$dartx_name", | |
| 133 ] | |
| 134 if (defined(invoker.deps)) { | |
| 135 deps += invoker.deps | |
| 136 } | |
| 137 | |
| 138 line = "#!mojo mojo:dart_content_handler" | |
| 139 if (is_debug || (defined(invoker.strict) && invoker.strict == true)) { | |
| 140 line = "#!mojo mojo:dart_content_handler?strict=true" | |
| 141 } | |
| 142 | |
| 143 rebase_input = rebase_path(input, root_build_dir) | |
| 144 rebase_output = rebase_path(output, root_build_dir) | |
| 145 args = [ | |
| 146 "--input=$rebase_input", | |
| 147 "--output=$rebase_output", | |
| 148 "--line=$line", | |
| 149 ] | |
| 150 } | |
| 151 } | |
| 152 | |
| 153 template("dart_pkg_helper") { | |
| 154 assert(defined(invoker.package_name)) | |
| 155 package_name = invoker.package_name | |
| 156 pkg_directory = rebase_path("$root_gen_dir/dart-pkg") | |
| 157 package_root = rebase_path("$root_gen_dir/dart-pkg/packages") | |
| 158 stamp_file = "$root_gen_dir/dart-pkg/${package_name}.stamp" | |
| 159 entries_file = "$root_gen_dir/dart-pkg/${package_name}.entries" | |
| 160 | |
| 161 assert(defined(invoker.sources) || defined(invoker.apps) || | |
| 162 defined(invoker.libs) || defined(invoker.pkg_dir)) | |
| 163 | |
| 164 action(target_name) { | |
| 165 deps = [] | |
| 166 if (defined(invoker.deps)) { | |
| 167 deps += invoker.deps | |
| 168 } | |
| 169 | |
| 170 datadeps = [] | |
| 171 if (defined(invoker.datadeps)) { | |
| 172 datadeps += invoker.datadeps | |
| 173 } | |
| 174 | |
| 175 sdk_ext_directory = [] | |
| 176 if (defined(invoker.sdk_ext_directory)) { | |
| 177 sdk_ext_directory += [ invoker.sdk_ext_directory ] | |
| 178 } | |
| 179 | |
| 180 sdk_ext_files = [] | |
| 181 if (defined(invoker.sdk_ext_files)) { | |
| 182 sdk_ext_files += invoker.sdk_ext_files | |
| 183 } | |
| 184 | |
| 185 sdk_ext_mappings = [] | |
| 186 if (defined(invoker.sdk_ext_mappings)) { | |
| 187 sdk_ext_mappings += invoker.sdk_ext_mappings | |
| 188 } | |
| 189 | |
| 190 script = rebase_path("mojo/public/tools/dart_pkg.py", ".", mojo_sdk_root) | |
| 191 | |
| 192 entrypoints = [] | |
| 193 if (defined(invoker.apps)) { | |
| 194 foreach(app, invoker.apps) { | |
| 195 entrypoints += [ app[1] ] | |
| 196 } | |
| 197 } | |
| 198 if (defined(invoker.libs)) { | |
| 199 entrypoints += invoker.libs | |
| 200 } | |
| 201 | |
| 202 sources = entrypoints | |
| 203 extra_flags = [] | |
| 204 if (defined(invoker.sources)) { | |
| 205 sources += invoker.sources | |
| 206 } else if (defined(invoker.pkg_dir)) { | |
| 207 list_script = rebase_path("mojo/public/tools/ls.py", ".", mojo_sdk_root) | |
| 208 extra_flags += [ "--read_only" ] | |
| 209 ls_sources = exec_script(list_script, | |
| 210 [ | |
| 211 "--target-directory", | |
| 212 rebase_path(invoker.pkg_dir), | |
| 213 ], | |
| 214 "list lines") | |
| 215 sources += ls_sources | |
| 216 } | |
| 217 | |
| 218 # We have to use foreach to set up outputs instead of rebase_path because | |
| 219 # GN doesn't like assignments to outputs that aren't obviously under | |
| 220 # $root_gen_dir somewhere. | |
| 221 outputs = [ | |
| 222 "$root_gen_dir/dart-pkg/${package_name}", | |
| 223 "$root_gen_dir/dart-pkg/packages/${package_name}", | |
| 224 stamp_file, | |
| 225 ] | |
| 226 | |
| 227 inputs = [ script ] + rebase_path(sources) | |
| 228 | |
| 229 args = [ | |
| 230 "--package-name", | |
| 231 package_name, | |
| 232 "--dart-sdk", | |
| 233 rebase_path(dart_sdk_root), | |
| 234 "--pkg-directory", | |
| 235 pkg_directory, | |
| 236 "--package-root", | |
| 237 package_root, | |
| 238 "--stamp-file", | |
| 239 rebase_path(stamp_file), | |
| 240 "--entries-file", | |
| 241 rebase_path(entries_file), | |
| 242 "--package-sources", | |
| 243 ] + rebase_path(sources) + [ "--package-entrypoints" ] + | |
| 244 rebase_path(entrypoints) + [ "--sdk-ext-directories" ] + | |
| 245 rebase_path(sdk_ext_directory) + [ "--sdk-ext-files" ] + | |
| 246 rebase_path(sdk_ext_files) + [ "--sdk-ext-mappings" ] + | |
| 247 sdk_ext_mappings + extra_flags | |
| 248 } | |
| 249 } | |
| 250 | |
| 251 # This is the entrypoint for organizing Dart code for Mojo. | |
| 252 # | |
| 253 # There should be a one to one mapping between dart_pkg rules and pubspec.yamls. | |
| 254 # | |
| 255 # This build rule will result in a package under $root_gen_dir/dart-pkg/ | |
| 256 # | |
| 257 # The name of the package is taken from the 'pubspec.yaml' file. | |
| 258 # | |
| 259 # For each app in |apps|, it makes a .mojo Mojo application using the dartx | |
| 260 # format as well as an assemblage of the app under $root_gen_dir/dart-pkg for | |
| 261 # use in local development. | |
| 262 # | |
| 263 # For each library in |libs|, it invokes the Dart analyzer on that library. The | |
| 264 # build will fail if the library is not analyzer clean. | |
| 265 # | |
| 266 # All other sources go in |sources|. This should at least contain the | |
| 267 # 'pubspec.yaml' file. | |
| 268 # | |
| 269 # Even if a package will not be uploaded to pub, an attempt should be made not | |
| 270 # to conflict with the names of existing pub packages, for example by using the | |
| 271 # prefix 'mojo_dart_'. | |
| 272 # | |
| 273 # sources | |
| 274 # List of sources to include in the package. This should at least contain | |
| 275 # the pubspec.yaml for the package. | |
| 276 # | |
| 277 # apps (optional) | |
| 278 # List of pairs. [mojo_app_name, entrypoint.dart]. Each entrypoint | |
| 279 # script must contain a main() function. A .mojo Mojo application will be | |
| 280 # generated for each application. | |
| 281 # | |
| 282 # libs (optional) | |
| 283 # List of library entrypoints to pass to the analyzer. If none are | |
| 284 # defined, the analyzer is not run. | |
| 285 # | |
| 286 # strict (optional) | |
| 287 # If |apps| are specified, |strict| can be set to true to | |
| 288 # instruct the content handler to run the apps in Dart VM's strict | |
| 289 # compilation mode (with assertions and type-checks, etc.). | |
| 290 # | |
| 291 # deps (optional) | |
| 292 # List of other dart_pkg targets for Dart packages imported by this | |
| 293 # dart_pkg, as well as the mojom targets needed by this dart_pkg. | |
| 294 # | |
| 295 # pkg_dir (optional) | |
| 296 # Directory containing the package sources. This overrides sources and | |
| 297 # entrypoints. The analyzer will not be run. | |
| 298 # | |
| 299 # datadeps (optional) | |
| 300 # | |
| 301 # sdk_ext_directory (optional) | |
| 302 # Directory containing sdk-ext .dart sources. | |
| 303 # | |
| 304 # sdk_ext_files (optional) | |
| 305 # List of sources to include in sdk-ext. | |
| 306 # | |
| 307 # sdk_ext_mappings (optional) | |
| 308 # Mappings for dart libraries that are part of of sdk_ext. | |
| 309 template("dart_pkg") { | |
| 310 if (defined(invoker.pkg_dir)) { | |
| 311 pubspec_yaml_path = rebase_path("pubspec.yaml", "", invoker.pkg_dir) | |
| 312 } else { | |
| 313 pubspec_yaml_path = rebase_path("pubspec.yaml") | |
| 314 } | |
| 315 dart_package_name_script = | |
| 316 rebase_path("mojo/public/tools/dart_package_name.py", ".", mojo_sdk_root) | |
| 317 dart_package_name = exec_script(dart_package_name_script, | |
| 318 [ | |
| 319 "--pubspec", | |
| 320 pubspec_yaml_path, | |
| 321 ], | |
| 322 "trim string", | |
| 323 [ pubspec_yaml_path ]) | |
| 324 | |
| 325 dart_pkg_target_name = "${target_name}_pkg_helper" | |
| 326 dart_pkg_helper(dart_pkg_target_name) { | |
| 327 package_name = dart_package_name | |
| 328 if (defined(invoker.sources)) { | |
| 329 sources = invoker.sources | |
| 330 } | |
| 331 if (defined(invoker.apps)) { | |
| 332 apps = invoker.apps | |
| 333 } | |
| 334 if (defined(invoker.libs)) { | |
| 335 libs = invoker.libs | |
| 336 } | |
| 337 if (defined(invoker.pkg_dir)) { | |
| 338 pkg_dir = invoker.pkg_dir | |
| 339 } | |
| 340 if (defined(invoker.deps)) { | |
| 341 deps = invoker.deps | |
| 342 } | |
| 343 if (defined(invoker.datadeps)) { | |
| 344 datadeps = invoker.datadeps | |
| 345 } | |
| 346 if (defined(invoker.sdk_ext_directory)) { | |
| 347 sdk_ext_directory = invoker.sdk_ext_directory | |
| 348 } | |
| 349 if (defined(invoker.sdk_ext_files)) { | |
| 350 sdk_ext_files = invoker.sdk_ext_files | |
| 351 } | |
| 352 if (defined(invoker.sdk_ext_mappings)) { | |
| 353 sdk_ext_mappings = invoker.sdk_ext_mappings | |
| 354 } | |
| 355 } | |
| 356 | |
| 357 if (defined(invoker.apps)) { | |
| 358 pkg_helper_output_dir = "$root_gen_dir/dart-pkg/${dart_package_name}" | |
| 359 foreach(app, invoker.apps) { | |
| 360 app_name = app[0] | |
| 361 app_entrypoint = app[1] | |
| 362 dartx_output_name = app_name | |
| 363 dartx_application("${app_name}_dart_app") { | |
| 364 output_name = dartx_output_name | |
| 365 main_dart = rebase_path(app_entrypoint, "", pkg_helper_output_dir) | |
| 366 sources = [ | |
| 367 "$root_gen_dir/dart-pkg/${dart_package_name}.stamp", | |
| 368 ] | |
| 369 deps = [ | |
| 370 ":$dart_pkg_target_name", | |
| 371 ] | |
| 372 deps += invoker.deps | |
| 373 if (defined(invoker.strict)) { | |
| 374 strict = invoker.strict | |
| 375 } | |
| 376 } | |
| 377 } | |
| 378 } | |
| 379 | |
| 380 group(target_name) { | |
| 381 deps = [ | |
| 382 ":$dart_pkg_target_name", | |
| 383 ] | |
| 384 if (defined(invoker.apps)) { | |
| 385 foreach(app, invoker.apps) { | |
| 386 app_name = app[0] | |
| 387 dartx_target_name = "${app_name}_dart_app" | |
| 388 deps += [ ":$dartx_target_name" ] | |
| 389 } | |
| 390 } | |
| 391 } | |
| 392 } | |
| 393 | |
| 394 # Used to create dart_pkgs from a directory populated by fetch_dart_packages.py | |
| 395 # | |
| 396 # This build rule will result in a many packages under $root_gen_dir/dart-pkg/. | |
| 397 # | |
| 398 # base_dir (optional) | |
| 399 # Directory populated by fetch_dart_packages.py. Defaults to BUILD.gn | |
| 400 # directory. | |
| 401 template("dart_packages") { | |
| 402 base_dir = "." | |
| 403 if (defined(invoker.base_dir)) { | |
| 404 base_dir = invoker.base_dir | |
| 405 } | |
| 406 | |
| 407 # Determine list of packages. | |
| 408 list_script = rebase_path("mojo/public/dart/tools/fetch_dart_packages.py", | |
| 409 ".", | |
| 410 mojo_sdk_root) | |
| 411 packages = exec_script(list_script, | |
| 412 [ | |
| 413 "--directory", | |
| 414 rebase_path(base_dir), | |
| 415 "--list", | |
| 416 ], | |
| 417 "list lines", | |
| 418 [ | |
| 419 rebase_path("pubspec.yaml"), | |
| 420 rebase_path("pubspec.lock"), | |
| 421 ]) | |
| 422 | |
| 423 # Generate dart_pkg for each package. | |
| 424 foreach(package_dir, packages) { | |
| 425 dart_pkg("$package_dir") { | |
| 426 pkg_dir = rebase_path("$package_dir") | |
| 427 } | |
| 428 } | |
| 429 | |
| 430 # Generate target group. | |
| 431 group(target_name) { | |
| 432 deps = [] | |
| 433 foreach(package_dir, packages) { | |
| 434 deps += [ ":$package_dir" ] | |
| 435 } | |
| 436 if (defined(invoker.deps)) { | |
| 437 deps += invoker.deps | |
| 438 } | |
| 439 } | |
| 440 } | |
| OLD | NEW |