From c9770d6a9cbffe166b0c7a2fe8049eb36b1682db Mon Sep 17 00:00:00 2001 From: Inseob Kim Date: Fri, 15 Jan 2021 18:04:20 +0900 Subject: [PATCH] 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 --- sysprop/sysprop_library.go | 70 ++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/sysprop/sysprop_library.go b/sysprop/sysprop_library.go index 38306adfc..2ccce1524 100644 --- a/sysprop/sysprop_library.go +++ b/sysprop/sysprop_library.go @@ -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()