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

Commit f27c3a5a authored by Jihoon Kang's avatar Jihoon Kang
Browse files

Convert absolute source path to relative path in PRODUCT_COPY_FILES processing

Source paths should be relative to the top in most builds, but this is
not true for some downstream builds. Kati does not restrict this, but
Soong enforces that all source paths are relative and leads to error for
these downstream branches. This change deals with such issue by
converting the absolute paths to relative paths.

Test: m nothing --no-skip-soong-tests
Bug: 378298832
Change-Id: I313b3827417c9672b38737e8fe846bb7521b17d1
parent f18c94b4
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -2589,3 +2589,19 @@ func IsThirdPartyPath(path string) bool {
	}
	return false
}

// ToRelativeSourcePath converts absolute source path to the path relative to the source root.
// This throws an error if the input path is outside of the source root and cannot be converted
// to the relative path.
// This should be rarely used given that the source path is relative in Soong.
func ToRelativeSourcePath(ctx PathContext, path string) string {
	ret := path
	if filepath.IsAbs(path) {
		relPath, err := filepath.Rel(absSrcDir, path)
		if err != nil || strings.HasPrefix(relPath, "..") {
			ReportPathErrorf(ctx, "%s is outside of the source root", path)
		}
		ret = relPath
	}
	return ret
}
+7 −2
Original line number Diff line number Diff line
@@ -100,10 +100,15 @@ func uniqueExistingProductCopyFileMap(ctx android.LoadHookContext) map[string][]
			ctx.ModuleErrorf("PRODUCT_COPY_FILES must follow the format \"src:dest\", got: %s", copyFilePair)
		}
		src, dest := srcDestList[0], srcDestList[1]

		// Some downstream branches use absolute path as entries in PRODUCT_COPY_FILES.
		// Convert them to relative path from top and check if they do not escape the tree root.
		relSrc := android.ToRelativeSourcePath(ctx, src)

		if _, ok := seen[dest]; !ok {
			if optionalPath := android.ExistentPathForSource(ctx, src); optionalPath.Valid() {
			if optionalPath := android.ExistentPathForSource(ctx, relSrc); optionalPath.Valid() {
				seen[dest] = true
				filtered[src] = append(filtered[src], dest)
				filtered[relSrc] = append(filtered[relSrc], dest)
			}
		}
	}