
# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Top-level test configuration.
# Converted from the following makefile
### PRODUCT_PACKAGES += dev
### PRODUCT_HOST_PACKAGES += host
### $(call inherit-product, $(LOCAL_PATH)/part1.mk)
### PRODUCT_COPY_FILES += device_from:device_to
### include $(LOCAL_PATH)/include1.mk
### PRODUCT_PACKAGES += dev_after
### PRODUCT_COPY_FILES += $(call find-copy-subdir-files,audio_platform_info*.xml,device/google/redfin/audio,$(TARGET_COPY_OUT_VENDOR)/etc) xyz:/etc/xyz
### PRODUCT_COPY_FILES += $(call copy-files,x.xml y.xml,/etc)
### $(call add_soong_namespace,NS1)
### $(call add_soong_config_var_value,NS1,v1,abc)
### $(call add_soong_config_var_value,NS1,v2,def)
### $(call add_soong_namespace,NS2)
### $(call add_soong_config_var_value,NS2,v3,abc)
### $(call add_soong_config_var_value,NS2,v3,xyz)

load("//build/make/core:product_config.rbc", "rblf")
load(":part1.rbc", _part1_init = "init")
load(":include1.rbc", _include1_init = "init")

def init(g, handle):
  cfg = rblf.cfg(handle)
  rblf.setdefault(handle, "PRODUCT_PACKAGES")
  cfg["PRODUCT_PACKAGES"] += ["dev"]
  rblf.setdefault(handle, "PRODUCT_HOST_PACKAGES")
  cfg["PRODUCT_HOST_PACKAGES"] += ["host"]
  rblf.inherit(handle, "test/part1", _part1_init)
  rblf.setdefault(handle, "PRODUCT_COPY_FILES")
  cfg["PRODUCT_COPY_FILES"] += ["device_from:device_to"]
  _include1_init(g, handle)
  cfg["PRODUCT_PACKAGES"] += ["dev_after"]
  cfg["PRODUCT_COPY_FILES"] += (rblf.find_and_copy("audio_platform_info*.xml", "device/google/redfin/audio", "||VENDOR-PATH-PH||/etc") +
      ["xyz:/etc/xyz"])
  cfg["PRODUCT_COPY_FILES"] += rblf.copy_files("x.xml y.xml", "/etc")
  rblf.add_soong_config_namespace(g, "NS1")
  rblf.add_soong_config_var_value(g, "NS1", "v1", "abc")
  rblf.add_soong_config_var_value(g, "NS1", "v2", "def")
  rblf.add_soong_config_namespace(g, "NS2")
  rblf.add_soong_config_var_value(g, "NS2", "v3", "abc")
  rblf.add_soong_config_var_value(g, "NS2", "v3", "xyz")

