Loading android/bazel_handler.go +10 −38 Original line number Diff line number Diff line Loading @@ -67,11 +67,7 @@ type BazelContext interface { // TODO(cparsons): Other cquery-related methods should be added here. // Returns the results of GetOutputFiles and GetCcObjectFiles in a single query (in that order). GetOutputFilesAndCcObjectFiles(label string, archType ArchType) ([]string, []string, bool) // GetPrebuiltCcStaticLibraryFiles returns paths to prebuilt cc static libraries, and whether the // results were available GetPrebuiltCcStaticLibraryFiles(label string, archType ArchType) ([]string, bool) GetCcInfo(label string, archType ArchType) (cquery.CcInfo, bool) // ** End cquery methods Loading Loading @@ -128,8 +124,7 @@ type MockBazelContext struct { OutputBaseDir string LabelToOutputFiles map[string][]string LabelToOutputFilesAndCcObjectFiles map[string]cquery.GetOutputFilesAndCcObjectFiles_Result LabelToCcStaticLibraryFiles map[string][]string LabelToCcInfo map[string]cquery.CcInfo } func (m MockBazelContext) GetOutputFiles(label string, archType ArchType) ([]string, bool) { Loading @@ -137,13 +132,8 @@ func (m MockBazelContext) GetOutputFiles(label string, archType ArchType) ([]str return result, ok } func (m MockBazelContext) GetOutputFilesAndCcObjectFiles(label string, archType ArchType) ([]string, []string, bool) { result, ok := m.LabelToOutputFilesAndCcObjectFiles[label] return result.OutputFiles, result.CcObjectFiles, ok } func (m MockBazelContext) GetPrebuiltCcStaticLibraryFiles(label string, archType ArchType) ([]string, bool) { result, ok := m.LabelToCcStaticLibraryFiles[label] func (m MockBazelContext) GetCcInfo(label string, archType ArchType) (cquery.CcInfo, bool) { result, ok := m.LabelToCcInfo[label] return result, ok } Loading Loading @@ -173,39 +163,21 @@ func (bazelCtx *bazelContext) GetOutputFiles(label string, archType ArchType) ([ return ret, ok } func (bazelCtx *bazelContext) GetOutputFilesAndCcObjectFiles(label string, archType ArchType) ([]string, []string, bool) { var outputFiles []string var ccObjects []string result, ok := bazelCtx.cquery(label, cquery.GetOutputFilesAndCcObjectFiles, archType) if ok { bazelOutput := strings.TrimSpace(result) returnResult := cquery.GetOutputFilesAndCcObjectFiles.ParseResult(bazelOutput) outputFiles = returnResult.OutputFiles ccObjects = returnResult.CcObjectFiles } return outputFiles, ccObjects, ok } // GetPrebuiltCcStaticLibraryFiles returns a slice of prebuilt static libraries for the given // label/archType if there are query results; otherwise, it enqueues the query and returns false. func (bazelCtx *bazelContext) GetPrebuiltCcStaticLibraryFiles(label string, archType ArchType) ([]string, bool) { result, ok := bazelCtx.cquery(label, cquery.GetPrebuiltCcStaticLibraryFiles, archType) func (bazelCtx *bazelContext) GetCcInfo(label string, archType ArchType) (cquery.CcInfo, bool) { result, ok := bazelCtx.cquery(label, cquery.GetCcInfo, archType) if !ok { return nil, false return cquery.CcInfo{}, ok } bazelOutput := strings.TrimSpace(result) ret := cquery.GetPrebuiltCcStaticLibraryFiles.ParseResult(bazelOutput) return ret, ok return cquery.GetCcInfo.ParseResult(bazelOutput), ok } func (n noopBazelContext) GetOutputFiles(label string, archType ArchType) ([]string, bool) { panic("unimplemented") } func (n noopBazelContext) GetOutputFilesAndCcObjectFiles(label string, archType ArchType) ([]string, []string, bool) { func (n noopBazelContext) GetCcInfo(label string, archType ArchType) (cquery.CcInfo, bool) { panic("unimplemented") } Loading bazel/cquery/request_type.go +30 −42 Original line number Diff line number Diff line Loading @@ -6,13 +6,13 @@ import ( var ( GetOutputFiles = &getOutputFilesRequestType{} GetOutputFilesAndCcObjectFiles = &getOutputFilesAndCcObjectFilesType{} GetPrebuiltCcStaticLibraryFiles = &getPrebuiltCcStaticLibraryFiles{} GetCcInfo = &getCcInfoType{} ) type GetOutputFilesAndCcObjectFiles_Result struct { type CcInfo struct { OutputFiles []string CcObjectFiles []string CcStaticLibraryFiles []string } type getOutputFilesRequestType struct{} Loading Loading @@ -42,12 +42,12 @@ func (g getOutputFilesRequestType) ParseResult(rawString string) []string { return strings.Split(rawString, ", ") } type getOutputFilesAndCcObjectFilesType struct{} type getCcInfoType struct{} // Name returns a string name for this request type. Such request type names must be unique, // and must only consist of alphanumeric characters. func (g getOutputFilesAndCcObjectFilesType) Name() string { return "getOutputFilesAndCcObjectFiles" func (g getCcInfoType) Name() string { return "getCcInfo" } // StarlarkFunctionBody returns a starlark function body to process this request type. Loading @@ -58,61 +58,49 @@ func (g getOutputFilesAndCcObjectFilesType) Name() string { // - `target` is the only parameter to this function (a configured target). // - The return value must be a string. // - The function body should not be indented outside of its own scope. func (g getOutputFilesAndCcObjectFilesType) StarlarkFunctionBody() string { func (g getCcInfoType) StarlarkFunctionBody() string { return ` outputFiles = [f.path for f in target.files.to_list()] ccObjectFiles = [] staticLibraries = [] linker_inputs = providers(target)["CcInfo"].linking_context.linker_inputs.to_list() for linker_input in linker_inputs: for library in linker_input.libraries: for object in library.objects: ccObjectFiles += [object.path] return ', '.join(outputFiles) + "|" + ', '.join(ccObjectFiles)` if library.static_library: staticLibraries.append(library.static_library.path) returns = [ outputFiles, staticLibraries, ccObjectFiles, ] return "|".join([", ".join(r) for r in returns])` } // ParseResult returns a value obtained by parsing the result of the request's Starlark function. // The given rawString must correspond to the string output which was created by evaluating the // Starlark given in StarlarkFunctionBody. func (g getOutputFilesAndCcObjectFilesType) ParseResult(rawString string) GetOutputFilesAndCcObjectFiles_Result { func (g getCcInfoType) ParseResult(rawString string) CcInfo { var outputFiles []string var ccObjects []string splitString := strings.Split(rawString, "|") outputFilesString := splitString[0] ccObjectsString := splitString[1] ccStaticLibrariesString := splitString[1] ccObjectsString := splitString[2] outputFiles = splitOrEmpty(outputFilesString, ", ") ccStaticLibraries := splitOrEmpty(ccStaticLibrariesString, ", ") ccObjects = splitOrEmpty(ccObjectsString, ", ") return GetOutputFilesAndCcObjectFiles_Result{outputFiles, ccObjects} } type getPrebuiltCcStaticLibraryFiles struct{} // Name returns the name of the starlark function to get prebuilt cc static library files func (g getPrebuiltCcStaticLibraryFiles) Name() string { return "getPrebuiltCcStaticLibraryFiles" return CcInfo{ OutputFiles: outputFiles, CcObjectFiles: ccObjects, CcStaticLibraryFiles: ccStaticLibraries, } // StarlarkFunctionBody returns the unindented body of a starlark function for extracting the static // library paths from a cc_import module. func (g getPrebuiltCcStaticLibraryFiles) StarlarkFunctionBody() string { return ` linker_inputs = providers(target)["CcInfo"].linking_context.linker_inputs.to_list() static_libraries = [] for linker_input in linker_inputs: for library in linker_input.libraries: static_libraries.append(library.static_library.path) return ', '.join(static_libraries)` } // ParseResult returns a slice of bazel output paths to static libraries if any exist for the given // rawString corresponding to the string output which was created by evaluating the // StarlarkFunctionBody. func (g getPrebuiltCcStaticLibraryFiles) ParseResult(rawString string) []string { return strings.Split(rawString, ", ") } // splitOrEmpty is a modification of strings.Split() that returns an empty list Loading cc/library.go +3 −1 Original line number Diff line number Diff line Loading @@ -483,7 +483,9 @@ type staticLibraryBazelHandler struct { func (handler *staticLibraryBazelHandler) generateBazelBuildActions(ctx android.ModuleContext, label string) bool { bazelCtx := ctx.Config().BazelContext outputPaths, objPaths, ok := bazelCtx.GetOutputFilesAndCcObjectFiles(label, ctx.Arch().ArchType) ccInfo, ok := bazelCtx.GetCcInfo(label, ctx.Arch().ArchType) outputPaths := ccInfo.OutputFiles objPaths := ccInfo.CcObjectFiles if !ok { return ok } Loading cc/prebuilt.go +2 −1 Original line number Diff line number Diff line Loading @@ -329,7 +329,8 @@ type prebuiltStaticLibraryBazelHandler struct { func (h *prebuiltStaticLibraryBazelHandler) generateBazelBuildActions(ctx android.ModuleContext, label string) bool { bazelCtx := ctx.Config().BazelContext staticLibs, ok := bazelCtx.GetPrebuiltCcStaticLibraryFiles(label, ctx.Arch().ArchType) ccInfo, ok := bazelCtx.GetCcInfo(label, ctx.Arch().ArchType) staticLibs := ccInfo.CcStaticLibraryFiles if !ok { return false } Loading Loading
android/bazel_handler.go +10 −38 Original line number Diff line number Diff line Loading @@ -67,11 +67,7 @@ type BazelContext interface { // TODO(cparsons): Other cquery-related methods should be added here. // Returns the results of GetOutputFiles and GetCcObjectFiles in a single query (in that order). GetOutputFilesAndCcObjectFiles(label string, archType ArchType) ([]string, []string, bool) // GetPrebuiltCcStaticLibraryFiles returns paths to prebuilt cc static libraries, and whether the // results were available GetPrebuiltCcStaticLibraryFiles(label string, archType ArchType) ([]string, bool) GetCcInfo(label string, archType ArchType) (cquery.CcInfo, bool) // ** End cquery methods Loading Loading @@ -128,8 +124,7 @@ type MockBazelContext struct { OutputBaseDir string LabelToOutputFiles map[string][]string LabelToOutputFilesAndCcObjectFiles map[string]cquery.GetOutputFilesAndCcObjectFiles_Result LabelToCcStaticLibraryFiles map[string][]string LabelToCcInfo map[string]cquery.CcInfo } func (m MockBazelContext) GetOutputFiles(label string, archType ArchType) ([]string, bool) { Loading @@ -137,13 +132,8 @@ func (m MockBazelContext) GetOutputFiles(label string, archType ArchType) ([]str return result, ok } func (m MockBazelContext) GetOutputFilesAndCcObjectFiles(label string, archType ArchType) ([]string, []string, bool) { result, ok := m.LabelToOutputFilesAndCcObjectFiles[label] return result.OutputFiles, result.CcObjectFiles, ok } func (m MockBazelContext) GetPrebuiltCcStaticLibraryFiles(label string, archType ArchType) ([]string, bool) { result, ok := m.LabelToCcStaticLibraryFiles[label] func (m MockBazelContext) GetCcInfo(label string, archType ArchType) (cquery.CcInfo, bool) { result, ok := m.LabelToCcInfo[label] return result, ok } Loading Loading @@ -173,39 +163,21 @@ func (bazelCtx *bazelContext) GetOutputFiles(label string, archType ArchType) ([ return ret, ok } func (bazelCtx *bazelContext) GetOutputFilesAndCcObjectFiles(label string, archType ArchType) ([]string, []string, bool) { var outputFiles []string var ccObjects []string result, ok := bazelCtx.cquery(label, cquery.GetOutputFilesAndCcObjectFiles, archType) if ok { bazelOutput := strings.TrimSpace(result) returnResult := cquery.GetOutputFilesAndCcObjectFiles.ParseResult(bazelOutput) outputFiles = returnResult.OutputFiles ccObjects = returnResult.CcObjectFiles } return outputFiles, ccObjects, ok } // GetPrebuiltCcStaticLibraryFiles returns a slice of prebuilt static libraries for the given // label/archType if there are query results; otherwise, it enqueues the query and returns false. func (bazelCtx *bazelContext) GetPrebuiltCcStaticLibraryFiles(label string, archType ArchType) ([]string, bool) { result, ok := bazelCtx.cquery(label, cquery.GetPrebuiltCcStaticLibraryFiles, archType) func (bazelCtx *bazelContext) GetCcInfo(label string, archType ArchType) (cquery.CcInfo, bool) { result, ok := bazelCtx.cquery(label, cquery.GetCcInfo, archType) if !ok { return nil, false return cquery.CcInfo{}, ok } bazelOutput := strings.TrimSpace(result) ret := cquery.GetPrebuiltCcStaticLibraryFiles.ParseResult(bazelOutput) return ret, ok return cquery.GetCcInfo.ParseResult(bazelOutput), ok } func (n noopBazelContext) GetOutputFiles(label string, archType ArchType) ([]string, bool) { panic("unimplemented") } func (n noopBazelContext) GetOutputFilesAndCcObjectFiles(label string, archType ArchType) ([]string, []string, bool) { func (n noopBazelContext) GetCcInfo(label string, archType ArchType) (cquery.CcInfo, bool) { panic("unimplemented") } Loading
bazel/cquery/request_type.go +30 −42 Original line number Diff line number Diff line Loading @@ -6,13 +6,13 @@ import ( var ( GetOutputFiles = &getOutputFilesRequestType{} GetOutputFilesAndCcObjectFiles = &getOutputFilesAndCcObjectFilesType{} GetPrebuiltCcStaticLibraryFiles = &getPrebuiltCcStaticLibraryFiles{} GetCcInfo = &getCcInfoType{} ) type GetOutputFilesAndCcObjectFiles_Result struct { type CcInfo struct { OutputFiles []string CcObjectFiles []string CcStaticLibraryFiles []string } type getOutputFilesRequestType struct{} Loading Loading @@ -42,12 +42,12 @@ func (g getOutputFilesRequestType) ParseResult(rawString string) []string { return strings.Split(rawString, ", ") } type getOutputFilesAndCcObjectFilesType struct{} type getCcInfoType struct{} // Name returns a string name for this request type. Such request type names must be unique, // and must only consist of alphanumeric characters. func (g getOutputFilesAndCcObjectFilesType) Name() string { return "getOutputFilesAndCcObjectFiles" func (g getCcInfoType) Name() string { return "getCcInfo" } // StarlarkFunctionBody returns a starlark function body to process this request type. Loading @@ -58,61 +58,49 @@ func (g getOutputFilesAndCcObjectFilesType) Name() string { // - `target` is the only parameter to this function (a configured target). // - The return value must be a string. // - The function body should not be indented outside of its own scope. func (g getOutputFilesAndCcObjectFilesType) StarlarkFunctionBody() string { func (g getCcInfoType) StarlarkFunctionBody() string { return ` outputFiles = [f.path for f in target.files.to_list()] ccObjectFiles = [] staticLibraries = [] linker_inputs = providers(target)["CcInfo"].linking_context.linker_inputs.to_list() for linker_input in linker_inputs: for library in linker_input.libraries: for object in library.objects: ccObjectFiles += [object.path] return ', '.join(outputFiles) + "|" + ', '.join(ccObjectFiles)` if library.static_library: staticLibraries.append(library.static_library.path) returns = [ outputFiles, staticLibraries, ccObjectFiles, ] return "|".join([", ".join(r) for r in returns])` } // ParseResult returns a value obtained by parsing the result of the request's Starlark function. // The given rawString must correspond to the string output which was created by evaluating the // Starlark given in StarlarkFunctionBody. func (g getOutputFilesAndCcObjectFilesType) ParseResult(rawString string) GetOutputFilesAndCcObjectFiles_Result { func (g getCcInfoType) ParseResult(rawString string) CcInfo { var outputFiles []string var ccObjects []string splitString := strings.Split(rawString, "|") outputFilesString := splitString[0] ccObjectsString := splitString[1] ccStaticLibrariesString := splitString[1] ccObjectsString := splitString[2] outputFiles = splitOrEmpty(outputFilesString, ", ") ccStaticLibraries := splitOrEmpty(ccStaticLibrariesString, ", ") ccObjects = splitOrEmpty(ccObjectsString, ", ") return GetOutputFilesAndCcObjectFiles_Result{outputFiles, ccObjects} } type getPrebuiltCcStaticLibraryFiles struct{} // Name returns the name of the starlark function to get prebuilt cc static library files func (g getPrebuiltCcStaticLibraryFiles) Name() string { return "getPrebuiltCcStaticLibraryFiles" return CcInfo{ OutputFiles: outputFiles, CcObjectFiles: ccObjects, CcStaticLibraryFiles: ccStaticLibraries, } // StarlarkFunctionBody returns the unindented body of a starlark function for extracting the static // library paths from a cc_import module. func (g getPrebuiltCcStaticLibraryFiles) StarlarkFunctionBody() string { return ` linker_inputs = providers(target)["CcInfo"].linking_context.linker_inputs.to_list() static_libraries = [] for linker_input in linker_inputs: for library in linker_input.libraries: static_libraries.append(library.static_library.path) return ', '.join(static_libraries)` } // ParseResult returns a slice of bazel output paths to static libraries if any exist for the given // rawString corresponding to the string output which was created by evaluating the // StarlarkFunctionBody. func (g getPrebuiltCcStaticLibraryFiles) ParseResult(rawString string) []string { return strings.Split(rawString, ", ") } // splitOrEmpty is a modification of strings.Split() that returns an empty list Loading
cc/library.go +3 −1 Original line number Diff line number Diff line Loading @@ -483,7 +483,9 @@ type staticLibraryBazelHandler struct { func (handler *staticLibraryBazelHandler) generateBazelBuildActions(ctx android.ModuleContext, label string) bool { bazelCtx := ctx.Config().BazelContext outputPaths, objPaths, ok := bazelCtx.GetOutputFilesAndCcObjectFiles(label, ctx.Arch().ArchType) ccInfo, ok := bazelCtx.GetCcInfo(label, ctx.Arch().ArchType) outputPaths := ccInfo.OutputFiles objPaths := ccInfo.CcObjectFiles if !ok { return ok } Loading
cc/prebuilt.go +2 −1 Original line number Diff line number Diff line Loading @@ -329,7 +329,8 @@ type prebuiltStaticLibraryBazelHandler struct { func (h *prebuiltStaticLibraryBazelHandler) generateBazelBuildActions(ctx android.ModuleContext, label string) bool { bazelCtx := ctx.Config().BazelContext staticLibs, ok := bazelCtx.GetPrebuiltCcStaticLibraryFiles(label, ctx.Arch().ArchType) ccInfo, ok := bazelCtx.GetCcInfo(label, ctx.Arch().ArchType) staticLibs := ccInfo.CcStaticLibraryFiles if !ok { return false } Loading