diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml new file mode 100644 index 0000000000..a18a45652e --- /dev/null +++ b/.azure-pipelines.yml @@ -0,0 +1,156 @@ +name: $(Build.SourceBranch)-$(date:yyyy-MM-dd)$(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 + - script: cargo install cargo-deadlinks + displayName: Install cargo-deadlinks + - bash: | + find ./target/doc -maxdepth 1 -type d -name "cranelift*" | xargs -I{} cargo deadlinks --dir {} + displayName: Run cargo-deadlinks + variables: + toolchain: nightly + +- job: Test + strategy: + matrix: + windows-earliest: + imageName: 'vs2017-win2016' + toolchain: '1.37.0' + linux-earliest: + imageName: 'ubuntu-16.04' + toolchain: '1.37.0' + mac-earliest: + imageName: 'macos-10.14' + toolchain: '1.37.0' + 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 + + - script: cargo build + displayName: Cargo build + + - bash: cargo test --all + displayName: Cargo test + env: + RUST_BACKTRACE: 1 + + # Ensure fuzzer works by running it with a single input + - bash: cargo install cargo-fuzz + displayName: Install cargo-fuzz + condition: and(succeeded(), eq(variables['toolchain'], 'nightly')) + - bash: | + fuzz_module="ffaefab69523eb11935a9b420d58826c8ea65c4c" + cargo fuzz run fuzz_translate_module \ + "fuzz/corpus/fuzz_translate_module/$fuzz_module" + displayName: Run cargo-fuzz + env: + RUST_BACKTRACE: 1 + condition: and(succeeded(), eq(variables['toolchain'], 'nightly')) + +- 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: '1.37.0' + pool: + vmImage: $(imageName) + # We try to be compatible with beta and nightly, but they occasionally + # fail, so we don't allow them to hold up people using stable. + continueOnError: $[ne(variables['toolchain'], 'stable')] + 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: '1.37.0' + container: + image: centos:6 + options: "--name ci-container -v /usr/bin/docker:/tmp/docker:ro" + steps: + # We're executing in the container as non-root but `yum` requires root. We + # need to install `sudo` but to do that we need `sudo`. Do a bit of a weird + # hack where we use the host `docker` executable to re-execute in our own + # container with the root user to install `sudo` + - bash: /tmp/docker exec -t -u 0 ci-container sh -c "yum install -y sudo" + displayName: Configure sudo + + # See https://edwards.sdsu.edu/research/c11-on-centos-6/ for where these + # various commands came from. + - bash: | + set -e + sudo yum install -y centos-release-scl cmake xz + sudo yum install -y devtoolset-8-gcc devtoolset-8-binutils devtoolset-8-gcc-c++ + echo "##vso[task.prependpath]/opt/rh/devtoolset-8/root/usr/bin" + displayName: Install system dependencies + + # Delete `libstdc++.so` to force gcc to link against `libstdc++.a` instead. + # This is a hack and not the right way to do this, but it ends up doing the + # right thing for now. + - bash: sudo rm -f /opt/rh/devtoolset-8/root/usr/lib/gcc/x86_64-redhat-linux/8/libstdc++.so + displayName: Force a static libstdc++ + + - template: ci/azure-build-release.yml diff --git a/cranelift/ci/azure-build-release.yml b/cranelift/ci/azure-build-release.yml new file mode 100644 index 0000000000..6400eed0eb --- /dev/null +++ b/cranelift/ci/azure-build-release.yml @@ -0,0 +1,66 @@ +steps: +- checkout: self + submodules: true + +- template: azure-install-rust.yml + +- bash: echo "##vso[task.setvariable variable=RUSTC_VERSION;]`rustc --version`" + displayName: Set rustc version string for caching + +- bash: cargo build --release + displayName: Cargo build + +# Test what we're about to release in release mode itself. +- bash: cargo test --release --all + displayName: Cargo test + env: + RUST_BACKTRACE: 1 + +- bash: | + echo "##vso[task.setvariable variable=tagName;]`echo $BUILD_SOURCEBRANCH | sed -e 's|refs/tags/||'`" + displayName: Set tag name + condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/') +- bash: | + echo "##vso[task.setvariable variable=tagName;]dev" + displayName: Set tag name to "dev" + condition: not(startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + +- bash: echo "##vso[task.setvariable variable=basename;]cranelift-$(tagName)-x86_64-windows" + displayName: Configure basename var + condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) +- bash: echo "##vso[task.setvariable variable=basename;]cranelift-$(tagName)-x86_64-macos" + displayName: Configure basename var + condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin')) +- bash: echo "##vso[task.setvariable variable=basename;]cranelift-$(tagName)-x86_64-linux" + displayName: Configure basename var + condition: and(succeeded(), eq( variables['Agent.OS'], 'Linux' )) + +- bash: | + set -e + mkdir -p $BUILD_BINARIESDIRECTORY/$BASENAME + if [ "$AGENT_OS" = "Windows_NT" ]; then + ext=.exe + fi + cp LICENSE README.md target/release/clif-util$ext $BUILD_BINARIESDIRECTORY/$BASENAME + displayName: Copy binaries + +- task: ArchiveFiles@2 + inputs: + rootFolderOrFile: $(Build.BinariesDirectory)/$(basename) + archiveType: 'zip' + archiveFile: '$(Build.ArtifactStagingDirectory)/$(basename).zip' + displayName: Archive files (Win) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) +- task: ArchiveFiles@2 + inputs: + rootFolderOrFile: $(Build.BinariesDirectory)/$(basename) + archiveType: 'tar' + tarCompression: 'xz' + archiveFile: '$(Build.ArtifactStagingDirectory)/$(basename).tar.xz' + displayName: Archive files (Unix) + condition: and(succeeded(), ne(variables['Agent.OS'], 'Windows_NT')) +- task: PublishPipelineArtifact@1 + inputs: + path: $(Build.ArtifactStagingDirectory)/ + artifactName: 'bundle-$(Agent.OS)' + diff --git a/cranelift/ci/azure-install-rust.yml b/cranelift/ci/azure-install-rust.yml new file mode 100644 index 0000000000..64e502b775 --- /dev/null +++ b/cranelift/ci/azure-install-rust.yml @@ -0,0 +1,33 @@ +steps: + # Rustup is currently installed on Windows and Linux, but not macOS. + # It is installed in /usr/local/cargo/bin/ or C:\Program Files\Rust\.cargo\bin\ + # This steps ensures that rustup is installed, mainly for macOS, or if the + # azure image changes in the future. + - bash: | + set -ex + if [ -x "`command -v rustup`" ]; then + echo `command -v rustup` `rustup -V` already installed + rustup self update + else + if [ "$AGENT_OS" = "Windows_NT" ]; then + curl -sSf -o rustup-init.exe https://win.rustup.rs + ./rustup-init.exe -y --default-toolchain $TOOLCHAIN + echo "##vso[task.prependpath]$USERPROFILE/.cargo/bin" + else + curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $TOOLCHAIN + echo "##vso[task.prependpath]$HOME/.cargo/bin" + fi + fi + displayName: Install rustup + + - bash: | + set -ex + rustup update $TOOLCHAIN + rustup default $TOOLCHAIN + displayName: Install rust + + - bash: | + set -ex + rustc -Vv + cargo -V + displayName: Query rust and cargo versions