// 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"`
	// Optional.
	// A list of specific package atoms to install. Will generate
	// the list of packages for the build target if none are
	// specified. The version of the packages is ignored if provided.
	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"`
	// Package index files available for use.
	PackageIndexes       []*chromiumos.PackageIndexInfo `protobuf:"bytes,7,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 *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
}

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