// Copyright 2014 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // This file contains the protocol buffer representation of a build // file or 'blaze query --output=proto' call. syntax = "proto2"; package blaze_query; // option cc_api_version = 2; // option java_api_version = 1; option java_package = "com.google.devtools.build.lib.query2.proto.proto2api"; message License { repeated string license_type = 1; repeated string exception = 2; } message StringDictEntry { required string key = 1; required string value = 2; } message LabelDictUnaryEntry { required string key = 1; required string value = 2; } message LabelListDictEntry { required string key = 1; repeated string value = 2; } message LabelKeyedStringDictEntry { required string key = 1; required string value = 2; } message StringListDictEntry { required string key = 1; repeated string value = 2; } // Represents an entry attribute of a Fileset rule in a build file. message FilesetEntry { // Indicates what to do when a source file is actually a symlink. enum SymlinkBehavior { COPY = 1; DEREFERENCE = 2; } // The label pointing to the source target where files are copied from. required string source = 1; // The relative path within the fileset rule where files will be mapped. required string destination_directory = 2; // Whether the files= attribute was specified. This is necessary because // no files= attribute and files=[] mean different things. optional bool files_present = 7; // A list of file labels to include from the source directory. repeated string file = 3; // If this is a fileset entry representing files within the rule // package, this lists relative paths to files that should be excluded from // the set. This cannot contain values if 'file' also has values. repeated string exclude = 4; // This field is optional because there will be some time when the new // PB is used by tools depending on blaze query, but the new blaze version // is not yet released. // TODO(bazel-team): Make this field required once a version of Blaze is // released that outputs this field. optional SymlinkBehavior symlink_behavior = 5 [ default=COPY ]; // The prefix to strip from the path of the files in this FilesetEntry. Note // that no value and the empty string as the value mean different things here. optional string strip_prefix = 6; } // A rule attribute. Each attribute must have a type and one of the various // value fields populated - for the most part. // // Attributes of BOOLEAN and TRISTATE type may set all of the int, bool, and // string values for backwards compatibility with clients that expect them to // be set. // // Attributes of INTEGER, STRING, LABEL, LICENSE, BOOLEAN, and TRISTATE type // may set *none* of the values. This can happen if the Attribute message is // prepared for a client that doesn't support SELECTOR_LIST, but the rule has // a selector list value for the attribute. (Selector lists for attributes of // other types--the collection types--are handled differently when prepared // for such a client. The possible collection values are gathered together // and flattened.) // // By checking the type, the appropriate value can be extracted - see the // comments on each type for the associated value. The order of lists comes // from the blaze parsing. If an attribute is of a list type, the associated // list should never be empty. message Attribute { // Indicates the type of attribute. enum Discriminator { INTEGER = 1; // int_value STRING = 2; // string_value LABEL = 3; // string_value OUTPUT = 4; // string_value STRING_LIST = 5; // string_list_value LABEL_LIST = 6; // string_list_value OUTPUT_LIST = 7; // string_list_value DISTRIBUTION_SET = 8; // string_list_value - order is unimportant LICENSE = 9; // license STRING_DICT = 10; // string_dict_value FILESET_ENTRY_LIST = 11; // fileset_list_value LABEL_LIST_DICT = 12; // label_list_dict_value STRING_LIST_DICT = 13; // string_list_dict_value BOOLEAN = 14; // int, bool and string value TRISTATE = 15; // tristate, int and string value INTEGER_LIST = 16; // int_list_value UNKNOWN = 18; // unknown type, use only for build extensions LABEL_DICT_UNARY = 19; // label_dict_unary_value SELECTOR_LIST = 20; // selector_list LABEL_KEYED_STRING_DICT = 21; // label_keyed_string_dict DEPRECATED_STRING_DICT_UNARY = 17; } // Values for the TriState field type. enum Tristate { NO = 0; YES = 1; AUTO = 2; } message SelectorEntry { // The key of the selector entry. At this time, this is the label of a // config_setting rule, or the pseudo-label "//conditions:default". optional string label = 1; // True if the entry's value is the default value for the type as a // result of the condition value being specified as None (ie: // {"//condition": None}). optional bool is_default_value = 16; // Exactly one of the following fields (except for glob_criteria) must be // populated - note that the BOOLEAN and TRISTATE caveat in Attribute's // comment does not apply here. The type field in the SelectorList // containing this entry indicates which of these fields is populated, // in accordance with the comments on Discriminator enum values above. // (To be explicit: BOOLEAN populates the boolean_value field and TRISTATE // populates the tristate_value field.) optional int32 int_value = 2; optional string string_value = 3; optional bool boolean_value = 4; optional Tristate tristate_value = 5; repeated string string_list_value = 6; optional License license = 7; repeated StringDictEntry string_dict_value = 8; repeated FilesetEntry fileset_list_value = 9; repeated LabelListDictEntry label_list_dict_value = 10; repeated StringListDictEntry string_list_dict_value = 11; repeated int32 int_list_value = 13; repeated LabelDictUnaryEntry label_dict_unary_value = 15; repeated LabelKeyedStringDictEntry label_keyed_string_dict_value = 17; repeated DEPRECATED_GlobCriteria DEPRECATED_glob_criteria = 12; repeated bytes DEPRECATED_string_dict_unary_value = 14; } message Selector { // The list of (label, value) pairs in the map that defines the selector. // At this time, this cannot be empty, i.e. a selector has at least one // entry. repeated SelectorEntry entries = 1; // Whether or not this has any default values. optional bool has_default_value = 2; // The error message when no condition matches. optional string no_match_error = 3; } message SelectorList { // The type that this selector list evaluates to, and the type that each // selector in the list evaluates to. At this time, this cannot be // SELECTOR_LIST, i.e. selector lists do not nest. optional Discriminator type = 1; // The list of selector elements in this selector list. At this time, this // cannot be empty, i.e. a selector list is never empty. repeated Selector elements = 2; } // The name of the attribute required string name = 1; // The location of the target in the BUILD file in a machine-parseable form. optional Location DEPRECATED_parseable_location = 12; // Whether the attribute was explicitly specified optional bool explicitly_specified = 13; // If this attribute has a string value or a string list value, then this // may be set to indicate that the value may be treated as a label that // isn't a dependency of this attribute's rule. optional bool nodep = 20; // The type of attribute. This message is used for all of the different // attribute types so the discriminator helps for figuring out what is // stored in the message. required Discriminator type = 2; // If this attribute has an integer value this will be populated. // Boolean and TriState also use this field as [0,1] and [-1,0,1] // for [false, true] and [auto, no, yes] respectively. optional int32 int_value = 3; // If the attribute has a string value this will be populated. Label and // path attributes use this field as the value even though the type may // be LABEL or something else other than STRING. optional string string_value = 5; // If the attribute has a boolean value this will be populated. optional bool boolean_value = 14; // If the attribute is a Tristate value, this will be populated. optional Tristate tristate_value = 15; // The value of the attribute has a list of string values (label and path // note from STRING applies here as well). repeated string string_list_value = 6; // If this is a license attribute, the license information is stored here. optional License license = 7; // If this is a string dict, each entry will be stored here. repeated StringDictEntry string_dict_value = 8; // If the attribute is part of a Fileset, the fileset entries are stored in // this field. repeated FilesetEntry fileset_list_value = 9; // If this is a label list dict, each entry will be stored here. repeated LabelListDictEntry label_list_dict_value = 10; // If this is a string list dict, each entry will be stored here. repeated StringListDictEntry string_list_dict_value = 11; // The value of the attribute has a list of int32 values repeated int32 int_list_value = 17; // If this is a label dict unary, each entry will be stored here. repeated LabelDictUnaryEntry label_dict_unary_value = 19; // If this is a label-keyed string dict, each entry will be stored here. repeated LabelKeyedStringDictEntry label_keyed_string_dict_value = 22; // If this attribute's value is an expression containing one or more select // expressions, then its type is SELECTOR_LIST and a SelectorList will be // stored here. optional SelectorList selector_list = 21; repeated DEPRECATED_GlobCriteria DEPRECATED_glob_criteria = 16; repeated bytes DEPRECATED_string_dict_unary_value = 18; } // A rule from a BUILD file (e.g., cc_library, java_binary). The rule class // is the actual name of the rule (e.g., cc_library) and the name is the full // label of the rule (e.g., //foo/bar:baz). message Rule { // The name of the rule required string name = 1; // The rule class (e.g., java_library) required string rule_class = 2; // The BUILD file and line number of the rule. optional string location = 3; // All of the attributes that describe the rule. repeated Attribute attribute = 4; // All of the inputs to the rule. These are predecessors in the dependency // graph. A rule_input for a rule should always be described as a // source_file in some package (either the rule's package or some other one). repeated string rule_input = 5; // All of the outputs of the rule. These are the successors in the // dependency graph. repeated string rule_output = 6; // The set of all default settings affecting this rule. The name of a default // setting is "_". There currently defined setting // types are: // // - 'blaze': settings implemented in Blaze itself repeated string default_setting = 7; // The location of the target in the BUILD file in a machine-parseable form. optional Location DEPRECATED_parseable_location = 8; // The rule's class's public by default value. optional bool public_by_default = 9; // If this rule is of a skylark-defined RuleClass. optional bool is_skylark = 10; // List of Skylark aspects that this rule applies. repeated AttributeAspect skylark_attribute_aspects = 11; // Hash encapsulating the behavior of this Skylark rule. Any change to this // rule's definition that could change its behavior will be reflected here. optional string skylark_environment_hash_code = 12; } // A pairing of attribute name and a Skylark aspect that is applied to that // attribute. message AttributeAspect { required string attribute_name = 1; required SkylarkAspect aspect = 2; } // Aspect defined in Skylark. message SkylarkAspect { required string extension_file_label = 1; required string exported_name = 2; repeated Attribute attribute = 3; } // Summary of all transitive dependencies of 'rule,' where each dependent // rule is included only once in the 'dependency' field. Gives complete // information to analyze the single build target labeled rule.name, // including optional location of target in BUILD file. message RuleSummary { required Rule rule = 1; repeated Rule dependency = 2; optional string location = 3; } // A package group. Aside from the name, it contains the list of packages // present in the group (as specified in the BUILD file). message PackageGroup { // The name of the package group required string name = 1; // The list of packages as specified in the BUILD file. Currently this is // only a list of packages, but some time in the future, there might be // some type of wildcard mechanism. repeated string contained_package = 2; // The list of sub package groups included in this one. repeated string included_package_group = 3; // The location of the target in the BUILD file in a machine-parseable form. optional Location DEPRECATED_parseable_location = 4; } // An environment group. message EnvironmentGroup { // The name of the environment group. required string name = 1; // The environments that belong to this group (as labels). repeated string environment = 2; // The member environments that rules implicitly support if not otherwise // specified. repeated string default = 3; } // A file that is an input into the build system. // Next-Id: 10 message SourceFile { // The name of the source file (a label). required string name = 1; // The location of the source file. This is a path with line numbers, not // a label in the build system. optional string location = 2; // The location of the corresponding label in the BUILD file in a // machine-parseable form. optional Location DEPRECATED_parseable_location = 7; // Labels of .bzl (Skylark) files that are transitively loaded in this BUILD // file. This is present only when the SourceFile represents a BUILD file that // loaded .bzl files. // TODO(bazel-team): Rename this field. repeated string subinclude = 3; // Labels of package groups that are mentioned in the visibility declaration // for this source file. repeated string package_group = 4; // Labels mentioned in the visibility declaration (including :__pkg__ and // //visibility: ones) repeated string visibility_label = 5; // The package-level features enabled for this package. Only present if the // SourceFile represents a BUILD file. repeated string feature = 6; // License attribute for the file. optional License license = 8; // True if the package contains an error. Only present if the SourceFile // represents a BUILD file. optional bool package_contains_errors = 9; } // A file that is the output of a build rule. message GeneratedFile { // The name of the generated file (a label). required string name = 1; // The label of the target that generates the file. required string generating_rule = 2; // The path of the output file (not a label). optional string location = 3; } // A target from a blaze query execution. Similar to the Attribute message, // the Discriminator is used to determine which field contains information. // For any given type, only one of these can be populated in a single Target. message Target { enum Discriminator { RULE = 1; SOURCE_FILE = 2; GENERATED_FILE = 3; PACKAGE_GROUP = 4; ENVIRONMENT_GROUP = 5; } // The type of target contained in the message. required Discriminator type = 1; // If this target represents a rule, the rule is stored here. optional Rule rule = 2; // A file that is not generated by the build system (version controlled // or created by the test harness). optional SourceFile source_file = 3; // A generated file that is the output of a rule. optional GeneratedFile generated_file = 4; // A package group. optional PackageGroup package_group = 5; // An environment group. optional EnvironmentGroup environment_group = 6; } // Container for all of the blaze query results. message QueryResult { // All of the targets returned by the blaze query. repeated Target target = 1; } //////////////////////////////////////////////////////////////////////////// // Messages dealing with querying the BUILD language itself. For now, this is // quite simplistic: Blaze can only tell the names of the rule classes, their // attributes with their type. // Information about allowed rule classes for a specific attribute of a rule. message AllowedRuleClassInfo { enum AllowedRuleClasses { ANY = 1; // Any rule is allowed to be in this attribute SPECIFIED = 2; // Only the explicitly listed rules are allowed } required AllowedRuleClasses policy = 1; // Rule class names of rules allowed in this attribute, e.g "cc_library", // "py_binary". Only present if the allowed_rule_classes field is set to // SPECIFIED. repeated string allowed_rule_class = 2; } // This message represents a single attribute of a single rule. message AttributeDefinition { // Attribute name, i.e. "name", "srcs", "deps" required string name = 1; required Attribute.Discriminator type = 2; required bool mandatory = 3; // Only present for attributes of type LABEL and LABEL_LIST. optional AllowedRuleClassInfo allowed_rule_classes = 4; optional string documentation = 5; } message RuleDefinition { required string name = 1; // Only contains documented attributes repeated AttributeDefinition attribute = 2; optional string documentation = 3; // Only for build extensions: label to file that defines the extension optional string label = 4; } message BuildLanguage { // Only contains documented rule definitions repeated RuleDefinition rule = 1; } message Location { optional int32 start_offset = 1; optional int32 start_line = 2; optional int32 start_column = 3; optional int32 end_offset = 4; optional int32 end_line = 5; optional int32 end_column = 6; } message MakeVarBinding { required string value = 1; required string platform_set_regexp = 2; } message MakeVar { required string name = 1; repeated MakeVarBinding binding = 2; } message DEPRECATED_GlobCriteria { // List of includes (or items if this criteria did not come from a glob) repeated string include = 1; // List of exclude expressions repeated string exclude = 2; // Whether this message came from a glob optional bool glob = 3; } message Event { enum EventKind { ERROR = 1; WARNING = 2; INFO = 3; PROGRESS = 4; } required EventKind kind = 1; optional Location DEPRECATED_location = 2; optional string message = 3; }