// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto3";

package fint;

option go_package = "go.fuchsia.dev/fuchsia/tools/integration/fint/proto";

// Context contains all of the dynamic configuration values for building
// Fuchsia. These values are context-dependent in that they vary based on git
// history and local filesystem layout, so they can only be known at runtime and
// cannot come from data checked into version control.
message Context {
  // Absolute path to the root of the Fuchsia checkout.
  string checkout_dir = 1;

  // Absolute path to the build output directory.
  string build_dir = 2;

  // Absolute path to a directory where build artifacts intended to be
  // exposed to the caller should be written.
  string artifact_dir = 3;

  message ChangedFile {
    // Relative path to the file within the checkout.
    string path = 1;
  }

  // Files changed in the commit being tested.
  repeated ChangedFile changed_files = 4;

  // Passed through to the `sdk_id` gn arg.
  string sdk_id = 5;

  // Cache directory that's persisted between builds.
  string cache_dir = 6;

  // Passed through to the `build_info_version` gn arg.
  string release_version = 7;

  // Paths to directories that contain alternate versions of these toolchains.
  // For each one, if set, we'll use the toolchain version at the specified path
  // instead of the version included in the checkout.
  string clang_toolchain_dir = 8;
  string gcc_toolchain_dir = 9;
  string rust_toolchain_dir = 10;
}
