// 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.
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"`
	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
}

// 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"`
	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
}

// 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
}

// 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{4}
}

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"`
	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{4, 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
}

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{5}
}

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{6}
}

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"`
	// Event file location.
	EventFile string `protobuf:"bytes,2,opt,name=event_file,json=eventFile,proto3" json:"event_file,omitempty"`
	// Whether to start goma.
	UseGoma              bool     `protobuf:"varint,3,opt,name=use_goma,json=useGoma,proto3" json:"use_goma,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{6, 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) GetEventFile() string {
	if m != nil {
		return m.EventFile
	}
	return ""
}

func (m *InstallPackagesRequest_Flags) GetUseGoma() bool {
	if m != nil {
		return m.UseGoma
	}
	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"`
	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{7}
}

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
}

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{8}
}

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{9}
}

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