Use soong_cc_prebuilt.mk instead of prebuilt.mk for Soong cc modules
Export Soong cc modules to Make using a new soong_cc_prebuilt.mk that
bypasses all of prebuilt_internal.mk, dynamic_binary.mk and binary.mk.
This also means that stripping is handled in Soong instead of Make.
Bug: 113936524
Test: m checkbuild
Change-Id: If9008c50920779048480f5eeeb0084f26006c998
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 9258bd4..bb82529 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -60,24 +60,17 @@
ret := android.AndroidMkData{
OutputFile: c.outputFile,
Required: c.Properties.AndroidMkRuntimeLibs,
+ Include: "$(BUILD_SYSTEM)/soong_cc_prebuilt.mk",
Extra: []android.AndroidMkExtraFunc{
func(w io.Writer, outputFile android.Path) {
if len(c.Properties.Logtags) > 0 {
fmt.Fprintln(w, "LOCAL_LOGTAGS_FILES :=", strings.Join(c.Properties.Logtags, " "))
}
- fmt.Fprintln(w, "LOCAL_SANITIZE := never")
if len(c.Properties.AndroidMkSharedLibs) > 0 {
fmt.Fprintln(w, "LOCAL_SHARED_LIBRARIES := "+strings.Join(c.Properties.AndroidMkSharedLibs, " "))
}
- if c.Target().Os == android.Android &&
- String(c.Properties.Sdk_version) != "" && !c.useVndk() && !c.inRecovery() {
- fmt.Fprintln(w, "LOCAL_SDK_VERSION := "+String(c.Properties.Sdk_version))
- fmt.Fprintln(w, "LOCAL_NDK_STL_VARIANT := none")
- } else {
- // These are already included in LOCAL_SHARED_LIBRARIES
- fmt.Fprintln(w, "LOCAL_CXX_STL := none")
- }
+ fmt.Fprintln(w, "LOCAL_SOONG_LINK_TYPE :=", c.getMakeLinkType())
if c.useVndk() {
fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
}
@@ -140,44 +133,13 @@
if library.static() {
ret.Class = "STATIC_LIBRARIES"
} else if library.shared() {
- ctx.subAndroidMk(ret, &library.stripper)
-
ret.Class = "SHARED_LIBRARIES"
+ ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
+ fmt.Fprintln(w, "LOCAL_SOONG_TOC :=", library.toc().String())
+ fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", library.unstrippedOutputFile.String())
+ })
} else if library.header() {
- ret.Custom = func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
- fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)")
- fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir)
- fmt.Fprintln(w, "LOCAL_MODULE :=", name+data.SubName)
-
- archStr := ctx.Target().Arch.ArchType.String()
- var host bool
- switch ctx.Target().Os.Class {
- case android.Host:
- fmt.Fprintln(w, "LOCAL_MODULE_HOST_ARCH := ", archStr)
- host = true
- case android.HostCross:
- fmt.Fprintln(w, "LOCAL_MODULE_HOST_CROSS_ARCH := ", archStr)
- host = true
- case android.Device:
- fmt.Fprintln(w, "LOCAL_MODULE_TARGET_ARCH := ", archStr)
- }
-
- if host {
- makeOs := ctx.Target().Os.String()
- if ctx.Target().Os == android.Linux || ctx.Target().Os == android.LinuxBionic {
- makeOs = "linux"
- }
- fmt.Fprintln(w, "LOCAL_MODULE_HOST_OS :=", makeOs)
- fmt.Fprintln(w, "LOCAL_IS_HOST_MODULE := true")
- } else if ctx.useVndk() {
- fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
- }
-
- library.androidMkWriteExportedFlags(w)
- fmt.Fprintln(w, "include $(BUILD_HEADER_LIBRARY)")
- }
-
- return
+ ret.Class = "HEADER_LIBRARIES"
}
ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
@@ -195,8 +157,6 @@
fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+ext)
- fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
-
if library.coverageOutputFile.Valid() {
fmt.Fprintln(w, "LOCAL_PREBUILT_COVERAGE_ARCHIVE :=", library.coverageOutputFile.String())
}
@@ -204,6 +164,10 @@
if library.shared() {
ctx.subAndroidMk(ret, library.baseInstaller)
+ } else {
+ ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
+ fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true")
+ })
}
}
@@ -218,15 +182,10 @@
func (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
ctx.subAndroidMk(ret, binary.baseInstaller)
- ctx.subAndroidMk(ret, &binary.stripper)
ret.Class = "EXECUTABLES"
ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
- fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
- if Bool(binary.Properties.Static_executable) {
- fmt.Fprintln(w, "LOCAL_FORCE_STATIC_EXECUTABLE := true")
- }
-
+ fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", binary.unstrippedOutputFile.String())
if len(binary.symlinks) > 0 {
fmt.Fprintln(w, "LOCAL_MODULE_SYMLINKS := "+strings.Join(binary.symlinks, " "))
}
@@ -287,25 +246,6 @@
ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
_, suffix, _ := splitFileExt(outputFile.Base())
fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+suffix)
- fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
- })
-}
-
-func (stripper *stripper) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
- // Make only supports stripping target modules
- if ctx.Target().Os != android.Android {
- return
- }
-
- ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
- if Bool(stripper.StripProperties.Strip.None) {
-
- fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false")
- } else if Bool(stripper.StripProperties.Strip.Keep_symbols) {
- fmt.Fprintln(w, "LOCAL_STRIP_MODULE := keep_symbols")
- } else {
- fmt.Fprintln(w, "LOCAL_STRIP_MODULE := mini-debug-info")
- }
})
}
@@ -333,7 +273,6 @@
ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
path, file := filepath.Split(c.installPath.String())
stem, suffix, _ := splitFileExt(file)
- fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+suffix)
fmt.Fprintln(w, "LOCAL_MODULE_PATH := "+path)
fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem)
@@ -355,11 +294,9 @@
_, _, ext := splitFileExt(outputFile.Base())
fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+ext)
- fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false")
- fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true")
fmt.Fprintln(w, "LOCAL_NO_NOTICE_FILE := true")
- fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
+ fmt.Fprintln(w, "LOCAL_SOONG_TOC :=", c.toc().String())
})
}
@@ -374,9 +311,6 @@
path := c.path.RelPathString()
dir, file := filepath.Split(path)
stem, suffix, ext := splitFileExt(file)
- fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false")
- fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
- fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+ext)
fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+suffix)
fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(OUT_DIR)/"+filepath.Clean(dir))
@@ -404,8 +338,6 @@
_, _, ext := splitFileExt(outputFile.Base())
fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+ext)
- fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false")
- fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true")
fmt.Fprintln(w, "LOCAL_NO_NOTICE_FILE := true")
})
diff --git a/cc/binary.go b/cc/binary.go
index be79032..6352ba1 100644
--- a/cc/binary.go
+++ b/cc/binary.go
@@ -78,6 +78,9 @@
toolPath android.OptionalPath
+ // Location of the linked, unstripped binary
+ unstrippedOutputFile android.Path
+
// Names of symlinks to be installed for use in LOCAL_MODULE_SYMLINKS
symlinks []string
@@ -306,6 +309,8 @@
binary.stripper.strip(ctx, outputFile, strippedOutputFile, builderFlags)
}
+ binary.unstrippedOutputFile = outputFile
+
if String(binary.Properties.Prefix_symbols) != "" {
afterPrefixSymbols := outputFile
outputFile = android.PathForModuleOut(ctx, "unprefixed", fileName)
diff --git a/cc/cc.go b/cc/cc.go
index 358bff6..188a1cc 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -1177,7 +1177,7 @@
// We can be permissive with the system "STL" since it is only the C++
// ABI layer, but in the future we should make sure that everyone is
// using either libc++ or nothing.
- } else if getNdkStlFamily(ctx, from) != getNdkStlFamily(ctx, to) {
+ } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
from.stl.Properties.SelectedStl, ctx.OtherModuleName(to),
to.stl.Properties.SelectedStl)
@@ -1487,6 +1487,29 @@
return false
}
+func (c *Module) getMakeLinkType() string {
+ if c.useVndk() {
+ if inList(c.Name(), vndkCoreLibraries) || inList(c.Name(), vndkSpLibraries) || inList(c.Name(), llndkLibraries) {
+ if inList(c.Name(), vndkPrivateLibraries) {
+ return "native:vndk_private"
+ } else {
+ return "native:vndk"
+ }
+ } else {
+ return "native:vendor"
+ }
+ } else if c.inRecovery() {
+ return "native:recovery"
+ } else if c.Target().Os == android.Android && String(c.Properties.Sdk_version) != "" {
+ return "native:ndk:none:none"
+ // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
+ //family, link := getNdkStlFamilyAndLinkType(c)
+ //return fmt.Sprintf("native:ndk:%s:%s", family, link)
+ } else {
+ return "native:platform"
+ }
+}
+
//
// Defaults
//
diff --git a/cc/library.go b/cc/library.go
index 7886c35..7330e3f 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -237,6 +237,9 @@
// not included in the NDK.
ndkSysrootPath android.Path
+ // Location of the linked, unstripped library for shared libraries
+ unstrippedOutputFile android.Path
+
// Decorated interafaces
*baseCompiler
*baseLinker
@@ -564,6 +567,8 @@
library.stripper.strip(ctx, outputFile, strippedOutputFile, builderFlags)
}
+ library.unstrippedOutputFile = outputFile
+
if Bool(library.baseLinker.Properties.Use_version_lib) && ctx.Host() {
versionedOutputFile := outputFile
outputFile = android.PathForModuleOut(ctx, "unversioned", fileName)
diff --git a/cc/llndk_library.go b/cc/llndk_library.go
index 6e64acf..c23dfd4 100644
--- a/cc/llndk_library.go
+++ b/cc/llndk_library.go
@@ -172,6 +172,7 @@
libraryDecorator: library,
}
stub.Properties.Vendor_available = BoolPtr(true)
+ module.Properties.UseVndk = true
module.compiler = stub
module.linker = stub
module.installer = nil
diff --git a/cc/prebuilt.go b/cc/prebuilt.go
index d6018eb..42d680a 100644
--- a/cc/prebuilt.go
+++ b/cc/prebuilt.go
@@ -82,6 +82,7 @@
in := p.Prebuilt.SingleSourcePath(ctx)
if p.shared() {
+ p.unstrippedOutputFile = in
libName := ctx.baseModuleName() + flags.Toolchain.ShlibSuffix()
if p.needsStrip(ctx) {
stripped := android.PathForModuleOut(ctx, "stripped", libName)
@@ -162,6 +163,8 @@
fileName := p.getStem(ctx) + flags.Toolchain.ExecutableSuffix()
in := p.Prebuilt.SingleSourcePath(ctx)
+ p.unstrippedOutputFile = in
+
if p.needsStrip(ctx) {
stripped := android.PathForModuleOut(ctx, "stripped", fileName)
p.strip(ctx, in, stripped, builderFlags)
diff --git a/cc/stl.go b/cc/stl.go
index 6f63835..5c69948 100644
--- a/cc/stl.go
+++ b/cc/stl.go
@@ -19,18 +19,24 @@
"fmt"
)
-func getNdkStlFamily(ctx android.ModuleContext, m *Module) string {
+func getNdkStlFamily(m *Module) string {
+ family, _ := getNdkStlFamilyAndLinkType(m)
+ return family
+}
+
+func getNdkStlFamilyAndLinkType(m *Module) (string, string) {
stl := m.stl.Properties.SelectedStl
switch stl {
- case "ndk_libc++_shared", "ndk_libc++_static":
- return "libc++"
+ case "ndk_libc++_shared":
+ return "libc++", "shared"
+ case "ndk_libc++_static":
+ return "libc++", "static"
case "ndk_system":
- return "system"
+ return "system", "shared"
case "":
- return "none"
+ return "none", "none"
default:
- ctx.ModuleErrorf("stl: %q is not a valid STL", stl)
- return ""
+ panic(fmt.Errorf("stl: %q is not a valid STL", stl))
}
}
diff --git a/cc/strip.go b/cc/strip.go
index ec2450a..02397f4 100644
--- a/cc/strip.go
+++ b/cc/strip.go
@@ -31,7 +31,8 @@
}
func (stripper *stripper) needsStrip(ctx ModuleContext) bool {
- return !ctx.Config().EmbeddedInMake() && !Bool(stripper.StripProperties.Strip.None)
+ // TODO(ccross): enable host stripping when embedded in make? Make never had support for stripping host binaries.
+ return (!ctx.Config().EmbeddedInMake() || ctx.Device()) && !Bool(stripper.StripProperties.Strip.None)
}
func (stripper *stripper) strip(ctx ModuleContext, in android.Path, out android.ModuleOutPath,
diff --git a/cc/vndk_prebuilt.go b/cc/vndk_prebuilt.go
index 849bb3f..2d7274d 100644
--- a/cc/vndk_prebuilt.go
+++ b/cc/vndk_prebuilt.go
@@ -149,6 +149,7 @@
module.stl = nil
module.sanitize = nil
library.StripProperties.Strip.None = BoolPtr(true)
+ module.Properties.UseVndk = true
prebuilt := &vndkPrebuiltLibraryDecorator{
libraryDecorator: library,