Loading cc/cc_test.go +10 −0 Original line number Diff line number Diff line Loading @@ -1738,13 +1738,16 @@ func TestVersionedStubs(t *testing.T) { ctx := testCc(t, ` cc_library_shared { name: "libFoo", srcs: ["foo.c"], stubs: { symbol_file: "foo.map.txt", versions: ["1", "2", "3"], }, } cc_library_shared { name: "libBar", srcs: ["bar.c"], shared_libs: ["libFoo#1"], }`) Loading Loading @@ -1786,4 +1789,11 @@ func TestVersionedStubs(t *testing.T) { if !strings.Contains(libFlags, libFoo1StubPath) { t.Errorf("%q is not found in %q", libFoo1StubPath, libFlags) } libBarCompileRule := ctx.ModuleForTests("libBar", "android_arm64_armv8-a_core_shared").Rule("cc") cFlags := libBarCompileRule.Args["cFlags"] libFoo1VersioningMacro := "-D__LIBFOO_API__=1" if !strings.Contains(cFlags, libFoo1VersioningMacro) { t.Errorf("%q is not found in %q", libFoo1VersioningMacro, cFlags) } } cc/library.go +37 −0 Original line number Diff line number Diff line Loading @@ -15,7 +15,9 @@ package cc import ( "regexp" "strings" "sync" "github.com/google/blueprint" "github.com/google/blueprint/pathtools" Loading Loading @@ -443,6 +445,8 @@ func (library *libraryDecorator) getLibName(ctx ModuleContext) string { return name + library.MutatedProperties.VariantName } var versioningMacroNamesListMutex sync.Mutex func (library *libraryDecorator) linkerInit(ctx BaseModuleContext) { location := InstallInSystem if library.baseLinker.sanitize.inSanitizerDir() { Loading @@ -453,6 +457,18 @@ func (library *libraryDecorator) linkerInit(ctx BaseModuleContext) { // Let baseLinker know whether this variant is for stubs or not, so that // it can omit things that are not required for linking stubs. library.baseLinker.dynamicProperties.BuildStubs = library.buildStubs() if library.buildStubs() { macroNames := versioningMacroNamesList(ctx.Config()) myName := versioningMacroName(ctx.ModuleName()) versioningMacroNamesListMutex.Lock() defer versioningMacroNamesListMutex.Unlock() if (*macroNames)[myName] == "" { (*macroNames)[myName] = ctx.ModuleName() } else if (*macroNames)[myName] != ctx.ModuleName() { ctx.ModuleErrorf("Macro name %q for versioning conflicts with macro name from module %q ", myName, (*macroNames)[myName]) } } } func (library *libraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps { Loading Loading @@ -715,6 +731,10 @@ func (library *libraryDecorator) link(ctx ModuleContext, library.reuseExportedFlags = append(library.reuseExportedFlags, flags...) } if library.buildStubs() { library.reexportFlags([]string{"-D" + versioningMacroName(ctx.ModuleName()) + "=" + library.stubsVersion()}) } return out } Loading Loading @@ -823,6 +843,23 @@ func (library *libraryDecorator) stubsVersion() string { return library.MutatedProperties.StubsVersion } func versioningMacroNamesList(config android.Config) *map[string]string { return config.Once("versioningMacroNamesList", func() interface{} { m := make(map[string]string) return &m }).(*map[string]string) } // alphanumeric and _ characters are preserved. // other characters are all converted to _ var charsNotForMacro = regexp.MustCompile("[^a-zA-Z0-9_]+") func versioningMacroName(moduleName string) string { macroName := charsNotForMacro.ReplaceAllString(moduleName, "_") macroName = strings.ToUpper(moduleName) return "__" + macroName + "_API__" } func NewLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) { module := newModule(hod, android.MultilibBoth) Loading Loading
cc/cc_test.go +10 −0 Original line number Diff line number Diff line Loading @@ -1738,13 +1738,16 @@ func TestVersionedStubs(t *testing.T) { ctx := testCc(t, ` cc_library_shared { name: "libFoo", srcs: ["foo.c"], stubs: { symbol_file: "foo.map.txt", versions: ["1", "2", "3"], }, } cc_library_shared { name: "libBar", srcs: ["bar.c"], shared_libs: ["libFoo#1"], }`) Loading Loading @@ -1786,4 +1789,11 @@ func TestVersionedStubs(t *testing.T) { if !strings.Contains(libFlags, libFoo1StubPath) { t.Errorf("%q is not found in %q", libFoo1StubPath, libFlags) } libBarCompileRule := ctx.ModuleForTests("libBar", "android_arm64_armv8-a_core_shared").Rule("cc") cFlags := libBarCompileRule.Args["cFlags"] libFoo1VersioningMacro := "-D__LIBFOO_API__=1" if !strings.Contains(cFlags, libFoo1VersioningMacro) { t.Errorf("%q is not found in %q", libFoo1VersioningMacro, cFlags) } }
cc/library.go +37 −0 Original line number Diff line number Diff line Loading @@ -15,7 +15,9 @@ package cc import ( "regexp" "strings" "sync" "github.com/google/blueprint" "github.com/google/blueprint/pathtools" Loading Loading @@ -443,6 +445,8 @@ func (library *libraryDecorator) getLibName(ctx ModuleContext) string { return name + library.MutatedProperties.VariantName } var versioningMacroNamesListMutex sync.Mutex func (library *libraryDecorator) linkerInit(ctx BaseModuleContext) { location := InstallInSystem if library.baseLinker.sanitize.inSanitizerDir() { Loading @@ -453,6 +457,18 @@ func (library *libraryDecorator) linkerInit(ctx BaseModuleContext) { // Let baseLinker know whether this variant is for stubs or not, so that // it can omit things that are not required for linking stubs. library.baseLinker.dynamicProperties.BuildStubs = library.buildStubs() if library.buildStubs() { macroNames := versioningMacroNamesList(ctx.Config()) myName := versioningMacroName(ctx.ModuleName()) versioningMacroNamesListMutex.Lock() defer versioningMacroNamesListMutex.Unlock() if (*macroNames)[myName] == "" { (*macroNames)[myName] = ctx.ModuleName() } else if (*macroNames)[myName] != ctx.ModuleName() { ctx.ModuleErrorf("Macro name %q for versioning conflicts with macro name from module %q ", myName, (*macroNames)[myName]) } } } func (library *libraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps { Loading Loading @@ -715,6 +731,10 @@ func (library *libraryDecorator) link(ctx ModuleContext, library.reuseExportedFlags = append(library.reuseExportedFlags, flags...) } if library.buildStubs() { library.reexportFlags([]string{"-D" + versioningMacroName(ctx.ModuleName()) + "=" + library.stubsVersion()}) } return out } Loading Loading @@ -823,6 +843,23 @@ func (library *libraryDecorator) stubsVersion() string { return library.MutatedProperties.StubsVersion } func versioningMacroNamesList(config android.Config) *map[string]string { return config.Once("versioningMacroNamesList", func() interface{} { m := make(map[string]string) return &m }).(*map[string]string) } // alphanumeric and _ characters are preserved. // other characters are all converted to _ var charsNotForMacro = regexp.MustCompile("[^a-zA-Z0-9_]+") func versioningMacroName(moduleName string) string { macroName := charsNotForMacro.ReplaceAllString(moduleName, "_") macroName = strings.ToUpper(moduleName) return "__" + macroName + "_API__" } func NewLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) { module := newModule(hod, android.MultilibBoth) Loading