Soong: Add relativeFilePathFlag category in CMakeList generator

* Add relativeFilePathFlag compiler flag category whose format must be
  a=b/c/d, where "a" is the flag name and "b/c/d" is the flag value that
  is a relative path
* During CMake conversion, "b/c/d" will be prefixed with ANDROID_ROOT
  before being written to CMakeLists.txt

Bug: 112599284
Test: cd system/bt; mm -j40
      croot; make -j40

Change-Id: I4bb039678482201db60f0af97ab280d5028e0463
diff --git a/cc/cmakelists.go b/cc/cmakelists.go
index a2f46cd..699f5c0 100644
--- a/cc/cmakelists.go
+++ b/cc/cmakelists.go
@@ -204,10 +204,11 @@
 	writeAllIncludeDirectories(c.systemHeaderSearchPath, f, true)
 	writeAllIncludeDirectories(c.headerSearchPath, f, false)
 	if cflags {
+		writeAllRelativeFilePathFlags(c.relativeFilePathFlags, f, "CMAKE_C_FLAGS")
 		writeAllFlags(c.flags, f, "CMAKE_C_FLAGS")
 	}
-
 	if cppflags {
+		writeAllRelativeFilePathFlags(c.relativeFilePathFlags, f, "CMAKE_CXX_FLAGS")
 		writeAllFlags(c.flags, f, "CMAKE_CXX_FLAGS")
 	}
 	if c.sysroot != "" {
@@ -249,6 +250,17 @@
 	f.WriteString("list (APPEND SOURCE_FILES ${TMP_HEADERS})\n\n")
 }
 
+type relativeFilePathFlagType struct {
+	flag             string
+	relativeFilePath string
+}
+
+func writeAllRelativeFilePathFlags(relativeFilePathFlags []relativeFilePathFlagType, f *os.File, tag string) {
+	for _, flag := range relativeFilePathFlags {
+		f.WriteString(fmt.Sprintf("set(%s \"${%s} %s=%s\")\n", tag, tag, flag.flag, buildCMakePath(flag.relativeFilePath)))
+	}
+}
+
 func writeAllFlags(flags []string, f *os.File, tag string) {
 	for _, flag := range flags {
 		f.WriteString(fmt.Sprintf("set(%s \"${%s} %s\")\n", tag, tag, flag))
@@ -263,6 +275,7 @@
 	systemHeaderSearchPath
 	flag
 	systemRoot
+	relativeFilePathFlag
 )
 
 type compilerParameters struct {
@@ -270,6 +283,8 @@
 	systemHeaderSearchPath []string
 	flags                  []string
 	sysroot                string
+	// Must be in a=b/c/d format and can be split into "a" and "b/c/d"
+	relativeFilePathFlags []relativeFilePathFlagType
 }
 
 func makeCompilerParameters() compilerParameters {
@@ -294,6 +309,9 @@
 	if strings.HasPrefix(parameter, "--sysroot") {
 		return systemRoot
 	}
+	if strings.HasPrefix(parameter, "-fsanitize-blacklist") {
+		return relativeFilePathFlag
+	}
 	return flag
 }
 
@@ -347,6 +365,16 @@
 				f.WriteString("# Found a system root path marker with no path")
 			}
 			i = i + 1
+		case relativeFilePathFlag:
+			flagComponents := strings.Split(param, "=")
+			if len(flagComponents) == 2 {
+				flagStruct := relativeFilePathFlagType{flag: flagComponents[0], relativeFilePath: flagComponents[1]}
+				compilerParameters.relativeFilePathFlags = append(compilerParameters.relativeFilePathFlags, flagStruct)
+			} else {
+				if outputDebugInfo {
+					f.WriteString(fmt.Sprintf("# Relative File Path Flag [%s] is not formatted as a=b/c/d \n", param))
+				}
+			}
 		}
 	}
 	return compilerParameters