// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/sysroot.proto

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Sysroot information.
type Sysroot struct {
	// Sysroot location.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The build target used to create the sysroot.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *Sysroot) Reset()         { *m = Sysroot{} }
func (m *Sysroot) String() string { return proto.CompactTextString(m) }
func (*Sysroot) ProtoMessage()    {}
func (*Sysroot) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{0}
}

func (m *Sysroot) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Sysroot.Unmarshal(m, b)
}
func (m *Sysroot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Sysroot.Marshal(b, m, deterministic)
}
func (m *Sysroot) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Sysroot.Merge(m, src)
}
func (m *Sysroot) XXX_Size() int {
	return xxx_messageInfo_Sysroot.Size(m)
}
func (m *Sysroot) XXX_DiscardUnknown() {
	xxx_messageInfo_Sysroot.DiscardUnknown(m)
}

var xxx_messageInfo_Sysroot proto.InternalMessageInfo

func (m *Sysroot) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *Sysroot) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

// Information about the sysroot's profile.
// TODO(crbug/1088059): Finish migrating this to chromiumos.Profile.
type Profile struct {
	// The name of the profile.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Profile) Reset()         { *m = Profile{} }
func (m *Profile) String() string { return proto.CompactTextString(m) }
func (*Profile) ProtoMessage()    {}
func (*Profile) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{1}
}

func (m *Profile) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Profile.Unmarshal(m, b)
}
func (m *Profile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Profile.Marshal(b, m, deterministic)
}
func (m *Profile) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Profile.Merge(m, src)
}
func (m *Profile) XXX_Size() int {
	return xxx_messageInfo_Profile.Size(m)
}
func (m *Profile) XXX_DiscardUnknown() {
	xxx_messageInfo_Profile.DiscardUnknown(m)
}

var xxx_messageInfo_Profile proto.InternalMessageInfo

