openubmc-bingo 0.5.275__py3-none-any.whl → 0.6.0__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.

Files changed (56) hide show
  1. bmcgo/__init__.py +1 -1
  2. bmcgo/bmcgo_config.py +22 -10
  3. bmcgo/cli/cli.py +86 -39
  4. bmcgo/cli/config.conan2.yaml +9 -0
  5. bmcgo/codegen/lua/codegen.py +1 -1
  6. bmcgo/codegen/lua/script/gen_intf_rpc_json.py +15 -14
  7. bmcgo/component/analysis/analysis.py +8 -8
  8. bmcgo/component/analysis/intf_validation.py +23 -12
  9. bmcgo/component/build.py +76 -14
  10. bmcgo/component/component_dt_version_parse.py +3 -2
  11. bmcgo/component/component_helper.py +43 -15
  12. bmcgo/component/coverage/incremental_cov.py +2 -2
  13. bmcgo/component/deploy.py +68 -14
  14. bmcgo/component/gen.py +1 -1
  15. bmcgo/component/package_info.py +128 -38
  16. bmcgo/component/template_v2/conanbase.py.mako +352 -0
  17. bmcgo/component/template_v2/conanfile.deploy.py.mako +26 -0
  18. bmcgo/component/test.py +53 -20
  19. bmcgo/frame.py +7 -3
  20. bmcgo/functional/analysis.py +3 -2
  21. bmcgo/functional/check.py +10 -6
  22. bmcgo/functional/conan_index_build.py +79 -20
  23. bmcgo/functional/csr_build.py +11 -3
  24. bmcgo/functional/diff.py +1 -1
  25. bmcgo/functional/fetch.py +1 -1
  26. bmcgo/functional/full_component.py +32 -24
  27. bmcgo/functional/git_history.py +220 -0
  28. bmcgo/functional/maintain.py +55 -12
  29. bmcgo/functional/new.py +1 -1
  30. bmcgo/functional/schema_valid.py +2 -2
  31. bmcgo/logger.py +2 -3
  32. bmcgo/misc.py +130 -9
  33. bmcgo/tasks/conan/__init__.py +10 -0
  34. bmcgo/tasks/conan/conanfile.py +45 -0
  35. bmcgo/tasks/task.py +27 -4
  36. bmcgo/tasks/task_build_conan.py +433 -65
  37. bmcgo/tasks/task_buildgppbin.py +8 -2
  38. bmcgo/tasks/task_download_buildtools.py +76 -0
  39. bmcgo/tasks/task_download_dependency.py +1 -0
  40. bmcgo/tasks/task_hpm_envir_prepare.py +1 -1
  41. bmcgo/utils/build_conans.py +231 -0
  42. bmcgo/utils/component_post.py +6 -4
  43. bmcgo/utils/component_version_check.py +10 -5
  44. bmcgo/utils/config.py +76 -40
  45. bmcgo/utils/fetch_component_code.py +44 -25
  46. bmcgo/utils/installations/install_plans/qemu.yml +6 -0
  47. bmcgo/utils/installations/install_plans/studio.yml +6 -0
  48. bmcgo/utils/installations/install_workflow.py +28 -2
  49. bmcgo/utils/merge_csr.py +124 -0
  50. bmcgo/utils/tools.py +239 -117
  51. bmcgo/worker.py +2 -2
  52. {openubmc_bingo-0.5.275.dist-info → openubmc_bingo-0.6.0.dist-info}/METADATA +4 -2
  53. {openubmc_bingo-0.5.275.dist-info → openubmc_bingo-0.6.0.dist-info}/RECORD +56 -46
  54. {openubmc_bingo-0.5.275.dist-info → openubmc_bingo-0.6.0.dist-info}/WHEEL +0 -0
  55. {openubmc_bingo-0.5.275.dist-info → openubmc_bingo-0.6.0.dist-info}/entry_points.txt +0 -0
  56. {openubmc_bingo-0.5.275.dist-info → openubmc_bingo-0.6.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,352 @@
1
+ import os
2
+ import urllib3
3
+ import time
4
+ import concurrent.futures
5
+ % if pkg.is_maintain:
6
+ import stat
7
+ import shutil
8
+ % endif
9
+ from conan import ConanFile
10
+ from conan.tools.scm import Git
11
+ from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
12
+ from conan.tools.files import copy, update_conandata, chdir, rm
13
+ from conan.errors import ConanInvalidConfiguration
14
+ % if language == "c":
15
+ from bmcgo.component.gen import GenComp
16
+ % endif
17
+ % if pkg.is_maintain:
18
+ from conans import tools
19
+ from conans.util.files import mkdir
20
+ from conan.tools.files import patch as apply_patch
21
+ from conans.errors import ConanException
22
+ % endif
23
+
24
+ urllib3.disable_warnings()
25
+
26
+ # 构建时由工具自动生成到业务仓,做为conanfile.py的基类参与组件构建
27
+ # 如需要调试,请修改模板文件(目录中存在python版本号、bingo集成开发环境应用名称,请适配):
28
+ # ~/.local/lib/python3.8/site-packages/bingo/component/template/conanbase.py.mako
29
+
30
+
31
+ class ConanBase(ConanFile):
32
+ name = "${pkg.name}"
33
+ % if not pkg.is_maintain:
34
+ version = "${pkg.version}"
35
+ % endif
36
+ settings = "os", "compiler", "build_type", "arch"
37
+ license = "Mulan PSL v2"
38
+ generators = "CMakeDeps", "VirtualBuildEnv", "PkgConfigDeps"
39
+ language = "${language}"
40
+ _cmake = None
41
+ _codegen_version = ${codegen_version}
42
+ options = {
43
+ "asan": [True, False],
44
+ "gcov": [True, False],
45
+ "test": [True, False],
46
+ "manufacture": [True, False],
47
+ % if language == "lua":
48
+ "enable_luajit": [True, False],
49
+ % endif
50
+ % for op, ctx in pkg.design_options.items():
51
+ "${op}": [${",".join(("\"" + i + "\"") if isinstance(i, str) else str(i) for i in ctx["option"])}],
52
+ % endfor
53
+ }
54
+ default_options = {
55
+ "asan": False,
56
+ "gcov": False,
57
+ "test": False,
58
+ "manufacture": False,
59
+ % if language == "lua":
60
+ "enable_luajit": False,
61
+ % endif
62
+ % for op, ctx in pkg.design_options.items():
63
+ "${op}": ${("\"" + ctx["default"] + "\"") if isinstance(ctx["default"], str) else str(ctx["default"])},
64
+ % endfor
65
+ }
66
+
67
+ % if language == "c":
68
+ def _codegen(self):
69
+ args = ["-s", "mds/service.json"]
70
+ gen = GenComp(args)
71
+ gen.run(self._codegen_version)
72
+ % endif
73
+
74
+ def layout(self):
75
+ cmake_layout(self, build_folder=".build")
76
+
77
+ def requirements(self):
78
+ % if len(pkg.build_dependencies) > 0:
79
+ # 编译依赖
80
+ % for build_dep in pkg.build_dependencies:
81
+ self.requires("${build_dep}")
82
+ % endfor
83
+ % endif
84
+ %if language == "lua":
85
+ skynet = self.conf.get("user.tools:skynet")
86
+ if skynet:
87
+ self.tool_requires(skynet, options={"tools_only": True})
88
+ luajit = self.conf.get("user.tools:luajit")
89
+ if luajit:
90
+ self.tool_requires(luajit, options={"tools_only": True})
91
+ % endif
92
+ pass
93
+
94
+ def export(self):
95
+ copy(self, "conanbase.py", self.recipe_folder, self.export_folder)
96
+ % if not pkg.is_maintain:
97
+ git = Git(self, self.recipe_folder)
98
+ if git.is_dirty():
99
+ update_conandata(self, {"sources": {self.version: {"branch": None, "url": None, "pwd": os.getcwd(), "timestamp": int(time.time())}}})
100
+ return
101
+ url = None
102
+ commit = git.get_commit()
103
+ branches = git.run("branch -r --contains {}".format(commit))
104
+ remotes = git.run("remote")
105
+ for remote in remotes.splitlines():
106
+ if "{}/".format(remote) in branches:
107
+ url = git.get_remote_url(remote)
108
+ break
109
+ if not url:
110
+ update_conandata(self, {"sources": {self.version: {"branch": None, "url": None, "pwd": os.getcwd(), "timestamp": int(time.time())}}})
111
+ return
112
+ tag = git.run("tag --points-at HEAD")
113
+ update_conandata(self, {"sources": {self.version: {"branch": f"refs/tags/{tag}" if tag else commit, "url": url}}})
114
+ % endif
115
+
116
+ % if pkg.is_maintain:
117
+ def export_sources(self):
118
+ patches = self.conan_data.get("patches", {}).get(self.version, [])
119
+ for patch in patches:
120
+ patch_file = patch.get("patch_file")
121
+ if patch_file is None:
122
+ continue
123
+ # 与export_conandata_patches方法不同点:所有patches将从recipes_folder/../pacthes读取
124
+ src = os.path.join(self.recipe_folder, "..", patch_file)
125
+ dst = os.path.join(self.export_sources_folder, patch_file)
126
+ mkdir(os.path.dirname(dst))
127
+ shutil.copy2(src, dst)
128
+ % endif
129
+
130
+ def source(self):
131
+ git = Git(self)
132
+ sources = self.conan_data["sources"][self.version]
133
+ if sources["url"] and sources["branch"]:
134
+ git.fetch_commit(url=sources["url"], commit=sources["branch"].split("/")[-1])
135
+ else:
136
+ copy(self, "*", src=sources["pwd"], dst=".")
137
+ % if language == "c":
138
+ self._codegen()
139
+ % endif
140
+
141
+ def _pre_generate(self):
142
+ tc = CMakeToolchain(self)
143
+ tc.preprocessor_definitions["_FORTIFY_SOURCE"] = "2"
144
+
145
+ tc.variables["BUILD_MANUFACTURE"] = self.options.manufacture
146
+ % if len(pkg.design_options) > 0:
147
+ % for op, _ in pkg.design_options.items():
148
+ tc.variables["CONAN_DEFS_${op.upper()}"] = self.options.${op}
149
+ % endfor
150
+ % endif
151
+ % if language == "lua":
152
+ if self.options.enable_luajit:
153
+ tc.variables["CONAN_DEFS_ENABLE_LUAJIT"] = True
154
+ % endif
155
+ if self.options.test:
156
+ tc.variables["ENABLE_TEST"] = True
157
+ tc.preprocessor_definitions["ENABLE_TEST"] = True
158
+ # 向CMAKE传递版本号信息
159
+ version = self.version.split(".")
160
+ if len(version) >= 1:
161
+ tc.variables["PACKAGE_VERSION_MAJOR"] = version[0]
162
+ if len(version) >= 2:
163
+ tc.variables["PACKAGE_VERSION_MINOR"] = version[1]
164
+ if len(version) >= 3:
165
+ tc.variables["PACKAGE_VERSION_REVISION"] = version[2]
166
+ # 设置额外编译选项或者重定义CFLAGS CXXFLAGS,也可以设置其他开关
167
+ # 示例: os.environ['CFLAGS'] = f"{os.getenv('CFLAGS')} -fPIE"
168
+
169
+ if self.settings.arch in ["armv8", "x86_64"]:
170
+ tc.variables["CMAKE_INSTALL_LIBDIR"] = "usr/lib64"
171
+ else:
172
+ tc.variables["CMAKE_INSTALL_LIBDIR"] = "usr/lib"
173
+
174
+ if self.options.get_safe("asan", False):
175
+ print("Enable asan flags")
176
+ asan_flags = "-fsanitize=address -fsanitize-recover=address,all -fno-omit-frame-pointer -fno-stack-protector -O0"
177
+ tc.extra_cflags.append(asan_flags)
178
+ tc.extra_cxxflags.append(asan_flags)
179
+ tc.extra_sharedlinkflag.append("LDFLAGS", "-fsanitize=address")
180
+ tc.extra_exelinkflag.append("LDFLAGS", "-fsanitize=address")
181
+
182
+ # GCOV 标志设置
183
+ if self.options.get_safe("gcov", False):
184
+ print("Enable gcov flags")
185
+ gcov_flags = "-ftest-coverage -fprofile-arcs -fprofile-update=atomic"
186
+ tc.extra_cflags.append(gcov_flags)
187
+ tc.extra_cxxflags.append(gcov_flags)
188
+ # 配合generate添加宏定义
189
+ tc.variables["CMAKE_TOOLCHAIN_FILE"] = "conan_toolchain.cmake"
190
+ # rpath配置
191
+ tc.variables["CMAKE_SKIP_BUILD_RPATH"] = True
192
+ tc.variables["CMAKE_SKIP_RPATH"] = True
193
+ tc.variables["CMAKE_SKIP_INSTALL_RPATH"] = True
194
+ tc.variables["CMAKE_BUILD_WITH_INSTALL_RPATH"] = False
195
+ tc.variables["CMAKE_INSTALL_RPATH_USE_LINK_PATH"] = False
196
+ return tc
197
+
198
+ def generate(self):
199
+ tc = self._pre_generate()
200
+ tc.generate()
201
+
202
+ % if pkg.is_maintain:
203
+ @staticmethod
204
+ def _get_patch_changed_files(patch_file):
205
+ files = {}
206
+ for line in open(patch_file):
207
+ if not line.startswith("diff --git"):
208
+ continue
209
+ line = line.strip()
210
+ chunk = line.split()
211
+ a_file = chunk[-2][2:]
212
+ b_file = chunk[-1][2:]
213
+ files[a_file] = b_file
214
+ return files
215
+
216
+ def _revise_renamed_files(self, changed_files):
217
+ for a_file, b_file in changed_files.items():
218
+ if a_file != b_file:
219
+ if a_file != "/dev/null" and b_file != "/dev/null":
220
+ os.rename(a_file, b_file)
221
+ cmd = f"git rm -f {a_file}"
222
+ self.run(cmd)
223
+ elif a_file != "/dev/null":
224
+ cmd = f"git rm -f {a_file}"
225
+ self.run(cmd)
226
+ continue
227
+ cmd = f"git add {b_file}"
228
+ self.run(cmd)
229
+
230
+ %endif
231
+ def _configure_cmake(self):
232
+ if self._cmake is not None:
233
+ return self._cmake
234
+ self._cmake = CMake(self)
235
+ self._cmake.configure()
236
+ return self._cmake
237
+
238
+ def build(self):
239
+ % if pkg.is_maintain:
240
+ for patch in self.conan_data.get("patches", {}).get(self.version, []):
241
+ patch_file = patch.get("patch_file")
242
+ if not patch_file:
243
+ continue
244
+ real_path = os.path.join(self.folders.base_source, patch_file)
245
+ print(f"Start patch file {patch_file}")
246
+ changed_files = self._get_patch_changed_files(real_path)
247
+ try:
248
+ apply_patch(self, patch_file=real_path)
249
+ self._revise_renamed_files(changed_files)
250
+ cmd = f"git commit -m \"{patch_file}\""
251
+ self.run(cmd)
252
+ except ConanException:
253
+ # 尝试还原文件修改
254
+ for a_file, b_file in changed_files.items():
255
+ cmd = f"git checkout -- {a_file}"
256
+ self.run(cmd, ignore_errors=True)
257
+ cmd = f"git checkout -- {b_file}"
258
+ self.run(cmd, ignore_errors=True)
259
+ cmd = "git am " + real_path
260
+ self.run(cmd)
261
+ % endif
262
+ cmake = self._configure_cmake()
263
+ cmake.build()
264
+
265
+ def package(self):
266
+ cmake = self._configure_cmake()
267
+ cmake.install()
268
+ files_to_copy = [
269
+ ("permissions.ini", self.source_folder, self.package_folder),
270
+ ("model.json", os.path.join(self.source_folder, "mds"), os.path.join(self.package_folder, "include/mds")),
271
+ ("service.json", os.path.join(self.source_folder, "mds"), os.path.join(self.package_folder, "include/mds")),
272
+ ("*", os.path.join(self.source_folder, "customization"), os.path.join(self.package_folder, "include")),
273
+ ("*", os.path.join(self.source_folder, "mds"), os.path.join(self.package_folder, "usr/share/doc/openubmc/${pkg.name}/mds")),
274
+ ("*", os.path.join(self.source_folder, "docs"), os.path.join(self.package_folder, "usr/share/doc/openubmc/${pkg.name}/docs")),
275
+ ("*", os.path.join(self.source_folder, "build"), os.path.join(self.package_folder, "include")),
276
+ ("permissions.ini", os.path.join(self.source_folder, "dist"), self.package_folder),
277
+ ("*.md", self.source_folder, os.path.join(self.package_folder,"usr/share/doc/openubmc/${pkg.name}/docs")),
278
+ ("*.MD", self.source_folder, os.path.join(self.package_folder,"usr/share/doc/openubmc/${pkg.name}/docs"))
279
+ ]
280
+ for pattern, src, dst in files_to_copy:
281
+ copy(self, pattern, src=src, dst=dst, keep_path=True)
282
+
283
+ # 只有当需要统计覆盖率且TRANSTOBIN环境变量未设置时才不处理lua文件
284
+ if self.options.gcov and os.getenv("TRANSTOBIN") is None:
285
+ return
286
+
287
+ os.chdir(self.package_folder)
288
+ with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
289
+ for root, _, files in os.walk("."):
290
+ for file in files:
291
+ if file.endswith(".lua") and not os.path.islink(os.path.join(root, file)):
292
+ file_path = os.path.join(root, file)
293
+ if self.options.enable_luajit:
294
+ executor.submit(self.compile_file, file_path, True)
295
+ else:
296
+ executor.submit(self.compile_file, file_path, False)
297
+ rm(self, "luac.out", self.package_folder)
298
+
299
+ def compile_file(self, file_path, enable_luajit):
300
+ if enable_luajit:
301
+ self.run(f"luajit -b -g {file_path} {file_path}")
302
+ else:
303
+ self.run(f"luac -o {file_path} {file_path}")
304
+ self.run(f"luac -s {file_path}")
305
+
306
+ def package_info(self):
307
+ app_dir = os.path.join(self.package_folder, "opt/bmc/apps/${pkg.name}")
308
+ if os.path.isdir(app_dir):
309
+ self.runenv_info.append("PATH", ':' + app_dir)
310
+ self.buildenv_info.append("PATH", ':' + app_dir)
311
+ % if "application" in pkg.package_type and pkg.package_info is not None:
312
+ % if len(pkg.package_info.get("bindirs", [])) > 0:
313
+ self.cpp_info.bindirs = [${", ".join("\"" + i + "\"" for i in pkg.package_info["bindirs"])}]
314
+ % for dir in pkg.package_info["bindirs"]:
315
+ self.env_info.PATH.append(os.path.join(self.package_folder, "${dir}"))
316
+ % endfor
317
+ % endif
318
+ % endif
319
+ libs = []
320
+ dirs = []
321
+ for root, _, files in os.walk("."):
322
+ for file in files:
323
+ if file.endswith(".so") and file.startswith("lib"):
324
+ if root.startswith("./"):
325
+ dir = root[2:]
326
+ else:
327
+ dir = root
328
+ if dir not in dirs:
329
+ dirs.append(dir)
330
+ lib = file[3:-3]
331
+ libs.append(lib)
332
+ continue
333
+ if file.endswith(".a") and file.startswith("lib"):
334
+ if root.startswith("./"):
335
+ dir = root[2:]
336
+ else:
337
+ dir = root
338
+ if dir not in dirs:
339
+ dirs.append(dir)
340
+ libs.append(lib)
341
+ continue
342
+
343
+ if len(dirs):
344
+ self.cpp_info.components["${pkg.name}"].set_property("cmake_target_name", "${pkg.name}::${pkg.name}")
345
+ self.cpp_info.components["${pkg.name}"].set_property("cmake_target_aliass", ["${pkg.name}::${pkg.name}"])
346
+ self.cpp_info.components["${pkg.name}"].set_property("pkg_config_name", "${pkg.name}")
347
+ self.cpp_info.components["${pkg.name}"].libs = libs
348
+ self.cpp_info.components["${pkg.name}"].libdirs = dirs
349
+ for dir in dirs:
350
+ self.runenv_info.append("LD_LIBRARY_PATH", os.path.join(self.package_folder, dir))
351
+ self.buildenv_info.append("LD_LIBRARY_PATH", os.path.join(self.package_folder, dir))
352
+
@@ -0,0 +1,26 @@
1
+ from conan import ConanFile
2
+
3
+
4
+ class DeployConan(ConanFile):
5
+ name = "${pkg.name}-deploy"
6
+ version = "0.0.1"
7
+ settings = "os", "compiler", "build_type", "arch"
8
+ license = "Mulan PSL v2"
9
+ requires = []
10
+
11
+ def export(self):
12
+ self.copy("manifest.yaml")
13
+
14
+ def requirements(self):
15
+ % for build_dep in dependencies:
16
+ self.requires("${build_dep}")
17
+ % endfor
18
+
19
+ def build(self):
20
+ pass
21
+
22
+ def package(self):
23
+ pass
24
+
25
+ def package_info(self):
26
+ pass
bmcgo/component/test.py CHANGED
@@ -58,19 +58,27 @@ class TestComp():
58
58
  # 参数检查
59
59
  dt_parser = ComponentDtVersionParse(parser=parser, args=args, serv_file=self.temp_service_json)
60
60
  dt_parser.chose_dt_mode()
61
- self.args, self.build_args = parser.parse_known_args(args)
61
+ if misc.conan_v1():
62
+ self.args, self.build_args = parser.parse_known_args(args)
63
+ self.build_args.append("-bt")
64
+ self.build_args.append("dt")
65
+ self.build_args.append("-r")
66
+ self.build_args.append(self.args.remote)
67
+ else:
68
+ self.args, _ = parser.parse_known_args(args)
69
+ self.build_args = args
70
+ self.build_args.append("-pr")
71
+ self.build_args.append("profile.dt.ini")
72
+ self.build_args.append("-test")
62
73
  if self.args.enable_luajit:
63
74
  self.build_args.append("-jit")
64
- self.build_args.append("-bt")
65
- self.build_args.append("dt")
66
- self.build_args.append("-r")
67
75
  self.build_args.append(self.args.remote)
68
76
  if self.args.coverage:
69
77
  self.build_args.append("-cov")
70
78
  if self.args.asan:
71
79
  self.build_args.append("-as")
72
80
 
73
- self.info = InfoComp(self.build_args, self.temp_service_json)
81
+ self.info = InfoComp(self.build_args, self.temp_service_json, self.bconfig.partner_mode, False)
74
82
  self.unit_test = self.args.unit_test
75
83
  self.integration_test = self.args.integration_test
76
84
  self.test_filter = self.args.test_filter
@@ -110,13 +118,13 @@ class TestComp():
110
118
  self.init_dt_result_dict()
111
119
 
112
120
  # 构建和部署对象
113
- self.build = BuildComp(bconfig, self.build_args, service_json=self.temp_service_json)
121
+ self.build = BuildComp(bconfig, self.build_args, service_json=self.temp_service_json, enable_upload=False)
114
122
  self.deploy = DeployComp(bconfig, self.build.info)
115
123
  self.current_app = self.build.info.name
116
124
 
117
125
  @staticmethod
118
126
  def arg_parser(add_help=False):
119
- pkg_parser = InfoComp.arg_parser()
127
+ pkg_parser = InfoComp.arg_parser(False, enable_upload=False)
120
128
  parser = argparse.ArgumentParser(description="Test component", parents=[pkg_parser], add_help=add_help)
121
129
  parser.add_argument("-ut", "--unit_test", help="Enable unit test", action=misc.STORE_TRUE)
122
130
  parser.add_argument("-it", "--integration_test", help="Enable integration test", action=misc.STORE_TRUE)
@@ -264,8 +272,11 @@ class TestComp():
264
272
  log.error("依赖格式错误, 获取到: %s", dep)
265
273
  elif not self.is_common_dep(conan, dt_common_deps):
266
274
  # 写入组件配置的非DT公共依赖
267
- if "@" not in conan:
268
- write_dep = prefix + '"' + conan + uc_code + '"' + "\n"
275
+ if misc.conan_v1():
276
+ if "@" not in conan:
277
+ write_dep = prefix + '"' + conan + uc_code + '"' + "\n"
278
+ else:
279
+ write_dep = prefix + '"' + conan + '"' + "\n"
269
280
  else:
270
281
  write_dep = prefix + '"' + conan + '"' + "\n"
271
282
  mf_file.write(write_dep)
@@ -275,7 +286,10 @@ class TestComp():
275
286
  self.build.run()
276
287
  os.chdir(self.folder)
277
288
  # 部署被测组件及其依赖到temp/rootfs目录
278
- self.deploy.run()
289
+ if misc.conan_v1():
290
+ self.deploy.run()
291
+ else:
292
+ self.deploy.run()
279
293
  os.chdir(self.folder)
280
294
 
281
295
  def coverage_config(self, project_root, cov_path, app):
@@ -606,17 +620,36 @@ class TestComp():
606
620
  stat.S_IWUSR | stat.S_IRUSR), 'w') as file:
