Add support for cc_test.

This behaves slightly differently than it does in the make based build.

1. The make based build manually passes -DGTEST_OS_ANDROID (or
   whatever). gtest-port.h already has logic that does this, so it's a
   no-op.
2. Host libraries are named identically, rather than libgtest_host.

Change-Id: Ic40a1025c698611d202cb7c8ec45abd8fe130065
This commit is contained in:
Dan Albert 2015-03-18 14:01:18 -07:00
parent 512e24f441
commit c403f7ce6d
2 changed files with 89 additions and 8 deletions

View File

@ -227,6 +227,9 @@ type ccModuleType interface {
// Compile objects into final module
compileModule(common.AndroidModuleContext, ccFlags, ccDeps, []string)
// Install the built module.
installModule(common.AndroidModuleContext, ccFlags)
// Return the output file (.o, .a or .so) for use by other modules
outputFile() string
}
@ -307,6 +310,11 @@ func (c *ccBase) GenerateAndroidBuildActions(ctx common.AndroidModuleContext) {
if ctx.Failed() {
return
}
c.ccModuleType().installModule(ctx, flags)
if ctx.Failed() {
return
}
}
func (c *ccBase) ccModuleType() ccModuleType {
@ -940,13 +948,6 @@ func (c *ccLibrary) compileSharedLibrary(ctx common.AndroidModuleContext,
c.out = outputFile
c.exportIncludeDirs = pathtools.PrefixPaths(c.properties.Export_include_dirs,
common.ModuleSrcDir(ctx))
installDir := "lib"
if flags.toolchain.Is64Bit() {
installDir = "lib64"
}
ctx.InstallFile(installDir, outputFile)
}
func (c *ccLibrary) compileModule(ctx common.AndroidModuleContext,
@ -966,6 +967,27 @@ func (c *ccLibrary) compileModule(ctx common.AndroidModuleContext,
}
}
func (c *ccLibrary) installStaticLibrary(ctx common.AndroidModuleContext, flags ccFlags) {
// Static libraries do not get installed.
}
func (c *ccLibrary) installSharedLibrary(ctx common.AndroidModuleContext, flags ccFlags) {
installDir := "lib"
if flags.toolchain.Is64Bit() {
installDir = "lib64"
}
ctx.InstallFile(installDir, c.out)
}
func (c *ccLibrary) installModule(ctx common.AndroidModuleContext, flags ccFlags) {
if c.libraryProperties.IsStatic {
c.installStaticLibrary(ctx, flags)
} else {
c.installSharedLibrary(ctx, flags)
}
}
//
// Objects (for crt*.o)
//
@ -1017,6 +1039,10 @@ func (c *ccObject) compileModule(ctx common.AndroidModuleContext,
ctx.CheckbuildFile(outputFile)
}
func (c *ccObject) installModule(ctx common.AndroidModuleContext, flags ccFlags) {
// Object files do not get installed.
}
func (c *ccObject) outputFile() string {
return c.out
}
@ -1027,6 +1053,7 @@ func (c *ccObject) outputFile() string {
type ccBinary struct {
ccDynamic
out string
binaryProperties binaryProperties
}
@ -1099,12 +1126,61 @@ func (c *ccBinary) compileModule(ctx common.AndroidModuleContext,
}
outputFile := filepath.Join(common.ModuleOutDir(ctx), c.getStem(ctx))
c.out = outputFile
TransformObjToDynamicBinary(ctx, objFiles, deps.sharedLibs, deps.staticLibs,
deps.lateStaticLibs, deps.wholeStaticLibs, deps.crtBegin, deps.crtEnd,
ccFlagsToBuilderFlags(flags), outputFile)
}
ctx.InstallFile("bin", outputFile)
func (c *ccBinary) installModule(ctx common.AndroidModuleContext, flags ccFlags) {
ctx.InstallFile("bin", c.out)
}
type ccTest struct {
ccBinary
}
var (
gtestLibs = []string{"libgtest", "libgtest_main"}
)
func (c *ccTest) collectDeps(ctx common.AndroidModuleContext, flags ccFlags) (ccDeps, ccFlags) {
deps, flags := c.ccBinary.collectDeps(ctx, flags)
flags.cFlags = append(flags.cFlags, "-DGTEST_HAS_STD_STRING")
if c.HostOrDevice().Host() {
flags.cFlags = append(flags.cFlags, "-O0", "-g")
flags.ldLibs = append(flags.ldLibs, "-lpthread")
}
// TODO(danalbert): Make gtest export its dependencies.
flags.includeDirs = append(flags.includeDirs, "external/gtest/include")
_, staticLibs, _ := c.collectDepsFromList(ctx, gtestLibs)
deps.staticLibs = append(deps.staticLibs, staticLibs...)
return deps, flags
}
func (c *ccTest) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string {
ctx.AddVariationDependencies([]blueprint.Variation{{"link", "static"}}, gtestLibs...)
deps := c.ccBinary.AndroidDynamicDependencies(ctx)
return append(deps, gtestLibs...)
}
func (c *ccTest) installModule(ctx common.AndroidModuleContext, flags ccFlags) {
if c.HostOrDevice().Device() {
ctx.InstallFile("../data/nativetest/" + ctx.ModuleName(), c.out)
} else {
c.ccBinary.installModule(ctx, flags)
}
}
func NewCCTest() (blueprint.Module, []interface{}) {
module := &ccTest{}
return newCCDynamic(&module.ccDynamic, module, common.HostAndDeviceSupported,
common.MultilibFirst, &module.binaryProperties)
}
//
@ -1198,6 +1274,10 @@ func (c *toolchainLibrary) compileModule(ctx common.AndroidModuleContext,
ctx.CheckbuildFile(outputFile)
}
func (c *toolchainLibrary) installModule(ctx common.AndroidModuleContext, flags ccFlags) {
// Toolchain libraries do not get installed.
}
func LinkageMutator(mctx blueprint.EarlyMutatorContext) {
if c, ok := mctx.Module().(*ccLibrary); ok {
var modules []blueprint.Module

View File

@ -42,6 +42,7 @@ func main() {
ctx.RegisterModuleType("cc_library", cc.NewCCLibrary)
ctx.RegisterModuleType("cc_object", cc.NewCCObject)
ctx.RegisterModuleType("cc_binary", cc.NewCCBinary)
ctx.RegisterModuleType("cc_test", cc.NewCCTest)
ctx.RegisterModuleType("toolchain_library", cc.NewToolchainLibrary)