Merge changes from topic "mod-info-foreach" into main

* changes:
  Reduce spaces in module-info.json
  use KATI_foreach_sep in module-info.json rules
diff --git a/core/base_rules.mk b/core/base_rules.mk
index 9ad1cc5..998cb0d 100644
--- a/core/base_rules.mk
+++ b/core/base_rules.mk
@@ -578,7 +578,9 @@
 
       ALL_VINTF_MANIFEST_FRAGMENTS_LIST += $(my_vintf_new_pairs)
 
-      $(my_all_targets) : $(my_vintf_new_installed)
+      $(my_all_targets) : $(my_vintf_installed)
+      # Install fragments together with the target
+      $(LOCAL_INSTALLED_MODULE) : | $(my_vintf_installed)
     endif # my_vintf_fragments
 
     # Rule to install the module's companion init.rc.
@@ -615,6 +617,8 @@
       ALL_INIT_RC_INSTALLED_PAIRS += $(my_init_rc_new_pairs)
 
       $(my_all_targets) : $(my_init_rc_installed)
+      # Install init_rc together with the target
+      $(LOCAL_INSTALLED_MODULE) : | $(my_init_rc_installed)
     endif # my_init_rc
 
   endif # !LOCAL_IS_HOST_MODULE
@@ -975,6 +979,11 @@
       $(my_init_rc_pairs) \
       $(my_test_data_pairs) \
       $(my_vintf_pairs))
+  # Store the list of vintf/init_rc as order-only dependencies
+  ALL_MODULES.$(my_register_name).ORDERONLY_INSTALLED := \
+    $(strip $(ALL_MODULES.$(my_register_name).ORDERONLY_INSTALLED) \
+      $(my_init_rc_installed) \
+      $(my_vintf_installed))
 else ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE))
   ALL_MODULES.$(my_register_name).INSTALLED := \
     $(strip $(ALL_MODULES.$(my_register_name).INSTALLED) \
@@ -984,6 +993,10 @@
     $(strip $(ALL_MODULES.$(my_register_name).BUILT_INSTALLED) \
     $(LOCAL_BUILT_MODULE):$(LOCAL_INSTALLED_MODULE) \
     $(my_init_rc_pairs) $(my_test_data_pairs) $(my_vintf_pairs))
+  ALL_MODULES.$(my_register_name).ORDERONLY_INSTALLED := \
+    $(strip $(ALL_MODULES.$(my_register_name).ORDERONLY_INSTALLED) \
+      $(my_init_rc_installed) \
+      $(my_vintf_installed))
 endif
 ifdef LOCAL_PICKUP_FILES
 # Files or directories ready to pick up by the build system
diff --git a/core/build_id.mk b/core/build_id.mk
index ba5ca42..4c2c7fa 100644
--- a/core/build_id.mk
+++ b/core/build_id.mk
@@ -18,4 +18,4 @@
 # (like "CRB01").  It must be a single word, and is
 # capitalized by convention.
 
-BUILD_ID=AOSP.MASTER
+BUILD_ID=AOSP.MAIN
diff --git a/core/main.mk b/core/main.mk
index 5a591f9..058a1a8 100644
--- a/core/main.mk
+++ b/core/main.mk
@@ -810,12 +810,14 @@
 
 # Sets up dependencies such that whenever a target module is installed,
 # any other target modules listed in $(ALL_MODULES.$(m).REQUIRED_FROM_TARGET) will also be installed
+# This doesn't apply to ORDERONLY_INSTALLED items.
 define add-all-target-to-target-required-modules-deps
 $(foreach m,$(ALL_MODULES), \
   $(eval r := $(ALL_MODULES.$(m).REQUIRED_FROM_TARGET)) \
   $(if $(r), \
     $(eval r := $(call module-installed-files,$(r))) \
     $(eval t_m := $(filter $(TARGET_OUT_ROOT)/%, $(ALL_MODULES.$(m).INSTALLED))) \
+    $(eval t_m := $(filter-out $(ALL_MODULES.$(m).ORDERONLY_INSTALLED), $(ALL_MODULES.$(m).INSTALLED))) \
     $(eval t_r := $(filter $(TARGET_OUT_ROOT)/%, $(r))) \
     $(eval t_r := $(filter-out $(t_m), $(t_r))) \
     $(if $(t_m), $(eval $(call add-required-deps, $(t_m),$(t_r)))) \
diff --git a/target/product/cfi-common.mk b/target/product/cfi-common.mk
index 5cc7ae5..559963c 100644
--- a/target/product/cfi-common.mk
+++ b/target/product/cfi-common.mk
@@ -33,7 +33,7 @@
     hardware/qcom/wlan/wcn6740/qcwcn/wpa_supplicant_8_lib \
     hardware/interfaces/keymaster \
     hardware/interfaces/security \
-    packages/modules/Bluetooth \
+    packages/modules/Bluetooth/system \
     system/chre \
     system/core/libnetutils \
     system/libziparchive \
diff --git a/tools/aconfig/src/codegen_cpp.rs b/tools/aconfig/src/codegen_cpp.rs
index 8acac8e..979b8ad 100644
--- a/tools/aconfig/src/codegen_cpp.rs
+++ b/tools/aconfig/src/codegen_cpp.rs
@@ -67,6 +67,16 @@
             },
             dir: "",
         },
+        FileSpec {
+            name: &format!("{}_c.h", header),
+            template: include_str!("../templates/c_exported_header.template"),
+            dir: "include",
+        },
+        FileSpec {
+            name: &format!("{}_c.cc", header),
+            template: include_str!("../templates/c_source_file.template"),
+            dir: "",
+        },
     ];
     files.iter().map(|file| generate_file(file, &context)).collect()
 }