607
621
  file.write(self.info.package)
608
622
 
623
+ def get_gcda_path(self, ):
624
+ package_path = f"{self.info.name}/{self.info.version}@{self.info.user}/{self.info.stage}"
625
+ ret = self.tools.run_command(f"conan list {package_path}#latest:* -f json", capture_output=True).stdout.strip()
626
+ revisions_path = json.loads(ret)["Local Cache"][package_path]["revisions"]
627
+ revisions = next(iter(revisions_path.keys()), None)
628
+ if not revisions:
629
+ raise ValueError("No revision IDs found")
630
+ packages = next(iter(revisions_path[revisions]["packages"].keys()), None)
631
+ if not packages:
632
+ raise ValueError("No packages IDs found")
633
+ build_path = self.tools.run_command(f"conan cache path {package_path}#{revisions}:{packages} --folder build",
634
+ capture_output=True).stdout.strip()
635
+ return build_path
636
+
609
637
  def generate_gcov(self):
610
- if not self.test_by_conan:
611
- if not os.path.exists("src/lualib-src"):
612
- return
613
- package_path = os.path.join(self.temp_path, "package_info")
614
- with open(package_path, "r") as file:
615
- lines = file.readlines()
616
- package_path = lines[0].replace("@", "/")
638
+ if misc.conan_v1():
639
+ if not self.test_by_conan:
640
+ if not os.path.exists("src/lualib-src"):
641
+ return
642
+ package_path = os.path.join(self.temp_path, "package_info")
643
+ with open(package_path, "r") as file:
644
+ lines = file.readlines()
645
+ package_path = lines[0].replace("@", "/")
646
+ else:
647
+ package_path = self.info.package.replace("@", "/")
648
+ base_dir = "%s/.conan/data/%s" % (os.path.expanduser('~'), package_path)
649
+ gcda_dir = base_dir
617
650
  else:
