diff --git a/.dart_version b/.dart_version new file mode 100644 index 0000000..ae2436c --- /dev/null +++ b/.dart_version @@ -0,0 +1,2 @@ +# This file contains the current Dart version we build against +3.0.7 \ No newline at end of file diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..3de1a77 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,20 @@ +name: Build Dart Shared Library +on: + push: + branches: + - main + pull_request: +jobs: + build_windows: + runs-on: [windows-latest] + steps: + - uses: actions/checkout@v3 + - uses: dart-lang/setup-dart@v1 + - uses: ilammy/msvc-dev-cmd@v1 + - uses: threeal/cmake-action@v1.3.0 + - run: dart pub get + working-directory: ./scripts/build_helpers + - name: Build Dart + run: dart ./scripts/build_helpers/bin/build_dart.dart + - name: Build Shared Library + run: cmake -B .\.build . && cmake --build .\.build --config release diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9dc4e40 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "files.exclude": { + "**/.git": true, // this is a default value + "**/.DS_Store": true, // this is a default value + + "dart-sdk/": true + } +} \ No newline at end of file diff --git a/README.md b/README.md index 5a3f3d8..fae1bf3 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,8 @@ The hope is that the the dynamic library will eventually support the following t * A "Fully Featured" .dll / .so that supports booting Dart in different configurations: * Boot (or not) the service and kernel isolates * Support Dart Source Compilation and / or Kernel Isolates - * Support "AOT only" mode? (aka, just the runtime) -* A JIT Only .dll / .so -* A AOT Only .dll / .so (aka, just the runtime) + * JIT from source or .dil +* An AOT Only .dll / .so Additionally we may have a static target that uses the same interface as the dynamic library, so the VM can be embedded on platforms that don't support dynamic linking. diff --git a/scripts/build_helpers/.gitignore b/scripts/build_helpers/.gitignore new file mode 100644 index 0000000..3a85790 --- /dev/null +++ b/scripts/build_helpers/.gitignore @@ -0,0 +1,3 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ diff --git a/scripts/build_helpers/CHANGELOG.md b/scripts/build_helpers/CHANGELOG.md new file mode 100644 index 0000000..effe43c --- /dev/null +++ b/scripts/build_helpers/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial version. diff --git a/scripts/build_helpers/analysis_options.yaml b/scripts/build_helpers/analysis_options.yaml new file mode 100644 index 0000000..94c8acd --- /dev/null +++ b/scripts/build_helpers/analysis_options.yaml @@ -0,0 +1,25 @@ +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +linter: + rules: + - camel_case_types + - prefer_relative_imports + +# analyzer: +# exclude: +# - path/to/excluded/files/** \ No newline at end of file diff --git a/scripts/build_helpers/bin/build_dart.dart b/scripts/build_helpers/bin/build_dart.dart new file mode 100644 index 0000000..abfcf21 --- /dev/null +++ b/scripts/build_helpers/bin/build_dart.dart @@ -0,0 +1,162 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:args/args.dart'; +import 'package:build_helpers/build_helpers.dart'; +import 'package:logger/logger.dart'; +import 'package:path/path.dart' as path; + +void main(List args) async { + final parser = ArgParser(); + parser.addFlag('verbose', abbr: 'v'); + + final argResults = parser.parse(args); + Level logLevel = Level.info; + if (argResults['verbose'] == true) { + logLevel = Level.debug; + } + + if (!checkRightDirectory()) { + // Not run from root. Exit. + exit(-1); + } + + if (Platform.isWindows) { + final depotToolsEnv = Platform.environment['DEPOT_TOOLS_WIN_TOOLCHAIN']; + if (depotToolsEnv == null) { + BuildToolsLogger.shared.e( + 'DEPOT_TOOLS_WIN_TOOOLCHAIN not set! Run ./setup_env.ps1 before running this script!'); + exit(-1); + } + } + + BuildToolsLogger.initLogger(logLevel: logLevel); + if (!await checkForDepotTools()) { + if (!await getDepotTools()) { + // Fatal. Can't do this without depot_tools + exit(-1); + } + } + + try { + if (!await _fetchOrUpdateDartSdk()) { + exit(-1); + } + + if (!await _patchDartSdk()) { + exit(-1); + } + + if (!await _buildDart()) { + exit(-1); + } + } catch (e) { + BuildToolsLogger.shared.f('Caught an exception building the Dart SDK:'); + BuildToolsLogger.shared.f(e); + exit(-1); + } +} + +Future _fetchOrUpdateDartSdk() async { + final logger = BuildToolsLogger.shared; + final dartVersion = await _fetchRequestedDartVersion(); + + if (!Directory('dart-sdk').existsSync()) { + logger.i('dart-sdk does not exist. Doing full fetch'); + + Directory('dart-sdk').create(); + + final fetchResult = await inDir('dart-sdk', () async { + final fetchProcess = + await startAppendingDepotToolsPath('fetch', ['--no-history', 'dart']); + var fetchResult = await waitForProcessFinish(fetchProcess); + return fetchResult; + }); + if (fetchResult != 0) return false; + } + + final finalResult = await inDir(path.join('dart-sdk', 'sdk'), () async { + logger.i('Checking out tag $dartVersion'); + final fetchProcess = await Process.start( + 'git', + ['fetch', 'origin', 'refs/tags/$dartVersion:refs/tags/$dartVersion'], + runInShell: true, + ); + var fetchResult = await waitForProcessFinish(fetchProcess); + if (fetchResult != 0) return fetchResult; + + final checkoutProcess = await Process.start( + 'git', + ['checkout', '-f', 'tags/$dartVersion'], + runInShell: true, + ); + var checkoutResult = await waitForProcessFinish(checkoutProcess); + if (checkoutResult != 0) return checkoutResult; + + logger.i('Performing `gclient sync -D --no-history'); + final syncProcess = await Process.start( + 'gclient', + ['sync', '-D', '--no-history'], + runInShell: true, + ); + var syncResult = await waitForProcessFinish(syncProcess); + if (syncResult != 0) return syncResult; + + return 0; + }); + + return finalResult == 0; +} + +Future _fetchRequestedDartVersion() async { + final lines = await File('.dart_version').readAsLines(); + for (var line in lines) { + if (line.startsWith('#')) { + continue; + } + + return line; + } + throw Exception('Only found comments in the `.dart_version` file!'); +} + +Future _patchDartSdk() async { + final logger = BuildToolsLogger.shared; + final result = await inDir('dart-sdk/sdk', () async { + logger.i("Patching the Dart SDK to create libdart"); + var result = await Process.run('git', ['apply', '../../dart_sdk.patch'], + runInShell: true); + logger.d(result.stdout); + return result.exitCode; + }); + if (result != 0) { + logger.f('Failed to apply patch.'); + } + + return result == 0; +} + +Future _buildDart() async { + final logger = BuildToolsLogger.shared; + final result = await inDir('dart-sdk/sdk', () async { + logger.i("Building libdart"); + var script = './tools/build.py'; + var args = ['--no-goma', '-m', 'release', 'libdart']; + var command = script; + if (Platform.isWindows) { + command = 'python'; + args.insert(0, script); + } + final buildProcess = await Process.start( + command, + args, + runInShell: true, + ); + var buildResult = await waitForProcessFinish(buildProcess); + return buildResult; + }); + if (result != 0) { + logger.f('Failed to build dart.'); + } + return result == 0; +} diff --git a/scripts/build_helpers/lib/build_helpers.dart b/scripts/build_helpers/lib/build_helpers.dart new file mode 100644 index 0000000..5e6a2e4 --- /dev/null +++ b/scripts/build_helpers/lib/build_helpers.dart @@ -0,0 +1,81 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:logger/logger.dart'; +import 'package:path/path.dart' as path; + +export 'depot_tools.dart'; + +class BuildToolsLogger { + static Logger? _shared; + static Logger get shared { + _shared ??= initLogger(); + return _shared!; + } + + static Logger initLogger({Level logLevel = Level.info}) { + return Logger( + filter: ProductionFilter(), + level: logLevel, + printer: SimplePrinter(), + ); + } +} + +bool checkRightDirectory() { + final logger = BuildToolsLogger.shared; + + final currentDir = Directory.current; + // Check if the .dart_version and the patch file are there. + if (!File(path.join(currentDir.path, '.dart_version')).existsSync()) { + logger.f( + 'Could not find `.dart_version`. Make sure you\'re running from the root of the `dart_dll` repo.'); + return false; + } + + if (!File(path.join(currentDir.path, 'dart_sdk.patch')).existsSync()) { + logger.f( + 'Could not find `dart_sdk.pathch`. Make sure you\'re running from the root of the `dart_dll` repo.'); + return false; + } + + return true; +} + +// Waits for the process to finish, outputting output to the BuildToolsLogger +Future waitForProcessFinish(Process process) async { + final logger = BuildToolsLogger.shared; + final stdoutCompleter = Completer(); + final stderrCompleter = Completer(); + + process.stdout.transform(utf8.decoder).transform(const LineSplitter()).listen( + (l) { + logger.i(l); + }, + ).onDone(() { + stdoutCompleter.complete(); + }); + + process.stderr.transform(utf8.decoder).transform(const LineSplitter()).listen( + (l) { + logger.i(l); + }, + ).onDone(() { + stderrCompleter.complete(); + }); + + var exitCode = await process.exitCode; + + await (Future.wait([stdoutCompleter.future, stderrCompleter.future])); + + return exitCode; +} + +Future inDir(String directory, Future Function() callback) async { + final oldDir = Directory.current; + Directory.current = Directory(directory); + final result = await callback(); + Directory.current = oldDir; + return result; +} diff --git a/scripts/build_helpers/lib/depot_tools.dart b/scripts/build_helpers/lib/depot_tools.dart new file mode 100644 index 0000000..32e60ff --- /dev/null +++ b/scripts/build_helpers/lib/depot_tools.dart @@ -0,0 +1,92 @@ +import 'dart:io'; + +import 'package:path/path.dart' as path; + +import 'build_helpers.dart'; + +Future checkForDepotTools() async { + final logger = BuildToolsLogger.shared; + logger.i('Checking for depot_tools'); + final result = await Process.run('gclient', ['--version'], runInShell: true); + if (result.exitCode != 0) { + logger.w('Failed checking for depot_tools.'); + logger.d('Output of `gclient --version`:'); + logger.d(result.stdout); + } else { + logger.i('✅ Found depot_tools'); + } + + return result.exitCode == 0; +} + +Future getDepotTools() async { + final logger = BuildToolsLogger.shared; + + logger.i('Cloning depot_tools...'); + final cloneResult = await Process.run( + 'git', + [ + 'clone', + 'https://chromium.googlesource.com/chromium/tools/depot_tools.git' + ], + runInShell: true, + ); + if (cloneResult.exitCode != 0) { + logger.e('Failed cloning depot_tools repot.'); + logger.d('Output of clone:'); + logger.d(cloneResult.stdout); + return false; + } + + logger.i('Running `gclient` to prep depot_tools.'); + final gclientResult = + await runAppendingDepotToolsPath('gclient', ['--version']); + if (gclientResult.exitCode != 0) { + logger.f('Still could not run `gclient` after clone.'); + logger.d('Output of run:'); + logger.d(gclientResult.stdout); + return false; + } + + return true; +} + +String _depotToolsAppendedPath() { + final logger = BuildToolsLogger.shared; + final cwd = Directory.current; + final depotToolsPath = path.join(cwd.absolute.path, 'depot_tools'); + + var pathEnv = Platform.environment['PATH']; + if (Platform.isWindows) { + pathEnv = '$depotToolsPath;$pathEnv'; + } else { + pathEnv = '$depotToolsPath:$pathEnv'; + } + logger.d('Path is now: $pathEnv'); + return pathEnv; +} + +Future runAppendingDepotToolsPath( + String command, List arguments) { + final pathEnv = _depotToolsAppendedPath(); + + return Process.run( + command, + arguments, + environment: { + 'PATH': pathEnv, + }, + runInShell: true, + ); +} + +Future startAppendingDepotToolsPath( + String command, List arguments) { + final pathEnv = _depotToolsAppendedPath(); + return Process.start( + command, + arguments, + environment: {'PATH': pathEnv}, + runInShell: true, + ); +} diff --git a/scripts/build_helpers/pubspec.lock b/scripts/build_helpers/pubspec.lock new file mode 100644 index 0000000..ab1926b --- /dev/null +++ b/scripts/build_helpers/pubspec.lock @@ -0,0 +1,381 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + url: "https://pub.dev" + source: hosted + version: "64.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + args: + dependency: "direct main" + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + coverage: + dependency: transitive + description: + name: coverage + sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + url: "https://pub.dev" + source: hosted + version: "1.6.3" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + file: + dependency: transitive + description: + name: file + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" + source: hosted + version: "6.1.4" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + lints: + dependency: "direct dev" + description: + name: lints + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + logger: + dependency: "direct main" + description: + name: logger + sha256: ba3bc83117b2b49bdd723c0ea7848e8285a0fbc597ba09203b20d329d020c24a + url: "https://pub.dev" + source: hosted + version: "2.0.2" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" + source: hosted + version: "0.12.16" + meta: + dependency: transitive + description: + name: meta + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + url: "https://pub.dev" + source: hosted + version: "1.10.0" + mime: + dependency: transitive + description: + name: mime + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" + source: hosted + version: "1.0.4" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: "direct main" + description: + name: path + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" + source: hosted + version: "1.8.3" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + url: "https://pub.dev" + source: hosted + version: "1.1.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" + source: hosted + version: "0.10.12" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test: + dependency: "direct dev" + description: + name: test + sha256: "9b0dd8e36af4a5b1569029949d50a52cb2a2a2fdaa20cebb96e6603b9ae241f9" + url: "https://pub.dev" + source: hosted + version: "1.24.6" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + test_core: + dependency: transitive + description: + name: test_core + sha256: "4bef837e56375537055fdbbbf6dd458b1859881f4c7e6da936158f77d61ab265" + url: "https://pub.dev" + source: hosted + version: "0.5.6" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 + url: "https://pub.dev" + source: hosted + version: "11.10.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.0.6 <4.0.0" diff --git a/scripts/build_helpers/pubspec.yaml b/scripts/build_helpers/pubspec.yaml new file mode 100644 index 0000000..e774fb6 --- /dev/null +++ b/scripts/build_helpers/pubspec.yaml @@ -0,0 +1,17 @@ +name: build_helpers +description: Script to help build the Dart Shared Library +version: 1.0.0 +publish_to: none + +environment: + sdk: ^3.0.6 + +# Add regular dependencies here. +dependencies: + args: ^2.4.2 + path: ^1.8.0 + logger: ^2.0.2 + +dev_dependencies: + lints: ^2.0.0 + test: ^1.21.0