func (m *Profile) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Sysroot create request.
type SysrootCreateRequest struct {
	// The target whose sysroot is being created.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The sysroot create flags.
	Flags *SysrootCreateRequest_Flags `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"`
	// The profile to select for the sysroot.
	Profile *Profile `protobuf:"bytes,3,opt,name=profile,proto3" json:"profile,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,4,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Package index files available for use.
	PackageIndexes       []*chromiumos.PackageIndexInfo `protobuf:"bytes,5,rep,name=package_indexes,json=packageIndexes,proto3" json:"package_indexes,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

func (m *SysrootCreateRequest) Reset()         { *m = SysrootCreateRequest{} }
func (m *SysrootCreateRequest) String() string { return proto.CompactTextString(m) }
func (*SysrootCreateRequest) ProtoMessage()    {}
func (*SysrootCreateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{2}
}

func (m *SysrootCreateRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SysrootCreateRequest.Unmarshal(m, b)
}
func (m *SysrootCreateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SysrootCreateRequest.Marshal(b, m, deterministic)
}
func (m *SysrootCreateRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SysrootCreateRequest.Merge(m, src)
}
func (m *SysrootCreateRequest) XXX_Size() int {
	return xxx_messageInfo_SysrootCreateRequest.Size(m)
}
func (m *SysrootCreateRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_SysrootCreateRequest.DiscardUnknown(m)
}

var xxx_messageInfo_SysrootCreateRequest proto.InternalMessageInfo

func (m *SysrootCreateRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *SysrootCreateRequest) GetFlags() *SysrootCreateRequest_Flags {
	if m != nil {
		return m.Flags
	}
	return nil
}

func (m *SysrootCreateRequest) GetProfile() *Profile {
	if m != nil {
		return m.Profile
	}
	return nil
}

func (m *SysrootCreateRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *SysrootCreateRequest) GetPackageIndexes() []*chromiumos.PackageIndexInfo {
	if m != nil {
		return m.PackageIndexes
	}
	return nil
}

// The Create flags.
type SysrootCreateRequest_Flags struct {
	// Triggers an update of the chroot unless the it is declared as current.
	ChrootCurrent bool `protobuf:"varint,1,opt,name=chroot_current,json=chrootCurrent,proto3" json:"chroot_current,omitempty"`
	// Replace the existing sysroot when one already exists when set to true,
	// otherwise keep the existing sysroot. No effect when the sysroot does not
	// exist.
	Replace bool `protobuf:"varint,2,opt,name=replace,proto3" json:"replace,omitempty"`
	// Whether a toolchain change has occurred.
	ToolchainChanged     bool     `protobuf:"varint,3,opt,name=toolchain_changed,json=toolchainChanged,proto3" json:"toolchain_changed,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SysrootCreateRequest_Flags) Reset()         { *m = SysrootCreateRequest_Flags{} }
func (m *SysrootCreateRequest_Flags) String() string { return proto.CompactTextString(m) }
func (*SysrootCreateRequest_Flags) ProtoMessage()    {}
func (*SysrootCreateRequest_Flags) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{2, 0}
}

func (m *SysrootCreateRequest_Flags) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SysrootCreateRequest_Flags.Unmarshal(m, b)
}
func (m *SysrootCreateRequest_Flags) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SysrootCreateRequest_Flags.Marshal(b, m, deterministic)
}
func (m *SysrootCreateRequest_Flags) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SysrootCreateRequest_Flags.Merge(m, src)
}
func (m *SysrootCreateRequest_Flags) XXX_Size() int {
	return xxx_messageInfo_SysrootCreateRequest_Flags.Size(m)
}
func (m *SysrootCreateRequest_Flags) XXX_DiscardUnknown() {
	xxx_messageInfo_SysrootCreateRequest_Flags.DiscardUnknown(m)
}

var xxx_messageInfo_SysrootCreateRequest_Flags proto.InternalMessageInfo

func (m *SysrootCreateRequest_Flags) GetChrootCurrent() bool {
	if m != nil {
		return m.ChrootCurrent
	}
	return false
}

func (m *SysrootCreateRequest_Flags) GetReplace() bool {
	if m != nil {
		return m.Replace
	}
	return false
}

func (m *SysrootCreateRequest_Flags) GetToolchainChanged() bool {
	if m != nil {
		return m.ToolchainChanged
	}
	return false
}

// Create response.
type SysrootCreateResponse struct {
	// Information about the created sysroot. This sysroot can be passed directly
	// to the InstallToolchainRequest.
	Sysroot              *Sysroot `protobuf:"bytes,1,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SysrootCreateResponse) Reset()         { *m = SysrootCreateResponse{} }
func (m *SysrootCreateResponse) String() string { return proto.CompactTextString(m) }
func (*SysrootCreateResponse) ProtoMessage()    {}
func (*SysrootCreateResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{3}
}

func (m *SysrootCreateResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SysrootCreateResponse.Unmarshal(m, b)
}
func (m *SysrootCreateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SysrootCreateResponse.Marshal(b, m, deterministic)
}
func (m *SysrootCreateResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SysrootCreateResponse.Merge(m, src)
}
func (m *SysrootCreateResponse) XXX_Size() int {
	return xxx_messageInfo_SysrootCreateResponse.Size(m)
}
func (m *SysrootCreateResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_SysrootCreateResponse.DiscardUnknown(m)
}

var xxx_messageInfo_SysrootCreateResponse proto.InternalMessageInfo

func (m *SysrootCreateResponse) GetSysroot() *Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

// Sysroot generate archive request.
type SysrootGenerateArchiveRequest struct {
	// The target whose sysroot is being created.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Packages to generate the sysroot for, such as 'virtual/target-fuzzers'.
	// This is passed in based on the informaitonal builder type, see
	// chromite/config/chromeos_config.py for examples.
	Packages []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	// Target directory for the sysroot tarball.
	TargetDir            *chromiumos.ResultPath `protobuf:"bytes,4,opt,name=target_dir,json=targetDir,proto3" json:"target_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *SysrootGenerateArchiveRequest) Reset()         { *m = SysrootGenerateArchiveRequest{} }
func (m *SysrootGenerateArchiveRequest) String() string { return proto.CompactTextString(m) }
func (*SysrootGenerateArchiveRequest) ProtoMessage()    {}
func (*SysrootGenerateArchiveRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{4}
}

func (m *SysrootGenerateArchiveRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SysrootGenerateArchiveRequest.Unmarshal(m, b)
}
func (m *SysrootGenerateArchiveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SysrootGenerateArchiveRequest.Marshal(b, m, deterministic)
}
func (m *SysrootGenerateArchiveRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SysrootGenerateArchiveRequest.Merge(m, src)
}
func (m *SysrootGenerateArchiveRequest) XXX_Size() int {
	return xxx_messageInfo_SysrootGenerateArchiveRequest.Size(m)
}
func (m *SysrootGenerateArchiveRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_SysrootGenerateArchiveRequest.DiscardUnknown(m)
}

var xxx_messageInfo_SysrootGenerateArchiveRequest proto.InternalMessageInfo

func (m *SysrootGenerateArchiveRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *SysrootGenerateArchiveRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *SysrootGenerateArchiveRequest) GetPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

func (m *SysrootGenerateArchiveRequest) GetTargetDir() *chromiumos.ResultPath {
	if m != nil {
		return m.TargetDir
	}
	return nil
}

// Generate archive response.
type SysrootGenerateArchiveResponse struct {
	// Path where the sysroot tarball is written.
	SysrootArchive       *chromiumos.Path `protobuf:"bytes,1,opt,name=sysroot_archive,json=sysrootArchive,proto3" json:"sysroot_archive,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *SysrootGenerateArchiveResponse) Reset()         { *m = SysrootGenerateArchiveResponse{} }
func (m *SysrootGenerateArchiveResponse) String() string { return proto.CompactTextString(m) }
func (*SysrootGenerateArchiveResponse) ProtoMessage()    {}
func (*SysrootGenerateArchiveResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{5}
}

func (m *SysrootGenerateArchiveResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SysrootGenerateArchiveResponse.Unmarshal(m, b)
}
func (m *SysrootGenerateArchiveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SysrootGenerateArchiveResponse.Marshal(b, m, deterministic)
}
func (m *SysrootGenerateArchiveResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SysrootGenerateArchiveResponse.Merge(m, src)
}
func (m *SysrootGenerateArchiveResponse) XXX_Size() int {
	return xxx_messageInfo_SysrootGenerateArchiveResponse.Size(m)
}
func (m *SysrootGenerateArchiveResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_SysrootGenerateArchiveResponse.DiscardUnknown(m)
}

var xxx_messageInfo_SysrootGenerateArchiveResponse proto.InternalMessageInfo

func (m *SysrootGenerateArchiveResponse) GetSysrootArchive() *chromiumos.Path {
	if m != nil {
		return m.SysrootArchive
	}
	return nil
}

// Request to install the toolchain into the sysroot.
type InstallToolchainRequest struct {
	// The sysroot where the toolchain is being installed.
	// The path and build_target are required.
	Sysroot *Sysroot `protobuf:"bytes,1,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// The flags for the install.
	Flags *InstallToolchainRequest_Flags `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,3,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *InstallToolchainRequest) Reset()         { *m = InstallToolchainRequest{} }
func (m *InstallToolchainRequest) String() string { return proto.CompactTextString(m) }
func (*InstallToolchainRequest) ProtoMessage()    {}
func (*InstallToolchainRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{6}
}

func (m *InstallToolchainRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InstallToolchainRequest.Unmarshal(m, b)
}
func (m *InstallToolchainRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InstallToolchainRequest.Marshal(b, m, deterministic)
}
func (m *InstallToolchainRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InstallToolchainRequest.Merge(m, src)
}
func (m *InstallToolchainRequest) XXX_Size() int {
	return xxx_messageInfo_InstallToolchainRequest.Size(m)
}
func (m *InstallToolchainRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_InstallToolchainRequest.DiscardUnknown(m)
}

var xxx_messageInfo_InstallToolchainRequest proto.InternalMessageInfo

func (m *InstallToolchainRequest) GetSysroot() *Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *InstallToolchainRequest) GetFlags() *InstallToolchainRequest_Flags {
	if m != nil {
		return m.Flags
	}
	return nil
}

func (m *InstallToolchainRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

// The install toolchain flags.
type InstallToolchainRequest_Flags struct {
	// Compile from source (true), or use bin packages (false).
	CompileSource bool `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	// Whether a toolchain change has occurred.
	ToolchainChanged     bool     `protobuf:"varint,2,opt,name=toolchain_changed,json=toolchainChanged,proto3" json:"toolchain_changed,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InstallToolchainRequest_Flags) Reset()         { *m = InstallToolchainRequest_Flags{} }
func (m *InstallToolchainRequest_Flags) String() string { return proto.CompactTextString(m) }
func (*InstallToolchainRequest_Flags) ProtoMessage()    {}
func (*InstallToolchainRequest_Flags) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{6, 0}
}

func (m *InstallToolchainRequest_Flags) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InstallToolchainRequest_Flags.Unmarshal(m, b)
}
func (m *InstallToolchainRequest_Flags) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InstallToolchainRequest_Flags.Marshal(b, m, deterministic)
}
func (m *InstallToolchainRequest_Flags) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InstallToolchainRequest_Flags.Merge(m, src)
}
func (m *InstallToolchainRequest_Flags) XXX_Size() int {
	return xxx_messageInfo_InstallToolchainRequest_Flags.Size(m)
}
func (m *InstallToolchainRequest_Flags) XXX_DiscardUnknown() {
	xxx_messageInfo_InstallToolchainRequest_Flags.DiscardUnknown(m)
}

