131c75014Sopenharmony_ci#!/usr/bin/env python 231c75014Sopenharmony_ci# -*- coding: utf-8 -*- 331c75014Sopenharmony_ci""" 431c75014Sopenharmony_ciCopyright (c) 2020-2021 Huawei Device Co., Ltd. 531c75014Sopenharmony_ciLicensed under the Apache License, Version 2.0 (the "License"); 631c75014Sopenharmony_ciyou may not use this file except in compliance with the License. 731c75014Sopenharmony_ciYou may obtain a copy of the License at 831c75014Sopenharmony_ci 931c75014Sopenharmony_ci http://www.apache.org/licenses/LICENSE-2.0 1031c75014Sopenharmony_ci 1131c75014Sopenharmony_ciUnless required by applicable law or agreed to in writing, software 1231c75014Sopenharmony_cidistributed under the License is distributed on an "AS IS" BASIS, 1331c75014Sopenharmony_ciWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1431c75014Sopenharmony_ciSee the License for the specific language governing permissions and 1531c75014Sopenharmony_cilimitations under the License. 1631c75014Sopenharmony_ci""" 1731c75014Sopenharmony_ci 1831c75014Sopenharmony_ciimport os 1931c75014Sopenharmony_ciimport fnmatch 2031c75014Sopenharmony_ciimport sys 2131c75014Sopenharmony_ciimport argparse 2231c75014Sopenharmony_ciimport distutils.dir_util as dir_util 2331c75014Sopenharmony_ciimport distutils.file_util as file_util 2431c75014Sopenharmony_ciimport json 2531c75014Sopenharmony_ciimport subprocess 2631c75014Sopenharmony_ci 2731c75014Sopenharmony_ci# all sub system list, must be lowercase. 2831c75014Sopenharmony_ci_SUB_SYSTEM_LIST = [ 2931c75014Sopenharmony_ci "kernel", 3031c75014Sopenharmony_ci "hiviewdfx", 3131c75014Sopenharmony_ci "communication", 3231c75014Sopenharmony_ci "security", 3331c75014Sopenharmony_ci "updater", 3431c75014Sopenharmony_ci "sstsutils", 3531c75014Sopenharmony_ci "utils", 3631c75014Sopenharmony_ci "uikit", 3731c75014Sopenharmony_ci "multimedia", 3831c75014Sopenharmony_ci "hdf", 3931c75014Sopenharmony_ci "appexecfwk", 4031c75014Sopenharmony_ci "distributedschedule", 4131c75014Sopenharmony_ci "startup", 4231c75014Sopenharmony_ci "sensors", 4331c75014Sopenharmony_ci "sample", 4431c75014Sopenharmony_ci "iothardware", 4531c75014Sopenharmony_ci "open_posix_testsuite", 4631c75014Sopenharmony_ci "validator" 4731c75014Sopenharmony_ci] 4831c75014Sopenharmony_ci_GRADLE_PARAMS = ["SIGN_USER_NAME", "SIGN_PWD", "SIGN_MATERIAL_PATH", 4931c75014Sopenharmony_ci "SIGN_PROFILE", "SIGN_CERT_FILE"] 5031c75014Sopenharmony_ci 5131c75014Sopenharmony_ci_DEFAULT_USER_NAME = "user" 5231c75014Sopenharmony_ci_DEFAULT_PWD = "decrypt_pwd" 5331c75014Sopenharmony_ci 5431c75014Sopenharmony_ci 5531c75014Sopenharmony_cidef main(): 5631c75014Sopenharmony_ci parser = argparse.ArgumentParser() 5731c75014Sopenharmony_ci parser.add_argument('--method_name', help='', required=True) 5831c75014Sopenharmony_ci parser.add_argument('--arguments', help='', 5931c75014Sopenharmony_ci required=True) # format key=value#key=value 6031c75014Sopenharmony_ci args = parser.parse_args() 6131c75014Sopenharmony_ci this_module = sys.modules[__name__] 6231c75014Sopenharmony_ci method = getattr(this_module, args.method_name) 6331c75014Sopenharmony_ci arguments = {} 6431c75014Sopenharmony_ci for argument in args.arguments.split("#"): 6531c75014Sopenharmony_ci key_value = argument.strip().split("=") 6631c75014Sopenharmony_ci if len(key_value) != 2: 6731c75014Sopenharmony_ci raise ValueError("Wrong format : '%s' % argument") 6831c75014Sopenharmony_ci arguments.setdefault(key_value[0].strip(), key_value[1].strip()) 6931c75014Sopenharmony_ci method(**arguments) 7031c75014Sopenharmony_ci return 0 7131c75014Sopenharmony_ci 7231c75014Sopenharmony_ci 7331c75014Sopenharmony_cidef read_file(input_file): 7431c75014Sopenharmony_ci if not os.path.exists(input_file): 7531c75014Sopenharmony_ci return "" 7631c75014Sopenharmony_ci 7731c75014Sopenharmony_ci with open(input_file, 'r') as input_f: 7831c75014Sopenharmony_ci content = input_f.read().strip() 7931c75014Sopenharmony_ci return content 8031c75014Sopenharmony_ci 8131c75014Sopenharmony_ci 8231c75014Sopenharmony_cidef write_file(output_file, content, append): 8331c75014Sopenharmony_ci file_dir = os.path.dirname(os.path.abspath(output_file)) 8431c75014Sopenharmony_ci if not os.path.exists(file_dir): 8531c75014Sopenharmony_ci os.makedirs(file_dir) 8631c75014Sopenharmony_ci mode = 'a+' if append else 'w' 8731c75014Sopenharmony_ci with open(output_file, mode) as output_f: 8831c75014Sopenharmony_ci output_f.write("%s\n" % content) 8931c75014Sopenharmony_ci 9031c75014Sopenharmony_ci 9131c75014Sopenharmony_cidef copy_file(output, sources="", source_dirs="", to_dir=True): 9231c75014Sopenharmony_ci """ 9331c75014Sopenharmony_ci copy source files or source dir to output. 9431c75014Sopenharmony_ci if sources is not empty, the output can be file(will be created 9531c75014Sopenharmony_ci automatically) 9631c75014Sopenharmony_ci or directory(must be exist). 9731c75014Sopenharmony_ci :param output: If source_dirs is not empty, output must be directory. 9831c75014Sopenharmony_ci :param sources: source files is separated by dot 9931c75014Sopenharmony_ci :param source_dirs: source directory is separated by dot 10031c75014Sopenharmony_ci :param to_dir: output is directory or not 10131c75014Sopenharmony_ci :return: 10231c75014Sopenharmony_ci """ 10331c75014Sopenharmony_ci if not sources and not source_dirs: 10431c75014Sopenharmony_ci raise Exception( 10531c75014Sopenharmony_ci "sources or source_dirs parameter must be specified one") 10631c75014Sopenharmony_ci _output = output.strip() 10731c75014Sopenharmony_ci _sources = sources.strip() 10831c75014Sopenharmony_ci _source_dirs = source_dirs.strip() 10931c75014Sopenharmony_ci _parent_output = os.path.dirname(_output) 11031c75014Sopenharmony_ci try: 11131c75014Sopenharmony_ci if to_dir and not os.path.exists(_output): 11231c75014Sopenharmony_ci os.makedirs(_output) 11331c75014Sopenharmony_ci if not to_dir and not os.path.exists(_parent_output): 11431c75014Sopenharmony_ci os.makedirs(_parent_output) 11531c75014Sopenharmony_ci except OSError: 11631c75014Sopenharmony_ci if not os.path.isdir(_output): 11731c75014Sopenharmony_ci raise 11831c75014Sopenharmony_ci if _sources: 11931c75014Sopenharmony_ci _copy_files(_sources.split(","), _output) 12031c75014Sopenharmony_ci 12131c75014Sopenharmony_ci if _source_dirs: 12231c75014Sopenharmony_ci _copy_dir(_source_dirs.split(","), _output) 12331c75014Sopenharmony_ci 12431c75014Sopenharmony_ci return 0 12531c75014Sopenharmony_ci 12631c75014Sopenharmony_ci 12731c75014Sopenharmony_cidef _copy_files(sources, output): 12831c75014Sopenharmony_ci for source_file in sources: 12931c75014Sopenharmony_ci source_file = source_file.strip() 13031c75014Sopenharmony_ci if os.path.isfile(source_file): 13131c75014Sopenharmony_ci file_util.copy_file(source_file, output) 13231c75014Sopenharmony_ci 13331c75014Sopenharmony_ci 13431c75014Sopenharmony_cidef _copy_dir(sources, output): 13531c75014Sopenharmony_ci for source_file in sources: 13631c75014Sopenharmony_ci source_file = source_file.strip() 13731c75014Sopenharmony_ci if os.path.isdir(source_file): 13831c75014Sopenharmony_ci dir_util.copy_tree(source_file, output) 13931c75014Sopenharmony_ci 14031c75014Sopenharmony_ci 14131c75014Sopenharmony_cidef gen_suite_out(suite_output_prefix, suite_names, out_suffix): 14231c75014Sopenharmony_ci outputs = [] 14331c75014Sopenharmony_ci _suite_output_prefix = suite_output_prefix.strip() 14431c75014Sopenharmony_ci _dirname_suffix = out_suffix.strip().rstrip(os.sep) 14531c75014Sopenharmony_ci for suite in suite_names.split(","): 14631c75014Sopenharmony_ci path = "%s%s/%s" % ( 14731c75014Sopenharmony_ci _suite_output_prefix, suite.strip(), _dirname_suffix) 14831c75014Sopenharmony_ci outputs.append(path) 14931c75014Sopenharmony_ci print(path) 15031c75014Sopenharmony_ci return outputs 15131c75014Sopenharmony_ci 15231c75014Sopenharmony_ci 15331c75014Sopenharmony_cidef get_subsystem_name(path): 15431c75014Sopenharmony_ci subsystem_name = "" 15531c75014Sopenharmony_ci for subsystem in _SUB_SYSTEM_LIST: 15631c75014Sopenharmony_ci subsystem_path = "/%s/" % (subsystem) 15731c75014Sopenharmony_ci _path = path.lower() 15831c75014Sopenharmony_ci if subsystem_path in _path: 15931c75014Sopenharmony_ci subsystem_name = subsystem 16031c75014Sopenharmony_ci break 16131c75014Sopenharmony_ci subsystem_path = "/%s/_lite" % (subsystem) 16231c75014Sopenharmony_ci if subsystem_path in _path: 16331c75014Sopenharmony_ci subsystem_name = subsystem 16431c75014Sopenharmony_ci break 16531c75014Sopenharmony_ci sys.stdout.write(subsystem_name) 16631c75014Sopenharmony_ci return subsystem_name 16731c75014Sopenharmony_ci 16831c75014Sopenharmony_ci 16931c75014Sopenharmony_cidef get_modulename_by_buildtarget(module_list_file, build_target): 17031c75014Sopenharmony_ci if not os.path.exists(module_list_file): 17131c75014Sopenharmony_ci return "" 17231c75014Sopenharmony_ci module_info_data = {} 17331c75014Sopenharmony_ci with open(module_list_file, "r") as module_file: 17431c75014Sopenharmony_ci module_info_data = json.load(module_file) 17531c75014Sopenharmony_ci for module in module_info_data: 17631c75014Sopenharmony_ci if module_info_data[module]["build_target_name"] == build_target: 17731c75014Sopenharmony_ci sys.stdout.write(module) 17831c75014Sopenharmony_ci return module 17931c75014Sopenharmony_ci return "" 18031c75014Sopenharmony_ci 18131c75014Sopenharmony_ci 18231c75014Sopenharmony_cidef glob(path, filename_pattern): 18331c75014Sopenharmony_ci files = [] 18431c75014Sopenharmony_ci for dir_path, _, files in os.walk(path): 18531c75014Sopenharmony_ci for filename in fnmatch.filter(files, filename_pattern): 18631c75014Sopenharmony_ci files.append(os.path.join(dir_path, filename)) 18731c75014Sopenharmony_ci return files 18831c75014Sopenharmony_ci 18931c75014Sopenharmony_ci 19031c75014Sopenharmony_cidef cmd_popen(cmd): 19131c75014Sopenharmony_ci proc = subprocess.Popen(cmd) 19231c75014Sopenharmony_ci proc.wait() 19331c75014Sopenharmony_ci ret_code = proc.returncode 19431c75014Sopenharmony_ci if ret_code != 0: 19531c75014Sopenharmony_ci raise Exception("{} failed, return code is {}".format(cmd, ret_code)) 19631c75014Sopenharmony_ci 19731c75014Sopenharmony_ci 19831c75014Sopenharmony_cidef build_js_hap(**kwargs): 19931c75014Sopenharmony_ci if not check_env(): 20031c75014Sopenharmony_ci return 20131c75014Sopenharmony_ci if "project_path" not in kwargs or "out_put_dir" not in kwargs: 20231c75014Sopenharmony_ci return 20331c75014Sopenharmony_ci project_path = kwargs.get("project_path") 20431c75014Sopenharmony_ci gradle_dir = os.path.join(project_path, "gradle") 20531c75014Sopenharmony_ci os.chdir(gradle_dir) 20631c75014Sopenharmony_ci build_clean = ["gradle", "clean"] 20731c75014Sopenharmony_ci cmd_popen(build_clean) 20831c75014Sopenharmony_ci if "SIGN_USER_NAME" not in kwargs: 20931c75014Sopenharmony_ci pass 21031c75014Sopenharmony_ci 21131c75014Sopenharmony_ci gradle_parm_cmd = get_gradle_cmd(**kwargs) 21231c75014Sopenharmony_ci # build sign debug hap 21331c75014Sopenharmony_ci build_hap_cmd = ["gradle"] 21431c75014Sopenharmony_ci build_hap_cmd.extend(gradle_parm_cmd) 21531c75014Sopenharmony_ci build_hap_cmd.append("entry:aD") 21631c75014Sopenharmony_ci cmd_popen(build_hap_cmd) 21731c75014Sopenharmony_ci 21831c75014Sopenharmony_ci # build sign ohos test hap 21931c75014Sopenharmony_ci build_test_hap_cmd = ["gradle"] 22031c75014Sopenharmony_ci build_test_hap_cmd.extend(gradle_parm_cmd) 22131c75014Sopenharmony_ci build_test_hap_cmd.append("entry:aDOT") 22231c75014Sopenharmony_ci cmd_popen(build_test_hap_cmd) 22331c75014Sopenharmony_ci 22431c75014Sopenharmony_ci gradle_output_dir = os.path.join(gradle_dir, "entry", "build", "outputs") 22531c75014Sopenharmony_ci if not os.path.exists(gradle_output_dir): 22631c75014Sopenharmony_ci return 22731c75014Sopenharmony_ci out_put_dir = kwargs.get("out_put_dir") 22831c75014Sopenharmony_ci if not os.path.exists(out_put_dir): 22931c75014Sopenharmony_ci os.makedirs(out_put_dir) 23031c75014Sopenharmony_ci hap_name = kwargs.get("hap_name") 23131c75014Sopenharmony_ci for root, _, files in os.walk(gradle_output_dir): 23231c75014Sopenharmony_ci for file in files: 23331c75014Sopenharmony_ci if file.endswith(".hap") and "unsigned" not in file: 23431c75014Sopenharmony_ci if "debugOhosTest" in root: 23531c75014Sopenharmony_ci target_file = "{}_OhosTest.hap".format(hap_name) 23631c75014Sopenharmony_ci else: 23731c75014Sopenharmony_ci target_file = "{}.hap".format(hap_name) 23831c75014Sopenharmony_ci file_util.copy_file(os.path.join(root, file), 23931c75014Sopenharmony_ci os.path.join(out_put_dir.rstrip(','), 24031c75014Sopenharmony_ci target_file)) 24131c75014Sopenharmony_ci 24231c75014Sopenharmony_ci 24331c75014Sopenharmony_cidef get_gradle_cmd(**kwargs): 24431c75014Sopenharmony_ci cmd = [] 24531c75014Sopenharmony_ci if kwargs: 24631c75014Sopenharmony_ci kwargs.setdefault("SIGN_USER_NAME", _DEFAULT_USER_NAME) 24731c75014Sopenharmony_ci kwargs.setdefault("SIGN_PWD", _DEFAULT_PWD) 24831c75014Sopenharmony_ci for param in _GRADLE_PARAMS: 24931c75014Sopenharmony_ci if param in kwargs: 25031c75014Sopenharmony_ci cmd.append("-P{}={}".format(param, kwargs.get(param))) 25131c75014Sopenharmony_ci return cmd 25231c75014Sopenharmony_ci 25331c75014Sopenharmony_ci 25431c75014Sopenharmony_cidef check_env(): 25531c75014Sopenharmony_ci """ 25631c75014Sopenharmony_ci check all the env for js hap build 25731c75014Sopenharmony_ci return: return true if all env ready, otherwise return false 25831c75014Sopenharmony_ci """ 25931c75014Sopenharmony_ci env_list = ['OHOS_SDK_HOME'] 26031c75014Sopenharmony_ci for env in env_list: 26131c75014Sopenharmony_ci if not os.environ.get(env): 26231c75014Sopenharmony_ci print("the env {} not set, skip build!".format(env)) 26331c75014Sopenharmony_ci return False 26431c75014Sopenharmony_ci else: 26531c75014Sopenharmony_ci return True 26631c75014Sopenharmony_ci 26731c75014Sopenharmony_ci 26831c75014Sopenharmony_ciif __name__ == '__main__': 26931c75014Sopenharmony_ci sys.exit(main()) 270