Allow to tag owner to PRODUCT_COPY_FILES

PRODUCT_COPY_FILES now is a list of words like <source
path>:<destination path>[:<owner>].
The optional :<owner> is used to indicate the owner of a vendor file.

Bug: 7048854
Change-Id: I435d1e18b7a091fb62513062cfc2e420e51557ec
diff --git a/core/Makefile b/core/Makefile
index 8f0895b..e0f6da8 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -13,7 +13,7 @@
 
 # -----------------------------------------------------------------
 # Define rules to copy PRODUCT_COPY_FILES defined by the product.
-# PRODUCT_COPY_FILES contains words like <source file>:<dest file>.
+# PRODUCT_COPY_FILES contains words like <source file>:<dest file>[:<owner>].
 # <dest file> is relative to $(PRODUCT_OUT), so it should look like,
 # e.g., "system/etc/file.xml".
 # The filter part means "only eval the copy-one-file rule if this
diff --git a/core/product.mk b/core/product.mk
index 20d1e97..c0e6e3e 100644
--- a/core/product.mk
+++ b/core/product.mk
@@ -165,7 +165,7 @@
     $(eval pb := $(strip $(PRODUCTS.$(p).PRODUCT_BRAND))) \
     $(if $(pb),,$(error $(p): PRODUCT_BRAND must be defined.)) \
     $(foreach cf,$(strip $(PRODUCTS.$(p).PRODUCT_COPY_FILES)), \
-      $(if $(filter 2,$(words $(subst :,$(space),$(cf)))),, \
+      $(if $(filter 2 3,$(words $(subst :,$(space),$(cf)))),, \
         $(error $(p): malformed COPY_FILE "$(cf)") \
        ) \
      ) \
diff --git a/core/product_config.mk b/core/product_config.mk
index 9c85d2c..7bb1852 100644
--- a/core/product_config.mk
+++ b/core/product_config.mk
@@ -284,11 +284,12 @@
 endif
 endif
 
-# A list of words like <source path>:<destination path>.  The file at
-# the source path should be copied to the destination path when building
-# this product.  <destination path> is relative to $(PRODUCT_OUT), so
-# it should look like, e.g., "system/etc/file.xml".  The rules
-# for these copy steps are defined in config/Makefile.
+# A list of words like <source path>:<destination path>[:<owner>].
+# The file at the source path should be copied to the destination path
+# when building  this product.  <destination path> is relative to
+# $(PRODUCT_OUT), so it should look like, e.g., "system/etc/file.xml".
+# The rules for these copy steps are defined in build/core/Makefile.
+# The optional :<owner> is used to indicate the owner of a vendor file.
 PRODUCT_COPY_FILES := \
     $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_COPY_FILES))
 
diff --git a/core/tasks/vendor_module_check.mk b/core/tasks/vendor_module_check.mk
index 9cbca41..cbee384 100644
--- a/core/tasks/vendor_module_check.mk
+++ b/core/tasks/vendor_module_check.mk
@@ -17,22 +17,22 @@
 # Restrict the vendor module owners here.
 _vendor_owner_whitelist := \
         asus \
-	audience \
-	broadcom \
-	csr \
+        audience \
+        broadcom \
+        csr \
         elan \
         google \
-	imgtec \
-	invensense \
+        imgtec \
+        invensense \
         lge \
         nvidia \
-	nxp \
+        nxp \
         qcom \
-	samsung \
-	samsung_arm \
-	ti \
+        samsung \
+        samsung_arm \
+        ti \
         trusted_logic \
-	widevine
+        widevine
 
 
 ifneq (,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_RESTRICT_VENDOR_FILES))
@@ -47,10 +47,13 @@
 $(error Error: Product "$(TARGET_PRODUCT)" can not have overlay in vendor tree: \
     $(filter vendor/%, $(PRODUCT_PACKAGE_OVERLAYS) $(DEVICE_PACKAGE_OVERLAYS)))
 endif
-ifneq (,$(filter vendor/%, $(PRODUCT_COPY_FILES)))
-$(error Error: Product "$(TARGET_PRODUCT)" can not have PRODUCT_COPY_FILES from vendor tree: \
-    $(filter vendor/%, $(PRODUCT_COPY_FILES)))
+_vendor_check_copy_files := $(filter vendor/%, $(PRODUCT_COPY_FILES))
+ifneq (,$(_vendor_check_copy_files))
+$(foreach c, $(_vendor_check_copy_files), \
+  $(if $(filter $(_vendor_owner_whitelist), $(call word-colon, 3, $(c))),,\
+    $(error Error: vendor PRODUCT_COPY_FILES file "$(c)" has unknown owner)))
 endif
+_vendor_check_copy_files :=
 
 $(foreach m, $(_vendor_check_modules), \
   $(if $(filter vendor/%, $(ALL_MODULES.$(m).PATH)),\