# Copyright (c) 2024 Huawei Device Co., Ltd.
# 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
#
#     http://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.

lite_target_list = []

# Step 1: Read product configuration profile.
product_cfg = read_file("${product_config_path}/config.json", "json")

parts_targets_info =
    read_file(
        "${root_build_dir}/build_configs/parts_info/parts_modules_info.json",
        "json")

# Step 2: Loop subsystems configured by product.
foreach(product_configed_subsystem, product_cfg.subsystems) {
  subsystem_name = product_configed_subsystem.subsystem

  if (build_xts || (!build_xts && subsystem_name != "xts")) {
    # Step 3: Read OS subsystems profile.
    subsystem_parts_info = {
    }
    subsystem_parts_info = read_file(
            "${root_build_dir}/build_configs/mini_adapter/${subsystem_name}.json",
            "json")

    # Step 4: Loop components configured by product.
    foreach(product_configed_component, product_configed_subsystem.components) {
      # Step 5: Check whether the component configured by product is exist.
      component_found = false

      foreach(part_name, subsystem_parts_info.parts) {
        if (product_configed_component.component == part_name) {
          component_found = true
        }
      }

      assert(component_found,
             "Component \"${product_configed_component.component}\" not found" +
                 ", please check your product configuration.")

      # Step 6: Loop OS components and check validity of product configuration.
      foreach(part_name, subsystem_parts_info.parts) {
        kernel_valid = true

        # Step 6.1: Skip component which not configured by product.
        if (part_name == product_configed_component.component) {
          # Step 6.1.1: Loop OS components adapted kernel type.

          assert(
              kernel_valid,
              "Invalid component configed, ${subsystem_name}:${product_configed_component.component} " + "not available for kernel: ${product_cfg.kernel_type}!")

          # Step 6.1.2: Add valid component for compiling.
          # Skip kernel target for userspace only scenario.
          if (!ohos_build_userspace_only ||
              (ohos_build_userspace_only && subsystem_name != "kernel" &&
               subsystem_name != "vendor")) {
            foreach(_p_info, parts_targets_info.parts) {
              if (_p_info.part_name == product_configed_component.component) {
                lite_target_list += _p_info.module_list
              }
            }
          }
        }
      }
    }
  }
}

# Skip device target for userspace only scenario.
if (!ohos_build_userspace_only) {
  # Step 7: Add device and product target by default.
  # liteos_m kernel organise device build targets, but not by default.
  if (product_cfg.kernel_type != "liteos_m") {
    lite_target_list += [ "${device_path}/../" ]
  }
}