Merge "Soong: Add build_error proto raw file to $(OUT_DIR)."
This commit is contained in:
@@ -161,6 +161,7 @@ func main() {
|
|||||||
trace.SetOutput(filepath.Join(logsDir, "build.trace"))
|
trace.SetOutput(filepath.Join(logsDir, "build.trace"))
|
||||||
stat.AddOutput(status.NewVerboseLog(log, filepath.Join(logsDir, "verbose.log")))
|
stat.AddOutput(status.NewVerboseLog(log, filepath.Join(logsDir, "verbose.log")))
|
||||||
stat.AddOutput(status.NewErrorLog(log, filepath.Join(logsDir, "error.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"))
|
defer met.Dump(filepath.Join(logsDir, "soong_metrics"))
|
||||||
|
|
||||||
|
@@ -19,6 +19,7 @@ bootstrap_go_package {
|
|||||||
"golang-protobuf-proto",
|
"golang-protobuf-proto",
|
||||||
"soong-ui-logger",
|
"soong-ui-logger",
|
||||||
"soong-ui-status-ninja_frontend",
|
"soong-ui-status-ninja_frontend",
|
||||||
|
"soong-ui-status-build_error_proto",
|
||||||
],
|
],
|
||||||
srcs: [
|
srcs: [
|
||||||
"kati.go",
|
"kati.go",
|
||||||
@@ -41,3 +42,12 @@ bootstrap_go_package {
|
|||||||
"ninja_frontend/frontend.pb.go",
|
"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
|
package status
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"android/soong/ui/logger"
|
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/golang/protobuf/proto"
|
||||||
|
|
||||||
|
"android/soong/ui/logger"
|
||||||
|
"android/soong/ui/status/build_error_proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
type verboseLog struct {
|
type verboseLog struct {
|
||||||
@@ -77,8 +83,7 @@ func (v *verboseLog) Write(p []byte) (int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type errorLog struct {
|
type errorLog struct {
|
||||||
w io.WriteCloser
|
w io.WriteCloser
|
||||||
|
|
||||||
empty bool
|
empty bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,20 +107,17 @@ func (e *errorLog) FinishAction(result ActionResult, counts Counts) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd := result.Command
|
|
||||||
if cmd == "" {
|
|
||||||
cmd = result.Description
|
|
||||||
}
|
|
||||||
|
|
||||||
if !e.empty {
|
if !e.empty {
|
||||||
fmt.Fprintf(e.w, "\n\n")
|
fmt.Fprintf(e.w, "\n\n")
|
||||||
}
|
}
|
||||||
e.empty = false
|
e.empty = false
|
||||||
|
|
||||||
fmt.Fprintf(e.w, "FAILED: %s\n", result.Description)
|
fmt.Fprintf(e.w, "FAILED: %s\n", result.Description)
|
||||||
|
|
||||||
if len(result.Outputs) > 0 {
|
if len(result.Outputs) > 0 {
|
||||||
fmt.Fprintf(e.w, "Outputs: %s\n", strings.Join(result.Outputs, " "))
|
fmt.Fprintf(e.w, "Outputs: %s\n", strings.Join(result.Outputs, " "))
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprintf(e.w, "Error: %s\n", result.Error)
|
fmt.Fprintf(e.w, "Error: %s\n", result.Error)
|
||||||
if result.Command != "" {
|
if result.Command != "" {
|
||||||
fmt.Fprintf(e.w, "Command: %s\n", 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))
|
fmt.Fprint(e.w, string(p))
|
||||||
return len(p), nil
|
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")
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user