618
- package_path = self.info.package.replace("@", "/")
619
- base_dir = "%s/.conan/data/%s" % (os.path.expanduser('~'), package_path)
651
+ base_dir = self.folder
652
+ gcda_dir = self.get_gcda_path()
620
653
  gcov_path = os.path.join(self.cov_path, "gcov")
621
654
  if not os.path.exists(gcov_path):
622
655
  os.makedirs(gcov_path)
@@ -630,7 +663,7 @@ class TestComp():
630
663
  "--base-directory",
631
664
  base_dir,
632
665
  "--directory",
633
- base_dir,
666
+ gcda_dir,
634
667
  "--capture",
635
668
  "--output-file",
636
669
  info_file,
bmcgo/frame.py CHANGED
@@ -135,8 +135,12 @@ class Frame(object):
135
135
  parser = argparse.ArgumentParser(description="build target")
136
136
  parser.add_argument("-cp", "--conan_package", help="软件包名, 示例: kmc/21.1.2.B001", default="")
137
137
  parser.add_argument("-uci", "--upload_package", help="是否上传软件包", action=misc.STORE_TRUE)
138
- parser.add_argument("-o", "--options", help="组件特性配置, 示例: -o skynet:enable_luajit=True",
139
- action='append')
138
+ if misc.conan_v2():
139
+ parser.add_argument("-o", "--options", help="组件特性配置, 示例: -o skynet/*:enable_luajit=True",
140
+ action='append')
141
+ else:
142
+ parser.add_argument("-o", "--options", help="组件特性配置, 示例: -o skynet:enable_luajit=True",
143
+ action='append')
140
144
  self.conan_args, unknown_args = parser.parse_known_args(unknown_args)