var xxx_messageInfo_InstallToolchainRequest_Flags proto.InternalMessageInfo

func (m *InstallToolchainRequest_Flags) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

func (m *InstallToolchainRequest_Flags) GetToolchainChanged() bool {
	if m != nil {
		return m.ToolchainChanged
	}
	return false
}

type InstallToolchainResponse struct {
	// The packages that failed to install. Will populate at least the category
	// and package fields for any failed packages.
	FailedPackages       []*chromiumos.PackageInfo `protobuf:"bytes,1,rep,name=failed_packages,json=failedPackages,proto3" json:"failed_packages,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *InstallToolchainResponse) Reset()         { *m = InstallToolchainResponse{} }
func (m *InstallToolchainResponse) String() string { return proto.CompactTextString(m) }
func (*InstallToolchainResponse) ProtoMessage()    {}
func (*InstallToolchainResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{7}
}

func (m *InstallToolchainResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InstallToolchainResponse.Unmarshal(m, b)
}
func (m *InstallToolchainResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InstallToolchainResponse.Marshal(b, m, deterministic)
}
func (m *InstallToolchainResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InstallToolchainResponse.Merge(m, src)
}
func (m *InstallToolchainResponse) XXX_Size() int {
	return xxx_messageInfo_InstallToolchainResponse.Size(m)
}
func (m *InstallToolchainResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_InstallToolchainResponse.DiscardUnknown(m)
}

var xxx_messageInfo_InstallToolchainResponse proto.InternalMessageInfo

func (m *InstallToolchainResponse) GetFailedPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.FailedPackages
	}
	return nil
}

type InstallPackagesRequest struct {
	// The sysroot into which the packages are being installed.
	// The path and build target are required.
	Sysroot *Sysroot `protobuf:"bytes,1,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// The install packages flags.
	Flags *InstallPackagesRequest_Flags `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"`
	// A list of specific packages to install. Will generate the list of packages
	// for the build target if none are specified.
	Packages []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,4,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// USE flags to set before building the packages.
	UseFlags []*chromiumos.UseFlag `protobuf:"bytes,5,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	// Goma Config.
	GomaConfig           *chromiumos.GomaConfig `protobuf:"bytes,6,opt,name=goma_config,json=gomaConfig,proto3" json:"goma_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *InstallPackagesRequest) Reset()         { *m = InstallPackagesRequest{} }
func (m *InstallPackagesRequest) String() string { return proto.CompactTextString(m) }
func (*InstallPackagesRequest) ProtoMessage()    {}
func (*InstallPackagesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{8}
}

func (m *InstallPackagesRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InstallPackagesRequest.Unmarshal(m, b)
}
func (m *InstallPackagesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InstallPackagesRequest.Marshal(b, m, deterministic)
}
func (m *InstallPackagesRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InstallPackagesRequest.Merge(m, src)
}
func (m *InstallPackagesRequest) XXX_Size() int {
	return xxx_messageInfo_InstallPackagesRequest.Size(m)
}
func (m *InstallPackagesRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_InstallPackagesRequest.DiscardUnknown(m)
}

var xxx_messageInfo_InstallPackagesRequest proto.InternalMessageInfo

func (m *InstallPackagesRequest) GetSysroot() *Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *InstallPackagesRequest) GetFlags() *InstallPackagesRequest_Flags {
	if m != nil {
		return m.Flags
	}
	return nil
}

func (m *InstallPackagesRequest) GetPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

func (m *InstallPackagesRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *InstallPackagesRequest) GetUseFlags() []*chromiumos.UseFlag {
	if m != nil {
		return m.UseFlags
	}
	return nil
}

func (m *InstallPackagesRequest) GetGomaConfig() *chromiumos.GomaConfig {
	if m != nil {
		return m.GomaConfig
	}
	return nil
}

