From c403f7ce6dc31d4f39af25862b782508e2cf1026 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Wed, 18 Mar 2015 14:01:18 -0700 Subject: [PATCH] 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 --- cc/cc.go | 96 +++++++++++++++++++++++++++++++++++++---- cmd/soong_build/main.go | 1 + 2 files changed, 89 insertions(+), 8 deletions(-) diff --git a/cc/cc.go b/cc/cc.go index 1ebd762e5..a9ed2051a 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -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 diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go index 5c954a92b..d158f75ea 100644 --- a/cmd/soong_build/main.go +++ b/cmd/soong_build/main.go @@ -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)