openubmc-bingo 0.6.63__py3-none-any.whl → 0.6.66__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of openubmc-bingo might be problematic. Click here for more details.
- bmcgo/__init__.py +1 -1
- bmcgo/functional/bmc_studio_action.py +21 -10
- bmcgo/functional/check.py +82 -42
- bmcgo/tasks/task_download_buildtools.py +20 -11
- bmcgo/tasks/task_download_dependency.py +29 -20
- bmcgo/utils/fetch_component_code.py +18 -2
- {openubmc_bingo-0.6.63.dist-info → openubmc_bingo-0.6.66.dist-info}/METADATA +1 -1
- {openubmc_bingo-0.6.63.dist-info → openubmc_bingo-0.6.66.dist-info}/RECORD +11 -12
- bmcgo/tasks/download_buildtools_hm.py +0 -124
- {openubmc_bingo-0.6.63.dist-info → openubmc_bingo-0.6.66.dist-info}/WHEEL +0 -0
- {openubmc_bingo-0.6.63.dist-info → openubmc_bingo-0.6.66.dist-info}/entry_points.txt +0 -0
- {openubmc_bingo-0.6.63.dist-info → openubmc_bingo-0.6.66.dist-info}/top_level.txt +0 -0
bmcgo/__init__.py
CHANGED
|
@@ -34,16 +34,10 @@ def if_available(bconfig: BmcgoConfig):
|
|
|
34
34
|
return True
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
class BmcgoCommand(
|
|
37
|
+
class BmcgoCommand():
|
|
38
38
|
def __init__(self, bconfig: BmcgoConfig, *args):
|
|
39
39
|
self.bconfig = bconfig
|
|
40
|
-
parser =
|
|
41
|
-
formatter_class=argparse.RawTextHelpFormatter)
|
|
42
|
-
action_group = parser.add_mutually_exclusive_group()
|
|
43
|
-
action_group.add_argument("-start", action=ACTION_TRUE, help="bmc studio的启动操作")
|
|
44
|
-
action_group.add_argument("-stop", action=ACTION_TRUE, help="bmc studio的停止操作")
|
|
45
|
-
action_group.add_argument("-restart", action=ACTION_TRUE, help="bmc studio的重启操作")
|
|
46
|
-
parser.add_argument("-b", "--backend", help="指定bmc studio是前端运行还是后端运行,默认前端运行", action=ACTION_TRUE)
|
|
40
|
+
parser = self._create_parser()
|
|
47
41
|
parsed_args, _ = parser.parse_known_args(*args)
|
|
48
42
|
self.action = self.get_action(parsed_args)
|
|
49
43
|
self.backend = parsed_args.backend
|
|
@@ -54,7 +48,8 @@ class BmcgoCommand(object):
|
|
|
54
48
|
self.studio_script = f"{self.studio_path}/bmc_studio.sh"
|
|
55
49
|
self.studio_command = f"{self.studio_script} {self.action}"
|
|
56
50
|
|
|
57
|
-
|
|
51
|
+
@staticmethod
|
|
52
|
+
def get_action(parsed_args):
|
|
58
53
|
if parsed_args.stop:
|
|
59
54
|
return "stop"
|
|
60
55
|
elif parsed_args.restart:
|
|
@@ -84,7 +79,7 @@ class BmcgoCommand(object):
|
|
|
84
79
|
|
|
85
80
|
def run_start(self):
|
|
86
81
|
if not self.backend:
|
|
87
|
-
|
|
82
|
+
self._run_front_end()
|
|
88
83
|
return
|
|
89
84
|
|
|
90
85
|
self.studio_command = f"{self.studio_command} backend"
|
|
@@ -96,3 +91,19 @@ class BmcgoCommand(object):
|
|
|
96
91
|
return
|
|
97
92
|
|
|
98
93
|
log.warning(start_out)
|
|
94
|
+
|
|
95
|
+
def _run_front_end(self):
|
|
96
|
+
self.studio_command = f"trap ':' INT; /bin/bash {self.studio_command}; :"
|
|
97
|
+
command_list = ['/bin/bash', '-c', self.studio_command]
|
|
98
|
+
tools.run_command(command_list, command_echo=False, show_log=True, timeout=None)
|
|
99
|
+
|
|
100
|
+
def _create_parser(self):
|
|
101
|
+
_ = self
|
|
102
|
+
parser = argparse.ArgumentParser(prog="bmc studio", description="启动停止bmc studio", add_help=True,
|
|
103
|
+
formatter_class=argparse.RawTextHelpFormatter)
|
|
104
|
+
action_group = parser.add_mutually_exclusive_group()
|
|
105
|
+
action_group.add_argument("-start", action=ACTION_TRUE, help="bmc studio的启动操作")
|
|
106
|
+
action_group.add_argument("-stop", action=ACTION_TRUE, help="bmc studio的停止操作")
|
|
107
|
+
action_group.add_argument("-restart", action=ACTION_TRUE, help="bmc studio的重启操作")
|
|
108
|
+
parser.add_argument("-b", "--backend", help="指定bmc studio是前端运行还是后端运行,默认前端运行", action=ACTION_TRUE)
|
|
109
|
+
return parser
|
bmcgo/functional/check.py
CHANGED
|
@@ -49,7 +49,6 @@ _PACKAGE_INFO_HELP = """
|
|
|
49
49
|
b. 文本格式
|
|
50
50
|
package/version@user/channel
|
|
51
51
|
"""
|
|
52
|
-
MODEL_CHOICES = ["all", "mds", "resource_tree", "csr", "interface_mapping"]
|
|
53
52
|
|
|
54
53
|
|
|
55
54
|
def if_available(bconfig: BmcgoConfig):
|
|
@@ -57,34 +56,21 @@ def if_available(bconfig: BmcgoConfig):
|
|
|
57
56
|
|
|
58
57
|
|
|
59
58
|
class BmcgoCommand:
|
|
59
|
+
MODEL_CHOICES = ["all", "mds", "resource_tree", "csr", "interface_mapping"]
|
|
60
|
+
BOARD_NAME_DEFAULT = misc.boardname_default()
|
|
61
|
+
|
|
60
62
|
def __init__(self, bconfig: BmcgoConfig, *args):
|
|
61
63
|
self.bconfig = bconfig
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
parser.add_argument("-b", "--board_name",
|
|
65
|
-
help="指定单板获取配套全量源码,可选值为build/product目录下的单板名\n默认:" + misc.boardname_default(),
|
|
66
|
-
default=misc.boardname_default())
|
|
67
|
-
parser.add_argument("--stage", help="包类型,可选值为:rc(预发布包), stable(发布包)\n默认: stable", default="stable")
|
|
68
|
-
parser.add_argument("-r", "--remote")
|
|
69
|
-
parser.add_argument("-m", "--model", help=f"检查的模型,可选值为: {', '.join(MODEL_CHOICES)}\n默认: all",
|
|
70
|
-
choices=MODEL_CHOICES, default="all")
|
|
64
|
+
|
|
65
|
+
parser = self._create_parser()
|
|
71
66
|
parsed_args, _ = parser.parse_known_args(*args)
|
|
72
|
-
self.
|
|
73
|
-
self.
|
|
74
|
-
|
|
75
|
-
self.model = parsed_args.model
|
|
76
|
-
self.community_issues = set()
|
|
77
|
-
self.service_dict = {}
|
|
78
|
-
self.packages = {}
|
|
79
|
-
self.repo_brance = Repo(cwd).active_branch.name
|
|
80
|
-
self.repo_name = "manifest"
|
|
81
|
-
self.disabled = False
|
|
82
|
-
self.studio_dir = "/usr/share/bmc_studio/server"
|
|
83
|
-
self.studio_path = "/usr/share/bmc_studio/server/bmcstudio"
|
|
67
|
+
self._init_common_attributes(parsed_args)
|
|
68
|
+
self._init_specific_attributes(parsed_args)
|
|
69
|
+
|
|
84
70
|
# 初始化fetch命令对象
|
|
85
71
|
if self.bconfig.manifest:
|
|
86
72
|
self.fetch_agent = FetchAgent(self.bconfig, *args)
|
|
87
|
-
|
|
73
|
+
|
|
88
74
|
@staticmethod
|
|
89
75
|
def check_overdue(issue: dict):
|
|
90
76
|
data = issue.get("deadline")
|
|
@@ -97,7 +83,7 @@ class BmcgoCommand:
|
|
|
97
83
|
except Exception as e:
|
|
98
84
|
log.warning("日期 %s 解析失败:%s", data, e)
|
|
99
85
|
return False
|
|
100
|
-
|
|
86
|
+
|
|
101
87
|
@staticmethod
|
|
102
88
|
def process_issues_group(issues, prefix, add_message=""):
|
|
103
89
|
result = ""
|
|
@@ -111,9 +97,8 @@ class BmcgoCommand:
|
|
|
111
97
|
if add_message:
|
|
112
98
|
result = f"{result}\n{add_message}\n"
|
|
113
99
|
return result
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
def filter_output():
|
|
100
|
+
|
|
101
|
+
def filter_output(self):
|
|
117
102
|
output_path = os.path.join(os.environ["HOME"], "bmc_studio", "var", "data", "cli_data", "issues.json")
|
|
118
103
|
try:
|
|
119
104
|
with open(output_path, "r") as output_fp:
|
|
@@ -124,6 +109,8 @@ class BmcgoCommand:
|
|
|
124
109
|
ci_enabled_issues = []
|
|
125
110
|
disabled_issues = []
|
|
126
111
|
for item in items:
|
|
112
|
+
if not self._filter_issue(item):
|
|
113
|
+
continue
|
|
127
114
|
rule = item.get("rule")
|
|
128
115
|
filepath = item.get("filepath")
|
|
129
116
|
ci_enabled = item.get("ciEnabled")
|
|
@@ -153,30 +140,23 @@ class BmcgoCommand:
|
|
|
153
140
|
self.packages[comp_name] = package
|
|
154
141
|
|
|
155
142
|
def run(self):
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
raise RuntimeError("mds/service.json 文件不存在")
|
|
160
|
-
with open(service_path, "r") as service_fp:
|
|
161
|
-
self.service_dict = json.load(service_fp)
|
|
162
|
-
if "name" not in self.service_dict:
|
|
163
|
-
raise RuntimeError("mds/service.json 文件中缺少 name 配置")
|
|
164
|
-
self.repo_name = self.service_dict.get("name")
|
|
165
|
-
self.find_component_packages()
|
|
143
|
+
self._check_repo_config()
|
|
144
|
+
self._before_run()
|
|
145
|
+
|
|
166
146
|
if self.disabled:
|
|
167
147
|
log.info("%s 仓库没有开启语法正确性和模型一致性检查", self.repo_name)
|
|
168
148
|
return 0
|
|
149
|
+
|
|
169
150
|
with tempfile.TemporaryDirectory(prefix="dependencies_repo_") as tempdir:
|
|
170
151
|
if self.bconfig.manifest:
|
|
171
152
|
self.fetch_agent.code_path = tempdir
|
|
172
153
|
self.fetch_agent.run()
|
|
173
154
|
elif self.packages:
|
|
174
155
|
FetchComponentCode(self.packages, tempdir, self.remote, include_open_source=False).run()
|
|
175
|
-
cmd =
|
|
176
|
-
|
|
177
|
-
cmd.append("--manifest")
|
|
178
|
-
cmd.append("true")
|
|
156
|
+
cmd = self._get_studio_command(tempdir)
|
|
157
|
+
|
|
179
158
|
os.chdir(self.studio_dir)
|
|
159
|
+
os.environ['LD_LIBRARY_PATH'] = '/usr/share/bmc_studio/server:$LD_LIBRARY_PATH'
|
|
180
160
|
Helper.run(cmd, stdout=subprocess.DEVNULL)
|
|
181
161
|
os.chdir(cwd)
|
|
182
162
|
error, warning = self.filter_output()
|
|
@@ -186,4 +166,64 @@ class BmcgoCommand:
|
|
|
186
166
|
return -1
|
|
187
167
|
log.warning(warning)
|
|
188
168
|
log.success("语法正确性和模型一致性检查通过\n")
|
|
189
|
-
return 0
|
|
169
|
+
return 0
|
|
170
|
+
|
|
171
|
+
def _init_common_attributes(self, parsed_args):
|
|
172
|
+
self.board_name = parsed_args.board_name
|
|
173
|
+
self.stage = parsed_args.stage
|
|
174
|
+
self.remote = parsed_args.remote
|
|
175
|
+
self.model = parsed_args.model
|
|
176
|
+
self.community_issues = set()
|
|
177
|
+
self.service_dict = {}
|
|
178
|
+
self.packages = {}
|
|
179
|
+
self.repo_branch = Repo(cwd).active_branch.name
|
|
180
|
+
self.repo_name = "manifest"
|
|
181
|
+
self.disabled = False
|
|
182
|
+
self.studio_dir = "/usr/share/bmc_studio/server"
|
|
183
|
+
self.studio_path = "/usr/share/bmc_studio/server/bmcstudio"
|
|
184
|
+
|
|
185
|
+
def _init_specific_attributes(self, parsed_args):
|
|
186
|
+
"""初始化子类特有属性,由子类自行实现"""
|
|
187
|
+
pass
|
|
188
|
+
|
|
189
|
+
def _check_repo_config(self):
|
|
190
|
+
service_path = os.path.join(cwd, "mds", "service.json")
|
|
191
|
+
if self.bconfig.manifest is None:
|
|
192
|
+
if not os.path.isfile(service_path):
|
|
193
|
+
raise RuntimeError("mds/service.json 文件不存在")
|
|
194
|
+
with open(service_path, "r") as service_fp:
|
|
195
|
+
self.service_dict = json.load(service_fp)
|
|
196
|
+
if "name" not in self.service_dict:
|
|
197
|
+
raise RuntimeError("mds/service.json 文件中缺少 name 配置")
|
|
198
|
+
self.repo_name = self.service_dict.get("name")
|
|
199
|
+
self.find_component_packages()
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _get_studio_command(self, tempdir: str):
|
|
203
|
+
cmd = [self.studio_path, "check", "--repo", cwd, "--dependencies", tempdir, "--model", self.model]
|
|
204
|
+
if self.bconfig.manifest:
|
|
205
|
+
cmd.extend(["--manifest", "true"])
|
|
206
|
+
cmd.extend(["--board", self.board_name])
|
|
207
|
+
return cmd
|
|
208
|
+
|
|
209
|
+
def _filter_issue(self, item):
|
|
210
|
+
"""过滤,由子类实现"""
|
|
211
|
+
_ = self
|
|
212
|
+
return True
|
|
213
|
+
|
|
214
|
+
def _before_run(self):
|
|
215
|
+
"""主流程中的钩子函数, 由子类实现"""
|
|
216
|
+
pass
|
|
217
|
+
|
|
218
|
+
def _create_parser(self):
|
|
219
|
+
"""命令参数,子类可重写"""
|
|
220
|
+
parser = argparse.ArgumentParser(prog=f"{misc.tool_name()} check", description="语法正确性与模型一致性检查", add_help=True,
|
|
221
|
+
formatter_class=argparse.RawTextHelpFormatter)
|
|
222
|
+
parser.add_argument("-b", "--board_name",
|
|
223
|
+
help="指定单板获取配套全量源码,可选值为build/product目录下的单板名\n默认:" + self.BOARD_NAME_DEFAULT,
|
|
224
|
+
default=self.BOARD_NAME_DEFAULT)
|
|
225
|
+
parser.add_argument("--stage", help="包类型,可选值为:rc(预发布包), stable(发布包)\n默认: stable", default="stable")
|
|
226
|
+
parser.add_argument("-r", "--remote")
|
|
227
|
+
parser.add_argument("-m", "--model", help=f"检查的模型,可选值为: {', '.join(self.MODEL_CHOICES)}\n默认: all",
|
|
228
|
+
choices=self.MODEL_CHOICES, default="all")
|
|
229
|
+
return parser
|
|
@@ -37,10 +37,10 @@ class DownloadDefaultBuildtools(Task):
|
|
|
37
37
|
if self.config.partner_mode:
|
|
38
38
|
self.info(f"从缓存目录{partner_tools_dir}复制编译器工具")
|
|
39
39
|
self.run_command(f"cp -rf {partner_tools_dir}/. {self.rtos_sdk_dir}")
|
|
40
|
+
self.info("下载依赖工具结束")
|
|
40
41
|
|
|
41
|
-
def
|
|
42
|
+
def install_rtos(self):
|
|
42
43
|
is_ubuntu = self.tools.is_ubuntu
|
|
43
|
-
self.chdir(self.rtos_sdk_dir)
|
|
44
44
|
self.info("删除目录 /opt/RTOS")
|
|
45
45
|
self.run_command(f"rm -rf {BUILD_TOOLS_SHA256_PATH}", sudo=True)
|
|
46
46
|
self.run_command("rm -rf /opt/RTOS", sudo=True)
|
|
@@ -54,36 +54,45 @@ class DownloadDefaultBuildtools(Task):
|
|
|
54
54
|
else:
|
|
55
55
|
self.pipe_command(["rpm2cpio {}".format(rpm), "sudo cpio -id -D /"])
|
|
56
56
|
|
|
57
|
+
def install_hcc(self):
|
|
57
58
|
self.info("删除目录 /opt/hcc_arm64le")
|
|
58
59
|
self.run_command("rm -rf /opt/hcc_arm64le", sudo=True)
|
|
59
60
|
self.info("解压 hcc_arm64le")
|
|
60
61
|
self.run_command("tar -xzf hcc_arm64le.tar.gz -C /opt", sudo=True)
|
|
61
62
|
|
|
63
|
+
def setup_path(self):
|
|
62
64
|
logname = os.getenv(misc.ENV_LOGNAME, None)
|
|
63
65
|
if logname and logname != "root":
|
|
64
66
|
user_group = f"{os.getuid():{os.getgid()}}"
|
|
65
67
|
self.run_command(f"chown {user_group} /opt/hcc_arm64le -R", sudo=True)
|
|
66
68
|
self.run_command(f"chown {user_group} /opt/RTOS -R", sudo=True)
|
|
67
|
-
self.chdir(self.config.code_path)
|
|
68
69
|
|
|
70
|
+
def copy_sysroot_sdk(self):
|
|
69
71
|
libstdcpp_install_path = f"{self.config.sysroot}/usr/"
|
|
70
72
|
os.makedirs(libstdcpp_install_path, exist_ok=True)
|
|
71
73
|
self.run_command(f"cp -rf {self.config.cross_compile_install_path}/{self.config.cross_prefix}/lib64/" +
|
|
72
74
|
f" {libstdcpp_install_path}")
|
|
75
|
+
|
|
76
|
+
def install_buildtools(self):
|
|
77
|
+
# 检查rtos是否安装,未安装或版本不匹配时安装
|
|
78
|
+
self.skip_install = not self.check_need_install(self.rtos_sdk_dir, BUILD_TOOLS_SHA256_PATH,
|
|
79
|
+
self.buildtools_new_sha256)
|
|
80
|
+
if self.skip_install:
|
|
81
|
+
self.info("buildtools版本匹配,跳过安装")
|
|
82
|
+
return
|
|
83
|
+
self.chdir(self.rtos_sdk_dir)
|
|
84
|
+
self.install_rtos()
|
|
85
|
+
self.install_hcc()
|
|
86
|
+
self.setup_path()
|
|
87
|
+
self.chdir(self.config.code_path)
|
|
88
|
+
self.copy_sysroot_sdk()
|
|
73
89
|
self.run_command("cp -af {} {}".format(self.buildtools_new_sha256, BUILD_TOOLS_SHA256_PATH), sudo=True)
|
|
74
90
|
self.run_command("chmod a+r {}".format(BUILD_TOOLS_SHA256_PATH), sudo=True)
|
|
75
91
|
|
|
76
92
|
def run(self):
|
|
77
93
|
self.download_tools()
|
|
78
|
-
self.info("下载依赖工具结束")
|
|
79
94
|
|
|
80
95
|
def install(self):
|
|
81
|
-
self.skip_install = not self.check_need_install(self.rtos_sdk_dir, BUILD_TOOLS_SHA256_PATH,
|
|
82
|
-
self.buildtools_new_sha256)
|
|
83
|
-
if self.skip_install:
|
|
84
|
-
self.info("buildtools版本匹配,跳过安装")
|
|
85
|
-
return
|
|
86
|
-
# 检查rtos是否安装,未安装或版本不匹配时安装
|
|
87
96
|
self.install_buildtools()
|
|
88
97
|
|
|
89
98
|
|
|
@@ -96,4 +105,4 @@ class TaskClass(Task):
|
|
|
96
105
|
self.download_buildtools.run()
|
|
97
106
|
|
|
98
107
|
def install(self):
|
|
99
|
-
self.download_buildtools.install()
|
|
108
|
+
self.download_buildtools.install()
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
修改记录:2021-10-11 创建
|
|
17
17
|
'''
|
|
18
18
|
import os
|
|
19
|
-
import re
|
|
20
19
|
import shutil
|
|
21
20
|
|
|
22
21
|
from bmcgo.tasks.task import Task
|
|
@@ -32,42 +31,52 @@ class TaskClass(Task):
|
|
|
32
31
|
self.skip_install = False
|
|
33
32
|
|
|
34
33
|
def download_dependency(self):
|
|
35
|
-
self.info(
|
|
34
|
+
self.info("开始下载sdk ...")
|
|
35
|
+
self.info(f"移除本地目录{self.sdk_dir}")
|
|
36
|
+
self.run_command(f"rm -rf {self.sdk_dir}", sudo=True)
|
|
36
37
|
partner_sdk_dir = f"{os.path.expanduser('~')}/sdk"
|
|
37
38
|
self.info(f"从缓存目录{partner_sdk_dir}复制sdk和rtos二进制文件")
|
|
38
39
|
self.run_command(f"cp -rf {partner_sdk_dir}/. {self.sdk_dir}")
|
|
40
|
+
self.info("下载sdk结束")
|
|
39
41
|
|
|
40
|
-
def
|
|
41
|
-
#
|
|
42
|
+
def prepare_dependency(self):
|
|
43
|
+
# 移动到构建目录中
|
|
42
44
|
if os.path.isdir(self.config.sdk_path):
|
|
43
45
|
shutil.rmtree(self.config.sdk_path)
|
|
44
46
|
self.run_command(f"cp -rf {self.sdk_dir} {self.config.sdk_path}")
|
|
45
|
-
self.info("
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if re.match("^Hi1711_[0-9]{8}_[0-9a-f]{40}.tar.gz$", file) is None:
|
|
49
|
-
continue
|
|
50
|
-
self.run_command(f"tar -xvf {file}")
|
|
51
|
-
break
|
|
52
|
-
if self.skip_install:
|
|
53
|
-
self.info("sdk版本匹配")
|
|
54
|
-
return
|
|
55
|
-
old_sdk_dir = "/opt/hi1711sdk"
|
|
47
|
+
self.info("移动sdk结束")
|
|
48
|
+
|
|
49
|
+
def clear_path(self, old_sdk_path):
|
|
56
50
|
self.run_command(f"rm -rf {SDK_SHA256_PATH}", sudo=True)
|
|
57
51
|
self.run_command(f"rm -rf {SDK_PATH}", sudo=True)
|
|
58
|
-
self.run_command(f"rm -rf {
|
|
52
|
+
self.run_command(f"rm -rf {old_sdk_path}", sudo=True)
|
|
53
|
+
|
|
54
|
+
def unzip_sdk(self):
|
|
55
|
+
self.info("开始解压sdk ...")
|
|
59
56
|
self.run_command(f"mkdir -p {SDK_PATH}", ignore_error=True, sudo=True)
|
|
60
57
|
self.run_command(f"tar -xzf hi1711sdk.tar.gz -C {SDK_PATH} {MODULE_SYMVERS}", sudo=True)
|
|
58
|
+
|
|
59
|
+
def setup_path(self, old_sdk_path):
|
|
61
60
|
logname = os.getenv(misc.ENV_LOGNAME, None)
|
|
62
61
|
if logname and logname != "root":
|
|
63
62
|
user_group = f"{os.getuid():{os.getgid()}}"
|
|
64
63
|
self.run_command(f"chown {user_group} {SDK_PATH} -R", sudo=True)
|
|
65
|
-
self.run_command(f"ln -s {SDK_PATH} {
|
|
64
|
+
self.run_command(f"ln -s {SDK_PATH} {old_sdk_path}", sudo=True)
|
|
66
65
|
self.run_command("cp -af {} {}".format(self.sdk_new_sha256, SDK_SHA256_PATH), sudo=True)
|
|
67
66
|
self.run_command("chmod a+r {}".format(SDK_SHA256_PATH), sudo=True)
|
|
68
67
|
|
|
68
|
+
def install_dependency(self):
|
|
69
|
+
self.chdir(self.config.sdk_path)
|
|
70
|
+
self.skip_install = not self.check_need_install(self.sdk_dir, SDK_SHA256_PATH, self.sdk_new_sha256)
|
|
71
|
+
if self.skip_install:
|
|
72
|
+
self.info("sdk版本匹配,跳过安装")
|
|
73
|
+
return
|
|
74
|
+
old_sdk_dir = "/opt/hi1711sdk"
|
|
75
|
+
self.clear_path(old_sdk_dir)
|
|
76
|
+
self.unzip_sdk()
|
|
77
|
+
self.setup_path(old_sdk_dir)
|
|
78
|
+
|
|
69
79
|
def run(self):
|
|
70
80
|
self.download_dependency()
|
|
71
|
-
self.
|
|
72
|
-
self.
|
|
73
|
-
self.move_dependency()
|
|
81
|
+
self.prepare_dependency()
|
|
82
|
+
self.install_dependency()
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
11
11
|
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
12
12
|
# See the Mulan PSL v2 for more details.
|
|
13
|
+
import json
|
|
13
14
|
import os
|
|
14
15
|
import re
|
|
15
16
|
import shutil
|
|
@@ -17,7 +18,7 @@ import subprocess
|
|
|
17
18
|
from multiprocessing import Pool
|
|
18
19
|
import patch_ng
|
|
19
20
|
import yaml
|
|
20
|
-
from git import Repo
|
|
21
|
+
from git import Repo, exc
|
|
21
22
|
|
|
22
23
|
from bmcgo import errors
|
|
23
24
|
from bmcgo import misc
|
|
@@ -248,6 +249,21 @@ class FetchComponentCode:
|
|
|
248
249
|
log.error("conandata(%s) 没有找到", conandata)
|
|
249
250
|
log.info("更新组件 %s 代码到 %s 失败, 无法获取到 conan 信息", component_name,
|
|
250
251
|
conan_version)
|
|
252
|
+
except exc.GitCommandError as exp:
|
|
253
|
+
# 尝试修补MDS
|
|
254
|
+
cmd = f"conan install --requires={conan_version} -r openubmc_dev \
|
|
255
|
+
--build=missing -pr profile.ini --format=json --output-folder=tmp"
|
|
256
|
+
result = json.loads(Tools().run_command(cmd, capture_output=True, ignore_error=True))
|
|
257
|
+
nodes = result.stdout.strip().get("graph").get("nodes")
|
|
258
|
+
for node in nodes.values():
|
|
259
|
+
if node.get("ref").startswith(conan_version):
|
|
260
|
+
package_folder = node.get("package_folder")
|
|
261
|
+
if os.path.exists(f"{package_folder}/include/mds"):
|
|
262
|
+
src = f"{package_folder}/include/mds"
|
|
263
|
+
dest = os.path.abspath(f"{component_name}/mds")
|
|
264
|
+
shutil.copytree(src, dest, dirs_exist_ok=True)
|
|
265
|
+
log.info("将组件 %s 复制到 %s.", component_name, f"{component_name}/mds")
|
|
266
|
+
shutil.rmtree(f"{self.target_dir}/tmp", ignore_errors=True)
|
|
251
267
|
except Exception as exp:
|
|
252
268
|
log.error("工作状态错误: %s", exp)
|
|
253
|
-
log.error("更新组件代码到 %s 失败", conan_version)
|
|
269
|
+
log.error("更新组件代码到 %s 失败", conan_version)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
bmcgo/__init__.py,sha256=
|
|
1
|
+
bmcgo/__init__.py,sha256=35RGOj62SFVkQy27ERD5AR3h542oaBYQIVkYOOwLpfQ,562
|
|
2
2
|
bmcgo/bmcgo.py,sha256=uD4TsfjrFB5aQPIS6WRUVc9ShXX-dSImY9ezkB13g1w,685
|
|
3
3
|
bmcgo/bmcgo_config.py,sha256=-KYhC3jNqWkCWu6YkyxDZlyC3floXIHaibGpmyB6YWQ,11873
|
|
4
4
|
bmcgo/errors.py,sha256=QW1ndrJcJ2Ws7riOznPKVvZsNlrYk73eZol7w8gJTPU,3076
|
|
@@ -194,8 +194,8 @@ bmcgo/component/template_v2/conanbase.py.mako,sha256=H0yO-uijpENtujj_1u037U2mZyy
|
|
|
194
194
|
bmcgo/component/template_v2/conanfile.deploy.py.mako,sha256=Xbd-PlfVHOWeRFLfvzINeykiZzzSHsgO_yUUvYrKqTw,512
|
|
195
195
|
bmcgo/functional/__init__.py,sha256=BDXz8BcSlCkfo5UYt6j2rm89-HiYA1ZzfpFhy99MH-0,538
|
|
196
196
|
bmcgo/functional/analysis.py,sha256=4FaJlz7CbupHAdCdhdrRZCTlnHZ0bz7Cy32FNg9Ik_0,4097
|
|
197
|
-
bmcgo/functional/bmc_studio_action.py,sha256=
|
|
198
|
-
bmcgo/functional/check.py,sha256=
|
|
197
|
+
bmcgo/functional/bmc_studio_action.py,sha256=1-O44mp--_r6M971cZ5JgutcQMM8aQtfQgDsSRXSrX8,3920
|
|
198
|
+
bmcgo/functional/check.py,sha256=lW9RAEhgo0CTrZW1iB6cetQBg_S_vtqtUchUqEy3JSU,9432
|
|
199
199
|
bmcgo/functional/conan_index_build.py,sha256=Mp1fDpZVvecn5lUCsWZqq3mKSx9yu5pznQrDZr4Liuk,13443
|
|
200
200
|
bmcgo/functional/config.py,sha256=ZQ-a9hegI0cV41iTo7t49ryBeUH4wPJ-qkVvWp8toV4,10824
|
|
201
201
|
bmcgo/functional/csr_build.py,sha256=k6vEWuhrmTXTndMQX-RF6v9S7So-Gi4WWjoUYzh5IVA,42046
|
|
@@ -221,7 +221,6 @@ bmcgo/target/install_sdk.yml,sha256=PjSSFtDudnlA_N-__XHHuJmYTZT0ZcTKlyzOz9xIK3I,
|
|
|
221
221
|
bmcgo/target/personal.yml,sha256=o2PEQIcHe7v8J5-WHiQlgTEgiisQx_vCkgLlKDLkzh4,1953
|
|
222
222
|
bmcgo/target/publish.yml,sha256=WvaJAUZ0_6CMV3O1p1t6dagHe-DdLcXqLxKP11_ki1E,1615
|
|
223
223
|
bmcgo/tasks/__init__.py,sha256=VapgzhPMmB7dzPIRohoVm1jjfVn_v97cYNCRmkxScaU,539
|
|
224
|
-
bmcgo/tasks/download_buildtools_hm.py,sha256=f4UxStARc8Z8DnT_5O6ONajQ7P0sKyJ8brixr43fHVQ,5988
|
|
225
224
|
bmcgo/tasks/misc.py,sha256=GK_bSDLGZW0FxywB2ICG1iIEz2y2QoCb1YQQk8SYOIA,711
|
|
226
225
|
bmcgo/tasks/task.py,sha256=95nKxTe5PW3rfhpm5YFasPtmP8oCraeWJKq0D5mbl6A,18578
|
|
227
226
|
bmcgo/tasks/task_build_conan.py,sha256=Si-8fIrQ_Vva6gw0kdLApEZY5cKt8Mt1C_8Ef4If61I,53872
|
|
@@ -230,8 +229,8 @@ bmcgo/tasks/task_build_wbd_up.py,sha256=X9-0Qqad-s3mGfJBMeBQvfZ99KlWcgaMluDr_zv6
|
|
|
230
229
|
bmcgo/tasks/task_buildgppbin.py,sha256=epBxxrYFPgoTzpBgPzSRXcUs-ia_BJWsLGflylEJS7I,6614
|
|
231
230
|
bmcgo/tasks/task_buildhpm_ext4.py,sha256=DBZnmU_eb14J0CW_wVoCc9VKnssFF1vXmRhLJQ6kR28,3482
|
|
232
231
|
bmcgo/tasks/task_create_interface_config.py,sha256=rkFRGLrUgYCics-n1CKwCoQscU2BaRQkH7KP3zwJ6FI,5393
|
|
233
|
-
bmcgo/tasks/task_download_buildtools.py,sha256=
|
|
234
|
-
bmcgo/tasks/task_download_dependency.py,sha256
|
|
232
|
+
bmcgo/tasks/task_download_buildtools.py,sha256=imiOIWXxKOiWolALasTuSp3EkXrVeFWD0bPLERA78W0,4520
|
|
233
|
+
bmcgo/tasks/task_download_dependency.py,sha256=-ZkRcUKZyx3KYWlbBEOoJEm9rpfDGIItnJZQqpimNDM,3369
|
|
235
234
|
bmcgo/tasks/task_hpm_envir_prepare.py,sha256=KVxiYeLtONpWe6Sh2l7hj09HD3NydrSTx3ycrpT6gLg,3457
|
|
236
235
|
bmcgo/tasks/task_packet_to_supporte.py,sha256=5VSnC9typxiShCxt8YWWyBVojJ6MaXvgPHiIf6bObuA,4351
|
|
237
236
|
bmcgo/tasks/task_prepare.py,sha256=K1cb_3lhclRkCYa2wgp5E2FMOd3pC7VHBnm_4L_nrRE,6704
|
|
@@ -246,7 +245,7 @@ bmcgo/utils/combine_json_schemas.py,sha256=08JrAlLeo_JgUqzYcZNgSwJZPLfjbWVJ4esPP
|
|
|
246
245
|
bmcgo/utils/component_post.py,sha256=rTSMv36geI6rbm6ZFQenZfG0mn1nVPpdJqn7g8bYtKA,2330
|
|
247
246
|
bmcgo/utils/component_version_check.py,sha256=ukc-H-A4ljkOShzVtkYWL0oTIYwxgDIZtP-fPqqHnRY,6274
|
|
248
247
|
bmcgo/utils/config.py,sha256=BoNx8U8VjnHrC-lFXIhp6Ex8f02kZgUS-mTkRxi_SYM,51141
|
|
249
|
-
bmcgo/utils/fetch_component_code.py,sha256=
|
|
248
|
+
bmcgo/utils/fetch_component_code.py,sha256=gLgo3J3s5DyuoKXuOArjxfQZxvCCt_bOWbI6teH5CNQ,12328
|
|
250
249
|
bmcgo/utils/install_manager.py,sha256=Ag7tcTbhBfc6aTe5FOiET-8koq8_iY38Sozmi3dquio,4919
|
|
251
250
|
bmcgo/utils/json_validator.py,sha256=_k5wU78wfYGrzvSDaqOEtT4otgKUjquVhZNpVf2PW_c,7524
|
|
252
251
|
bmcgo/utils/mapping_config_patch.py,sha256=rfCfeiEU3WAEMDuUxLDARNjne3pWtK0Bxga3dQrEWoM,16827
|
|
@@ -264,8 +263,8 @@ bmcgo/utils/installations/install_plans/qemu.yml,sha256=lT7aKag60QUH6hTGFKa3hGRq
|
|
|
264
263
|
bmcgo/utils/installations/install_plans/studio.yml,sha256=AEspVgsVAnmUdvqZYNCb7SPoUEq_0i61dfpauyguLa4,229
|
|
265
264
|
bmcgo/utils/installations/installers/apt_installer.py,sha256=nPaCb4cobSi9InN_aHsEPtQ0k4FgsCUWE5_VgBPvcRE,3769
|
|
266
265
|
bmcgo/utils/installations/installers/pip_installer.py,sha256=dDdios1EQ7fzt90r02pZeoM3jCmjslLzkSvzd2hgRVM,3241
|
|
267
|
-
openubmc_bingo-0.6.
|
|
268
|
-
openubmc_bingo-0.6.
|
|
269
|
-
openubmc_bingo-0.6.
|
|
270
|
-
openubmc_bingo-0.6.
|
|
271
|
-
openubmc_bingo-0.6.
|
|
266
|
+
openubmc_bingo-0.6.66.dist-info/METADATA,sha256=c7qItr-Hvt0Fzra-Q2wtuEN77amPYsFx8gOnGG1tvtg,1010
|
|
267
|
+
openubmc_bingo-0.6.66.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
268
|
+
openubmc_bingo-0.6.66.dist-info/entry_points.txt,sha256=UUoUP-vAWTgg9vEYbRwYqOBHgpRtkngdzMPb-ocz90g,42
|
|
269
|
+
openubmc_bingo-0.6.66.dist-info/top_level.txt,sha256=9AcvCAt1nZcOgMsGt6T07mg2Bgtdet-3mHTwg91axgI,6
|
|
270
|
+
openubmc_bingo-0.6.66.dist-info/RECORD,,
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2024 Huawei Technologies Co., Ltd.
|
|
2
|
-
# openUBMC is licensed under Mulan PSL v2.
|
|
3
|
-
# You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
4
|
-
# You may obtain a copy of Mulan PSL v2 at:
|
|
5
|
-
# http://license.coscl.org.cn/MulanPSL2
|
|
6
|
-
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
7
|
-
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
8
|
-
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
9
|
-
# See the Mulan PSL v2 for more details.
|
|
10
|
-
"""
|
|
11
|
-
功 能:下载并安装V2X的rtos/hcc工具
|
|
12
|
-
修改记录:2024-08-29 创建
|
|
13
|
-
"""
|
|
14
|
-
import os
|
|
15
|
-
import shutil
|
|
16
|
-
|
|
17
|
-
from bmcgo.tasks.task import Task
|
|
18
|
-
from bmcgo.utils.config import Config
|
|
19
|
-
from bmcgo import misc
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class DownloadHmBuildTools(Task):
|
|
23
|
-
def __init__(self, config: Config):
|
|
24
|
-
super(DownloadHmBuildTools, self).__init__(config, "DownloadHmBuildTools")
|
|
25
|
-
self.dependency_file = os.path.realpath(
|
|
26
|
-
os.path.join(self.config.code_path, self.get_manufacture_config("base/dependency_buildtools"))
|
|
27
|
-
)
|
|
28
|
-
self.rtos_sdk_dir = f"{self.config.tools_path}/rtos-sdk-arm64-hm"
|
|
29
|
-
_, buildtool_config = self.get_profile_config()
|
|
30
|
-
self.standalone_toolchain = buildtool_config.get("standalone_toolchain", self.config.cross_compile_install_path)
|
|
31
|
-
self.sdkroot = buildtool_config.get("sdkroot", "/opt/hi1711sdk")
|
|
32
|
-
self.rtos_root = buildtool_config.get("rtos_root", f"/opt/{self.config.rtos_offering}")
|
|
33
|
-
self.sysroot = buildtool_config.get("sysroot", self.config.sysroot)
|
|
34
|
-
self.target_host = buildtool_config.get("target_host", self.config.cross_prefix)
|
|
35
|
-
self.dep_md5 = f"{self.rtos_root}/dependency.md5sum"
|
|
36
|
-
self.dep_md5_new = f"{self.tools.user_home}/dependency.md5sum.new"
|
|
37
|
-
self.skip_install = False
|
|
38
|
-
|
|
39
|
-
def download_tools(self):
|
|
40
|
-
self.info(f"移除下载路径: {self.rtos_sdk_dir}")
|
|
41
|
-
self.run_command(f"rm -rf {self.rtos_sdk_dir}", ignore_error=True, sudo=True)
|
|
42
|
-
self.info("开始下载依赖工具...")
|
|
43
|
-
partner_tools_dir = f"{os.path.expanduser('~')}/rtos_compiler"
|
|
44
|
-
if self.config.partner_mode:
|
|
45
|
-
self.info(f"从缓存目录{partner_tools_dir}复制编译器工具")
|
|
46
|
-
self.run_command(f"cp -rf {partner_tools_dir}/. {self.rtos_sdk_dir}")
|
|
47
|
-
self.info("下载依赖工具结束")
|
|
48
|
-
|
|
49
|
-
def check_rtos_sdk(self):
|
|
50
|
-
is_ubuntu = self.tools.is_ubuntu
|
|
51
|
-
self.chdir(self.rtos_sdk_dir)
|
|
52
|
-
self.info("安装 rpm 包")
|
|
53
|
-
self.info(f"删除目录 {self.rtos_root}")
|
|
54
|
-
self.run_command(f"rm -rf {self.rtos_root}", sudo=True)
|
|
55
|
-
for rpm in os.listdir("./"):
|
|
56
|
-
if not os.path.isfile(rpm) or not rpm.endswith(".rpm"):
|
|
57
|
-
continue
|
|
58
|
-
self.info("安装 {}".format(rpm))
|
|
59
|
-
if not is_ubuntu:
|
|
60
|
-
self.run_command("rpm -ivh {}".format(rpm), sudo=True)
|
|
61
|
-
else:
|
|
62
|
-
self.pipe_command(["rpm2cpio {}".format(rpm), "sudo cpio -id -D /"])
|
|
63
|
-
|
|
64
|
-
self.info(f"删除目录 {self.standalone_toolchain}")
|
|
65
|
-
self.run_command(f"rm -rf {self.standalone_toolchain}", sudo=True)
|
|
66
|
-
self.info("解压 hcc_arm64le")
|
|
67
|
-
self.run_command("tar -xzf hcc_arm64le.tar.gz -C /opt", sudo=True)
|
|
68
|
-
|
|
69
|
-
hm_tiny = "/opt/hcc_arm64le_hm_tiny"
|
|
70
|
-
self.info(f"删除目录 {hm_tiny}")
|
|
71
|
-
self.run_command(f"rm -rf {hm_tiny}", sudo=True)
|
|
72
|
-
self.info("解压 hcc_arm64le_hm_tiny")
|
|
73
|
-
self.run_command("tar -xzf hcc_arm64le_hm_tiny.tar.gz -C /opt", sudo=True)
|
|
74
|
-
|
|
75
|
-
self.info(f"删除目录 {self.sdkroot}")
|
|
76
|
-
self.run_command(f"rm -rf {self.sdkroot}", ignore_error=True, sudo=True)
|
|
77
|
-
self.run_command(f"mkdir -p {self.sdkroot}", ignore_error=True, sudo=True)
|
|
78
|
-
self.info("解压 hi1711sdk")
|
|
79
|
-
self.run_command(f"tar -xzf hi1711sdk.tar.gz -C {self.sdkroot} Module.symvers", sudo=True)
|
|
80
|
-
logname = os.getenv(misc.ENV_LOGNAME, None)
|
|
81
|
-
if logname and logname != "root":
|
|
82
|
-
self.run_command(f"chown {logname} {self.rtos_root} -R", sudo=True)
|
|
83
|
-
self.run_command(f"chown {logname} {self.sdkroot} -R", sudo=True)
|
|
84
|
-
self.run_command(f"chown {logname} {self.standalone_toolchain} -R", sudo=True)
|
|
85
|
-
self.run_command(f"chown {logname} {hm_tiny} -R", sudo=True)
|
|
86
|
-
|
|
87
|
-
self.chdir(self.config.code_path)
|
|
88
|
-
|
|
89
|
-
libstdcpp_install_path = os.path.join(self.sysroot, "usr")
|
|
90
|
-
os.makedirs(libstdcpp_install_path, exist_ok=True)
|
|
91
|
-
|
|
92
|
-
cross_compile_lib64 = os.path.join(self.standalone_toolchain, self.target_host, "lib64")
|
|
93
|
-
self.run_command(f"cp -rf {cross_compile_lib64} {libstdcpp_install_path}")
|
|
94
|
-
|
|
95
|
-
cmake_platform, _ = self.pipe_command(
|
|
96
|
-
["find /usr/share -type d -wholename */Modules/Platform", "head -n 1"], sudo=True, capture_output=True
|
|
97
|
-
)
|
|
98
|
-
self.info(f"复制HongMeng.cmake到 {cmake_platform}")
|
|
99
|
-
hm_cmake = os.path.join(libstdcpp_install_path, "share/cmake/Modules/Platform/HongMeng.cmake")
|
|
100
|
-
self.run_command(f"cp -af {hm_cmake} {cmake_platform}", sudo=True)
|
|
101
|
-
|
|
102
|
-
self.run_command("cp -af {} {}".format(self.dep_md5_new, self.dep_md5))
|
|
103
|
-
# md5文件对齐其他分支
|
|
104
|
-
dep_md5_br = f"{self.tools.user_home}/dependency.md5sum"
|
|
105
|
-
self.run_command(f"cp -af {self.dep_md5_new} {dep_md5_br}")
|
|
106
|
-
|
|
107
|
-
def run(self):
|
|
108
|
-
self.pipe_command([f"md5sum {self.dependency_file}"], self.dep_md5_new)
|
|
109
|
-
if os.path.isfile(self.dep_md5):
|
|
110
|
-
with open(self.dep_md5, "r") as fp:
|
|
111
|
-
md5old = fp.read()
|
|
112
|
-
with open(self.dep_md5_new, "r") as fp:
|
|
113
|
-
md5new = fp.read()
|
|
114
|
-
if md5old == md5new:
|
|
115
|
-
self.info("版本匹配, 跳过安装")
|
|
116
|
-
self.skip_install = True
|
|
117
|
-
return
|
|
118
|
-
self.download_tools()
|
|
119
|
-
|
|
120
|
-
def install(self):
|
|
121
|
-
if self.skip_install:
|
|
122
|
-
return
|
|
123
|
-
# 检查rtos是否安装,未安装或版本不匹配时安装
|
|
124
|
-
self.check_rtos_sdk()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|