// This file was auto-generated by the veyron vdl tool.
// Source: profile.vdl

// Package profile contains implementation and internal interfaces and
// types used by the implementation of Veyron profiles.
package profile

import (
	// VDL system imports
	"v.io/core/veyron2/vdl"

	// VDL user imports
	"v.io/core/veyron2/services/mgmt/build"
)

// Library describes a shared library that applications may use.
type Library struct {
	// Name is the name of the library.
	Name string
	// MajorVersion is the major version of the library.
	MajorVersion string
	// MinorVersion is the minor version of the library.
	MinorVersion string
}

func (Library) __VDLReflect(struct {
	Name string "v.io/core/veyron/services/mgmt/profile.Library"
}) {
}

// Specification is how we represent a profile internally. It should
// provide enough information to allow matching of binaries to devices.
type Specification struct {
	// Label is a human-friendly concise label for the profile,
	// e.g. "linux-media".
	Label string
	// Description is a human-friendly description of the profile.
	Description string
	// Arch is the target hardware architecture of the profile.
	Arch build.Architecture
	// OS is the target operating system of the profile.
	OS build.OperatingSystem
	// Format is the file format supported by the profile.
	Format build.Format
	// Libraries is a set of libraries the profile requires.
	Libraries map[Library]struct{}
}

func (Specification) __VDLReflect(struct {
	Name string "v.io/core/veyron/services/mgmt/profile.Specification"
}) {
}

func init() {
	vdl.Register((*Library)(nil))
	vdl.Register((*Specification)(nil))
}
