content: # Copyright (c) Microsoft Corporation.
  # Licensed under the MIT License.
  
  [alias]
  xflowey = "run -p flowey_hvlite -- pipeline run"
  xtask = "run -p xtask --profile light --"
  
  [env]
  # Use the packaged openssl libraries on musl targets.
  X86_64_UNDERHILL_LINUX_MUSL_OPENSSL_NO_VENDOR = "1"
  X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_NO_VENDOR = "1"
  AARCH64_UNDERHILL_LINUX_MUSL_OPENSSL_NO_VENDOR = "1"
  AARCH64_UNKNOWN_LINUX_MUSL_OPENSSL_NO_VENDOR = "1"
  
  # pkg-config-rs has all sorts of sharp edges, so just tell openssl-sys exactly
  # where to get openssl.
  X86_64_UNDERHILL_LINUX_MUSL_OPENSSL_DIR = { value = ".packages/extracted/x86_64-sysroot", relative = true }
  X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_DIR = { value = ".packages/extracted/x86_64-sysroot", relative = true }
  X86_64_UNDERHILL_LINUX_MUSL_OPENSSL_STATIC = "1"
  X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_STATIC = "1"
  AARCH64_UNDERHILL_LINUX_MUSL_OPENSSL_DIR = { value = ".packages/extracted/aarch64-sysroot", relative = true }
  AARCH64_UNKNOWN_LINUX_MUSL_OPENSSL_DIR = { value = ".packages/extracted/aarch64-sysroot", relative = true }
  AARCH64_UNDERHILL_LINUX_MUSL_OPENSSL_STATIC = "1"
  AARCH64_UNKNOWN_LINUX_MUSL_OPENSSL_STATIC = "1"
  
  # Tell cc-rs where the Underhill compilers are.
  CC_aarch64_underhill_linux_musl = { value = "build_support/underhill_cross/aarch64-underhill-musl-gcc", relative = true }
  CC_aarch64_unknown_linux_musl = { value = "build_support/underhill_cross/aarch64-underhill-musl-gcc", relative = true }
  CC_x86_64_underhill_linux_musl = { value = "build_support/underhill_cross/x86_64-underhill-musl-gcc", relative = true }
  CC_x86_64_unknown_linux_musl = { value = "build_support/underhill_cross/x86_64-underhill-musl-gcc", relative = true }
  
  # Use the packaged verison of protoc, symlinked by repo setup tooling
  PROTOC = { value = ".packages/Google.Protobuf.Tools/tools/protoc", relative = true }
  
  # Path to lxutil.dll
  X86_64_LXUTIL_DLL_DIR = { value = ".packages/Microsoft.WSL.LxUtil.amd64fre/build/native/bin", relative = true }
  AARCH64_LXUTIL_DLL_DIR = { value = ".packages/Microsoft.WSL.LxUtil.arm64fre/build/native/bin", relative = true }
  
  # Path to sysroot (used by build_support/underhill_cross)
  X86_64_SYSROOT = { value = ".packages/extracted/x86_64-sysroot", relative = true }
  AARCH64_SYSROOT = { value = ".packages/extracted/aarch64-sysroot", relative = true }
  
  # Streamline the OpenVMM `cargo run` experience by setting a sane-default for
  # what kernel and initrd to use when booting via Linux direct (i.e: use the
  # sample kernel packaged alongside openvmm-deps)
  X86_64_OPENVMM_LINUX_DIRECT_KERNEL = { value = ".packages/underhill-deps-private/x64/vmlinux", relative = true }
  X86_64_OPENVMM_LINUX_DIRECT_INITRD = { value = ".packages/underhill-deps-private/x64/initrd", relative = true }
  AARCH64_OPENVMM_LINUX_DIRECT_KERNEL = { value = ".packages/underhill-deps-private/aarch64/Image", relative = true }
  AARCH64_OPENVMM_LINUX_DIRECT_INITRD = { value = ".packages/underhill-deps-private/aarch64/initrd", relative = true }
  # Streamline the OpenVMM `cargo run` experience by setting a sane-default for
  # what UEFI firmware to use (i.e: use the Microsoft MSVM firmware)
  X86_64_OPENVMM_UEFI_FIRMWARE = { value = ".packages/hyperv.uefi.mscoreuefi.x64.RELEASE/MsvmX64/RELEASE_VS2022/FV/MSVM.fd", relative = true }
  AARCH64_OPENVMM_UEFI_FIRMWARE = { value = ".packages/hyperv.uefi.mscoreuefi.AARCH64.RELEASE/MsvmAARCH64/RELEASE_VS2022/FV/MSVM.fd", relative = true }
  
  [target.'cfg(all(windows, target_env = "msvc"))']
  rustflags = [
    # Set up delayloads.
    "-C", "link-args=dloadhelper.lib /delayload:ws2_32.dll /delayload:virtdisk.dll /delayload:user32.dll /delayload:winhvplatform.dll",
    # Set up the CRT: use ucrtbase.dll but statically link the VC runtime.
    "-C", "link-args=/nodefaultlib onecore_apiset.lib ucrt.lib libvcruntime.lib libcmt.lib",
    # Enable CFG
    "-Ccontrol-flow-guard"
  ]
  
  [target.aarch64-apple-darwin]
  # At least some of our macos binaries need to have entitlements for running
  # hypervisor code, so they must be signed.
  runner = "build_support/macos/sign_and_run.sh"
  
  # Use the internal gcc to invoke link so that we can use our spec file that
  # points to our version of musl.
  [target.x86_64-unknown-linux-musl]
  linker = "build_support/underhill_cross/x86_64-underhill-musl-gcc"
  [target.x86_64-underhill-linux-musl]
  linker = "build_support/underhill_cross/x86_64-underhill-musl-gcc"
  [target.aarch64-unknown-linux-musl]
  linker = "build_support/underhill_cross/aarch64-underhill-musl-gcc"
  [target.aarch64-underhill-linux-musl]
  linker = "build_support/underhill_cross/aarch64-underhill-musl-gcc"
  
  [target.'cfg(target_arch = "aarch64")']
  rustflags = [
    # This enables efficient atomics via LSE and SIMD via Neon.
    # The machines like DevKit and CC have these.
    "-Ctarget-feature=+lse,+neon",
  ]
  
  [target.'cfg(target_env = "musl")']
  rustflags = [
    # Use the musl from the sysroot, not from the Rust distribution.
    "-Clink-self-contained=n",
    # Force musl to be statically linked in
    "-Ctarget-feature=+crt-static",
    # Use RELR relocation format, which is considerably smaller.
    "-Clink-arg=-Wl,-z,pack-relative-relocs",
  ]
  
  [target.'cfg(all(target_arch = "aarch64", target_env = "musl"))']
  rustflags = [
    # Avoid swapping in and out the hefty SVE state on Underhill/arm64.
    # That is not enabled by default in the compiler at the moment, making
    # this explicit.
    "-Ctarget-feature=-sve,-sve2",
  ]
  
  # Specify a common set of rustflags for all targets.
  [target.'cfg(all())']
  rustflags = [
    # Disable FPO to get full call stack as the '--call-graph=dwarf' option
    # is not working well.
    "-Cforce-frame-pointers=yes",
  
    # Enable v0 symbols to get better output from `perf` and related tools.
    "-Csymbol-mangling-version=v0",
  
    # Treat warnings as errors in CI.
  ### ENABLE_IN_CI "-Dwarnings",
  ]
  
  # Specify a common set of rustdocflags for all targets.
  [build]
  rustdocflags = [
    # Treat warnings as errors in CI.
  ### ENABLE_IN_CI "-Dwarnings",
  ]
  