type InstallPackagesRequest_Flags struct {
	// Compile from source (true), or use bin packages (false).
	CompileSource bool `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	// Whether to start goma.
	UseGoma bool `protobuf:"varint,3,opt,name=use_goma,json=useGoma,proto3" json:"use_goma,omitempty"`
	// Whether a toolchain change has occurred.
	ToolchainChanged     bool     `protobuf:"varint,4,opt,name=toolchain_changed,json=toolchainChanged,proto3" json:"toolchain_changed,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InstallPackagesRequest_Flags) Reset()         { *m = InstallPackagesRequest_Flags{} }
func (m *InstallPackagesRequest_Flags) String() string { return proto.CompactTextString(m) }
func (*InstallPackagesRequest_Flags) ProtoMessage()    {}
func (*InstallPackagesRequest_Flags) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{8, 0}
}

func (m *InstallPackagesRequest_Flags) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InstallPackagesRequest_Flags.Unmarshal(m, b)
}
func (m *InstallPackagesRequest_Flags) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InstallPackagesRequest_Flags.Marshal(b, m, deterministic)
}
func (m *InstallPackagesRequest_Flags) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InstallPackagesRequest_Flags.Merge(m, src)
}
func (m *InstallPackagesRequest_Flags) XXX_Size() int {
	return xxx_messageInfo_InstallPackagesRequest_Flags.Size(m)
}
func (m *InstallPackagesRequest_Flags) XXX_DiscardUnknown() {
	xxx_messageInfo_InstallPackagesRequest_Flags.DiscardUnknown(m)
}

var xxx_messageInfo_InstallPackagesRequest_Flags proto.InternalMessageInfo

func (m *InstallPackagesRequest_Flags) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

func (m *InstallPackagesRequest_Flags) GetUseGoma() bool {
	if m != nil {
		return m.UseGoma
	}
	return false
}

func (m *InstallPackagesRequest_Flags) GetToolchainChanged() bool {
	if m != nil {
		return m.ToolchainChanged
	}
	return false
}

