Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ab5fcd2 authored by Spandan Das's avatar Spandan Das Committed by Gerrit Code Review
Browse files

Merge changes from topic "vendor_linker_config_soong" into main

* changes:
  Create linker_config_srcs for autogenerated vendor partition
  Add linker.config.pb support to android_filesystem
parents 33b10100 312cc411
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -598,6 +598,7 @@ type PartitionVariables struct {

	ProductPackages        []string `json:",omitempty"`
	ProductPackagesDebug   []string `json:",omitempty"`
	VendorLinkerConfigSrcs []string `json:",omitempty"`

	ProductCopyFiles map[string]string `json:",omitempty"`
}
+33 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import (

	"android/soong/android"
	"android/soong/cc"
	"android/soong/linkerconfig"

	"github.com/google/blueprint"
	"github.com/google/blueprint/proptools"
@@ -146,6 +147,10 @@ type FilesystemProperties struct {

	Erofs ErofsProperties

	// List of files (in .json format) that will be converted to a linker config file (in .pb format).
	// The linker config file be installed in the filesystem at /etc/linker.config.pb
	Linker_config_srcs []string `android:"path"`

	// Determines if the module is auto-generated from Soong or not. If the module is
	// auto-generated, its deps are exempted from visibility enforcement.
	Is_auto_generated *bool
@@ -428,6 +433,7 @@ func (f *filesystem) buildImageUsingBuildImage(ctx android.ModuleContext) androi
	f.buildFsverityMetadataFiles(ctx, builder, specs, rootDir, rebasedDir)
	f.buildEventLogtagsFile(ctx, builder, rebasedDir)
	f.buildAconfigFlagsFiles(ctx, builder, specs, rebasedDir)
	f.buildLinkerConfigFile(ctx, builder, rebasedDir)
	f.copyFilesToProductOut(ctx, builder, rebasedDir)

	// run host_init_verifier
@@ -591,6 +597,7 @@ func (f *filesystem) buildCpioImage(ctx android.ModuleContext, compressed bool)
	f.buildFsverityMetadataFiles(ctx, builder, specs, rootDir, rebasedDir)
	f.buildEventLogtagsFile(ctx, builder, rebasedDir)
	f.buildAconfigFlagsFiles(ctx, builder, specs, rebasedDir)
	f.buildLinkerConfigFile(ctx, builder, rebasedDir)
	f.copyFilesToProductOut(ctx, builder, rebasedDir)

	output := android.PathForModuleOut(ctx, f.installFileName()).OutputPath
@@ -682,6 +689,32 @@ func (f *filesystem) buildEventLogtagsFile(ctx android.ModuleContext, builder *a
	f.appendToEntry(ctx, eventLogtagsPath)
}

func (f *filesystem) buildLinkerConfigFile(ctx android.ModuleContext, builder *android.RuleBuilder, rebasedDir android.OutputPath) {
	getCStubLibs := func() []android.Module {
		// Determine the list of C stub libraries that are part of this filesystem.
		// These will be added to `provideLibs`.
		// The current implementation assumes that stub libraries are listed explicitly in `deps`
		// (direct deps). If this is not true, ctx.VisitDeps will need to be replaced by ctx.WalkDeps.
		ret := []android.Module{}
		ctx.VisitDirectDeps(func(child android.Module) {
			if c, ok := child.(*cc.Module); ok && c.HasStubsVariants() {
				ret = append(ret, c)
			}
		})
		return ret
	}

	if len(f.properties.Linker_config_srcs) == 0 {
		return
	}

	// cp to the final output
	output := rebasedDir.Join(ctx, "etc", "linker.config.pb")
	linkerconfig.BuildLinkerConfig(ctx, builder, android.PathsForModuleSrc(ctx, f.properties.Linker_config_srcs), getCStubLibs(), nil, output)

	f.appendToEntry(ctx, output)
}

type partition interface {
	PartitionType() string
}
+21 −0
Original line number Diff line number Diff line
@@ -664,3 +664,24 @@ cc_library {
	fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList"))
	android.AssertDeepEquals(t, "Shared library dep of overridden binary should not be installed", fileList, "bin/binfoo1\nlib64/libc++.so\nlib64/libc.so\nlib64/libdl.so\nlib64/libfoo2.so\nlib64/libm.so\n")
}

func TestInstallLinkerConfigFile(t *testing.T) {
	result := fixture.RunTestWithBp(t, `
android_filesystem {
    name: "myfilesystem",
    deps: ["libfoo_has_no_stubs", "libfoo_has_stubs"],
    linker_config_srcs: ["linker.config.json"]
}
cc_library {
    name: "libfoo_has_no_stubs",
}
cc_library {
    name: "libfoo_has_stubs",
    stubs: {symbol_file: "libfoo.map.txt"},
}
	`)

	linkerConfigCmd := result.ModuleForTests("myfilesystem", "android_common").Rule("build_filesystem_image").RuleParams.Command
	android.AssertStringDoesContain(t, "", linkerConfigCmd, "conv_linker_config proto --force -s linker.config.json")
	android.AssertStringDoesContain(t, "", linkerConfigCmd, "--key provideLibs --value libfoo_has_stubs.so")
}
+1 −1
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr
	})

	builder := android.NewRuleBuilder(pctx, ctx)
	linkerconfig.BuildLinkerConfig(ctx, builder, input, provideModules, requireModules, output)
	linkerconfig.BuildLinkerConfig(ctx, builder, android.Paths{input}, provideModules, requireModules, output)
	builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String())
	return output
}
+36 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ package fsgen
import (
	"crypto/sha256"
	"fmt"
	"path/filepath"
	"slices"
	"strconv"
	"strings"
@@ -473,6 +474,10 @@ func (f *filesystemCreator) createPartition(ctx android.LoadHookContext, partiti
		return false
	}

	if partitionType == "vendor" {
		fsProps.Linker_config_srcs = f.createLinkerConfigSourceFilegroups(ctx)
	}

	var module android.Module
	if partitionType == "system" {
		module = ctx.CreateModule(filesystem.SystemImageFactory, baseProps, fsProps)
@@ -504,6 +509,37 @@ func (f *filesystemCreator) createPartition(ctx android.LoadHookContext, partiti
	return true
}

// createLinkerConfigSourceFilegroups creates filegroup modules to generate linker.config.pb for _vendor_
// It creates a filegroup for each file in PRODUCT_VENDOR_LINKER_CONFIG_FRAGMENTS.
// The filegroup modules are then added to `linker_config_srcs` of the autogenerated vendor `android_filesystem`.
func (f *filesystemCreator) createLinkerConfigSourceFilegroups(ctx android.LoadHookContext) []string {
	ret := []string{}
	partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse
	if linkerConfigSrcs := android.FirstUniqueStrings(partitionVars.VendorLinkerConfigSrcs); len(linkerConfigSrcs) > 0 {
		// Create a filegroup, and add `:<filegroup_name>` to ret.
		for index, linkerConfigSrc := range linkerConfigSrcs {
			dir := filepath.Dir(linkerConfigSrc)
			base := filepath.Base(linkerConfigSrc)
			fgName := generatedModuleName(ctx.Config(), "vendor-linker-config-src"+strconv.Itoa(index))
			srcs := []string{base}
			fgProps := &struct {
				Name *string
				Srcs proptools.Configurable[[]string]
			}{
				Name: proptools.StringPtr(fgName),
				Srcs: proptools.NewSimpleConfigurable(srcs),
			}
			ctx.CreateModuleInDirectory(
				android.FileGroupFactory,
				dir,
				fgProps,
			)
			ret = append(ret, ":"+fgName)
		}
	}
	return ret
}

type filesystemBaseProperty struct {
	Name             *string
	Compile_multilib *string
Loading