# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: src/third_party/chromiumos-overlay/proto/build_target.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from src.third_party.chromiumos_overlay.proto import build_target_id_pb2 as src_dot_third__party_dot_chromiumos__overlay_dot_proto_dot_build__target__id__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='src/third_party/chromiumos-overlay/proto/build_target.proto',
  package='chromiumos_overlay',
  syntax='proto3',
  serialized_options=_b('ZMgo.chromium.org/chromiumos/config/go/src/third_party/chromiumos-overlay/proto'),
  serialized_pb=_b('\n;src/third_party/chromiumos-overlay/proto/build_target.proto\x12\x12\x63hromiumos_overlay\x1a>src/third_party/chromiumos-overlay/proto/build_target_id.proto\"M\n\x0b\x42uildTarget\x12-\n\x02id\x18\x01 \x01(\x0b\x32!.chromiumos_overlay.BuildTargetId\x12\x0f\n\x07overlay\x18\x02 \x01(\tBOZMgo.chromium.org/chromiumos/config/go/src/third_party/chromiumos-overlay/protob\x06proto3')
  ,
  dependencies=[src_dot_third__party_dot_chromiumos__overlay_dot_proto_dot_build__target__id__pb2.DESCRIPTOR,])




_BUILDTARGET = _descriptor.Descriptor(
  name='BuildTarget',
  full_name='chromiumos_overlay.BuildTarget',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='id', full_name='chromiumos_overlay.BuildTarget.id', index=0,
      number=1, type=11, cpp_type=10, label=1,
      has_default_value=False, default_value=None,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='overlay', full_name='chromiumos_overlay.BuildTarget.overlay', index=1,
      number=2, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=147,
  serialized_end=224,
)

_BUILDTARGET.fields_by_name['id'].message_type = src_dot_third__party_dot_chromiumos__overlay_dot_proto_dot_build__target__id__pb2._BUILDTARGETID
DESCRIPTOR.message_types_by_name['BuildTarget'] = _BUILDTARGET
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

BuildTarget = _reflection.GeneratedProtocolMessageType('BuildTarget', (_message.Message,), dict(
  DESCRIPTOR = _BUILDTARGET,
  __module__ = 'src.third_party.chromiumos_overlay.proto.build_target_pb2'
  # @@protoc_insertion_point(class_scope:chromiumos_overlay.BuildTarget)
  ))
_sym_db.RegisterMessage(BuildTarget)


DESCRIPTOR._options = None
# @@protoc_insertion_point(module_scope)