type InstallPackagesResponse struct {
	// The packages that failed to install. Will populate at least the category
	// and package fields for any failed packages.
	FailedPackages []*chromiumos.PackageInfo `protobuf:"bytes,1,rep,name=failed_packages,json=failedPackages,proto3" json:"failed_packages,omitempty"`
	// The metric events that occurred during the running of InstallPackages.
	Events []*chromiumos.MetricEvent `protobuf:"bytes,2,rep,name=events,proto3" json:"events,omitempty"`
	// Goma artifacts will only be populated if
	// InstallPackagesRequest.goma_config.log_dir was not empty.
	GomaArtifacts        *chromiumos.GomaArtifacts `protobuf:"bytes,3,opt,name=goma_artifacts,json=gomaArtifacts,proto3" json:"goma_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *InstallPackagesResponse) Reset()         { *m = InstallPackagesResponse{} }
func (m *InstallPackagesResponse) String() string { return proto.CompactTextString(m) }
func (*InstallPackagesResponse) ProtoMessage()    {}
func (*InstallPackagesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{9}
}

func (m *InstallPackagesResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InstallPackagesResponse.Unmarshal(m, b)
}
func (m *InstallPackagesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InstallPackagesResponse.Marshal(b, m, deterministic)
}
func (m *InstallPackagesResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InstallPackagesResponse.Merge(m, src)
}
func (m *InstallPackagesResponse) XXX_Size() int {
	return xxx_messageInfo_InstallPackagesResponse.Size(m)
}
func (m *InstallPackagesResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_InstallPackagesResponse.DiscardUnknown(m)
}

var xxx_messageInfo_InstallPackagesResponse proto.InternalMessageInfo

func (m *InstallPackagesResponse) GetFailedPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.FailedPackages
	}
	return nil
}

func (m *InstallPackagesResponse) GetEvents() []*chromiumos.MetricEvent {
	if m != nil {
		return m.Events
	}
	return nil
}

func (m *InstallPackagesResponse) GetGomaArtifacts() *chromiumos.GomaArtifacts {
	if m != nil {
		return m.GomaArtifacts
	}
	return nil
}

type CreateSimpleChromeSysrootRequest struct {
	// The board that is the build_target for the created sysroot.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Additional environment flags which are set via the ENV VAR 'USE'.
	UseFlags []string `protobuf:"bytes,2,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	// Target directory for the sysroot tarball.
	TargetDir            *chromiumos.ResultPath `protobuf:"bytes,3,opt,name=target_dir,json=targetDir,proto3" json:"target_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *CreateSimpleChromeSysrootRequest) Reset()         { *m = CreateSimpleChromeSysrootRequest{} }
func (m *CreateSimpleChromeSysrootRequest) String() string { return proto.CompactTextString(m) }
func (*CreateSimpleChromeSysrootRequest) ProtoMessage()    {}
func (*CreateSimpleChromeSysrootRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{10}
}

func (m *CreateSimpleChromeSysrootRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateSimpleChromeSysrootRequest.Unmarshal(m, b)
}
func (m *CreateSimpleChromeSysrootRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateSimpleChromeSysrootRequest.Marshal(b, m, deterministic)
}
func (m *CreateSimpleChromeSysrootRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateSimpleChromeSysrootRequest.Merge(m, src)
}
func (m *CreateSimpleChromeSysrootRequest) XXX_Size() int {
	return xxx_messageInfo_CreateSimpleChromeSysrootRequest.Size(m)
}
func (m *CreateSimpleChromeSysrootRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateSimpleChromeSysrootRequest.DiscardUnknown(m)
}

var xxx_messageInfo_CreateSimpleChromeSysrootRequest proto.InternalMessageInfo

func (m *CreateSimpleChromeSysrootRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *CreateSimpleChromeSysrootRequest) GetUseFlags() []string {
	if m != nil {
		return m.UseFlags
	}
	return nil
}

func (m *CreateSimpleChromeSysrootRequest) GetTargetDir() *chromiumos.ResultPath {
	if m != nil {
		return m.TargetDir
	}
	return nil
}

type CreateSimpleChromeSysrootResponse struct {
	// Path where the sysroot tarball is written.
	SysrootArchive       *chromiumos.Path `protobuf:"bytes,1,opt,name=sysroot_archive,json=sysrootArchive,proto3" json:"sysroot_archive,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *CreateSimpleChromeSysrootResponse) Reset()         { *m = CreateSimpleChromeSysrootResponse{} }
func (m *CreateSimpleChromeSysrootResponse) String() string { return proto.CompactTextString(m) }
func (*CreateSimpleChromeSysrootResponse) ProtoMessage()    {}
func (*CreateSimpleChromeSysrootResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{11}
}

func (m *CreateSimpleChromeSysrootResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateSimpleChromeSysrootResponse.Unmarshal(m, b)
}
func (m *CreateSimpleChromeSysrootResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateSimpleChromeSysrootResponse.Marshal(b, m, deterministic)
}
func (m *CreateSimpleChromeSysrootResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateSimpleChromeSysrootResponse.Merge(m, src)
}
func (m *CreateSimpleChromeSysrootResponse) XXX_Size() int {
	return xxx_messageInfo_CreateSimpleChromeSysrootResponse.Size(m)
}
func (m *CreateSimpleChromeSysrootResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateSimpleChromeSysrootResponse.DiscardUnknown(m)
}

var xxx_messageInfo_CreateSimpleChromeSysrootResponse proto.InternalMessageInfo

func (m *CreateSimpleChromeSysrootResponse) GetSysrootArchive() *chromiumos.Path {
	if m != nil {
		return m.SysrootArchive
	}
	return nil
}

func init() {
	proto.RegisterType((*Sysroot)(nil), "chromite.api.Sysroot")
	proto.RegisterType((*Profile)(nil), "chromite.api.Profile")
	proto.RegisterType((*SysrootCreateRequest)(nil), "chromite.api.SysrootCreateRequest")
	proto.RegisterType((*SysrootCreateRequest_Flags)(nil), "chromite.api.SysrootCreateRequest.Flags")
	proto.RegisterType((*SysrootCreateResponse)(nil), "chromite.api.SysrootCreateResponse")
	proto.RegisterType((*SysrootGenerateArchiveRequest)(nil), "chromite.api.SysrootGenerateArchiveRequest")
	proto.RegisterType((*SysrootGenerateArchiveResponse)(nil), "chromite.api.SysrootGenerateArchiveResponse")
	proto.RegisterType((*InstallToolchainRequest)(nil), "chromite.api.InstallToolchainRequest")
	proto.RegisterType((*InstallToolchainRequest_Flags)(nil), "chromite.api.InstallToolchainRequest.Flags")
	proto.RegisterType((*InstallToolchainResponse)(nil), "chromite.api.InstallToolchainResponse")
	proto.RegisterType((*InstallPackagesRequest)(nil), "chromite.api.InstallPackagesRequest")
	proto.RegisterType((*InstallPackagesRequest_Flags)(nil), "chromite.api.InstallPackagesRequest.Flags")
	proto.RegisterType((*InstallPackagesResponse)(nil), "chromite.api.InstallPackagesResponse")
	proto.RegisterType((*CreateSimpleChromeSysrootRequest)(nil), "chromite.api.CreateSimpleChromeSysrootRequest")
	proto.RegisterType((*CreateSimpleChromeSysrootResponse)(nil), "chromite.api.CreateSimpleChromeSysrootResponse")
}

func init() { proto.RegisterFile("chromite/api/sysroot.proto", fileDescriptor_f8efa85b3e33e938) }

var fileDescriptor_f8efa85b3e33e938 = []byte{
	// 944 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xdf, 0x6e, 0xe3, 0xc4,
	0x17, 0x56, 0xfe, 0x34, 0x49, 0x4f, 0x76, 0x93, 0xfc, 0xe6, 0x47, 0xb7, 0xae, 0xd9, 0x45, 0xc5,
	0x50, 0x54, 0x6d, 0x51, 0x8c, 0xba, 0xe2, 0xef, 0x05, 0x6a, 0x37, 0x2c, 0x4b, 0x91, 0x90, 0xca,
	0x74, 0xb9, 0x80, 0x45, 0x6b, 0x4d, 0x9d, 0x89, 0x33, 0xc2, 0xf6, 0x98, 0x99, 0x71, 0x05, 0xd2,
	0x3e, 0x07, 0x2f, 0xc0, 0x35, 0x37, 0x3c, 0x02, 0x0f, 0xc0, 0x1d, 0x8f, 0xc1, 0x15, 0x2f, 0x80,
	0xec, 0x19, 0x27, 0x76, 0x9a, 0x36, 0xe9, 0xd2, 0xbb, 0xf1, 0x39, 0xdf, 0x9c, 0x73, 0xe6, 0x3b,
	0xdf, 0x1c, 0x0f, 0xd8, 0xfe, 0x54, 0xf0, 0x88, 0x29, 0xea, 0x92, 0x84, 0xb9, 0xf2, 0x67, 0x29,
	0x38, 0x57, 0xc3, 0x44, 0x70, 0xc5, 0xd1, 0x9d, 0xc2, 0x37, 0x24, 0x09, 0xb3, 0xef, 0x57, 0x90,
	0xe7, 0x29, 0x0b, 0xc7, 0x1e, 0x49, 0x98, 0xc6, 0xda, 0xdb, 0xda, 0x9b, 0x46, 0x5c, 0xba, 0x3e,
	0x8f, 0x22, 0x1e, 0x1b, 0x87, 0x55, 0x72, 0x44, 0x54, 0x09, 0xe6, 0x4b, 0xed, 0x71, 0xbe, 0x85,
	0xf6, 0x99, 0xce, 0x87, 0x10, 0x34, 0x13, 0xa2, 0xa6, 0x56, 0x6d, 0xb7, 0xb6, 0xbf, 0x89, 0xf3,
	0x35, 0xfa, 0x04, 0xee, 0xe8, 0x24, 0x8a, 0x88, 0x80, 0x2a, 0xab, 0xbe, 0x5b, 0xdb, 0xef, 0x1e,
	0x6e, 0x0f, 0xe7, 0xf1, 0x86, 0x8f, 0x33, 0xff, 0xb3, 0xdc, 0x8d, 0xbb, 0xe7, 0xf3, 0x0f, 0xe7,
	0x01, 0xb4, 0x4f, 0x05, 0x9f, 0xb0, 0x90, 0x66, 0xa1, 0x63, 0x12, 0xd1, 0x22, 0x74, 0xb6, 0x76,
	0x7e, 0x6b, 0xc0, 0x6b, 0x26, 0xf5, 0x48, 0x50, 0xa2, 0x28, 0xa6, 0x3f, 0xa6, 0x54, 0xaa, 0x4b,
	0x39, 0x6b, 0xeb, 0xe7, 0x44, 0x9f, 0xc2, 0xc6, 0x24, 0x24, 0x81, 0x34, 0x85, 0xee, 0x0f, 0xcb,
	0xec, 0x0d, 0x97, 0xa5, 0x1b, 0x7e, 0x9e, 0xe1, 0xb1, 0xde, 0x86, 0x5c, 0x68, 0x27, 0xba, 0x66,
	0xab, 0x91, 0x47, 0xd8, 0xaa, 0x46, 0x30, 0x07, 0xc2, 0x05, 0x0a, 0x3d, 0x84, 0x56, 0x06, 0xe0,
	0xca, 0x6a, 0xe6, 0x78, 0x54, 0x2e, 0x73, 0x94, 0x7b, 0xb0, 0x41, 0xa0, 0x27, 0xd0, 0x4f, 0x88,
	0xff, 0x03, 0x09, 0xa8, 0xc7, 0xe2, 0x31, 0xfd, 0x89, 0x4a, 0x6b, 0x63, 0xb7, 0xb1, 0xdf, 0x3d,
	0xbc, 0x5f, 0xde, 0x74, 0xaa, 0x21, 0x27, 0x19, 0xe2, 0x24, 0x9e, 0x70, 0xdc, 0x4b, 0x4a, 0x16,
	0x2a, 0xed, 0x14, 0x36, 0xf2, 0x9a, 0xd1, 0x1e, 0xf4, 0x74, 0x64, 0xcf, 0x4f, 0x85, 0xa0, 0xb1,
	0xa6, 0xaa, 0x83, 0xef, 0x6a, 0xeb, 0x48, 0x1b, 0x91, 0x05, 0x6d, 0x41, 0x93, 0x90, 0xf8, 0x34,
	0x67, 0xa5, 0x83, 0x8b, 0x4f, 0x74, 0x00, 0xff, 0x53, 0x9c, 0x87, 0xfe, 0x94, 0xb0, 0xd8, 0xf3,
	0xa7, 0x24, 0x0e, 0xe8, 0x38, 0x3f, 0x77, 0x07, 0x0f, 0x66, 0x8e, 0x91, 0xb6, 0x3b, 0x5f, 0xc0,
	0xd6, 0x02, 0x7f, 0x32, 0xe1, 0xb1, 0xa4, 0x19, 0x67, 0x46, 0xb2, 0xa6, 0x55, 0x5b, 0x4b, 0x59,
	0xc7, 0x05, 0xca, 0xf9, 0xa7, 0x06, 0x0f, 0x8c, 0xf1, 0x29, 0x8d, 0xa9, 0x20, 0x8a, 0x1e, 0x0b,
	0x7f, 0xca, 0x2e, 0x6e, 0x45, 0x02, 0xf3, 0x8e, 0xd4, 0x57, 0x76, 0xe4, 0x11, 0x74, 0x0c, 0xb9,
	0xd2, 0x6a, 0xe4, 0xad, 0xd8, 0x5e, 0xda, 0x8a, 0x09, 0xc7, 0x33, 0x20, 0x7a, 0x1f, 0x40, 0x97,
	0xe5, 0x8d, 0x99, 0x30, 0x6d, 0xbf, 0x57, 0xde, 0x86, 0xa9, 0x4c, 0x43, 0x75, 0x4a, 0xd4, 0x14,
	0x6f, 0x6a, 0xe4, 0x67, 0x4c, 0x38, 0xcf, 0xe1, 0x8d, 0xab, 0x0e, 0x6d, 0x88, 0xfc, 0x18, 0xfa,
	0x86, 0x22, 0x8f, 0x68, 0x97, 0x39, 0xf8, 0xa0, 0x5a, 0x94, 0x9a, 0xe2, 0x9e, 0x01, 0x9a, 0x10,
	0xce, 0x2f, 0x75, 0xd8, 0x3e, 0x89, 0xa5, 0x22, 0x61, 0xf8, 0xac, 0x68, 0x5c, 0x41, 0xe6, 0x4d,
	0xfb, 0x83, 0x8e, 0xab, 0x97, 0xe8, 0xa0, 0x0a, 0xbf, 0x22, 0x4d, 0xf5, 0x1e, 0xcd, 0x9b, 0xd0,
	0x58, 0xd5, 0x04, 0xfb, 0x79, 0x59, 0xcf, 0x3c, 0x4a, 0x58, 0x48, 0x3d, 0xc9, 0x53, 0xe1, 0xd3,
	0x99, 0x9e, 0xb5, 0xf5, 0x2c, 0x37, 0x2e, 0x57, 0x6d, 0xfd, 0x0a, 0xd5, 0x7e, 0x0f, 0xd6, 0xe5,
	0x82, 0x0d, 0xdf, 0x47, 0xd0, 0x9f, 0x10, 0x16, 0xd2, 0xb1, 0x37, 0x13, 0x41, 0xed, 0x7a, 0x11,
	0xf4, 0x34, 0xde, 0x98, 0xa4, 0xf3, 0x57, 0x03, 0xee, 0x99, 0xf0, 0x85, 0xed, 0x95, 0x59, 0x3f,
	0xaa, 0xb2, 0xfe, 0x70, 0x29, 0xeb, 0x0b, 0x59, 0xaa, 0xa4, 0xbf, 0x92, 0x9a, 0x6f, 0x32, 0xc0,
	0xde, 0x83, 0xcd, 0x54, 0x52, 0x4f, 0x97, 0xa9, 0x47, 0xd7, 0xff, 0xcb, 0xf0, 0x6f, 0x24, 0xcd,
	0x0a, 0xc2, 0x9d, 0x54, 0x2f, 0x24, 0xfa, 0x10, 0xba, 0x01, 0x8f, 0x88, 0xe7, 0xf3, 0x78, 0xc2,
	0x02, 0xab, 0x75, 0xf9, 0xb2, 0x3c, 0xe5, 0x11, 0x19, 0xe5, 0x5e, 0x0c, 0xc1, 0x6c, 0x6d, 0xbf,
	0xbc, 0xa1, 0x28, 0x76, 0x20, 0x4b, 0xea, 0x65, 0x11, 0xcc, 0x04, 0x6b, 0xa7, 0x92, 0x66, 0xc1,
	0x97, 0xeb, 0xa5, 0xb9, 0x5c, 0x2f, 0x5f, 0x36, 0x3b, 0xf5, 0x41, 0xc3, 0xf9, 0xb3, 0x36, 0xbb,
	0x4e, 0x73, 0xc6, 0x6f, 0x4b, 0x35, 0xc8, 0x85, 0x16, 0xbd, 0xa0, 0xb1, 0xca, 0x5a, 0x7d, 0x69,
	0xe3, 0x57, 0xf9, 0xef, 0xf9, 0x49, 0xe6, 0xc7, 0x06, 0x86, 0x8e, 0xa0, 0x97, 0xb3, 0x48, 0x84,
	0x62, 0x13, 0xe2, 0x2b, 0x69, 0x6e, 0xd5, 0xce, 0x22, 0x91, 0xc7, 0x05, 0x00, 0xdf, 0x0d, 0xca,
	0x9f, 0xce, 0xef, 0x35, 0xd8, 0xd5, 0x63, 0xfb, 0x8c, 0x45, 0x49, 0x48, 0xb3, 0xc6, 0x46, 0xb4,
	0xd0, 0xe0, 0x2d, 0x4c, 0xdd, 0xd7, 0xcb, 0xd2, 0xc8, 0x8e, 0xb5, 0x59, 0x52, 0x41, 0x75, 0x62,
	0x36, 0xd6, 0x9d, 0x98, 0x2f, 0xe0, 0xcd, 0x6b, 0x6a, 0xfe, 0xcf, 0x43, 0xf3, 0xf0, 0xd7, 0x26,
	0xf4, 0x4c, 0xb8, 0x33, 0x2a, 0x2e, 0x98, 0x4f, 0xd1, 0xd7, 0xd0, 0xd2, 0x29, 0x91, 0xb3, 0xfa,
	0xe9, 0x60, 0xbf, 0x75, 0x2d, 0xc6, 0x14, 0x18, 0x42, 0x7f, 0x61, 0xe0, 0xa3, 0x83, 0xa5, 0xfb,
	0x96, 0xff, 0x0b, 0xed, 0x77, 0xd7, 0x03, 0x9b, 0x6c, 0x04, 0x06, 0x8b, 0xf3, 0x0e, 0xed, 0xad,
	0x35, 0xc0, 0xed, 0x77, 0x56, 0xc1, 0x4c, 0x8a, 0x17, 0xd0, 0x5f, 0xb8, 0x1b, 0xe8, 0xed, 0x75,
	0x86, 0x95, 0xbd, 0xb7, 0x02, 0x65, 0xe2, 0xbf, 0x84, 0x9d, 0x2b, 0xdb, 0x8e, 0x86, 0xd5, 0x18,
	0xab, 0x34, 0x6d, 0xbb, 0x6b, 0xe3, 0x75, 0x76, 0xbb, 0xff, 0xc7, 0xdf, 0x76, 0x77, 0x36, 0xbb,
	0x07, 0xb5, 0xc7, 0x1f, 0x7d, 0xf7, 0x41, 0xc0, 0x67, 0x5a, 0x1a, 0x72, 0x11, 0xb8, 0xa5, 0xd7,
	0x34, 0x8b, 0x27, 0x82, 0xb8, 0xf9, 0x5b, 0xda, 0x0d, 0xb8, 0x5b, 0x7e, 0x9e, 0x9f, 0xb7, 0x72,
	0xf3, 0xa3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x5b, 0x2b, 0xfb, 0xdf, 0x0b, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// SysrootServiceClient is the client API for SysrootService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type SysrootServiceClient interface {
	// Create the base sysroot structure.
	Create(ctx context.Context, in *SysrootCreateRequest, opts ...grpc.CallOption) (*SysrootCreateResponse, error)
	// Generate sysroot archive.
	GenerateArchive(ctx context.Context, in *SysrootGenerateArchiveRequest, opts ...grpc.CallOption) (*SysrootGenerateArchiveResponse, error)
	// Install the toolchain into the sysroot.
	InstallToolchain(ctx context.Context, in *InstallToolchainRequest, opts ...grpc.CallOption) (*InstallToolchainResponse, error)
	// Install packages into the sysroot. By default will install all packages.
	InstallPackages(ctx context.Context, in *InstallPackagesRequest, opts ...grpc.CallOption) (*InstallPackagesResponse, error)
	// Install SimpleChrome sysroot.
	CreateSimpleChromeSysroot(ctx context.Context, in *CreateSimpleChromeSysrootRequest, opts ...grpc.CallOption) (*CreateSimpleChromeSysrootResponse, error)
}

type sysrootServiceClient struct {
	cc *grpc.ClientConn
}

func NewSysrootServiceClient(cc *grpc.ClientConn) SysrootServiceClient {
	return &sysrootServiceClient{cc}
}

func (c *sysrootServiceClient) Create(ctx context.Context, in *SysrootCreateRequest, opts ...grpc.CallOption) (*SysrootCreateResponse, error) {
	out := new(SysrootCreateResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SysrootService/Create", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sysrootServiceClient) GenerateArchive(ctx context.Context, in *SysrootGenerateArchiveRequest, opts ...grpc.CallOption) (*SysrootGenerateArchiveResponse, error) {
	out := new(SysrootGenerateArchiveResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SysrootService/GenerateArchive", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sysrootServiceClient) InstallToolchain(ctx context.Context, in *InstallToolchainRequest, opts ...grpc.CallOption) (*InstallToolchainResponse, error) {
	out := new(InstallToolchainResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SysrootService/InstallToolchain", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sysrootServiceClient) InstallPackages(ctx context.Context, in *InstallPackagesRequest, opts ...grpc.CallOption) (*InstallPackagesResponse, error) {
	out := new(InstallPackagesResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SysrootService/InstallPackages", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sysrootServiceClient) CreateSimpleChromeSysroot(ctx context.Context, in *CreateSimpleChromeSysrootRequest, opts ...grpc.CallOption) (*CreateSimpleChromeSysrootResponse, error) {
	out := new(CreateSimpleChromeSysrootResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SysrootService/CreateSimpleChromeSysroot", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// SysrootServiceServer is the server API for SysrootService service.
type SysrootServiceServer interface {
	// Create the base sysroot structure.
	Create(context.Context, *SysrootCreateRequest) (*SysrootCreateResponse, error)
	// Generate sysroot archive.
	GenerateArchive(context.Context, *SysrootGenerateArchiveRequest) (*SysrootGenerateArchiveResponse, error)
	// Install the toolchain into the sysroot.
	InstallToolchain(context.Context, *InstallToolchainRequest) (*InstallToolchainResponse, error)
	// Install packages into the sysroot. By default will install all packages.
	InstallPackages(context.Context, *InstallPackagesRequest) (*InstallPackagesResponse, error)
	// Install SimpleChrome sysroot.
	CreateSimpleChromeSysroot(context.Context, *CreateSimpleChromeSysrootRequest) (*CreateSimpleChromeSysrootResponse, error)
}

// UnimplementedSysrootServiceServer can be embedded to have forward compatible implementations.
type UnimplementedSysrootServiceServer struct {
}

func (*UnimplementedSysrootServiceServer) Create(ctx context.Context, req *SysrootCreateRequest) (*SysrootCreateResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
}
func (*UnimplementedSysrootServiceServer) GenerateArchive(ctx context.Context, req *SysrootGenerateArchiveRequest) (*SysrootGenerateArchiveResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GenerateArchive not implemented")
}
func (*UnimplementedSysrootServiceServer) InstallToolchain(ctx context.Context, req *InstallToolchainRequest) (*InstallToolchainResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method InstallToolchain not implemented")
}
func (*UnimplementedSysrootServiceServer) InstallPackages(ctx context.Context, req *InstallPackagesRequest) (*InstallPackagesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method InstallPackages not implemented")
}
func (*UnimplementedSysrootServiceServer) CreateSimpleChromeSysroot(ctx context.Context, req *CreateSimpleChromeSysrootRequest) (*CreateSimpleChromeSysrootResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CreateSimpleChromeSysroot not implemented")
}

func RegisterSysrootServiceServer(s *grpc.Server, srv SysrootServiceServer) {
	s.RegisterService(&_SysrootService_serviceDesc, srv)
}

func _SysrootService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SysrootCreateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SysrootServiceServer).Create(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SysrootService/Create",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SysrootServiceServer).Create(ctx, req.(*SysrootCreateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SysrootService_GenerateArchive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SysrootGenerateArchiveRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SysrootServiceServer).GenerateArchive(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SysrootService/GenerateArchive",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SysrootServiceServer).GenerateArchive(ctx, req.(*SysrootGenerateArchiveRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SysrootService_InstallToolchain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(InstallToolchainRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SysrootServiceServer).InstallToolchain(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SysrootService/InstallToolchain",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SysrootServiceServer).InstallToolchain(ctx, req.(*InstallToolchainRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SysrootService_InstallPackages_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(InstallPackagesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SysrootServiceServer).InstallPackages(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SysrootService/InstallPackages",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SysrootServiceServer).InstallPackages(ctx, req.(*InstallPackagesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SysrootService_CreateSimpleChromeSysroot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateSimpleChromeSysrootRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SysrootServiceServer).CreateSimpleChromeSysroot(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SysrootService/CreateSimpleChromeSysroot",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SysrootServiceServer).CreateSimpleChromeSysroot(ctx, req.(*CreateSimpleChromeSysrootRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _SysrootService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.SysrootService",
	HandlerType: (*SysrootServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Create",
			Handler:    _SysrootService_Create_Handler,
		},
		{
			MethodName: "GenerateArchive",
			Handler:    _SysrootService_GenerateArchive_Handler,
		},
		{
			MethodName: "InstallToolchain",
			Handler:    _SysrootService_InstallToolchain_Handler,
		},
		{
			MethodName: "InstallPackages",
			Handler:    _SysrootService_InstallPackages_Handler,
		},
		{
			MethodName: "CreateSimpleChromeSysroot",
			Handler:    _SysrootService_CreateSimpleChromeSysroot_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/sysroot.proto",
}
