150 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/python3
 | |
| # -*- coding: utf-8 -*-
 | |
| """
 | |
| Copyright (c) 2021 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.
 | |
| 
 | |
| """
 | |
| import os
 | |
| import json
 | |
| import argparse
 | |
| from hb.resources.config import Config
 | |
| 
 | |
| """
 | |
| @Desc:
 | |
|   This script is used to generate full components
 | |
|   example for creating new products
 | |
| 
 | |
| @GUID:
 | |
| basic:
 | |
|   cmd1: cd ${repo_root}
 | |
|   cmd2: python3 ./build/tools/component_tools/full_components_generator.py
 | |
|   base_product.json will be created in ./productdefine/common/base
 | |
| 
 | |
| advanced:
 | |
|   cmd: python3 full_components_generator.py -h
 | |
|   Get more information
 | |
| 
 | |
| @Date 2022/01/14
 | |
| """
 | |
| 
 | |
| def find_files(path, name):
 | |
|     ret, files, folders = [], [], [path]
 | |
|     for folder in folders:
 | |
|         for file in os.listdir(folder):
 | |
|             abs_file = os.path.join(folder, file)
 | |
|             if str(file) == name:
 | |
|                 files.append(abs_file)
 | |
|             if os.path.isdir(abs_file):
 | |
|                 folders.append(abs_file)
 | |
|     
 | |
|     for file in files:
 | |
|         if len(file) > 0 and os.path.exists(file):
 | |
|             ret.append(file)
 | |
|     return ret
 | |
| 
 | |
| 
 | |
| def read_component_from_ohos_build(file):
 | |
|     ret = {"subsystem": "", "components": []}
 | |
|     with open(file, "rb") as f:
 | |
|         data = json.load(f)
 | |
|         ret["subsystem"] =  data.get("subsystem")
 | |
|         for k, _ in data.get("parts").items():
 | |
|             ret.get("components").append(k)
 | |
|     return ret
 | |
| 
 | |
| 
 | |
| def read_component_from_bundle_json(file):
 | |
|     ret = {"subsystem": "", "components": []}
 | |
|     with open(file, "rb") as f:
 | |
|         data = json.load(f)
 | |
|         ret["subsystem"] = data.get("component").get("subsystem")
 | |
|         ret.get("components").append(data.get("component").get("name"))
 | |
|     return ret
 | |
| 
 | |
| 
 | |
| def find_component_in_path(subsys, path):
 | |
|     ret = set()
 | |
|     if not os.path.exists(path):
 | |
|         return []
 | |
|     files_ohos_build = find_files(path, "ohos.build")
 | |
|     files_bundle_json = find_files(path, "bundle.json")
 | |
|     for ohos_build in files_ohos_build:
 | |
|         data = read_component_from_ohos_build(ohos_build)
 | |
|         if data.get("subsystem") == subsys:
 | |
|             ret = ret.union(set(data.get("components")))
 | |
| 
 | |
|     for bundle_json in files_bundle_json:
 | |
|         data = read_component_from_bundle_json(bundle_json)
 | |
|         if data.get("subsystem") == subsys:
 | |
|             ret = ret.union(set(data.get("components")))
 | |
|     return ret
 | |
| 
 | |
| 
 | |
| def update_components(subsys_file):
 | |
|     ret = {"subsystems": []}
 | |
|     with open(subsys_file, "rb") as f:
 | |
|         data = json.load(f)
 | |
|         for subsys, v in data.items():
 | |
|             components_path = v.get("path")
 | |
|             parts = find_component_in_path(subsys, components_path)
 | |
|             components = []
 | |
|             for part in parts:
 | |
|                 components.append({"component": part, "features": []})
 | |
|             ret.get("subsystems").append(
 | |
|                 {"subsystem": subsys, "components": components})
 | |
|     return ret
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     conf = Config()
 | |
|     subsystem_json_overlay_path = conf.product_path + '/subsystem_config_overlay.json'
 | |
|     parser = argparse.ArgumentParser()
 | |
|     parser.add_argument('--subsys', type=str, default="./build/subsystem_config.json",
 | |
|                         help='subsystem config file location, default=//build/subsystem_config.json')
 | |
|     parser.add_argument('--subsys_overlay', type=str, default=subsystem_json_overlay_path,
 | |
|                         help='subsystem config overlay file location, default={}'.format(subsystem_json_overlay_path))
 | |
|     parser.add_argument('--out', type=str, default="./productdefine/common/base/base_product.json",
 | |
|                         help='base_config output path default //productdefine/common/base')
 | |
|     args = parser.parse_args()
 | |
|     # Only for version 3.0 config
 | |
|     # 'device_name' has been replaced by 'board' in 3.0
 | |
|     # device info has been merged into product in 3.0
 | |
|     # 'target cpu' need to be arm instead of arm64 due to adaption work has not been done
 | |
|     ret = {
 | |
|         "product_name": "ohos-arm64",
 | |
|         "version": "3.0",
 | |
|         "type": "standard",
 | |
|         "ohos_version": "OpenHarmony 3.x",
 | |
|         "board": "arm64",
 | |
|         "kernel_type": "",
 | |
|         "kernel_version": "",
 | |
|         "device_name": "arm64",
 | |
|         "device_company": "openharmony",
 | |
|         "target_os": "ohos",
 | |
|         "target_cpu": "arm",
 | |
|         "subsystems": []
 | |
|     }
 | |
|     data = update_components(args.subsys)
 | |
|     ret["subsystems"] = data.get("subsystems")
 | |
|     if os.path.isfile(subsystem_json_overlay_path):
 | |
|         overlay_data = update_components(args.subsys_overlay)
 | |
|         ret["subsystems"].update(overlay_data.get("subsystems"))
 | |
|     with open(args.out, "w") as f:
 | |
|         f.write(json.dumps(ret, indent=2))
 | |
|     print("file has generated in path: {}".format(args.out))
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |