diff --git a/.gitignore b/.gitignore index ada3096751ee4fd48b5bccda743f3bd01ff423fe..ea7c9905d57219b91294da4c16949d7d67ca4aa0 100755 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ **/__pycache__ out +prebuilts/build-tools diff --git a/build/builder.py b/build/builder.py index 9491f0e9ebfc3890f19b95a9fb37c0bb9560928f..a474f8ca446de52aa5f1da17f6cd344cd56db39d 100755 --- a/build/builder.py +++ b/build/builder.py @@ -59,8 +59,8 @@ class FtBuilder: build_parser = subparsers.add_parser('build', help='Build the project') build_parser.add_argument('-t', '--target-cpu', type=str, - choices=['x64', 'x86'], - default='x64', + choices=['auto', 'x64', 'x86', 'aarch64'], + default='auto', help='Specify the target CPU type.') build_parser.add_argument('-b', '--build-type', choices=['debug', 'release'], diff --git a/build/builder/commands/build.py b/build/builder/commands/build.py index 270695d232b9ac91631ebe31003796b3e72e8de7..6790715dd635b79f6185e4b6cc6623e76a2153df 100755 --- a/build/builder/commands/build.py +++ b/build/builder/commands/build.py @@ -17,14 +17,19 @@ import os from builder.common.logger import logger from builder.common.utils import exec_sys_command from builder.common.env_checker import checker +from builder.common.prebuild import get_machine_info class Builder: def __init__(self, args): self.args = args self.project_dir = args.project_dir - self.build_output_dir = os.path.join(args.project_dir, "out", args.build_type.title(), args.target_cpu) - self._build_tools_dir = os.path.join(args.project_dir, "prebuilts", "build-tools", f"linux-{args.target_cpu}", "bin") + os_name = "linux" + arch = "x64" + if args.target_cpu == "auto": + arch, os_name = get_machine_info() + self.build_output_dir = os.path.join(args.project_dir, "out", args.build_type.title(), arch) + self._build_tools_dir = os.path.join(args.project_dir, "prebuilts", "build-tools", os_name+"-"+arch, "bin") self.gn_path = os.path.join(self._build_tools_dir, "gn") self.ninja_path = os.path.join(self._build_tools_dir, "ninja") diff --git a/build/builder/common/env_checker.py b/build/builder/common/env_checker.py index bf29b166e711cafd8e023ca1c56ce98c6f580f27..8ca0415623b911ffdad3b7d2acb71b8d3d7a0b5d 100755 --- a/build/builder/common/env_checker.py +++ b/build/builder/common/env_checker.py @@ -16,6 +16,7 @@ import toml from builder.common.logger import logger from builder.common.utils import exec_sys_command +from builder.common.prebuild import build_deps class Checker: """ @@ -78,9 +79,13 @@ class Checker: missing_packages.append(pkg) if missing_packages == []: + build_deps(os.path.join(project_dir, "out", "prebuild")) return True elif install_missing_pkg: - return self._install_packages(missing_packages) + ret = self._install_packages(missing_packages) + if ret: + build_deps(os.path.join(project_dir, "out", "prebuild")) + return ret else: logger.error('System package "{}" is not installed. Please install them by using `yum install` or `dnf install`'.format(', '.join(missing_packages))) return False diff --git a/build/builder/common/prebuild.py b/build/builder/common/prebuild.py new file mode 100755 index 0000000000000000000000000000000000000000..92db12499b0ae7c7d32b74195c6eb2cae7dbc21b --- /dev/null +++ b/build/builder/common/prebuild.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +# coding=utf-8 +import sys +import os +import shutil +import platform +from builder.common.utils import exec_sys_command +from builder.common.logger import logger +def get_machine_info(): + arch = platform.machine() + if arch == "x86_64": + arch = "x64" + os_name = platform.system().lower() + return arch,os_name + +def build_deps(output_dir): + arch, os_name = get_machine_info() + copy_path = "prebuilts/build-tools/" + os_name + "-" + arch + "/bin/" + abs_copy_path = os.path.join(output_dir, "../../", copy_path) + ninja_path = os.path.abspath(os.path.join(abs_copy_path, "ninja")) + gn_path = os.path.abspath(os.path.join(abs_copy_path, "gn")) + if os.path.exists(ninja_path) and os.path.exists(gn_path): + return + + # build ninja + if os.path.exists(output_dir): + shutil.rmtree(output_dir) + if not os.path.exists(abs_copy_path): + os.makedirs(abs_copy_path) + ninja_dir = os.path.join(output_dir, "ninja-build") + os.makedirs(ninja_dir) + cmd = ['git', 'clone', 'https://gitee.com/src-openeuler/ninja-build.git', '-b', 'openEuler-22.03-LTS', ninja_dir] + is_success, _output = exec_sys_command(cmd) + if is_success: + cur_work_dir = os.getcwd() + exec_sys_command(['tar', 'xf', os.path.join(ninja_dir, 'ninja-1.10.2.tar.gz'), '-C', ninja_dir]) + os.chdir(os.path.join(ninja_dir, 'ninja-1.10.2')) + exec_sys_command(['python3', 'configure.py', '--bootstrap']) + if os.path.exists("ninja"): + exec_sys_command(['cp', 'ninja', ninja_path]) + logger.info("build ninja success") + os.chdir(cur_work_dir) + + # build gn + gn_dir = os.path.join(output_dir, "gn-build") + os.makedirs(gn_dir) + cmd = ['git', 'clone', 'https://gitee.com/src-openeuler/gn.git', '-b', 'openEuler-22.03-LTS-SP1', gn_dir] + is_success, _output = exec_sys_command(cmd) + if is_success: + cur_work_dir = os.getcwd() + exec_sys_command(['tar', 'xf', os.path.join(gn_dir, 'gn-e1ac69b17da0c6d4f5e34e686690ff70c6a43e6f.tar.gz'), '-C', gn_dir]) + os.chdir(gn_dir) + #exec_sys_command(['patch', '-p1