Support writing inputs/outputs of actions of modules into a file from the moduleInfo.actionDefs. am: a78b020089
am: 6fb018a456
am: 33eafd0d60
am: d246a146ee
Original change: https://android-review.googlesource.com/c/platform/build/blueprint/+/1959132 Change-Id: Ia8256f9afb096110c9b50126fe3bcd5a512cbfcf
This commit is contained in:
commit
f9e936b3c4
2 changed files with 52 additions and 59 deletions
78
context.go
78
context.go
|
@ -2297,26 +2297,6 @@ type JSONDataSupplier interface {
|
|||
AddJSONData(d *map[string]interface{})
|
||||
}
|
||||
|
||||
// A JSONDataAction contains the inputs and outputs of actions of a module. Which helps pass such
|
||||
// data to be included in the JSON module graph.
|
||||
type JSONDataAction struct {
|
||||
Inputs []string
|
||||
Outputs []string
|
||||
}
|
||||
|
||||
// FormatJSONDataActions puts the content of a list of JSONDataActions into a standard format to be
|
||||
// appended into the JSON module graph.
|
||||
func FormatJSONDataActions(jsonDataActions []JSONDataAction) []map[string]interface{} {
|
||||
var actions []map[string]interface{}
|
||||
for _, jsonDataAction := range jsonDataActions {
|
||||
actions = append(actions, map[string]interface{}{
|
||||
"Inputs": jsonDataAction.Inputs,
|
||||
"Outputs": jsonDataAction.Outputs,
|
||||
})
|
||||
}
|
||||
return actions
|
||||
}
|
||||
|
||||
func jsonModuleFromModuleInfo(m *moduleInfo) *JsonModule {
|
||||
result := &JsonModule{
|
||||
jsonModuleName: *jsonModuleNameFromModuleInfo(m),
|
||||
|
@ -2325,11 +2305,9 @@ func jsonModuleFromModuleInfo(m *moduleInfo) *JsonModule {
|
|||
Blueprint: m.relBlueprintsFile,
|
||||
Module: make(map[string]interface{}),
|
||||
}
|
||||
|
||||
if j, ok := m.logicModule.(JSONDataSupplier); ok {
|
||||
j.AddJSONData(&result.Module)
|
||||
}
|
||||
|
||||
for _, p := range m.providers {
|
||||
if j, ok := p.(JSONDataSupplier); ok {
|
||||
j.AddJSONData(&result.Module)
|
||||
|
@ -2338,20 +2316,68 @@ func jsonModuleFromModuleInfo(m *moduleInfo) *JsonModule {
|
|||
return result
|
||||
}
|
||||
|
||||
func (c *Context) PrintJSONGraph(w io.Writer) {
|
||||
modules := make([]*JsonModule, 0)
|
||||
func jsonModuleWithActionsFromModuleInfo(m *moduleInfo) *JsonModule {
|
||||
result := &JsonModule{
|
||||
jsonModuleName: jsonModuleName{
|
||||
Name: m.Name(),
|
||||
},
|
||||
Deps: make([]jsonDep, 0),
|
||||
Type: m.typeName,
|
||||
Blueprint: m.relBlueprintsFile,
|
||||
Module: make(map[string]interface{}),
|
||||
}
|
||||
var actions []map[string]interface{}
|
||||
for _, bDef := range m.actionDefs.buildDefs {
|
||||
actions = append(actions, map[string]interface{}{
|
||||
"Inputs": append(
|
||||
getNinjaStringsWithNilPkgNames(bDef.Inputs),
|
||||
getNinjaStringsWithNilPkgNames(bDef.Implicits)...),
|
||||
"Outputs": append(
|
||||
getNinjaStringsWithNilPkgNames(bDef.Outputs),
|
||||
getNinjaStringsWithNilPkgNames(bDef.ImplicitOutputs)...),
|
||||
})
|
||||
}
|
||||
result.Module["Actions"] = actions
|
||||
return result
|
||||
}
|
||||
|
||||
// Gets a list of strings from the given list of ninjaStrings by invoking ninjaString.Value with
|
||||
// nil pkgNames on each of the input ninjaStrings.
|
||||
func getNinjaStringsWithNilPkgNames(nStrs []ninjaString) []string {
|
||||
var strs []string
|
||||
for _, nstr := range nStrs {
|
||||
strs = append(strs, nstr.Value(nil))
|
||||
}
|
||||
return strs
|
||||
}
|
||||
|
||||
// PrintJSONGraph prints info of modules in a JSON file.
|
||||
func (c *Context) PrintJSONGraphAndActions(wGraph io.Writer, wActions io.Writer) {
|
||||
modulesToGraph := make([]*JsonModule, 0)
|
||||
modulesToActions := make([]*JsonModule, 0)
|
||||
for _, m := range c.modulesSorted {
|
||||
jm := jsonModuleFromModuleInfo(m)
|
||||
jmWithActions := jsonModuleWithActionsFromModuleInfo(m)
|
||||
for _, d := range m.directDeps {
|
||||
jm.Deps = append(jm.Deps, jsonDep{
|
||||
jsonModuleName: *jsonModuleNameFromModuleInfo(d.module),
|
||||
Tag: fmt.Sprintf("%T %+v", d.tag, d.tag),
|
||||
})
|
||||
jmWithActions.Deps = append(jmWithActions.Deps, jsonDep{
|
||||
jsonModuleName: jsonModuleName{
|
||||
Name: d.module.Name(),
|
||||
},
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
modules = append(modules, jm)
|
||||
modulesToGraph = append(modulesToGraph, jm)
|
||||
modulesToActions = append(modulesToActions, jmWithActions)
|
||||
}
|
||||
writeJson(wGraph, modulesToGraph)
|
||||
writeJson(wActions, modulesToActions)
|
||||
}
|
||||
|
||||
func writeJson(w io.Writer, modules []*JsonModule) {
|
||||
e := json.NewEncoder(w)
|
||||
e.SetIndent("", "\t")
|
||||
e.Encode(modules)
|
||||
|
|
|
@ -607,39 +607,6 @@ func TestParseFailsForModuleWithoutName(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestFormatJSONDataActions(t *testing.T) {
|
||||
inputs := []string{"fake/input/1", "fake/input/2"}
|
||||
outputs := []string{"fake/output/1", "fake/output/2"}
|
||||
jsonDataActionEmptyInputs := JSONDataAction{
|
||||
Outputs: outputs,
|
||||
}
|
||||
jsonDataActionEmptyOutputs := JSONDataAction{
|
||||
Inputs: inputs,
|
||||
}
|
||||
jsonDataAction := JSONDataAction{
|
||||
Inputs: inputs,
|
||||
Outputs: outputs,
|
||||
}
|
||||
formatData := FormatJSONDataActions([]JSONDataAction{
|
||||
jsonDataActionEmptyInputs, jsonDataActionEmptyOutputs, jsonDataAction})
|
||||
if fmt.Sprint(formatData) != fmt.Sprint([]map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
"Inputs": []string{},
|
||||
"Outputs": outputs,
|
||||
},
|
||||
map[string]interface{}{
|
||||
"Inputs": inputs,
|
||||
"Outputs": []string{},
|
||||
},
|
||||
map[string]interface{}{
|
||||
"Inputs": inputs,
|
||||
"Outputs": outputs,
|
||||
},
|
||||
}) {
|
||||
t.Errorf("The formatted JSON data %s isn't expected.", formatData)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_findVariant(t *testing.T) {
|
||||
module := &moduleInfo{
|
||||
variant: variant{
|
||||
|
|
Loading…
Reference in a new issue