141
145
  if self.conan_args is None or self.conan_args.conan_package == "":
142
146
  raise errors.BmcGoException("软件包选项为空, 请输入软件包选项!")
@@ -216,5 +220,5 @@ class Frame(object):
216
220
  shutil.rmtree(misc.CACHE_DIR)
217
221
  os.makedirs(misc.CACHE_DIR)
218
222
  os.chmod(misc.CACHE_DIR, 0o777)
219
- if shutil.which(misc.CONAN) is not None:
223
+ if shutil.which(misc.CONAN) is not None and misc.conan_v1():
220
224
  tool.run_command("conan remove --locks")
@@ -42,7 +42,8 @@ def if_available(bconfig: BmcgoConfig):
42
42
 
43
43
  class BmcgoCommand:
44
44
  def __init__(self, bconfig: BmcgoConfig, *args):
45
- parser = argparse.ArgumentParser(prog="bmcgo analysis", description="BMC package analysis", add_help=True,
45
+ parser = argparse.ArgumentParser(prog=f"{misc.tool_name()} analysis",
46
+ description="BMC package analysis", add_help=True,
46
47
  formatter_class=argparse.RawTextHelpFormatter)
47
48
  parser.add_argument("-r", "--remote", help="指定conan远端")
48
49
  parser.add_argument("--rebuild", dest="rebuild", help="rebuild the package before analysis",
@@ -50,7 +51,7 @@ class BmcgoCommand:
50
51
  parser.add_argument("--out_dir", dest="out_dir", help="analysis artifacts directory")
51
52
  parser.add_argument("--lock_file", dest="lock_file", help="manifest lock file path")
52
53
  parser.add_argument("-b", "--board_name", help="find supported boards in the manifest/build/product directory",
53
- default="openUBMC")
54
+ default=misc.boardname_default())
54
55
  pre_parsed_args, _ = parser.parse_known_args(*args)
55
56
 
56
57
  self.bconfig = bconfig
bmcgo/functional/check.py CHANGED
@@ -59,10 +59,11 @@ def if_available(bconfig: BmcgoConfig):
59
59
  class BmcgoCommand:
60
60
  def __init__(self, bconfig: BmcgoConfig, *args):
61
61
  self.bconfig = bconfig
62
- parser = argparse.ArgumentParser(prog="bmcgo check", description="语法正确性与模型一致性检查", add_help=True,
62
+ parser = argparse.ArgumentParser(prog=f"{misc.tool_name()} check", description="语法正确性与模型一致性检查", add_help=True,
63
63
  formatter_class=argparse.RawTextHelpFormatter)
64
- parser.add_argument("-b", "--board_name", help="指定单板获取配套全量源码,可选值为build/product目录下的单板名\n默认:openUBMC",
65
- default="openUBMC")
64
+ parser.add_argument("-b", "--board_name",
65
+ help="指定单板获取配套全量源码,可选值为build/product目录下的单板名\n默认:" + misc.boardname_default(),
66
+ default=misc.boardname_default())
66
67
  parser.add_argument("--stage", help="包类型,可选值为:rc(预发布包), stable(发布包)\n默认: stable", default="stable")
67
68
  parser.add_argument("-r", "--remote")
68
69
  parser.add_argument("-m", "--model", help=f"检查的模型,可选值为: {', '.join(MODEL_CHOICES)}\n默认: all",
@@ -87,14 +88,14 @@ class BmcgoCommand:
87
88
  @staticmethod
88
89
  def check_overdue(issue: dict):
89
90
  data = issue.get("deadline")
90
- if date is None:
91
+ if data is None:
91
92
  return False
92
93
  try:
93
94
  utc_8 = timezone(timedelta(hours=8))
94
95
  deadline = datetime.strptime(data, '%Y/%m/%d').replace(tzinfo=utc_8)
95
96
  return datetime.now(tz=utc_8) >= deadline + timedelta(days=1)
96
97
  except Exception as e:
97
- log.warning("日期 %s 解析失败:%s", date, e)
98
+ log.warning("日期 %s 解析失败:%s", data, e)
98
99
  return False
99
100
 
100
101
  @staticmethod
@@ -145,7 +146,10 @@ class BmcgoCommand:
145
146
  package = dep.get(misc.CONAN, "")
146
147
  comp_name = package.split("/")[0]
147
148
  if "@" not in package:
148
- package += f"@{misc.ConanUserEnum.CONAN_USER_RELEASE.value}/{misc.StageEnum.STAGE_RC.value}"
149
+ if misc.conan_v1():
150
+ package += f"@{misc.conan_user()}/{misc.StageEnum.STAGE_RC.value}"
151
+ else:
152
+ package += f"@{misc.conan_user()}/stable"
149
153
  self.packages[comp_name] = package
150
154
 
151
155
  def run(self):