Merge "Soong: Add build_error proto raw file to $(OUT_DIR)." am: 7d7cae85ab

am: 9f9778cff0

Change-Id: I7d2ee16ad31446360142295c61562cff467f9d19
This commit is contained in:
Patrice Arruda 2019-06-24 16:43:43 -07:00 committed by android-build-merger
commit 55ac3ddb21
6 changed files with 297 additions and 8 deletions

View file

@ -161,6 +161,7 @@ func main() {
trace.SetOutput(filepath.Join(logsDir, "build.trace"))
stat.AddOutput(status.NewVerboseLog(log, filepath.Join(logsDir, "verbose.log")))
stat.AddOutput(status.NewErrorLog(log, filepath.Join(logsDir, "error.log")))
stat.AddOutput(status.NewProtoErrorLog(log, filepath.Join(logsDir, "build_error")))
defer met.Dump(filepath.Join(logsDir, "soong_metrics"))

View file

@ -19,6 +19,7 @@ bootstrap_go_package {
"golang-protobuf-proto",
"soong-ui-logger",
"soong-ui-status-ninja_frontend",
"soong-ui-status-build_error_proto",
],
srcs: [
"kati.go",
@ -41,3 +42,12 @@ bootstrap_go_package {
"ninja_frontend/frontend.pb.go",
],
}
bootstrap_go_package {
name: "soong-ui-status-build_error_proto",
pkgPath: "android/soong/ui/status/build_error_proto",
deps: ["golang-protobuf-proto"],
srcs: [
"build_error_proto/build_error.pb.go",
],
}

View file

@ -0,0 +1,175 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: build_error.proto
package soong_build_error_proto
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type BuildError struct {
// List of error messages of the overall build. The error messages
// are not associated with a build action.
ErrorMessages []string `protobuf:"bytes,1,rep,name=error_messages,json=errorMessages" json:"error_messages,omitempty"`
// List of build action errors.
ActionErrors []*BuildActionError `protobuf:"bytes,2,rep,name=action_errors,json=actionErrors" json:"action_errors,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *BuildError) Reset() { *m = BuildError{} }
func (m *BuildError) String() string { return proto.CompactTextString(m) }
func (*BuildError) ProtoMessage() {}
func (*BuildError) Descriptor() ([]byte, []int) {
return fileDescriptor_a2e15b05802a5501, []int{0}
}
func (m *BuildError) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildError.Unmarshal(m, b)
}
func (m *BuildError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_BuildError.Marshal(b, m, deterministic)
}
func (m *BuildError) XXX_Merge(src proto.Message) {
xxx_messageInfo_BuildError.Merge(m, src)
}
func (m *BuildError) XXX_Size() int {
return xxx_messageInfo_BuildError.Size(m)
}
func (m *BuildError) XXX_DiscardUnknown() {
xxx_messageInfo_BuildError.DiscardUnknown(m)
}
var xxx_messageInfo_BuildError proto.InternalMessageInfo
func (m *BuildError) GetErrorMessages() []string {
if m != nil {
return m.ErrorMessages
}
return nil
}
func (m *BuildError) GetActionErrors() []*BuildActionError {
if m != nil {
return m.ActionErrors
}
return nil
}
// Build is composed of a list of build action. There can be a set of build
// actions that can failed.
type BuildActionError struct {
// Description of the command.
Description *string `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"`
// The command name that raised the error.
Command *string `protobuf:"bytes,2,opt,name=command" json:"command,omitempty"`
// The command output stream.
Output *string `protobuf:"bytes,3,opt,name=output" json:"output,omitempty"`
// List of artifacts (i.e. files) that was produced by the command.
Artifacts []string `protobuf:"bytes,4,rep,name=artifacts" json:"artifacts,omitempty"`
// The error string produced by the build action.
Error *string `protobuf:"bytes,5,opt,name=error" json:"error,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *BuildActionError) Reset() { *m = BuildActionError{} }
func (m *BuildActionError) String() string { return proto.CompactTextString(m) }
func (*BuildActionError) ProtoMessage() {}
func (*BuildActionError) Descriptor() ([]byte, []int) {
return fileDescriptor_a2e15b05802a5501, []int{1}
}
func (m *BuildActionError) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildActionError.Unmarshal(m, b)
}
func (m *BuildActionError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_BuildActionError.Marshal(b, m, deterministic)
}
func (m *BuildActionError) XXX_Merge(src proto.Message) {
xxx_messageInfo_BuildActionError.Merge(m, src)
}
func (m *BuildActionError) XXX_Size() int {
return xxx_messageInfo_BuildActionError.Size(m)
}
func (m *BuildActionError) XXX_DiscardUnknown() {
xxx_messageInfo_BuildActionError.DiscardUnknown(m)
}
var xxx_messageInfo_BuildActionError proto.InternalMessageInfo
func (m *BuildActionError) GetDescription() string {
if m != nil && m.Description != nil {
return *m.Description
}
return ""
}
func (m *BuildActionError) GetCommand() string {
if m != nil && m.Command != nil {
return *m.Command
}
return ""
}
func (m *BuildActionError) GetOutput() string {
if m != nil && m.Output != nil {
return *m.Output
}
return ""
}
func (m *BuildActionError) GetArtifacts() []string {
if m != nil {
return m.Artifacts
}
return nil
}
func (m *BuildActionError) GetError() string {
if m != nil && m.Error != nil {
return *m.Error
}
return ""
}
func init() {
proto.RegisterType((*BuildError)(nil), "soong_build_error.BuildError")
proto.RegisterType((*BuildActionError)(nil), "soong_build_error.BuildActionError")
}
func init() { proto.RegisterFile("build_error.proto", fileDescriptor_a2e15b05802a5501) }
var fileDescriptor_a2e15b05802a5501 = []byte{
// 229 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0xc1, 0x4a, 0xc3, 0x40,
0x10, 0x86, 0x49, 0x63, 0x95, 0x4c, 0xad, 0xd8, 0x41, 0x74, 0x04, 0x0f, 0xa1, 0x22, 0xe4, 0x94,
0x83, 0x6f, 0x60, 0x41, 0xf0, 0xe2, 0x25, 0x47, 0x2f, 0x61, 0xdd, 0xac, 0x65, 0xc1, 0x64, 0xc2,
0xce, 0xe6, 0xe8, 0x8b, 0xf8, 0xb4, 0x92, 0x69, 0xa5, 0xa5, 0x39, 0x7e, 0xdf, 0x3f, 0xfb, 0xef,
0xce, 0xc2, 0xea, 0x73, 0xf0, 0xdf, 0x4d, 0xed, 0x42, 0xe0, 0x50, 0xf6, 0x81, 0x23, 0xe3, 0x4a,
0x98, 0xbb, 0x6d, 0x7d, 0x14, 0xac, 0x7f, 0x00, 0x36, 0x23, 0xbe, 0x8e, 0x84, 0x4f, 0x70, 0xa5,
0xba, 0x6e, 0x9d, 0x88, 0xd9, 0x3a, 0xa1, 0x24, 0x4f, 0x8b, 0xac, 0x5a, 0xaa, 0x7d, 0xdf, 0x4b,
0x7c, 0x83, 0xa5, 0xb1, 0xd1, 0x73, 0xb7, 0x2b, 0x11, 0x9a, 0xe5, 0x69, 0xb1, 0x78, 0x7e, 0x2c,
0x27, 0xfd, 0xa5, 0x96, 0xbf, 0xe8, 0xb0, 0x5e, 0x51, 0x5d, 0x9a, 0x03, 0xc8, 0xfa, 0x37, 0x81,
0xeb, 0xd3, 0x11, 0xcc, 0x61, 0xd1, 0x38, 0xb1, 0xc1, 0xf7, 0xa3, 0xa3, 0x24, 0x4f, 0x8a, 0xac,
0x3a, 0x56, 0x48, 0x70, 0x61, 0xb9, 0x6d, 0x4d, 0xd7, 0xd0, 0x4c, 0xd3, 0x7f, 0xc4, 0x5b, 0x38,
0xe7, 0x21, 0xf6, 0x43, 0xa4, 0x54, 0x83, 0x3d, 0xe1, 0x03, 0x64, 0x26, 0x44, 0xff, 0x65, 0x6c,
0x14, 0x3a, 0xd3, 0xa5, 0x0e, 0x02, 0x6f, 0x60, 0xae, 0xcf, 0xa5, 0xb9, 0x1e, 0xda, 0xc1, 0xe6,
0xfe, 0xe3, 0x6e, 0xb2, 0x50, 0xad, 0x3f, 0xf9, 0x17, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x18, 0x9e,
0x17, 0x5d, 0x01, 0x00, 0x00,
}

View file

@ -0,0 +1,46 @@
// Copyright 2019 Google Inc. 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.
syntax = "proto2";
package soong_build_error;
option go_package = "soong_build_error_proto";
message BuildError {
// List of error messages of the overall build. The error messages
// are not associated with a build action.
repeated string error_messages = 1;
// List of build action errors.
repeated BuildActionError action_errors = 2;
}
// Build is composed of a list of build action. There can be a set of build
// actions that can failed.
message BuildActionError {
// Description of the command.
optional string description = 1;
// The command name that raised the error.
optional string command = 2;
// The command output stream.
optional string output = 3;
// List of artifacts (i.e. files) that was produced by the command.
repeated string artifacts = 4;
// The error string produced by the build action.
optional string error = 5;
}

View file

@ -0,0 +1,3 @@
#!/bin/bash
aprotoc --go_out=paths=source_relative:. build_error.proto

View file

@ -15,11 +15,17 @@
package status
import (
"android/soong/ui/logger"
"compress/gzip"
"errors"
"fmt"
"io"
"io/ioutil"
"strings"
"github.com/golang/protobuf/proto"
"android/soong/ui/logger"
"android/soong/ui/status/build_error_proto"
)
type verboseLog struct {
@ -77,8 +83,7 @@ func (v *verboseLog) Write(p []byte) (int, error) {
}
type errorLog struct {
w io.WriteCloser
w io.WriteCloser
empty bool
}
@ -102,20 +107,17 @@ func (e *errorLog) FinishAction(result ActionResult, counts Counts) {
return
}
cmd := result.Command
if cmd == "" {
cmd = result.Description
}
if !e.empty {
fmt.Fprintf(e.w, "\n\n")
}
e.empty = false
fmt.Fprintf(e.w, "FAILED: %s\n", result.Description)
if len(result.Outputs) > 0 {
fmt.Fprintf(e.w, "Outputs: %s\n", strings.Join(result.Outputs, " "))
}
fmt.Fprintf(e.w, "Error: %s\n", result.Error)
if result.Command != "" {
fmt.Fprintf(e.w, "Command: %s\n", result.Command)
@ -144,3 +146,55 @@ func (e *errorLog) Write(p []byte) (int, error) {
fmt.Fprint(e.w, string(p))
return len(p), nil
}
type errorProtoLog struct {
errorProto soong_build_error_proto.BuildError
filename string
log logger.Logger
}
func NewProtoErrorLog(log logger.Logger, filename string) StatusOutput {
return &errorProtoLog{
errorProto: soong_build_error_proto.BuildError{},
filename: filename,
log: log,
}
}
func (e *errorProtoLog) StartAction(action *Action, counts Counts) {}
func (e *errorProtoLog) FinishAction(result ActionResult, counts Counts) {
if result.Error == nil {
return
}
e.errorProto.ActionErrors = append(e.errorProto.ActionErrors, &soong_build_error_proto.BuildActionError{
Description: proto.String(result.Description),
Command: proto.String(result.Command),
Output: proto.String(result.Output),
Artifacts: result.Outputs,
Error: proto.String(result.Error.Error()),
})
}
func (e *errorProtoLog) Flush() {
data, err := proto.Marshal(&e.errorProto)
if err != nil {
e.log.Println("Failed to marshal build status proto: %v", err)
return
}
err = ioutil.WriteFile(e.filename, []byte(data), 0644)
if err != nil {
e.log.Println("Failed to write file %s: %v", e.errorProto, err)
}
}
func (e *errorProtoLog) Message(level MsgLevel, message string) {
if level > ErrorLvl {
e.errorProto.ErrorMessages = append(e.errorProto.ErrorMessages, message)
}
}
func (e *errorProtoLog) Write(p []byte) (int, error) {
return 0, errors.New("not supported")
}