// 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.
//
// proto definitions for the blaze extra_action feature.

syntax = "proto2";

package blaze;

option java_multiple_files = true;
option java_package = "com.google.devtools.build.lib.actions.extra";

// A list of extra actions and metadata for the print_action command.
message ExtraActionSummary {
  repeated DetailedExtraActionInfo action = 1;
}

// An individual action printed by the print_action command.
message DetailedExtraActionInfo {
  // If the given action was included in the output due to a request for a
  // specific file, then this field contains the name of that file so that the
  // caller can correctly associate the extra action with that file.
  //
  // The data in this message is currently not sufficient to run the action on a
  // production machine, because not all necessary input files are identified,
  // especially for C++.
  //
  // There is no easy way to fix this; we could require that all header files
  // are declared and then add all of them here (which would be a huge superset
  // of the files that are actually required), or we could run the include
  // scanner and add those files here.
  optional string triggering_file = 1;
  // The actual action.
  required ExtraActionInfo action = 2;
}

// Provides information to an extra_action on the original action it is
// shadowing.
message ExtraActionInfo {
  extensions 1000 to max;

  // The label of the ActionOwner of the shadowed action.
  optional string owner = 1;
  // An id uniquely describing the shadowed action at the ActionOwner level.
  optional string id = 2;

  // The mnemonic of the shadowed action. Used to distinguish actions with the
  // same ActionType.
  optional string mnemonic = 5;
}

message EnvironmentVariable {
  required string name = 1;
  required string value = 2;
}

// provides access to data that is specific to spawn actions.
// Usually provided by actions using the "Spawn" & "Genrule" Mnemonics.
message SpawnInfo {
  extend ExtraActionInfo {
    optional SpawnInfo spawn_info = 1003;
  }

  repeated string argument = 1;
  repeated EnvironmentVariable variable = 2;
  repeated string input_file = 4;
  repeated string output_file = 5;
}

// Provides access to data that is specific to C++ compile actions.
// Usually provided by actions using the "CppCompile" Mnemonic.
message CppCompileInfo {
  extend ExtraActionInfo {
    optional CppCompileInfo cpp_compile_info = 1001;
  }

  optional string tool = 1;
  repeated string compiler_option = 2;
  optional string source_file = 3;
  optional string output_file = 4;
  // Due to header discovery, this won't include headers unless the build is
  // actually performed. If set, this field will include the value of
  // "source_file" in addition to the headers.
  repeated string sources_and_headers = 5;
}

// Provides access to data that is specific to C++ link  actions.
// Usually provided by actions using the "CppLink" Mnemonic.
message CppLinkInfo {
  extend ExtraActionInfo {
    optional CppLinkInfo cpp_link_info = 1002;
  }

  repeated string input_file = 1;
  optional string output_file = 2;
  optional string interface_output_file = 3;
  optional string link_target_type = 4;
  optional string link_staticness = 5;
  repeated string link_stamp = 6;
  repeated string build_info_header_artifact = 7;
  repeated string link_opt = 8;
}

// Provides access to data that is specific to java compile actions.
// Usually provided by actions using the "Javac" Mnemonic.
message JavaCompileInfo {
  extend ExtraActionInfo {
    optional JavaCompileInfo java_compile_info = 1000;
  }

  optional string outputjar = 1;
  repeated string classpath = 2;
  repeated string sourcepath = 3;
  repeated string source_file = 4;
  repeated string javac_opt = 5;
  repeated string processor = 6;
  repeated string processorpath = 7;
  repeated string bootclasspath = 8;
}

// Provides access to data that is specific to python rules.
// Usually provided by actions using the "Python" Mnemonic.
message PythonInfo {
  extend ExtraActionInfo {
    optional PythonInfo python_info = 1005;
  }

  repeated string source_file = 1;
  repeated string dep_file = 2;
}
