Files
wasmtime/.azure-pipelines.yml
Alex Crichton af2b4e4946 Add initial support for WebAssembly Interface Types (#282)
This commit adds initial support for [WebAssembly Interface
Types][proposal] to wasmtime. This is all intended to be quite
experimental, so experimental in fact that even the name of the
[proposal] is still in flux. (this has otherwise been known as "host
bindings" or "webidl bindings" or "wasm bindings").

The goal of this commit is to start adding support the wasmtime set of
crates for WebAssembly Interface Types. A new `wasmtime-interface-types`
crate has been added with very basic support for dynamically invoking
and inspecting the various bindings of a module. This is in turn powered
by the `wasm-webidl-bindings` crate which is shared with the
`wasm-bindgen` CLI tool as a producer of this section.

Currently the only integration in `wasmtime`-the-binary itself is that
when passed the `--invoke` argument the CLI will now attempt to invoke
the target function with arguments as parsed from the command line
itself. For example if you export a function like:

    fn render(&str) -> String

Then passing `--invoke render` will require one argument on the command
line, which is the first argument as a string, and the return value is
printed to the console. This differs from today's interpretation of
`--invoke` where it is a failure if the invoked function takes more than
one argument and the return values are currently ignored.

This is intended to also be the basis of embedding wasmtime in other
contexts which also want to consume WebAssembly interface types. A
Python extension is also added to this repository which implements the
`wasmtime` package on PyPI. This Python extension is intended to make it
as easy as `pip3 install wasmtime` to load a WebAssembly file with
WebAssembly Interface Types into Python. Extensions for other languages
is of course possible as well!

One of the major missing pieces from this is handling imported functions
with interface bindings. Currently the embedding support doesn't have
much ability to support handling imports ergonomically, so it's intended
that this will be included in a follow-up patch.

[proposal]: https://github.com/webassembly/webidl-bindings

Co-authored-by: Yury Delendik <ydelendik@mozilla.com>
2019-08-19 13:32:13 +02:00

217 lines
6.7 KiB
YAML

name: $(Build.SourceBranch)-$(date:yyyyMMdd)$(rev:.r)
trigger:
branches:
include:
- 'master'
tags:
include:
- '*'
exclude:
- 'dev'
jobs:
- job: rustfmt
pool:
vmImage: 'macos-10.14'
steps:
- checkout: self
submodules: true
- template: ci/azure-install-rust.yml
- script: rustup component add rustfmt
displayName: Add rustfmt
- script: cargo fmt --all -- --check
displayName: Check formatting
variables:
toolchain: stable
# Smoke test to build docs on one builder, using OSX for now since it's the
# fastest
- job: docs
pool:
vmImage: 'macos-10.14'
steps:
- checkout: self
submodules: true
- template: ci/azure-install-rust.yml
- script: cargo doc
displayName: Build documentation
variables:
toolchain: stable
- job: Test
strategy:
matrix:
windows-stable:
imageName: 'vs2017-win2016'
toolchain: stable
linux-stable:
imageName: 'ubuntu-16.04'
toolchain: stable
mac-stable:
imageName: 'macos-10.14'
toolchain: stable
mac-beta:
imageName: 'macos-10.14'
toolchain: beta
mac-nightly:
imageName: 'macos-10.14'
toolchain: nightly
pool:
vmImage: $(imageName)
steps:
- checkout: self
submodules: true
- template: ci/azure-install-rust.yml
- script: cargo fetch
displayName: Fetch cargo dependencies
# Build and test all features except for lightbeam
- bash: cargo test --all --exclude lightbeam --exclude wasmtime-wasi-c --exclude wasmtime-py
displayName: Cargo test
env:
RUST_BACKTRACE: 1
# Build and test lightbeam if we're using the nightly toolchain
- bash: cargo build --package lightbeam
displayName: Cargo build lightbeam
condition: and(succeeded(), eq(variables['toolchain'], 'nightly'))
- bash: cargo test --package lightbeam
displayName: Cargo test lightbeam
# Lightbeam tests fail right now, but we don't want to block on that.
continueOnError: true
condition: and(succeeded(), eq(variables['toolchain'], 'nightly'))
env:
RUST_BACKTRACE: 1
- job: Build
strategy:
matrix:
windows:
imageName: 'vs2017-win2016'
# Statically link against msvcrt to produce slightly more portable
# binaries on Windows by reducing our binary compatibility requirements.
RUSTFLAGS: -Ctarget-feature=+crt-static
mac:
imageName: 'macos-10.14'
# Lower the deployment target from our build image in an attempt to
# build more portable binaries that run on older releases. Note that
# 10.9 here is arbitrarily chosen and just happens to be the lowest that
# works at this time. Raising this is probably fine.
MACOSX_DEPLOYMENT_TARGET: 10.9
variables:
toolchain: stable
pool:
vmImage: $(imageName)
steps:
- template: ci/azure-build-release.yml
# Build the Linux release binary in an older Linux container (in this case
# Centos 6)
- job: Build_linux
variables:
toolchain: stable
container:
image: centos:6
options: "--name ci-container -v /usr/bin/docker:/tmp/docker:ro"
steps:
- template: ci/azure-prepare-centos-6.yml
- template: ci/azure-build-release.yml
# Build the `wasmtime-py` python extension in the same manner we build the
# binaries above, since these wheels are also native code that we're
# distributing.
#
# Note that the builds here are using a nightly compiler, not a stable compiler,
# since this is what PyO3 requires.
- job: Build_wheels
strategy:
matrix:
windows:
imageName: 'vs2017-win2016'
RUSTFLAGS: -Ctarget-feature=+crt-static
mac:
imageName: 'macos-10.14'
MACOSX_DEPLOYMENT_TARGET: 10.9
variables:
toolchain: nightly-2019-08-15
pool:
vmImage: $(imageName)
steps:
- template: ci/azure-build-wheels.yml
- job: Build_linux_wheels
variables:
toolchain: nightly-2019-08-15
container:
image: centos:6
options: "--name ci-container -v /usr/bin/docker:/tmp/docker:ro"
steps:
- template: ci/azure-prepare-centos-6.yml
- template: ci/azure-build-wheels.yml
- job: Publish
dependsOn:
- Build
- Build_wheels
- Build_linux
- Build_linux_wheels
condition: and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI'))
steps:
# Checking out the sources is needed to be able to delete the "dev" tag, see below.
- checkout: self
persistCredentials: true
submodules: false
- task: DownloadPipelineArtifact@1
inputs:
targetPath: $(Build.ArtifactStagingDirectory)
- script: |
echo "##vso[task.setvariable variable=tagName;]`echo $BUILD_SOURCEBRANCH | sed -e 's|refs/tags/||'`"
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/')
- task: GitHubRelease@0
inputs:
gitHubConnection: 'tschneidereit-releases'
target: '$(Build.SourceVersion)'
tagSource: 'manual'
tag: '$(tagName)'
title: 'Wasmtime $(tagName)'
assets: '$(Build.ArtifactStagingDirectory)/**'
isDraft: false
isPreRelease: true
condition: and(startsWith(variables['Build.SourceBranch'], 'refs/tags/'),
ne(variables['Build.SourceBranch'], 'refs/tags/dev'))
# GitHub doesn't support doing rolling releases for branch.
# To simulate that for dev builds, always do a release for the "dev" tag.
# While the `edit` action for the GitHubRelease task would replace any assets
# associated with the tag, it wouldn't update the tag itself. Hence, delete the
# tag if it exists, and re-create it every time.
# Also explicitly delete the GitHub release, which would otherwise turn into a draft
# and linger forever.
- task: GitHubRelease@0
inputs:
gitHubConnection: 'tschneidereit-releases'
action: 'delete'
tag: 'dev'
# This might fail in case the target repo doesn't yet have this tag, which is fine.
continueOnError: true
condition: in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/tags/dev')
- script: |
git -c http.extraheader="AUTHORIZATION: basic ***" push origin :dev
# This might fail in case the target repo doesn't yet have this tag, which is fine.
continueOnError: true
condition: in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/tags/dev')
- task: GitHubRelease@0
inputs:
gitHubConnection: 'tschneidereit-releases'
action: 'create'
target: '$(Build.SourceVersion)'
tag: 'dev'
tagSource: 'manual'
title: 'Latest CI build'
assets: '$(Build.ArtifactStagingDirectory)/**'
isDraft: false
isPreRelease: true
condition: in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/tags/dev')