diff --git a/build_tools/gcc-tools/main.py b/build_tools/gcc-tools/main.py new file mode 100644 index 0000000000000000000000000000000000000000..20b3a546327ad9fe88952917839f742c8078ed7a --- /dev/null +++ b/build_tools/gcc-tools/main.py @@ -0,0 +1,246 @@ +import argparse +import sys +import subprocess +import os +import datetime +import logging +from paramiko import SSHClient + +logger = logging.getLogger() + +# set global param for other function to use +User = "" +Passwd = "" +Ip = "" +BaseDst = "" +SshClient = SSHClient() +SftpClient = None + + +def init_args(): + """ + init args + :return: parse_args + """ + parser = argparse.ArgumentParser() + parser.add_argument("-u", type=str, dest="user", default="", required=True) + parser.add_argument("-p", type=str, dest="passwd", default="", required=True) + parser.add_argument("-ip", type=str, dest="ip", default="", required=True) + parser.add_argument("-dst", type=str, dest="dst", default="", required=True) + + return parser.parse_args() + + +def release_ssh(): + ''' + release ssh resource + ''' + global SshClient, SftpClient + + SshClient.close() + SftpClient.close() + + +def main(): + # init param + args = init_args() + + global User, Passwd, Ip, BaseDst + User = args.user + Passwd = args.passwd + Ip = args.ip + BaseDst = args.dst + + # check ssh param if currented + if not check_ssh(): + logger.error("ssh param is not useful") + sys.exit(1) + + # running gcc compile brfore initing environment with this function + if not prepare(): + sys.exit(1) + + # running all gcc compile tasks + if not compile_gcc_all(): + sys.exit(1) + + output = subprocess.run( + "ls -al", + shell = True, + encoding = "utf-8", + cwd = "/home/openeuler/x-tools") + if output.returncode == 0: + logger.info(output.stdout) + + # tar gcc to tar.gz + if not tar_and_upload_all(): + sys.exit(1) + + logger.info("all task finishd successful") + + release_ssh() + +def check_ssh(): + ''' + check ssh param if current + ''' + global User, Passwd, Ip, SshClient, SftpClient + + try: + SshClient.load_system_host_keys() + SshClient.connect(hostname = Ip, username = User, password = Passwd) + SftpClient = SshClient.open_sftp() + except Exception as e: + logger.error(e) + return False + + return True + + +def prepare(cwd): + ''' + running .prepare.sh + ''' + logger.info("====================now running prepare==========================================") + with subprocess.Popen( + "./prepare.sh", + shell = True, + encoding = "utf-8", + stdout = subprocess.PIPE, + cwd = cwd) as proc: + try: + stdout = proc.stdout + for readline in stdout: + if readline.find("'cp config_riscv64 .config && ct-ng build' for build riscv64") != -1: + break + logger.info(readline) + stdout.close() + except Exception as e: + logger.error(e) + return False + logger.info("====================prepare successful==========================================") + + return True + + +def compile_gcc_all(): + if not compile_gcc("aarch64", "/usr1/yocto-embedded-tools/cross_tools"): + return False + + if not compile_gcc("arm32", "/usr1/yocto-embedded-tools/cross_tools"): + return False + + if not compile_gcc("x86_64", "/usr1/yocto-embedded-tools/cross_tools"): + return False + + if not compile_gcc("riscv64", "/usr1/yocto-embedded-tools/cross_tools"): + return False + + return True + + +def compile_gcc(arch, cwd): + logger.info("====================now building gcc-{}====================================".format(arch)) + command = "cp config_{} .config && ct-ng build".format(arch) + with subprocess.Popen( + command, + shell = True, + encoding = "utf-8", + stdout = subprocess.PIPE, + cwd = cwd) as proc: + try: + stdout = proc.stdout + for readline in stdout: + logger.info(readline) + if readline.find("Finishing installation") != -1: + break + stdout.close() + except Exception as e: + logger.error(e) + return False + logger.info("====================build gcc-{} successful====================================".format(arch)) + + return True + + +def tar_and_upload_all(): + if not tar_and_upload("aarch64-openeuler-linux-gnu", "openeuler_gcc_arm64le", "/home/openeuler/x-tools"): + return False + + if not tar_and_upload("arm-openeuler-linux-gnueabi", "openeuler_gcc_arm32le", "/home/openeuler/x-tools"): + return False + + if not tar_and_upload("x86_64-openeuler-linux-gnu", "openeuler_gcc_x86_64", "/home/openeuler/x-tools"): + return False + + if not tar_and_upload("riscv64-openeuler-linux-gnu", "openeuler_gcc_riscv64", "/home/openeuler/x-tools"): + return False + + return True + + +def tar_and_upload(origin, target, cwd): + # mv origin directory to target directory as we want for tar step + command = "mv {} {} && tar zcf {}.tar.gz {}".format(origin, target, target, target) + output = subprocess.run( + command, + shell = True, + encoding = "utf-8", + cwd = cwd) + if output.returncode != 0: + logger.info("{} tar step faield".format(target)) + logger.error(output.stderr) + return False + logger.info("finished {} tar step".format(target)) + + # upload action + global BaseDst + source = os.path.join(cwd, target + ".tar.gz") + date=str(datetime.datetime.date(datetime.datetime.now(tz = datetime.timezone.utc))) + dst = os.path.join(BaseDst, date) + cur_dir = os.path.join(BaseDst, "current") + if not upload(source = source, dst = dst, cur_dir = cur_dir): + logger.error("upload {}.tar.gz faield".format(target)) + return False + + logger.info("upload {}.tar.gz successful".format(target)) + return True + + +def upload(source, dst, cur_dir): + ''' + upload to remote server + ''' + global SshClient, SftpClient + + # first mkdir directory if not exists + try: + SshClient.exec_command("mkdir -p {}".format(dst)) + logger.info("mkdir {} action successful".format(dst)) + except Exception as e: + logger.error(e) + return False + + # upload local resource to remote server + try: + filename = os.path.basename(source) + dst_file = os.path.join(dst, filename) + SftpClient.put(source, dst_file) + logger.info("put {} action successful".format(dst)) + except Exception as e: + logger.error(e) + return False + + # mv resource to current directory + try: + SshClient.exec_command("cp -r {} {}".format(dst, cur_dir)) + logger.info("cp {} action successful".format(dst)) + except Exception as e: + logger.error(e) + return False + + return True + + +if __name__ == "__main__": + main() \ No newline at end of file