// 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 (
	"veyron.io/veyron/veyron2/services/mgmt/build"

	// The non-user imports are prefixed with "__" to prevent collisions.
	__vdl "veyron.io/veyron/veyron2/vdl"
)

// 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 "veyron.io/veyron/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 {
	// Arch is the target hardware architecture of the profile.
	Arch build.Architecture
	// Description is a human-friendly description of the profile.
	Description string
	// 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{}
	// Label is a human-friendly concise label for the profile,
	// e.g. "linux-media".
	Label string
	// OS is the target operating system of the profile.
	OS build.OperatingSystem
}

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

func init() {
	__vdl.Register(Library{})
	__vdl.Register(Specification{})
}