@@ -387,6 +397,71 @@
 }
 "#;
 
+    const C_EXPORTED_HEADER_EXPECTED: &str = r#"
+#ifndef com_android_aconfig_test_c_HEADER_H
+#define com_android_aconfig_test_c_HEADER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const char* com_android_aconfig_test_DISABLED_RO;
+extern const char* com_android_aconfig_test_DISABLED_RW;
+extern const char* com_android_aconfig_test_ENABLED_RO;
+extern const char* com_android_aconfig_test_ENABLED_RW;
+
+bool com_android_aconfig_test_disabled_ro();
+
+bool com_android_aconfig_test_disabled_rw();
+
+bool com_android_aconfig_test_enabled_ro();
+
+bool com_android_aconfig_test_enabled_rw();
+
+void com_android_aconfig_test_override_flag(const char* name, bool val);
+
+void com_android_aconfig_test_reset_overrides();
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+"#;
+
+    const C_SOURCE_FILE_EXPECTED: &str = r#"
+#include "com_android_aconfig_test_c.h"
+#include "com_android_aconfig_test.h"
+#include <string>
+
+const char* com_android_aconfig_test_DISABLED_RO = "com.android.aconfig.test.disabled_ro";
+const char* com_android_aconfig_test_DISABLED_RW = "com.android.aconfig.test.disabled_rw";
+const char* com_android_aconfig_test_ENABLED_RO = "com.android.aconfig.test.enabled_ro";
+const char* com_android_aconfig_test_ENABLED_RW = "com.android.aconfig.test.enabled_rw";
+
+bool com_android_aconfig_test_disabled_ro() {
+    return com::android::aconfig::test::disabled_ro();
+}
+
+bool com_android_aconfig_test_disabled_rw() {
+    return com::android::aconfig::test::disabled_rw();
+}
+
+bool com_android_aconfig_test_enabled_ro() {
+    return com::android::aconfig::test::enabled_ro();
+}
+
+bool com_android_aconfig_test_enabled_rw() {
+    return com::android::aconfig::test::enabled_rw();
+}
+
+void com_android_aconfig_test_override_flag(const char* name, bool val) {
+    com::android::aconfig::test::override_flag(std::string(name), val);
+}
+
+void com_android_aconfig_test_reset_overrides() {
+    com::android::aconfig::test::reset_overrides();
+}
+"#;
     fn test_generate_cpp_code(mode: CodegenMode) {
         let parsed_flags = crate::test::parse_test_flags();
         let generated =
@@ -435,6 +510,26 @@
                 generated_files_map.get(&target_file_path).unwrap()
             )
         );
+
+        target_file_path = String::from("include/com_android_aconfig_test_c.h");
+        assert!(generated_files_map.contains_key(&target_file_path));
+        assert_eq!(
+            None,
+            crate::test::first_significant_code_diff(
+                C_EXPORTED_HEADER_EXPECTED,
+                generated_files_map.get(&target_file_path).unwrap()
+            )
+        );
+
+        target_file_path = String::from("com_android_aconfig_test_c.cc");
+        assert!(generated_files_map.contains_key(&target_file_path));
+        assert_eq!(
+            None,
+            crate::test::first_significant_code_diff(
+                C_SOURCE_FILE_EXPECTED,
+                generated_files_map.get(&target_file_path).unwrap()
+            )
+        );
     }
 
     #[test]
diff --git a/tools/aconfig/templates/c_exported_header.template b/tools/aconfig/templates/c_exported_header.template
new file mode 100644
index 0000000..08af860
--- /dev/null
+++ b/tools/aconfig/templates/c_exported_header.template
@@ -0,0 +1,22 @@
+#ifndef {header}_c_HEADER_H
+#define {header}_c_HEADER_H
+
+#ifdef __cplusplus
+extern "C" \{
+#endif
+
+{{ for item in class_elements}}
+extern const char* {header}_{item.uppercase_flag_name};
+{{ endfor -}}
+
+{{ for item in class_elements}}
+bool {header}_{item.flag_name}();{{ endfor }}
+
+void {header}_override_flag(const char* name, bool val);
+
+void {header}_reset_overrides();
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/tools/aconfig/templates/c_source_file.template b/tools/aconfig/templates/c_source_file.template
new file mode 100644
index 0000000..18da299
--- /dev/null
+++ b/tools/aconfig/templates/c_source_file.template
@@ -0,0 +1,21 @@
+#include "{header}_c.h"
+#include "{header}.h"
+#include <string>
+
+{{ for item in class_elements}}
+const char* {header}_{item.uppercase_flag_name} = "{item.device_config_flag}";
+{{ endfor - }}
+
+{{ for item in class_elements}}
+bool {header}_{item.flag_name}() \{
+    return {cpp_namespace}::{item.flag_name}();
+}
+{{ endfor }}
+
+void {header}_override_flag(const char* name, bool val) \{
+     {cpp_namespace}::override_flag(std::string(name), val);
+}
+
+void {header}_reset_overrides() \{
+     {cpp_namespace}::reset_overrides();
+}