Build modules from source for module products.

This overrides the branch default
(BRANCH_DEFAULT_MODULE_BUILD_FROM_SOURCE) if it is set to use
prebuilts.

Test: build/soong/soong_ui.bash --dumpvar-mode MODULE_BUILD_FROM_SOURCE
  returns false with BRANCH_DEFAULT_MODULE_BUILD_FROM_SOURCE:=false
  in internal
Test: env TARGET_PRODUCT=module_arm64 \
      build/soong/soong_ui.bash --dumpvar-mode MODULE_BUILD_FROM_SOURCE
  returns true with BRANCH_DEFAULT_MODULE_BUILD_FROM_SOURCE:=false
  in internal
Test: env TARGET_PRODUCT=mainline_modules_x86 \
      build/soong/soong_ui.bash --dumpvar-mode MODULE_BUILD_FROM_SOURCE
  returns true with BRANCH_DEFAULT_MODULE_BUILD_FROM_SOURCE:=false
  in internal
Test: env TARGET_PRODUCT=redfin \
      build/soong/soong_ui.bash --dumpvar-mode MODULE_BUILD_FROM_SOURCE
  returns false with BRANCH_DEFAULT_MODULE_BUILD_FROM_SOURCE:=false
  in internal
Bug: 222723757
Change-Id: I0faea006b0e95eff40bbfbe00cc74ba5985beeba
diff --git a/core/android_soong_config_vars.mk b/core/android_soong_config_vars.mk
index 777aec5..6c32da4 100644
--- a/core/android_soong_config_vars.mk
+++ b/core/android_soong_config_vars.mk
@@ -52,9 +52,9 @@
   # However, sdk/win_sdk/sdk_addon builds might not include com.google.android.xxx
   # packages, so for those we respect the default behavior.
   MODULE_BUILD_FROM_SOURCE := true
-else ifeq (,$(filter-out modules_% mainline_modules_%,$(TARGET_PRODUCT)))
-  # Always build from source in unbundled builds using the module targets.
-  MODULE_BUILD_FROM_SOURCE := true
+else ifneq (,$(PRODUCT_MODULE_BUILD_FROM_SOURCE))
+  # Let products override the branch default.
+  MODULE_BUILD_FROM_SOURCE := $(PRODUCT_MODULE_BUILD_FROM_SOURCE)
 else
   MODULE_BUILD_FROM_SOURCE := $(BRANCH_DEFAULT_MODULE_BUILD_FROM_SOURCE)
 endif
@@ -64,10 +64,6 @@
 else ifneq (,$(findstring .android.art,$(TARGET_BUILD_APPS)))
   # Build ART modules from source if they are listed in TARGET_BUILD_APPS.
   ART_MODULE_BUILD_FROM_SOURCE := true
-else ifeq (,$(filter-out modules_% mainline_modules_%,$(TARGET_PRODUCT)))
-  # Always build from source for the module targets. This ought to be covered by
-  # the TARGET_BUILD_APPS check above, but there are test builds that don't set it.
-  ART_MODULE_BUILD_FROM_SOURCE := true
 else
   # Do the same as other modules by default.
   ART_MODULE_BUILD_FROM_SOURCE := $(MODULE_BUILD_FROM_SOURCE)
diff --git a/core/product.mk b/core/product.mk
index 4ddc4fe..1f304cd 100644
--- a/core/product.mk
+++ b/core/product.mk
@@ -370,6 +370,10 @@
 # "/system/framework/foo.jar" will be "system/framework/foo.jar.fsv_meta".
 _product_single_value_vars += PRODUCT_SYSTEM_FSVERITY_GENERATE_METADATA
 
+# If true, sets the default for MODULE_BUILD_FROM_SOURCE. This overrides
+# BRANCH_DEFAULT_MODULE_BUILD_FROM_SOURCE but not an explicitly set value.
+_product_single_value_vars += PRODUCT_MODULE_BUILD_FROM_SOURCE
+
 .KATI_READONLY := _product_single_value_vars _product_list_vars
 _product_var_list :=$= $(_product_single_value_vars) $(_product_list_vars)