Allow sysprop library API files to be missing

If sysprop library contains only internal properties, the API txt file
will be empty. This allows the API files to be missing in such cases to
turn off API-Review bit.

Bug: 177036449
Test: manual test
Change-Id: I8cb0b10e135cf211dae45ab14ccc9bc04e248634
This commit is contained in:
Inseob Kim 2021-01-15 18:04:20 +09:00
parent 2463ec5ad5
commit c9770d6a9c

View file

@ -19,6 +19,7 @@ package sysprop
import (
"fmt"
"io"
"os"
"path"
"sync"
@ -125,8 +126,8 @@ type syspropLibrary struct {
properties syspropLibraryProperties
checkApiFileTimeStamp android.WritablePath
latestApiFile android.Path
currentApiFile android.Path
latestApiFile android.OptionalPath
currentApiFile android.OptionalPath
dumpedApiFile android.WritablePath
}
@ -224,7 +225,7 @@ func (m *syspropLibrary) HasPublicStub() bool {
return proptools.Bool(m.properties.Public_stub)
}
func (m *syspropLibrary) CurrentSyspropApiFile() android.Path {
func (m *syspropLibrary) CurrentSyspropApiFile() android.OptionalPath {
return m.currentApiFile
}
@ -243,8 +244,11 @@ func (m *syspropLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext)
return
}
m.currentApiFile = android.PathForSource(ctx, ctx.ModuleDir(), "api", baseModuleName+"-current.txt")
m.latestApiFile = android.PathForSource(ctx, ctx.ModuleDir(), "api", baseModuleName+"-latest.txt")
apiDirectoryPath := path.Join(ctx.ModuleDir(), "api")
currentApiFilePath := path.Join(apiDirectoryPath, baseModuleName+"-current.txt")
latestApiFilePath := path.Join(apiDirectoryPath, baseModuleName+"-latest.txt")
m.currentApiFile = android.ExistentPathForSource(ctx, currentApiFilePath)
m.latestApiFile = android.ExistentPathForSource(ctx, latestApiFilePath)
// dump API rule
rule := android.NewRuleBuilder(pctx, ctx)
@ -258,19 +262,37 @@ func (m *syspropLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext)
// check API rule
rule = android.NewRuleBuilder(pctx, ctx)
// We allow that the API txt files don't exist, when the sysprop_library only contains internal
// properties. But we have to feed current api file and latest api file to the rule builder.
// Currently we can't get android.Path representing the null device, so we add any existing API
// txt files to implicits, and then directly feed string paths, rather than calling Input(Path)
// method.
var apiFileList android.Paths
currentApiArgument := os.DevNull
if m.currentApiFile.Valid() {
apiFileList = append(apiFileList, m.currentApiFile.Path())
currentApiArgument = m.currentApiFile.String()
}
latestApiArgument := os.DevNull
if m.latestApiFile.Valid() {
apiFileList = append(apiFileList, m.latestApiFile.Path())
latestApiArgument = m.latestApiFile.String()
}
// 1. compares current.txt to api-dump.txt
// current.txt should be identical to api-dump.txt.
msg := fmt.Sprintf(`\n******************************\n`+
`API of sysprop_library %s doesn't match with current.txt\n`+
`Please update current.txt by:\n`+
`m %s-dump-api && rm -rf %q && cp -f %q %q\n`+
`m %s-dump-api && mkdir -p %q && rm -rf %q && cp -f %q %q\n`+
`******************************\n`, baseModuleName, baseModuleName,
m.currentApiFile.String(), m.dumpedApiFile.String(), m.currentApiFile.String())
apiDirectoryPath, currentApiFilePath, m.dumpedApiFile.String(), currentApiFilePath)
rule.Command().
Text("( cmp").Flag("-s").
Input(m.dumpedApiFile).
Input(m.currentApiFile).
Text(currentApiArgument).
Text("|| ( echo").Flag("-e").
Flag(`"` + msg + `"`).
Text("; exit 38) )")
@ -285,11 +307,12 @@ func (m *syspropLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext)
rule.Command().
Text("( ").
BuiltTool("sysprop_api_checker").
Input(m.latestApiFile).
Input(m.currentApiFile).
Text(latestApiArgument).
Text(currentApiArgument).
Text(" || ( echo").Flag("-e").
Flag(`"` + msg + `"`).
Text("; exit 38) )")
Text("; exit 38) )").
Implicits(apiFileList)
m.checkApiFileTimeStamp = android.PathForModuleOut(ctx, "check_api.timestamp")
@ -393,31 +416,6 @@ func syspropLibraryHook(ctx android.LoadHookContext, m *syspropLibrary) {
ctx.PropertyErrorf("srcs", "sysprop_library must specify srcs")
}
missingApi := false
for _, txt := range []string{"-current.txt", "-latest.txt"} {
path := path.Join(ctx.ModuleDir(), "api", m.BaseModuleName()+txt)
file := android.ExistentPathForSource(ctx, path)
if !file.Valid() {
ctx.ModuleErrorf("API file %#v doesn't exist", path)
missingApi = true
}
}
if missingApi {
script := "build/soong/scripts/gen-sysprop-api-files.sh"
p := android.ExistentPathForSource(ctx, script)
if !p.Valid() {
panic(fmt.Sprintf("script file %s doesn't exist", script))
}
ctx.ModuleErrorf("One or more api files are missing. "+
"You can create them by:\n"+
"%s %q %q", script, ctx.ModuleDir(), m.BaseModuleName())
return
}
// ctx's Platform or Specific functions represent where this sysprop_library installed.
installedInSystem := ctx.Platform() || ctx.SystemExtSpecific()
installedInVendorOrOdm := ctx.SocSpecific() || ctx.DeviceSpecific()