14cffe588Sopenharmony_ci#!/usr/bin/env python
24cffe588Sopenharmony_ci# -*- coding: utf-8 -*-
34cffe588Sopenharmony_ci# Copyright (c) 2023 Huawei Device Co., Ltd.
44cffe588Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
54cffe588Sopenharmony_ci# you may not use this file except in compliance with the License.
64cffe588Sopenharmony_ci# You may obtain a copy of the License at
74cffe588Sopenharmony_ci#
84cffe588Sopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
94cffe588Sopenharmony_ci#
104cffe588Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
114cffe588Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
124cffe588Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134cffe588Sopenharmony_ci# See the License for the specific language governing permissions and
144cffe588Sopenharmony_ci# limitations under the License.
154cffe588Sopenharmony_ci
164cffe588Sopenharmony_ciimport tarfile
174cffe588Sopenharmony_ciimport argparse
184cffe588Sopenharmony_ciimport os
194cffe588Sopenharmony_ciimport subprocess
204cffe588Sopenharmony_ciimport sys
214cffe588Sopenharmony_ciimport shutil
224cffe588Sopenharmony_ci
234cffe588Sopenharmony_cipatch_files = [
244cffe588Sopenharmony_ci    "backport-x86-64-Always-double-jump-table-slot-size-for-CET-71.patch",
254cffe588Sopenharmony_ci    "backport-Fix-check-for-invalid-varargs-arguments-707.patch",
264cffe588Sopenharmony_ci    "libffi-Add-sw64-architecture.patch",
274cffe588Sopenharmony_ci    "backport-Fix-signed-vs-unsigned-comparison.patch",
284cffe588Sopenharmony_ci    "riscv-extend-return-types-smaller-than-ffi_arg-680.patch",
294cffe588Sopenharmony_ci    "fix-AARCH64EB-support.patch",
304cffe588Sopenharmony_ci    "backport-openharmony-adapt.patch",
314cffe588Sopenharmony_ci    "backport-openharmony-dummy.patch"
324cffe588Sopenharmony_ci]
334cffe588Sopenharmony_ci
344cffe588Sopenharmony_cidef untar_file(tar_file_path, extract_path):
354cffe588Sopenharmony_ci    try:
364cffe588Sopenharmony_ci        tar_cmd = ['tar', '-zxf', tar_file_path, '-C', extract_path]
374cffe588Sopenharmony_ci        subprocess.run(tar_cmd, check=True)
384cffe588Sopenharmony_ci    except Exception as e:
394cffe588Sopenharmony_ci        print("tar error!")
404cffe588Sopenharmony_ci        return
414cffe588Sopenharmony_ci
424cffe588Sopenharmony_cidef move_file(src_path, dst_path):
434cffe588Sopenharmony_ci    patch_dir = os.path.join(src_path, "patch")
444cffe588Sopenharmony_ci    for file in patch_files:
454cffe588Sopenharmony_ci        src_file = os.path.join(patch_dir, file)
464cffe588Sopenharmony_ci        dst_file = os.path.join(dst_path, file)
474cffe588Sopenharmony_ci        shutil.copy(src_file, dst_file)
484cffe588Sopenharmony_ci
494cffe588Sopenharmony_cidef apply_patch(patch_file, target_dir):
504cffe588Sopenharmony_ci    try:
514cffe588Sopenharmony_ci        if not os.path.exists(target_dir):
524cffe588Sopenharmony_ci            return
534cffe588Sopenharmony_ci        patch_cmd = ['patch', '-p1', "--fuzz=0", "--no-backup-if-mismatch", '-i', patch_file, '-d', target_dir]
544cffe588Sopenharmony_ci        subprocess.run(patch_cmd, check=True)
554cffe588Sopenharmony_ci    except Exception as e:
564cffe588Sopenharmony_ci        print("apply_patch error!")
574cffe588Sopenharmony_ci        return
584cffe588Sopenharmony_ci
594cffe588Sopenharmony_cidef do_patch(target_dir):
604cffe588Sopenharmony_ci    for patch in patch_files:
614cffe588Sopenharmony_ci        apply_patch(patch, target_dir)
624cffe588Sopenharmony_ci
634cffe588Sopenharmony_cidef main():
644cffe588Sopenharmony_ci    libffi_path = argparse.ArgumentParser()
654cffe588Sopenharmony_ci    libffi_path.add_argument('--gen-dir', help='generate path of log', required=True)
664cffe588Sopenharmony_ci    libffi_path.add_argument('--source-dir', help='generate path of log', required=True)
674cffe588Sopenharmony_ci    args = libffi_path.parse_args()
684cffe588Sopenharmony_ci    tar_file_path = os.path.join(args.source_dir, "libffi-3.4.2.tar.gz")
694cffe588Sopenharmony_ci    target_dir = os.path.join(args.gen_dir, "libffi-3.4.2")
704cffe588Sopenharmony_ci
714cffe588Sopenharmony_ci    untar_file(tar_file_path, args.gen_dir)
724cffe588Sopenharmony_ci    move_file(args.source_dir, target_dir)
734cffe588Sopenharmony_ci    do_patch(target_dir)
744cffe588Sopenharmony_ci    return 0
754cffe588Sopenharmony_ci
764cffe588Sopenharmony_ciif __name__ == '__main__':
774cffe588Sopenharmony_ci    sys.exit(main())
78