diff --git a/cc/cc.go b/cc/cc.go index 6e285225a..04aa6a6e9 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -1036,6 +1036,27 @@ func checkLinkType(ctx android.ModuleContext, from *Module, to *Module) { ctx.ModuleErrorf("links %q built against newer API version %q", ctx.OtherModuleName(to), String(to.Properties.Sdk_version)) } + + // Also check that the two STL choices are compatible. + fromStl := from.stl.Properties.SelectedStl + toStl := to.stl.Properties.SelectedStl + if fromStl == "" || toStl == "" { + // Libraries that don't use the STL are unrestricted. + return + } + + if fromStl == "ndk_system" || toStl == "ndk_system" { + // 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. + return + } + + if getNdkStlFamily(ctx, from) != getNdkStlFamily(ctx, to) { + ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q", + from.stl.Properties.SelectedStl, ctx.OtherModuleName(to), + to.stl.Properties.SelectedStl) + } } // Convert dependencies to paths. Returns a PathDeps containing paths diff --git a/cc/stl.go b/cc/stl.go index 347db991a..338db84c3 100644 --- a/cc/stl.go +++ b/cc/stl.go @@ -19,6 +19,25 @@ import ( "fmt" ) +func getNdkStlFamily(ctx android.ModuleContext, m *Module) string { + stl := m.stl.Properties.SelectedStl + switch stl { + case "ndk_libc++_shared", "ndk_libc++_static": + return "libc++" + case "ndk_libstlport_shared", "ndk_libstlport_static": + return "stlport" + case "ndk_libgnustl_static": + return "gnustl" + case "ndk_system": + return "system" + case "": + return "none" + default: + ctx.ModuleErrorf("stl: %q is not a valid STL", stl) + return "" + } +} + type StlProperties struct { // select the STL library to use. Possible values are "libc++", "libc++_static", // "stlport", "stlport_static", "ndk", "libstdc++", or "none". Leave blank to select the