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

Commit be891d5a authored by Colin Cross's avatar Colin Cross Committed by Gerrit Code Review
Browse files

Merge changes I5f2fd123,Ie8d8e229,Id2194f6b into main

* changes:
  Move RelativeToTop out of basePath
  Make PathForArbitraryOutput return an OutputPath
  Run TestClasspath subtests in parallel
parents e1234e51 bd73d0db
Loading
Loading
Loading
Loading
+30 −22
Original line number Diff line number Diff line
@@ -245,13 +245,13 @@ type Path interface {
	// A standard build has the following structure:
	//   ../top/
	//          out/ - make install files go here.
	//          out/soong - this is the soongOutDir passed to NewTestConfig()
	//          out/soong - this is the outDir passed to NewTestConfig()
	//          ... - the source files
	//
	// This function converts a path so that it appears relative to the ../top/ directory, i.e.
	// * Make install paths, which have the pattern "soongOutDir/../<path>" are converted into the top
	// * Make install paths, which have the pattern "outDir/../<path>" are converted into the top
	//   relative path "out/<path>"
	// * Soong install paths and other writable paths, which have the pattern "soongOutDir/<path>" are
	// * Soong install paths and other writable paths, which have the pattern "outDir/soong/<path>" are
	//   converted into the top relative path "out/soong/<path>".
	// * Source paths are already relative to the top.
	// * Phony paths are not relative to anything.
@@ -261,8 +261,9 @@ type Path interface {
}

const (
	OutDir      = "out"
	OutSoongDir = OutDir + "/soong"
	testOutDir         = "out"
	testOutSoongSubDir = "/soong"
	TestOutSoongDir    = testOutDir + testOutSoongSubDir
)

// WritablePath is a type of path that can be used as an output for build rules.
@@ -1118,11 +1119,6 @@ func (p basePath) withRel(rel string) basePath {
	return p
}

func (p basePath) RelativeToTop() Path {
	ensureTestOnly()
	return p
}

// SourcePath is a Path representing a file path rooted from SrcDir
type SourcePath struct {
	basePath
@@ -1135,6 +1131,11 @@ func (p SourcePath) withRel(rel string) SourcePath {
	return p
}

func (p SourcePath) RelativeToTop() Path {
	ensureTestOnly()
	return p
}

// safePathForSource is for paths that we expect are safe -- only for use by go
// code that is embedding ninja variables in paths
func safePathForSource(ctx PathContext, pathComponents ...string) (SourcePath, error) {
@@ -1218,11 +1219,13 @@ func PathForSource(ctx PathContext, pathComponents ...string) SourcePath {
// PathForArbitraryOutput creates a path for the given components. Unlike PathForOutput,
// the path is relative to the root of the output folder, not the out/soong folder.
func PathForArbitraryOutput(ctx PathContext, pathComponents ...string) Path {
	p, err := validatePath(pathComponents...)
	path, err := validatePath(pathComponents...)
	if err != nil {
		reportPathError(ctx, err)
	}
	return basePath{path: filepath.Join(ctx.Config().OutDir(), p)}
	fullPath := filepath.Join(ctx.Config().OutDir(), path)
	path = fullPath[len(fullPath)-len(path):]
	return OutputPath{basePath{path, ""}, ctx.Config().OutDir(), fullPath}
}

// MaybeExistentPathForSource joins the provided path components and validates that the result
@@ -1325,8 +1328,8 @@ func (p SourcePath) OverlayPath(ctx ModuleMissingDepsPathContext, path Path) Opt
type OutputPath struct {
	basePath

	// The soong build directory, i.e. Config.SoongOutDir()
	soongOutDir string
	// The base out directory for this path, either Config.SoongOutDir() or Config.OutDir()
	outDir string

	fullPath string
}
@@ -1334,7 +1337,7 @@ type OutputPath struct {
func (p OutputPath) GobEncode() ([]byte, error) {
	w := new(bytes.Buffer)
	encoder := gob.NewEncoder(w)
	err := errors.Join(encoder.Encode(p.basePath), encoder.Encode(p.soongOutDir), encoder.Encode(p.fullPath))
	err := errors.Join(encoder.Encode(p.basePath), encoder.Encode(p.outDir), encoder.Encode(p.fullPath))
	if err != nil {
		return nil, err
	}
@@ -1345,7 +1348,7 @@ func (p OutputPath) GobEncode() ([]byte, error) {
func (p *OutputPath) GobDecode(data []byte) error {
	r := bytes.NewBuffer(data)
	decoder := gob.NewDecoder(r)
	err := errors.Join(decoder.Decode(&p.basePath), decoder.Decode(&p.soongOutDir), decoder.Decode(&p.fullPath))
	err := errors.Join(decoder.Decode(&p.basePath), decoder.Decode(&p.outDir), decoder.Decode(&p.fullPath))
	if err != nil {
		return err
	}
@@ -1365,7 +1368,7 @@ func (p OutputPath) WithoutRel() OutputPath {
}

func (p OutputPath) getSoongOutDir() string {
	return p.soongOutDir
	return p.outDir
}

func (p OutputPath) RelativeToTop() Path {
@@ -1373,8 +1376,13 @@ func (p OutputPath) RelativeToTop() Path {
}

func (p OutputPath) outputPathRelativeToTop() OutputPath {
	p.fullPath = StringPathRelativeToTop(p.soongOutDir, p.fullPath)
	p.soongOutDir = OutSoongDir
	p.fullPath = StringPathRelativeToTop(p.outDir, p.fullPath)
	if strings.HasSuffix(p.outDir, testOutSoongSubDir) {
		p.outDir = TestOutSoongDir
	} else {
		// Handle the PathForArbitraryOutput case
		p.outDir = testOutDir
	}
	return p
}

@@ -1420,7 +1428,7 @@ func PathForOutput(ctx PathContext, pathComponents ...string) OutputPath {
	return OutputPath{basePath{path, ""}, ctx.Config().soongOutDir, fullPath}
}

// PathsForOutput returns Paths rooted from soongOutDir
// PathsForOutput returns Paths rooted from outDir
func PathsForOutput(ctx PathContext, paths []string) WritablePaths {
	ret := make(WritablePaths, len(paths))
	for i, path := range paths {
@@ -1751,9 +1759,9 @@ func ensureTestOnly() {
func (p InstallPath) RelativeToTop() Path {
	ensureTestOnly()
	if p.makePath {
		p.soongOutDir = OutDir
		p.soongOutDir = testOutDir
	} else {
		p.soongOutDir = OutSoongDir
		p.soongOutDir = TestOutSoongDir
	}
	p.fullPath = filepath.Join(p.soongOutDir, p.path)
	return p
+11 −5
Original line number Diff line number Diff line
@@ -822,15 +822,15 @@ func newBaseTestingComponent(config Config, provider testBuildProvider) baseTest
// containing at most one instance of the temporary build directory at the start of the path while
// this assumes that there can be any number at any position.
func normalizeStringRelativeToTop(config Config, s string) string {
	// The soongOutDir usually looks something like: /tmp/testFoo2345/001
	// The outDir usually looks something like: /tmp/testFoo2345/001
	//
	// Replace any usage of the soongOutDir with out/soong, e.g. replace "/tmp/testFoo2345/001" with
	// Replace any usage of the outDir with out/soong, e.g. replace "/tmp/testFoo2345/001" with
	// "out/soong".
	outSoongDir := filepath.Clean(config.soongOutDir)
	re := regexp.MustCompile(`\Q` + outSoongDir + `\E\b`)
	s = re.ReplaceAllString(s, "out/soong")

	// Replace any usage of the soongOutDir/.. with out, e.g. replace "/tmp/testFoo2345" with
	// Replace any usage of the outDir/.. with out, e.g. replace "/tmp/testFoo2345" with
	// "out". This must come after the previous replacement otherwise this would replace
	// "/tmp/testFoo2345/001" with "out/001" instead of "out/soong".
	outDir := filepath.Dir(outSoongDir)
@@ -1234,8 +1234,14 @@ func StringPathRelativeToTop(soongOutDir string, path string) string {
	}

	if isRel {
		if strings.HasSuffix(soongOutDir, testOutSoongSubDir) {
			// The path is in the soong out dir so indicate that in the relative path.
		return filepath.Join("out/soong", rel)
			return filepath.Join(TestOutSoongDir, rel)
		} else {
			// Handle the PathForArbitraryOutput case
			return filepath.Join(testOutDir, rel)

		}
	}

	// Check to see if the path is relative to the top level out dir.
+2 −3
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@ package filesystem

import (
	"os"
	"path/filepath"
	"testing"

	"android/soong/android"
@@ -147,8 +146,8 @@ func TestIncludeMakeBuiltFiles(t *testing.T) {

	output := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img")

	stampFile := filepath.Join(result.Config.OutDir(), "target/product/test_device/obj/PACKAGING/system_intermediates/staging_dir.stamp")
	fileListFile := filepath.Join(result.Config.OutDir(), "target/product/test_device/obj/PACKAGING/system_intermediates/file_list.txt")
	stampFile := "out/target/product/test_device/obj/PACKAGING/system_intermediates/staging_dir.stamp"
	fileListFile := "out/target/product/test_device/obj/PACKAGING/system_intermediates/file_list.txt"
	android.AssertStringListContains(t, "deps of filesystem must include the staging dir stamp file", output.Implicits.Strings(), stampFile)
	android.AssertStringListContains(t, "deps of filesystem must include the staging dir file list", output.Implicits.Strings(), fileListFile)
}
+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ func TestAndroidAppSet(t *testing.T) {
	mkEntries := android.AndroidMkEntriesForTest(t, result.TestContext, module.Module())[0]
	actualInstallFile := mkEntries.EntryMap["LOCAL_APK_SET_INSTALL_FILE"]
	expectedInstallFile := []string{
		strings.Replace(params.ImplicitOutputs[0].String(), android.OutSoongDir, result.Config.SoongOutDir(), 1),
		strings.Replace(params.ImplicitOutputs[0].String(), android.TestOutSoongDir, result.Config.SoongOutDir(), 1),
	}
	if !reflect.DeepEqual(actualInstallFile, expectedInstallFile) {
		t.Errorf("Unexpected LOCAL_APK_SET_INSTALL_FILE value: '%s', expected: '%s',",
+3 −0
Original line number Diff line number Diff line
@@ -388,7 +388,9 @@ func TestClasspath(t *testing.T) {
		},
	}

	t.Parallel()
	t.Run("basic", func(t *testing.T) {
		t.Parallel()
		testClasspathTestCases(t, classpathTestcases, false)
	})

@@ -404,6 +406,7 @@ func testClasspathTestCases(t *testing.T, classpathTestcases []classpathTestCase
		}

		t.Run(testcase.name, func(t *testing.T) {
			t.Parallel()
			moduleType := "java_library"
			if testcase.moduleType != "" {
				moduleType = testcase.moduleType