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

Commit 1db97488 authored by Justin Yun's avatar Justin Yun
Browse files

Include license information for vendor and host snapshots

In addition to the license text files, include license kinds
information to json file. Also, use the original paths of license
text files that are copied to NOTICE_FILES directory.
This will be used when generating snapshots from the snapshot build.

Bug: 271539873
Test: m vendor-snapshot
Change-Id: I0c0427bb66f2c1fca322d5554aa66220a3b62fb3
parent 28cbb75a
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -100,17 +100,6 @@ func makeSymlinkCmd(linkDirOnDevice string, linkName string, target string) stri
		"ln -sf " + target + " " + filepath.Join(dir, linkName)
}

func combineNoticesRule(ctx android.SingletonContext, paths android.Paths, out string) android.OutputPath {
	outPath := android.PathForOutput(ctx, out)
	ctx.Build(pctx, android.BuildParams{
		Rule:        android.Cat,
		Inputs:      paths,
		Output:      outPath,
		Description: "combine notices for " + out,
	})
	return outPath
}

// Dump a map to a list file as:
//
// {key1} {value1}
+8 −11
Original line number Diff line number Diff line
@@ -160,7 +160,7 @@ type snapshotJsonFlags struct {
	MinSdkVersion  string   `json:",omitempty"`
}

var ccSnapshotAction snapshot.GenerateSnapshotAction = func(s snapshot.SnapshotSingleton, ctx android.SingletonContext, snapshotArchDir string) android.Paths {
var ccSnapshotAction snapshot.GenerateSnapshotAction = func(s snapshot.SnapshotSingleton, ctx android.SingletonContext, snapshotArchDir string) snapshot.SnapshotPaths {
	/*
		Vendor snapshot zipped artifacts directory structure for cc modules:
		{SNAPSHOT_ARCH}/
@@ -195,10 +195,10 @@ var ccSnapshotAction snapshot.GenerateSnapshotAction = func(s snapshot.SnapshotS
	*/

	var snapshotOutputs android.Paths
	var snapshotNotices android.Paths

	includeDir := filepath.Join(snapshotArchDir, "include")
	configsDir := filepath.Join(snapshotArchDir, "configs")
	noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")

	installedNotices := make(map[string]bool)
	installedConfigs := make(map[string]bool)
@@ -228,7 +228,7 @@ var ccSnapshotAction snapshot.GenerateSnapshotAction = func(s snapshot.SnapshotS
		prop := snapshotJsonFlags{}

		// Common properties among snapshots.
		prop.ModuleName = ctx.ModuleName(m)
		prop.InitBaseSnapshotPropsWithName(m, ctx.ModuleName(m))
		if supportsVndkExt(s.Image) && m.IsVndkExt() {
			// vndk exts are installed to /vendor/lib(64)?/vndk(-sp)?
			if m.IsVndkSp() {
@@ -406,13 +406,10 @@ var ccSnapshotAction snapshot.GenerateSnapshotAction = func(s snapshot.SnapshotS
			headers = append(headers, m.SnapshotHeaders()...)
		}

		if len(m.EffectiveLicenseFiles()) > 0 {
			noticeName := ctx.ModuleName(m) + ".txt"
			noticeOut := filepath.Join(noticeDir, noticeName)
			// skip already copied notice file
			if !installedNotices[noticeOut] {
				installedNotices[noticeOut] = true
				snapshotOutputs = append(snapshotOutputs, combineNoticesRule(ctx, m.EffectiveLicenseFiles(), noticeOut))
		for _, notice := range m.EffectiveLicenseFiles() {
			if _, ok := installedNotices[notice.String()]; !ok {
				installedNotices[notice.String()] = true
				snapshotNotices = append(snapshotNotices, notice)
			}
		}
	})
@@ -422,7 +419,7 @@ var ccSnapshotAction snapshot.GenerateSnapshotAction = func(s snapshot.SnapshotS
		snapshotOutputs = append(snapshotOutputs, copyFile(ctx, header, filepath.Join(includeDir, header.String()), s.Fake))
	}

	return snapshotOutputs
	return snapshot.SnapshotPaths{OutputFiles: snapshotOutputs, NoticeFiles: snapshotNotices}
}

func init() {
+8 −19
Original line number Diff line number Diff line
@@ -617,7 +617,7 @@ func isSnapshotAware(ctx android.SingletonContext, m *PrebuiltEtc, image snapsho
	return true
}

func generatePrebuiltSnapshot(s snapshot.SnapshotSingleton, ctx android.SingletonContext, snapshotArchDir string) android.Paths {
func generatePrebuiltSnapshot(s snapshot.SnapshotSingleton, ctx android.SingletonContext, snapshotArchDir string) snapshot.SnapshotPaths {
	/*
		Snapshot zipped artifacts directory structure for etc modules:
		{SNAPSHOT_ARCH}/
@@ -631,7 +631,7 @@ func generatePrebuiltSnapshot(s snapshot.SnapshotSingleton, ctx android.Singleto
				(notice files)
	*/
	var snapshotOutputs android.Paths
	noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
	var snapshotNotices android.Paths
	installedNotices := make(map[string]bool)

	ctx.VisitAllModules(func(module android.Module) {
@@ -651,7 +651,7 @@ func generatePrebuiltSnapshot(s snapshot.SnapshotSingleton, ctx android.Singleto

		prop := snapshot.SnapshotJsonFlags{}
		propOut := snapshotLibOut + ".json"
		prop.ModuleName = m.BaseModuleName()
		prop.InitBaseSnapshotProps(m)
		if m.subdirProperties.Relative_install_path != nil {
			prop.RelativeInstallPath = *m.subdirProperties.Relative_install_path
		}
@@ -667,27 +667,16 @@ func generatePrebuiltSnapshot(s snapshot.SnapshotSingleton, ctx android.Singleto
		}
		snapshotOutputs = append(snapshotOutputs, snapshot.WriteStringToFileRule(ctx, string(j), propOut))

		if len(m.EffectiveLicenseFiles()) > 0 {
			noticeName := ctx.ModuleName(m) + ".txt"
			noticeOut := filepath.Join(noticeDir, noticeName)
			// skip already copied notice file
			if !installedNotices[noticeOut] {
				installedNotices[noticeOut] = true

				noticeOutPath := android.PathForOutput(ctx, noticeOut)
				ctx.Build(pctx, android.BuildParams{
					Rule:        android.Cat,
					Inputs:      m.EffectiveLicenseFiles(),
					Output:      noticeOutPath,
					Description: "combine notices for " + noticeOut,
				})
				snapshotOutputs = append(snapshotOutputs, noticeOutPath)
		for _, notice := range m.EffectiveLicenseFiles() {
			if _, ok := installedNotices[notice.String()]; !ok {
				installedNotices[notice.String()] = true
				snapshotNotices = append(snapshotNotices, notice)
			}
		}

	})

	return snapshotOutputs
	return snapshot.SnapshotPaths{OutputFiles: snapshotOutputs, NoticeFiles: snapshotNotices}
}

// For Bazel / bp2build
+11 −7
Original line number Diff line number Diff line
@@ -96,6 +96,7 @@ func (f *hostSnapshot) CreateMetaData(ctx android.ModuleContext, fileName string
	var jsonData []SnapshotJsonFlags
	var metaPaths android.Paths

	installedNotices := make(map[string]bool)
	metaZipFile := android.PathForModuleOut(ctx, fileName).OutputPath

	// Create JSON file based on the direct dependencies
@@ -104,12 +105,14 @@ func (f *hostSnapshot) CreateMetaData(ctx android.ModuleContext, fileName string
		if desc != nil {
			jsonData = append(jsonData, *desc)
		}
		if len(dep.EffectiveLicenseFiles()) > 0 {
			noticeFile := android.PathForModuleOut(ctx, "NOTICE_FILES", dep.Name()+".txt").OutputPath
			android.CatFileRule(ctx, dep.EffectiveLicenseFiles(), noticeFile)
			metaPaths = append(metaPaths, noticeFile)
		for _, notice := range dep.EffectiveLicenseFiles() {
			if _, ok := installedNotices[notice.String()]; !ok {
				installedNotices[notice.String()] = true
				noticeOut := android.PathForModuleOut(ctx, "NOTICE_FILES", notice.String()).OutputPath
				CopyFileToOutputPathRule(pctx, ctx, notice, noticeOut)
				metaPaths = append(metaPaths, noticeOut)
			}
		}

	})
	// Sort notice paths and json data for repeatble build
	sort.Slice(jsonData, func(i, j int) bool {
@@ -220,8 +223,7 @@ func hostJsonDesc(m android.Module) *SnapshotJsonFlags {
	}

	if path.Valid() && path.String() != "" {
		return &SnapshotJsonFlags{
			ModuleName:          m.Name(),
		props := &SnapshotJsonFlags{
			ModuleStemName:      moduleStem,
			Filename:            path.String(),
			Required:            append(m.HostRequiredModuleNames(), m.RequiredModuleNames()...),
@@ -229,6 +231,8 @@ func hostJsonDesc(m android.Module) *SnapshotJsonFlags {
			RustProcMacro:       procMacro,
			CrateName:           crateName,
		}
		props.InitBaseSnapshotProps(m)
		return props
	}
	return nil
}
+26 −2
Original line number Diff line number Diff line
@@ -26,6 +26,10 @@ import (

var pctx = android.NewPackageContext("android/soong/snapshot")

func init() {
	pctx.Import("android/soong/android")
}

type SnapshotSingleton struct {
	// Name, e.g., "vendor", "recovery", "ramdisk".
	name string
@@ -48,8 +52,18 @@ type SnapshotSingleton struct {
	Fake bool
}

// The output files to be included in the snapshot.
type SnapshotPaths struct {
	// All files to be included in the snapshot
	OutputFiles android.Paths

	// Notice files of the snapshot output files
	NoticeFiles android.Paths
}

// Interface of function to capture snapshot from each module
type GenerateSnapshotAction func(snapshot SnapshotSingleton, ctx android.SingletonContext, snapshotArchDir string) android.Paths
// Returns snapshot ouputs and notice files.
type GenerateSnapshotAction func(snapshot SnapshotSingleton, ctx android.SingletonContext, snapshotArchDir string) SnapshotPaths

var snapshotActionList []GenerateSnapshotAction

@@ -74,9 +88,19 @@ func (c *SnapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
		snapshotDir = filepath.Join("fake", snapshotDir)
	}
	snapshotArchDir := filepath.Join(snapshotDir, ctx.DeviceConfig().DeviceArch())
	noticeDir := filepath.Join(snapshotArchDir, "NOTICE_FILES")
	installedNotices := make(map[string]bool)

	for _, f := range snapshotActionList {
		snapshotOutputs = append(snapshotOutputs, f(*c, ctx, snapshotArchDir)...)
		snapshotPaths := f(*c, ctx, snapshotArchDir)
		snapshotOutputs = append(snapshotOutputs, snapshotPaths.OutputFiles...)
		for _, notice := range snapshotPaths.NoticeFiles {
			if _, ok := installedNotices[notice.String()]; !ok {
				installedNotices[notice.String()] = true
				snapshotOutputs = append(snapshotOutputs, CopyFileRule(
					pctx, ctx, notice, filepath.Join(noticeDir, notice.String())))
			}
		}
	}

	// All artifacts are ready. Sort them to normalize ninja and then zip.
Loading