openubmc-bingo 0.5.277__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.
- bmcgo/__init__.py +1 -1
- bmcgo/bmcgo_config.py +22 -10
- bmcgo/cli/cli.py +86 -39
- bmcgo/cli/config.conan2.yaml +9 -0
- bmcgo/codegen/lua/codegen.py +1 -1
- bmcgo/codegen/lua/script/gen_intf_rpc_json.py +15 -14
- bmcgo/component/analysis/analysis.py +8 -8
- bmcgo/component/analysis/intf_validation.py +23 -12
- bmcgo/component/build.py +76 -14
- bmcgo/component/component_dt_version_parse.py +3 -2
- bmcgo/component/component_helper.py +43 -15
- bmcgo/component/coverage/incremental_cov.py +2 -2
- bmcgo/component/deploy.py +68 -14
- bmcgo/component/gen.py +1 -1
- bmcgo/component/package_info.py +128 -38
- bmcgo/component/template_v2/conanbase.py.mako +352 -0
- bmcgo/component/template_v2/conanfile.deploy.py.mako +26 -0
- bmcgo/component/test.py +53 -20
- bmcgo/frame.py +7 -3
- bmcgo/functional/analysis.py +3 -2
- bmcgo/functional/check.py +10 -6
- bmcgo/functional/conan_index_build.py +79 -20
- bmcgo/functional/csr_build.py +1 -1
- bmcgo/functional/diff.py +1 -1
- bmcgo/functional/fetch.py +1 -1
- bmcgo/functional/full_component.py +32 -24
- bmcgo/functional/git_history.py +220 -0
- bmcgo/functional/maintain.py +55 -12
- bmcgo/functional/new.py +1 -1
- bmcgo/functional/schema_valid.py +2 -2
- bmcgo/logger.py +2 -3
- bmcgo/misc.py +130 -9
- bmcgo/tasks/conan/__init__.py +10 -0
- bmcgo/tasks/conan/conanfile.py +45 -0
- bmcgo/tasks/task.py +27 -4
- bmcgo/tasks/task_build_conan.py +399 -52
- bmcgo/tasks/task_buildgppbin.py +8 -2
- bmcgo/tasks/task_download_buildtools.py +76 -0
- bmcgo/tasks/task_download_dependency.py +1 -0
- bmcgo/tasks/task_hpm_envir_prepare.py +1 -1
- bmcgo/utils/build_conans.py +231 -0
- bmcgo/utils/component_post.py +6 -4
- bmcgo/utils/component_version_check.py +10 -5
- bmcgo/utils/config.py +76 -40
- bmcgo/utils/fetch_component_code.py +44 -25
- bmcgo/utils/tools.py +239 -117
- bmcgo/worker.py +2 -2
- {openubmc_bingo-0.5.277.dist-info → openubmc_bingo-0.6.0.dist-info}/METADATA +4 -2
- {openubmc_bingo-0.5.277.dist-info → openubmc_bingo-0.6.0.dist-info}/RECORD +52 -45
- {openubmc_bingo-0.5.277.dist-info → openubmc_bingo-0.6.0.dist-info}/WHEEL +0 -0
- {openubmc_bingo-0.5.277.dist-info → openubmc_bingo-0.6.0.dist-info}/entry_points.txt +0 -0
- {openubmc_bingo-0.5.277.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
|
-
|
|
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
|
|
268
|
-
|
|
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
|
-
|
|
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
|
|
611
|
-
if not
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
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
|
-
|
|
619
|
-
|
|
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
|
-
|
|
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
|
-
|
|
139
|
-
|
|
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")
|
bmcgo/functional/analysis.py
CHANGED
|
@@ -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="
|
|
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=
|
|
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="
|
|
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",
|
|
65
|
-
|
|
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
|
|
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",
|
|
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
|
-
|
|
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):
|