Merge "Soong: Add build_error proto raw file to $(OUT_DIR)." am: 7d7cae85ab
am: 9f9778cff0
Change-Id: I7d2ee16ad31446360142295c61562cff467f9d19
This commit is contained in:
commit
55ac3ddb21
6 changed files with 297 additions and 8 deletions
|
@ -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"))
|
||||
|
||||
|
|
|
@ -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",
|
||||
],
|
||||
}
|
||||
|
|
175
ui/status/build_error_proto/build_error.pb.go
Normal file
175
ui/status/build_error_proto/build_error.pb.go
Normal 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,
|
||||
}
|
46
ui/status/build_error_proto/build_error.proto
Normal file
46
ui/status/build_error_proto/build_error.proto
Normal 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;
|
||||
}
|
3
ui/status/build_error_proto/regen.sh
Executable file
3
ui/status/build_error_proto/regen.sh
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/bash
|
||||
|
||||
aprotoc --go_out=paths=source_relative:. build_error.proto
|
|
@ -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")
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue