-
Notifications
You must be signed in to change notification settings - Fork 56
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[native_assets_cli] Add DartCApi
#1937
Conversation
PR HealthBreaking changes ✔️
Changelog Entry ✔️
Changes to files need to be accounted for in their respective changelogs. API leaks ✔️The following packages contain symbols visible in the public API, but not exported by the library. Export these symbols or remove them from your publicly visible API.
License Headers ✔️
All source files should start with a license header. Unrelated files missing license headers
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have no context for this but it seems reasonable.
/// Only `dart_api_dl.h` should be used. `dart_api_dl.c` shoud be compiled into | ||
/// your `CodeAsset`. | ||
/// | ||
/// Note: If you're precompiling code assets, you must check that [version] is |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This documentation might not be sufficient in the long wrong - how would I check that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One should check the major version is identical and the minor version is at least what you need.
Instead of baking this into the protocol and complicating dart & flutter bundling tools, have we considered simply making a That would mean if an app depends on many packages, several of them use this package, we get the Furthermore we'd have the ability to start versioning this API with SDK constraints of the package. Basically the question is: What benefit does it have to bake it into the protocol? |
I like this.
I don't believe this will work properly. We don't have a way in pub to retroactively add an SDK upper bound to a package version. Also it would mean that a Dart package has to chose a Dart C API version and will fail to resolve if it has chosen a different version.
Being able to build against (or download) the exact Dart C API version. This enables the C build of your package to have ifdefs against different versions of the Dart C API and make your package succeed building against different versions of the Dart C API. Iif the dylibs are prebuilt, you can have multiple prebuilt binaries (os * arch * dart-c-api-version) similarly to how Python does it. #839 (comment) |
There's no reason for doing that retroactively. I've mentioned this in other places before, but cannot find where, so I've described it in a new issue here: #1941
That doesn't help. Imagine we break the API by removing a function. All the existing packages that use that function (and didn't if/def it because they don't know it's not available in newer versions) will break in obscure ways at hook build time or even at runtime.
I don't think one wants to have prebuilt binaries for huge cross products. Would a package author want to prebuilt their binaries for years old Dart SDKs? We have a mechanism to deal breaking changes - semantic package versions - and I think we should use that mechanism instead of introducing X new versioning mechanisms that make things only fail at build or even runtime. |
Right, if we do a breaking change we need to do a major version bump, and that's never forward compatible. But a package can still decide to also support a previous major version.
Hopefully people move on quicker in Dart than in the Python ecosystem.
Agreed. My suggestion in #93 (comment) with the SDK specifying constraints would have
The package can then have both the C source and generated FFI bindings. What this PR does has no solution for FFI bindings, because one would have to generate the bindings in their own package and once the API changes. (#839 (comment)) So publishing a package instead is a good idea. It's kind of ugly we have to copy-paste the include dir, and we have to not forget to publish such package, but I believe that's acceptable. (We can't really properly work with SDK constraints, because if we want to do a breaking change we'd need to postpone landing that breaking change in the SDK until the upper bound of the last published package runs out. That seems like considerable lag. And most likely we're going to forget about this constraint...) |
Closing this PR for now in favor of adding a package in the future in some way. Let's continue the discussion on the tracking bug instead of PR. #839 |
This PR adds an (optional) path to the Dart C API. Both Dart and Flutter will be able to provide this.
For C code that's compiled in the hook, the path can be used directly.
For C code that's precompiled and pulled in via from a CDN, the version number should be checked in the hook.
Does not yet update the example in pkgs/native_assets_cli/example/build/use_dart_api/ because it's run against the released Dart and Flutter on CI. We should update it after Dart and Flutter pass in the API.
Bug: #839