bootloader 0.8.3

An experimental pure-Rust x86 bootloader.
Documentation
# Documentation: https://aka.ms/yaml

trigger:
  batch: true
  branches:
    include:
    # This is where pull requests from "bors r+" are built.
    - staging
    # This is where pull requests from "bors try" are built.
    - trying
    # Build pull requests.
    - master

strategy:
  matrix:
    linux:
      image_name: 'ubuntu-16.04'
      rustup_toolchain: nightly
    mac:
      image_name: 'macos-10.13'
      rustup_toolchain: nightly
    windows:
      image_name: 'vs2017-win2016'
      rustup_toolchain: nightly

pool:
  vmImage: $(image_name)

steps:
- bash: |
    echo "Hello world from $AGENT_NAME running on $AGENT_OS"
    echo "Reason: $BUILD_REASON"
    case "$BUILD_REASON" in
            "Manual") echo "$BUILD_REQUESTEDFOR manually queued the build." ;;
            "PullRequest") echo "This is a CI build for a pull request on $BUILD_REQUESTEDFOR." ;;
            "IndividualCI") echo "This is a CI build for $BUILD_REQUESTEDFOR." ;;
            "BatchedCI") echo "This is a batched CI build for $BUILD_REQUESTEDFOR." ;;
        *) "$BUILD_REASON" ;;
    esac
  displayName: 'Build Info'
  continueOnError: true

- script: |
    set -euxo pipefail
    curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $RUSTUP_TOOLCHAIN
    echo "##vso[task.setvariable variable=PATH;]$PATH:$HOME/.cargo/bin"
  condition: or(eq( variables['Agent.OS'], 'Linux' ),  eq( variables['Agent.OS'], 'Darwin' ))
  displayName: 'Install Rust (Linux/macOS)'

- script: curl -sSf -o rustup-init.exe https://win.rustup.rs && rustup-init.exe -y --default-toolchain %RUSTUP_TOOLCHAIN%
  condition: eq( variables['Agent.OS'], 'Windows_NT' )
  displayName: 'Install Rust (Windows)'

- script: |
    echo ##vso[task.setvariable variable=PATH;]%PATH%;%USERPROFILE%\.cargo\bin
  condition: eq( variables['Agent.OS'], 'Windows_NT' )
  displayName: 'Add ~/.cargo/bin to PATH (Windows)'

- script: |
    rustc -Vv
    cargo -V
  displayName: 'Print Rust Version'
  continueOnError: true

- script: rustup component add rust-src llvm-tools-preview
  displayName: 'Install Rustup Components'

- script: cargo install cargo-xbuild cargo-binutils --debug
  displayName: 'Install cargo-xbuild cargo-binutils'

- script: sudo apt update && sudo apt install qemu-system-x86
  condition: eq( variables['Agent.OS'], 'Linux' )
  displayName: 'Install QEMU (Linux)'

- script: |
    set -euxo pipefail
    export HOMEBREW_NO_AUTO_UPDATE=1
    export HOMEBREW_NO_BOTTLE_SOURCE_FALLBACK=1
    export HOMEBREW_NO_INSTALL_CLEANUP=1
    brew install qemu
  condition: eq( variables['Agent.OS'], 'Darwin' )
  displayName: 'Install QEMU (macOS)'

- script: |
    choco install qemu --limit-output --no-progress
    echo ##vso[task.setvariable variable=PATH;]%PATH%;C:\Program Files\qemu
    set PATH=%PATH%;C:\Program Files\qemu
    qemu-system-x86_64 --version
  condition: eq( variables['Agent.OS'], 'Windows_NT' )
  failOnStderr: true
  displayName: 'Install QEMU (Windows)'

- script: cargo xbuild
  workingDirectory: test-kernel
  displayName: 'Build Test Kernel'

- script: cargo xbuild --bin bootloader --features binary --release
  displayName: 'Build Bootloader'
  env:
    KERNEL: "test-kernel/target/x86_64-test-kernel/debug/test-kernel"
    KERNEL_MANIFEST: "test-kernel/Cargo.toml"

- script: cargo objcopy -- -I elf64-x86-64 -O binary --binary-architecture=i386:x86-64 target/x86_64-bootloader/release/bootloader target/x86_64-bootloader/release/bootloader.bin
  displayName: 'Convert Bootloader ELF to Binary'

- bash: |
    qemu-system-x86_64 -drive format=raw,file=target/x86_64-bootloader/release/bootloader.bin -device isa-debug-exit,iobase=0xf4,iosize=0x04 -display none
    if [ $? -eq 123 ]; then (exit 0); else (exit 1); fi
  displayName: 'Test Bootloader'

- script: cargo xbuild
  workingDirectory: example-kernel
  displayName: 'Build Example Kernel'

- script: rustup component add rustfmt
  displayName: 'Install Rustfmt'

- script: cargo fmt -- --check
  displayName: 'Check Formatting'