Merge "Handle simple prebuilt static libraries from bazel" am: 76579e0e9a
am: 70a88424ba
am: 8d77e0b2fd
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1664542 Change-Id: Ib330bfb45d699a0541c12362939ad780f4057a01
This commit is contained in:
commit
2a35da912e
|
@ -69,6 +69,10 @@ type BazelContext interface {
|
||||||
// Returns the results of GetOutputFiles and GetCcObjectFiles in a single query (in that order).
|
// Returns the results of GetOutputFiles and GetCcObjectFiles in a single query (in that order).
|
||||||
GetOutputFilesAndCcObjectFiles(label string, archType ArchType) ([]string, []string, bool)
|
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)
|
||||||
|
|
||||||
// ** End cquery methods
|
// ** End cquery methods
|
||||||
|
|
||||||
// Issues commands to Bazel to receive results for all cquery requests
|
// Issues commands to Bazel to receive results for all cquery requests
|
||||||
|
@ -126,6 +130,11 @@ func (m MockBazelContext) GetOutputFilesAndCcObjectFiles(label string, archType
|
||||||
return result, result, ok
|
return result, result, ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m MockBazelContext) GetPrebuiltCcStaticLibraryFiles(label string, archType ArchType) ([]string, bool) {
|
||||||
|
result, ok := m.AllFiles[label]
|
||||||
|
return result, ok
|
||||||
|
}
|
||||||
|
|
||||||
func (m MockBazelContext) InvokeBazel() error {
|
func (m MockBazelContext) InvokeBazel() error {
|
||||||
panic("unimplemented")
|
panic("unimplemented")
|
||||||
}
|
}
|
||||||
|
@ -169,6 +178,19 @@ func (bazelCtx *bazelContext) GetOutputFilesAndCcObjectFiles(label string, archT
|
||||||
return outputFiles, ccObjects, ok
|
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)
|
||||||
|
if !ok {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
bazelOutput := strings.TrimSpace(result)
|
||||||
|
ret := cquery.GetPrebuiltCcStaticLibraryFiles.ParseResult(bazelOutput)
|
||||||
|
return ret, ok
|
||||||
|
}
|
||||||
|
|
||||||
func (n noopBazelContext) GetOutputFiles(label string, archType ArchType) ([]string, bool) {
|
func (n noopBazelContext) GetOutputFiles(label string, archType ArchType) ([]string, bool) {
|
||||||
panic("unimplemented")
|
panic("unimplemented")
|
||||||
}
|
}
|
||||||
|
@ -177,6 +199,10 @@ func (n noopBazelContext) GetOutputFilesAndCcObjectFiles(label string, archType
|
||||||
panic("unimplemented")
|
panic("unimplemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n noopBazelContext) GetPrebuiltCcStaticLibraryFiles(label string, archType ArchType) ([]string, bool) {
|
||||||
|
panic("unimplemented")
|
||||||
|
}
|
||||||
|
|
||||||
func (n noopBazelContext) InvokeBazel() error {
|
func (n noopBazelContext) InvokeBazel() error {
|
||||||
panic("unimplemented")
|
panic("unimplemented")
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
GetOutputFiles = &getOutputFilesRequestType{}
|
GetOutputFiles = &getOutputFilesRequestType{}
|
||||||
GetOutputFilesAndCcObjectFiles = &getOutputFilesAndCcObjectFilesType{}
|
GetOutputFilesAndCcObjectFiles = &getOutputFilesAndCcObjectFilesType{}
|
||||||
|
GetPrebuiltCcStaticLibraryFiles = &getPrebuiltCcStaticLibraryFiles{}
|
||||||
)
|
)
|
||||||
|
|
||||||
type GetOutputFilesAndCcObjectFiles_Result struct {
|
type GetOutputFilesAndCcObjectFiles_Result struct {
|
||||||
|
@ -86,6 +87,34 @@ func (g getOutputFilesAndCcObjectFilesType) ParseResult(rawString string) GetOut
|
||||||
return GetOutputFilesAndCcObjectFiles_Result{outputFiles, ccObjects}
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
// splitOrEmpty is a modification of strings.Split() that returns an empty list
|
||||||
// if the given string is empty.
|
// if the given string is empty.
|
||||||
func splitOrEmpty(s string, sep string) []string {
|
func splitOrEmpty(s string, sep string) []string {
|
||||||
|
|
|
@ -305,6 +305,7 @@ func PrebuiltStaticLibraryFactory() android.Module {
|
||||||
func NewPrebuiltStaticLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
|
func NewPrebuiltStaticLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
|
||||||
module, library := NewPrebuiltLibrary(hod)
|
module, library := NewPrebuiltLibrary(hod)
|
||||||
library.BuildOnlyStatic()
|
library.BuildOnlyStatic()
|
||||||
|
module.bazelHandler = &prebuiltStaticLibraryBazelHandler{module: module, library: library}
|
||||||
return module, library
|
return module, library
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,6 +320,52 @@ type prebuiltObjectLinker struct {
|
||||||
properties prebuiltObjectProperties
|
properties prebuiltObjectProperties
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type prebuiltStaticLibraryBazelHandler struct {
|
||||||
|
bazelHandler
|
||||||
|
|
||||||
|
module *Module
|
||||||
|
library *libraryDecorator
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *prebuiltStaticLibraryBazelHandler) generateBazelBuildActions(ctx android.ModuleContext, label string) bool {
|
||||||
|
bazelCtx := ctx.Config().BazelContext
|
||||||
|
staticLibs, ok := bazelCtx.GetPrebuiltCcStaticLibraryFiles(label, ctx.Arch().ArchType)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if len(staticLibs) > 1 {
|
||||||
|
ctx.ModuleErrorf("expected 1 static library from bazel target %q, got %s", label, staticLibs)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(b/184543518): cc_prebuilt_library_static may have properties for re-exporting flags
|
||||||
|
|
||||||
|
// TODO(eakammer):Add stub-related flags if this library is a stub library.
|
||||||
|
// h.library.exportVersioningMacroIfNeeded(ctx)
|
||||||
|
|
||||||
|
// Dependencies on this library will expect collectedSnapshotHeaders to be set, otherwise
|
||||||
|
// validation will fail. For now, set this to an empty list.
|
||||||
|
// TODO(cparsons): More closely mirror the collectHeadersForSnapshot implementation.
|
||||||
|
h.library.collectedSnapshotHeaders = android.Paths{}
|
||||||
|
|
||||||
|
if len(staticLibs) == 0 {
|
||||||
|
h.module.outputFile = android.OptionalPath{}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
out := android.PathForBazelOut(ctx, staticLibs[0])
|
||||||
|
h.module.outputFile = android.OptionalPathForPath(out)
|
||||||
|
|
||||||
|
depSet := android.NewDepSetBuilder(android.TOPOLOGICAL).Direct(out).Build()
|
||||||
|
ctx.SetProvider(StaticLibraryInfoProvider, StaticLibraryInfo{
|
||||||
|
StaticLibrary: out,
|
||||||
|
|
||||||
|
TransitiveStaticLibrariesForOrdering: depSet,
|
||||||
|
})
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (p *prebuiltObjectLinker) prebuilt() *android.Prebuilt {
|
func (p *prebuiltObjectLinker) prebuilt() *android.Prebuilt {
|
||||||
return &p.Prebuilt
|
return &p.Prebuilt
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue