11
csrc/scripts/package/common/__init__.py
Normal file
11
csrc/scripts/package/common/__init__.py
Normal file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
2
csrc/scripts/package/common/cfg/path.cfg
Normal file
2
csrc/scripts/package/common/cfg/path.cfg
Normal file
@@ -0,0 +1,2 @@
|
||||
CUSTOM_DATA_PATH=$HOME/Ascend/latest/data/
|
||||
CUSTOM_CONF_PATH=$HOME/Ascend/latest/conf/
|
||||
11
csrc/scripts/package/common/py/__init__.py
Normal file
11
csrc/scripts/package/common/py/__init__.py
Normal file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
515
csrc/scripts/package/common/py/filelist.py
Normal file
515
csrc/scripts/package/common/py/filelist.py
Normal file
@@ -0,0 +1,515 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
"""filelist相关类。"""
|
||||
|
||||
import itertools
|
||||
import os
|
||||
from collections import Counter
|
||||
from collections.abc import Callable, Iterator
|
||||
from enum import IntEnum
|
||||
from functools import partial
|
||||
from itertools import chain, repeat
|
||||
from operator import and_, attrgetter, contains, itemgetter, lt, methodcaller, ne, not_
|
||||
from typing import NamedTuple
|
||||
|
||||
from .utils.comm_log import CommLog
|
||||
from .utils.funcbase import any_, constant, dispatch, identity, invoke, pipe, side_effect, star_apply
|
||||
from .utils.pkg_utils import (
|
||||
TOP_DIR,
|
||||
FilelistError,
|
||||
GenerateFilelistError,
|
||||
conditional_apply,
|
||||
config_feature_to_string,
|
||||
pairwise,
|
||||
swap_args,
|
||||
)
|
||||
|
||||
|
||||
class FileItem(NamedTuple):
|
||||
"""文件条目"""
|
||||
|
||||
module: str
|
||||
operation: str
|
||||
relative_path_in_pkg: str
|
||||
relative_install_path: str
|
||||
is_in_docker: str
|
||||
permission: str
|
||||
owner_group: str
|
||||
install_type: str
|
||||
softlink: list[str]
|
||||
feature: set[str]
|
||||
is_common_path: str
|
||||
configurable: str
|
||||
hash_value: str
|
||||
block: str
|
||||
pkg_inner_softlink: list[str]
|
||||
chip: set[str]
|
||||
is_dir: bool
|
||||
|
||||
|
||||
def create_file_item(*args, **kwargs) -> FileItem:
|
||||
"""创建文件条目。"""
|
||||
file_item = FileItem(*args, **kwargs)
|
||||
|
||||
if not isinstance(file_item.feature, set):
|
||||
raise TypeError("The feature parameter should be a set.")
|
||||
if not isinstance(file_item.chip, set):
|
||||
raise TypeError("The chip parameter should be a set.")
|
||||
if not isinstance(file_item.softlink, list):
|
||||
raise TypeError("The softlink parameter should be a list.")
|
||||
if not isinstance(file_item.pkg_inner_softlink, list):
|
||||
raise TypeError("The pkg_inner_softlink parameter should be a list.")
|
||||
|
||||
return file_item
|
||||
|
||||
|
||||
# 文件列表
|
||||
FileList = list[FileItem]
|
||||
|
||||
|
||||
def soft_links_to_string(soft_links: list[str]) -> str:
|
||||
"""软链接转换为字符串。"""
|
||||
if not soft_links:
|
||||
return "NA"
|
||||
return ";".join(soft_links)
|
||||
|
||||
|
||||
def file_item_to_string(item: FileItem) -> str:
|
||||
"""文件条目转换为字符串。"""
|
||||
return ",".join(
|
||||
[
|
||||
item.module,
|
||||
item.operation,
|
||||
item.relative_path_in_pkg,
|
||||
item.relative_install_path,
|
||||
item.is_in_docker,
|
||||
item.permission,
|
||||
item.owner_group,
|
||||
item.install_type,
|
||||
soft_links_to_string(item.softlink),
|
||||
config_feature_to_string(item.feature),
|
||||
item.is_common_path,
|
||||
item.configurable,
|
||||
item.hash_value,
|
||||
item.block,
|
||||
soft_links_to_string(item.pkg_inner_softlink),
|
||||
config_feature_to_string(item.chip),
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def get_filelist_header_string() -> str:
|
||||
"""获取文件列表表头。"""
|
||||
return ",".join(
|
||||
[
|
||||
"module",
|
||||
"operation",
|
||||
"relative_path_in_pkg",
|
||||
"relative_install_path",
|
||||
"is_in_docker",
|
||||
"permission",
|
||||
"owner:group",
|
||||
"install_type",
|
||||
"softlink",
|
||||
"feature",
|
||||
"is_common_path",
|
||||
"configurable",
|
||||
"hash",
|
||||
"block",
|
||||
"pkg_inner_softlink",
|
||||
"chip",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def get_soft_links_not_in_common_paths(filelist: FileList, target_env: str) -> Iterator[list[str]]:
|
||||
for file_item_t in filelist:
|
||||
if file_item_t.relative_install_path.startswith(target_env):
|
||||
for softlink in file_item_t.softlink:
|
||||
if not softlink.startswith(target_env):
|
||||
yield softlink
|
||||
|
||||
|
||||
def fill_is_common_path(filelist: FileList, target_env: str) -> Iterator[FileItem]:
|
||||
"""填充文件条目中是否为公共目录字段。"""
|
||||
soft_links = set(get_soft_links_not_in_common_paths(filelist, target_env))
|
||||
for file_item in filelist:
|
||||
if file_item.relative_install_path.startswith(target_env):
|
||||
yield file_item._replace(is_common_path="Y")
|
||||
else:
|
||||
is_soft_links_prefix = map(methodcaller("startswith", f"{file_item.relative_install_path}/"), soft_links)
|
||||
if any(is_soft_links_prefix):
|
||||
yield file_item._replace(is_common_path="YY")
|
||||
else:
|
||||
yield file_item
|
||||
|
||||
|
||||
def is_relative_install_path(path: str) -> bool:
|
||||
"""是否为相对路径。"""
|
||||
return not path.startswith("/")
|
||||
|
||||
|
||||
def is_specific_operations(file_item: FileItem, operations: list[str]) -> bool:
|
||||
"""是否为特定的操作类型。"""
|
||||
return file_item.operation in operations
|
||||
|
||||
|
||||
def is_specific_install_type(file_item: FileItem, install_types: set[str]) -> bool:
|
||||
"""是否为特定的安装类型。"""
|
||||
item_install_types = set(file_item.install_type.split(";"))
|
||||
if "all" in item_install_types:
|
||||
return True
|
||||
return bool(item_install_types & install_types)
|
||||
|
||||
|
||||
def get_install_path_dirs(install_path: str) -> Iterator[str]:
|
||||
"""获取安装路径父目录。"""
|
||||
install_path = os.path.dirname(install_path)
|
||||
while install_path not in ("", "/"):
|
||||
yield install_path
|
||||
install_path = os.path.dirname(install_path)
|
||||
|
||||
|
||||
def get_missing_dir_set(filelist: FileList) -> set[str]:
|
||||
"""获取缺失目录集合。
|
||||
|
||||
文件列表可能出现某一级目录缺失情况。
|
||||
如配置了file_info:aaa/bbb/ccc.txt,但只配置了dir_info:aaa,
|
||||
那么缺失dir_info:aaa/bbb
|
||||
"""
|
||||
parent_dirs: set[str] = invoke(
|
||||
pipe(
|
||||
dispatch(
|
||||
pipe(
|
||||
partial(
|
||||
filter,
|
||||
partial(is_specific_operations, operations={"copy", "copy_entity"}),
|
||||
),
|
||||
partial(map, attrgetter("relative_install_path")),
|
||||
partial(filter, is_relative_install_path),
|
||||
set,
|
||||
partial(map, get_install_path_dirs),
|
||||
chain.from_iterable,
|
||||
),
|
||||
pipe(
|
||||
partial(map, attrgetter("softlink")),
|
||||
chain.from_iterable,
|
||||
partial(
|
||||
filter,
|
||||
pipe(
|
||||
dispatch(
|
||||
bool,
|
||||
is_relative_install_path,
|
||||
partial(ne, "NA"),
|
||||
),
|
||||
all,
|
||||
),
|
||||
),
|
||||
set,
|
||||
partial(map, get_install_path_dirs),
|
||||
chain.from_iterable,
|
||||
),
|
||||
pipe(
|
||||
partial(map, attrgetter("pkg_inner_softlink")),
|
||||
chain.from_iterable,
|
||||
partial(
|
||||
filter,
|
||||
pipe(
|
||||
dispatch(
|
||||
bool,
|
||||
partial(ne, "NA"),
|
||||
),
|
||||
all,
|
||||
),
|
||||
),
|
||||
set,
|
||||
partial(map, get_install_path_dirs),
|
||||
chain.from_iterable,
|
||||
),
|
||||
),
|
||||
chain.from_iterable,
|
||||
set,
|
||||
),
|
||||
filelist,
|
||||
)
|
||||
mkdir_installs: set[str] = {
|
||||
file_item.relative_install_path
|
||||
for file_item in filter(partial(is_specific_operations, operations={"mkdir"}), filelist)
|
||||
if is_relative_install_path(file_item.relative_install_path)
|
||||
}
|
||||
|
||||
mkdir_parent_dirs: set[str] = set(itertools.chain.from_iterable(map(get_install_path_dirs, mkdir_installs)))
|
||||
|
||||
missing_dir_set = sorted((parent_dirs | mkdir_parent_dirs) - mkdir_installs)
|
||||
return set(missing_dir_set)
|
||||
|
||||
|
||||
def print_missing_dir_set(missing_dir_set: set[str], in_msg: str = None) -> set[str]:
|
||||
"""打印缺失目录集合。"""
|
||||
if in_msg:
|
||||
tail_msg = f" {in_msg}"
|
||||
else:
|
||||
tail_msg = ""
|
||||
for path in sorted(missing_dir_set):
|
||||
CommLog.cilog_error(f'missing dir info path "{path}"{tail_msg}')
|
||||
return missing_dir_set
|
||||
|
||||
|
||||
def print_unsafe_paths(unsafe_paths: tuple[str, ...]) -> tuple[str, ...]:
|
||||
"""打印非安全路径。"""
|
||||
for path in unsafe_paths:
|
||||
CommLog.cilog_error(f'unsafe path "{path}" in move scene.')
|
||||
return unsafe_paths
|
||||
|
||||
|
||||
# 获取filelist中所有的特性集合
|
||||
get_features_in_filelist = pipe(
|
||||
partial(map, attrgetter("feature")),
|
||||
chain.from_iterable, # 展开集合序列为元素序列
|
||||
set, # 去重
|
||||
partial(filter, partial(ne, "comm")), # 排除comm特性
|
||||
set,
|
||||
)
|
||||
|
||||
# 获取filelist中所有的芯片集合
|
||||
get_chips_in_filelist = pipe(
|
||||
partial(map, attrgetter("chip")),
|
||||
chain.from_iterable, # 展开集合序列为元素序列
|
||||
set, # 去重
|
||||
)
|
||||
|
||||
|
||||
def check_features_in_filelist(features: set[str], filelist: FileList) -> set[str]:
|
||||
"""检查文件列表中特性配置目录规范。"""
|
||||
return invoke(
|
||||
pipe(
|
||||
# 过滤指定features的file_item
|
||||
partial(filter, pipe(attrgetter("feature"), partial(and_, features), bool)),
|
||||
list,
|
||||
get_missing_dir_set,
|
||||
partial(print_missing_dir_set, in_msg=f"in features {features}"),
|
||||
),
|
||||
filelist,
|
||||
)
|
||||
|
||||
|
||||
def check_chip_in_filelist(chip: str, filelist: FileList) -> set[str]:
|
||||
"""检查文件列表中芯片配置目录规范。"""
|
||||
return invoke(
|
||||
pipe(
|
||||
# 过滤指定chip的file_item
|
||||
partial(
|
||||
filter,
|
||||
any_(
|
||||
pipe(attrgetter("chip"), not_), # 没有配置chip
|
||||
pipe(attrgetter("chip"), partial(swap_args(contains), chip), bool), # 配置了指定chip
|
||||
),
|
||||
),
|
||||
list,
|
||||
get_missing_dir_set,
|
||||
partial(print_missing_dir_set, in_msg=f"in chip {chip}"),
|
||||
),
|
||||
filelist,
|
||||
)
|
||||
|
||||
|
||||
check_filelist_features = any_(
|
||||
pipe(
|
||||
dispatch(
|
||||
pipe(
|
||||
get_features_in_filelist,
|
||||
# 对于每个feature,与comm组成一个set
|
||||
partial(map, lambda x: {x, "comm"}),
|
||||
# 此时为feature集合序列
|
||||
),
|
||||
repeat, # 重复filelist
|
||||
),
|
||||
tuple,
|
||||
star_apply(zip),
|
||||
# 此时为元组序列,元组的第1个元素是过滤的feature集合,第2个元素是filelist
|
||||
partial(itertools.starmap, check_features_in_filelist),
|
||||
# 此时为集合序列;合并为一个集合
|
||||
chain.from_iterable,
|
||||
set,
|
||||
),
|
||||
pipe(
|
||||
dispatch(
|
||||
get_chips_in_filelist,
|
||||
repeat, # 重复filelist
|
||||
),
|
||||
tuple,
|
||||
star_apply(zip),
|
||||
# 此时为元组序列,元组的第1个元素是chip集合,第2个元素是filelist
|
||||
partial(itertools.starmap, check_chip_in_filelist),
|
||||
# 此时为集合序列;合并为一个集合
|
||||
chain.from_iterable,
|
||||
set,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
# 检查move是否安全,是否存在同一个源路径被mv多次
|
||||
check_move_safe = pipe(
|
||||
partial(
|
||||
filter,
|
||||
partial(is_specific_operations, operations={"copy", "copy_entity", "move"}),
|
||||
),
|
||||
partial(map, attrgetter("relative_path_in_pkg")),
|
||||
Counter,
|
||||
methodcaller("items"),
|
||||
partial(filter, pipe(itemgetter(1), partial(lt, 1))),
|
||||
partial(map, itemgetter(0)),
|
||||
tuple,
|
||||
print_unsafe_paths,
|
||||
)
|
||||
|
||||
|
||||
def check_filelist(filelist: FileList, check_features: bool, check_move: bool):
|
||||
"""检查文件列表是否符合规范。"""
|
||||
if check_features:
|
||||
check_features_func = check_filelist_features
|
||||
else:
|
||||
check_features_func = constant(set())
|
||||
|
||||
if check_move:
|
||||
check_move_func = check_move_safe
|
||||
else:
|
||||
check_move_func = constant(tuple())
|
||||
|
||||
# 此处使用any_,短路部分报错
|
||||
check_func = any_(
|
||||
pipe(
|
||||
get_missing_dir_set,
|
||||
print_missing_dir_set,
|
||||
),
|
||||
pipe(
|
||||
partial(filter, partial(is_specific_install_type, install_types={"run"})),
|
||||
list,
|
||||
get_missing_dir_set,
|
||||
partial(print_missing_dir_set, in_msg="in run install type"),
|
||||
),
|
||||
check_features_func,
|
||||
check_move_func,
|
||||
)
|
||||
missing = check_func(filelist)
|
||||
|
||||
if missing:
|
||||
raise FilelistError()
|
||||
|
||||
|
||||
def get_common_path(args: list[str]) -> str:
|
||||
"""公共路径前缀。"""
|
||||
try:
|
||||
return os.path.commonpath(args)
|
||||
except ValueError:
|
||||
return ""
|
||||
|
||||
|
||||
class FileItemRelation(IntEnum):
|
||||
"""文件条目之间的关系。"""
|
||||
|
||||
NOT_NESTED = 0 # 不是嵌套文件
|
||||
NESTED = 1 # 嵌套文件
|
||||
SAME = 2 # 相同文件
|
||||
|
||||
|
||||
def is_nested_file_item(item: FileItem, base_item: FileItem) -> FileItemRelation:
|
||||
"""是否为嵌套的文件。"""
|
||||
if base_item is None:
|
||||
return FileItemRelation.NOT_NESTED
|
||||
|
||||
if item == base_item:
|
||||
return FileItemRelation.SAME
|
||||
|
||||
install_path = item.relative_install_path
|
||||
base_install_path = base_item.relative_install_path
|
||||
|
||||
common_install_path = get_common_path([install_path, base_install_path])
|
||||
if common_install_path != base_install_path:
|
||||
return FileItemRelation.NOT_NESTED
|
||||
|
||||
pkg_path = item.relative_path_in_pkg
|
||||
base_pkg_path = base_item.relative_path_in_pkg
|
||||
|
||||
install_rel_path = os.path.relpath(install_path, base_install_path)
|
||||
pkg_rel_path = os.path.relpath(pkg_path, base_pkg_path)
|
||||
if install_rel_path != pkg_rel_path:
|
||||
# 确保打包与安装相对路径一致
|
||||
raise FilelistError(f"nested paths {item} and {base_item} are illegal.")
|
||||
return FileItemRelation.NESTED
|
||||
|
||||
|
||||
def found_nested_file_item(item: FileItem, base_item: FileItem):
|
||||
"""发现嵌套元素。"""
|
||||
raise FilelistError(f"found nested paths {item} and {base_item}!")
|
||||
|
||||
|
||||
def convert_nested_path_in_filelist(filelist: FileList):
|
||||
"""filelist中嵌套路径元素转为del。"""
|
||||
pre_item = None
|
||||
for item in filelist:
|
||||
ret = is_nested_file_item(item, pre_item)
|
||||
if ret == FileItemRelation.NESTED:
|
||||
yield item._replace(operation="del")
|
||||
elif any((ret == FileItemRelation.NOT_NESTED, (ret == FileItemRelation.SAME and not item.is_dir))):
|
||||
yield item
|
||||
pre_item = item
|
||||
|
||||
|
||||
# 检查文件列表中的嵌套路径。入参: filelist
|
||||
check_nested_path_in_filelist = pipe(
|
||||
partial(filter, partial(is_specific_operations, operations={"copy", "copy_entity"})),
|
||||
partial(sorted, key=attrgetter("relative_install_path")),
|
||||
pairwise,
|
||||
partial(map, conditional_apply(star_apply(is_nested_file_item), star_apply(found_nested_file_item))),
|
||||
list,
|
||||
)
|
||||
|
||||
|
||||
# 变换文件列表中嵌套路径。入参: filelist
|
||||
transform_nested_path_in_filelist = pipe(
|
||||
dispatch(
|
||||
partial(itertools.filterfalse, partial(is_specific_operations, operations={"copy"})),
|
||||
pipe(
|
||||
partial(filter, partial(is_specific_operations, operations={"copy"})),
|
||||
partial(sorted, key=attrgetter("relative_install_path")),
|
||||
convert_nested_path_in_filelist,
|
||||
),
|
||||
),
|
||||
chain.from_iterable,
|
||||
list,
|
||||
side_effect(check_nested_path_in_filelist),
|
||||
)
|
||||
|
||||
|
||||
def generate_filelist(filelist: FileList, filename: str):
|
||||
"""生成文件列表文件。"""
|
||||
content_list = list(
|
||||
itertools.chain([get_filelist_header_string()], [file_item_to_string(item) for item in filelist])
|
||||
)
|
||||
content = "\n".join(content_list)
|
||||
filepath = os.path.join(TOP_DIR, "build", filename)
|
||||
try:
|
||||
with open(filepath, "w", encoding="utf-8") as file:
|
||||
file.write(content)
|
||||
# filelist.csv文件末尾补充一个换行符
|
||||
file.write("\n")
|
||||
except OSError as ex:
|
||||
raise GenerateFilelistError(filename) from ex
|
||||
|
||||
|
||||
def get_transform_nested_path_func(parallel: bool) -> Callable[[FileList], FileList]:
|
||||
"""获取转换嵌套路径函数。"""
|
||||
if parallel:
|
||||
return transform_nested_path_in_filelist
|
||||
return identity
|
||||
69
csrc/scripts/package/common/py/merge_binary_info_config.py
Normal file
69
csrc/scripts/package/common/py/merge_binary_info_config.py
Normal file
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
"""合并算子binary_info_config.json。"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
def load_json_file(json_file: str):
|
||||
"""加载json文件。"""
|
||||
with open(json_file, encoding="utf-8") as file:
|
||||
json_content = json.load(file)
|
||||
return json_content
|
||||
|
||||
|
||||
def save_json_file(output_file: str, content):
|
||||
"""保存json文件。"""
|
||||
output_dir = os.path.dirname(output_file)
|
||||
if not os.path.exists(output_dir):
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
with open(output_file, "w", encoding="utf-8") as file:
|
||||
json.dump(content, file, ensure_ascii=True, indent=2)
|
||||
|
||||
|
||||
def update_config(base_content, update_content):
|
||||
"""更新配置。"""
|
||||
new_content = base_content.copy()
|
||||
new_content.update(update_content)
|
||||
return dict(sorted(new_content.items()))
|
||||
|
||||
|
||||
def parse_args(argv: list[str]):
|
||||
"""入参解析。"""
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--base-file", required=True, help="the basic binary_info_config file")
|
||||
parser.add_argument("--update-file", required=True, help="the update binary_info_config file")
|
||||
parser.add_argument(
|
||||
"--output-file", required=True, type=os.path.realpath, help="the output binary_info_config file"
|
||||
)
|
||||
args = parser.parse_args(argv)
|
||||
return args
|
||||
|
||||
|
||||
def main(argv: list[str]) -> bool:
|
||||
"""主流程。"""
|
||||
args = parse_args(argv)
|
||||
base_content = load_json_file(args.base_file)
|
||||
update_content = load_json_file(args.update_file)
|
||||
result = update_config(base_content, update_content)
|
||||
save_json_file(args.output_file, result)
|
||||
return True
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if not main(sys.argv[1:]): # pragma: no cover
|
||||
sys.exit(1) # pragma: no cover
|
||||
240
csrc/scripts/package/common/py/packer.py
Normal file
240
csrc/scripts/package/common/py/packer.py
Normal file
@@ -0,0 +1,240 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
from argparse import Namespace
|
||||
from collections.abc import Callable
|
||||
from itertools import chain
|
||||
from subprocess import PIPE, STDOUT
|
||||
from typing import NamedTuple
|
||||
|
||||
from .utils.comm_log import CommLog
|
||||
from .utils.pkg_utils import CompressError
|
||||
|
||||
|
||||
class PackageName:
|
||||
"""包名。"""
|
||||
|
||||
def __init__(self, package_attr, args: Namespace, version: str):
|
||||
self.product_name = package_attr.get("product_name")
|
||||
self.chip_name = args.chip_name or package_attr.get("chip_name")
|
||||
self.suffix = args.suffix or package_attr.get("suffix")
|
||||
self.func_name = get_func_name(args.func_name, package_attr)
|
||||
self.chip_plat = package_attr.get("chip_plat")
|
||||
self.deploy_type = package_attr.get("deploy_type")
|
||||
self.version = version.lower()
|
||||
self.not_in_name_list = args.not_in_name.split(",")
|
||||
self.os_arch = args.os_arch
|
||||
self.package_suffix = args.package_suffix
|
||||
self.ext_name = args.ext_name
|
||||
if args.pkg_name_style == "underline":
|
||||
self.name_sep = "_"
|
||||
else:
|
||||
self.name_sep = "-"
|
||||
|
||||
def get_attribute(self, name: str) -> str | None:
|
||||
"""获取属性。"""
|
||||
if name in self.not_in_name_list:
|
||||
return None
|
||||
return getattr(self, name)
|
||||
|
||||
def getvalue(self) -> str:
|
||||
product_name = self.get_attribute("product_name")
|
||||
chip_name = self.get_attribute("chip_name")
|
||||
func_name = self.get_attribute("func_name")
|
||||
version = self.get_attribute("version")
|
||||
os_arch = self.get_attribute("os_arch")
|
||||
chip_plat = self.get_attribute("chip_plat")
|
||||
deploy_type = self.get_attribute("deploy_type")
|
||||
ext_name = self.get_attribute("ext_name")
|
||||
package_suffix = "debug" if self.package_suffix == "debug" else None
|
||||
|
||||
region1 = "-".join(filter(None, [product_name, remove_ascend(chip_name), func_name]))
|
||||
region2 = ".".join(filter(None, [version]))
|
||||
region3 = "-".join(filter(None, [os_arch, chip_plat, deploy_type, package_suffix, ext_name]))
|
||||
package_name = "_".join(filter(None, [region1, region2, region3]))
|
||||
|
||||
return f"{package_name}.{self.suffix}"
|
||||
|
||||
|
||||
class MakeselfPkgParams(NamedTuple):
|
||||
"""run包打包参数。"""
|
||||
|
||||
package_name: str
|
||||
comments: str
|
||||
makeself_tool: str | None = None
|
||||
makeself_header: str | None = None
|
||||
help_info: str | None = None
|
||||
source_target: str | None = None
|
||||
|
||||
install_script: str | None = None
|
||||
independent_pkg: bool | None = False
|
||||
cleanup: str | None = None
|
||||
|
||||
|
||||
def remove_ascend(text):
|
||||
if text is None:
|
||||
return None
|
||||
text_lower = text.lower()
|
||||
if text_lower == "ascend910_93":
|
||||
return "A3"
|
||||
if "ascend" in text_lower:
|
||||
return text_lower.replace("ascend", "")
|
||||
return text_lower
|
||||
|
||||
|
||||
def get_func_name(func_name: str, package_attr) -> str:
|
||||
"""获取包func_name。"""
|
||||
return func_name or package_attr.get("func_name")
|
||||
|
||||
|
||||
def get_compress_tool() -> str:
|
||||
tools = ["pigz", "gzip", "bzip2", "xz"]
|
||||
for tool in tools:
|
||||
path = shutil.which(tool)
|
||||
if path:
|
||||
return "--" + tool
|
||||
CommLog.cilog_error(
|
||||
"The system does not come with a compression tool pre-installed."
|
||||
"Please ensure at least one of the following compression tools is available: %s",
|
||||
tools,
|
||||
)
|
||||
return ""
|
||||
|
||||
|
||||
def get_compress_format() -> str:
|
||||
tar_format = "gnu"
|
||||
path = shutil.which("bsdtar")
|
||||
if path:
|
||||
tar_format = "ustar"
|
||||
return tar_format
|
||||
|
||||
|
||||
def compose_makeself_command(params: MakeselfPkgParams) -> str:
|
||||
"""组装makeself包打包命令。"""
|
||||
|
||||
def get_cleanup_commands() -> list[str]:
|
||||
if params.cleanup:
|
||||
return ["--cleanup", params.cleanup]
|
||||
return []
|
||||
|
||||
independent_pkg = params.independent_pkg
|
||||
compress_tool = get_compress_tool()
|
||||
tar_format = get_compress_format()
|
||||
if independent_pkg:
|
||||
commands = chain(
|
||||
[
|
||||
"TMPDIR=$pwd",
|
||||
params.makeself_tool,
|
||||
"--header",
|
||||
params.makeself_header,
|
||||
"--help-header",
|
||||
params.help_info,
|
||||
compress_tool,
|
||||
"--complevel",
|
||||
"4",
|
||||
"--nomd5",
|
||||
"--sha256",
|
||||
"--nooverwrite",
|
||||
"--chown",
|
||||
"--tar-format",
|
||||
tar_format,
|
||||
"--tar-extra",
|
||||
"--numeric-owner",
|
||||
"--tar-quietly",
|
||||
],
|
||||
get_cleanup_commands(),
|
||||
[params.source_target, params.package_name, params.comments, params.install_script],
|
||||
)
|
||||
else:
|
||||
commands = chain(
|
||||
[
|
||||
compress_tool,
|
||||
"--complevel",
|
||||
"4",
|
||||
"--nomd5",
|
||||
"--sha256",
|
||||
"--nooverwrite",
|
||||
"--chown",
|
||||
"--tar-format",
|
||||
tar_format,
|
||||
"--tar-extra",
|
||||
"--numeric-owner",
|
||||
"--tar-quietly",
|
||||
],
|
||||
get_cleanup_commands(),
|
||||
[params.package_name, params.comments],
|
||||
)
|
||||
|
||||
command = " ".join(commands)
|
||||
return command
|
||||
|
||||
|
||||
def create_makeself_pkg_params_factory(
|
||||
source_target: str, package_name: str, comments: str
|
||||
) -> Callable[[str, dict, bool], MakeselfPkgParams]:
|
||||
"""创建Makeself打包参数工厂。"""
|
||||
|
||||
def create_makeself_pkg_params(makeself_dir: str, package_attr: dict, independent_pkg=False) -> MakeselfPkgParams:
|
||||
"""创建Makeself打包参数。"""
|
||||
cleanup = package_attr.get("cleanup")
|
||||
|
||||
if independent_pkg:
|
||||
install_script = str(package_attr.get("install_script"))
|
||||
help_info = str(package_attr.get("help"))
|
||||
makeself_tool = os.path.join(makeself_dir, "makeself.sh")
|
||||
makeself_header = os.path.join(makeself_dir, "makeself-header.sh")
|
||||
params = MakeselfPkgParams(
|
||||
package_name=package_name,
|
||||
comments=comments,
|
||||
makeself_tool=makeself_tool,
|
||||
makeself_header=makeself_header,
|
||||
help_info=help_info,
|
||||
source_target=source_target,
|
||||
install_script=install_script,
|
||||
independent_pkg=independent_pkg,
|
||||
cleanup=cleanup,
|
||||
)
|
||||
else:
|
||||
params = MakeselfPkgParams(
|
||||
package_name=package_name,
|
||||
comments=comments,
|
||||
cleanup=cleanup,
|
||||
)
|
||||
return params
|
||||
|
||||
return create_makeself_pkg_params
|
||||
|
||||
|
||||
def create_run_package_command(params: MakeselfPkgParams) -> tuple[str | None, str | None]:
|
||||
"""
|
||||
功能描述: 组装打run包命令
|
||||
返回值: command
|
||||
"""
|
||||
return compose_makeself_command(params), None
|
||||
|
||||
|
||||
def exec_pack_cmd(delivery_dir: str, pack_cmd: str, package_name: str) -> str:
|
||||
"""执行打包命令"""
|
||||
if delivery_dir:
|
||||
cmd = f"cd {delivery_dir} && {pack_cmd}"
|
||||
else:
|
||||
cmd = pack_cmd
|
||||
CommLog.cilog_info("package cmd:%s", cmd)
|
||||
result = subprocess.run(cmd, shell=True, check=False, stdout=PIPE, stderr=STDOUT)
|
||||
output = result.stdout.decode()
|
||||
if result.returncode != 0:
|
||||
CommLog.cilog_error(__file__, "compress package(%s) failed! %s.", package_name, output)
|
||||
raise CompressError(package_name)
|
||||
return package_name
|
||||
1058
csrc/scripts/package/common/py/pkg_parser.py
Normal file
1058
csrc/scripts/package/common/py/pkg_parser.py
Normal file
File diff suppressed because it is too large
Load Diff
64
csrc/scripts/package/common/py/utils/comm_log.py
Normal file
64
csrc/scripts/package/common/py/utils/comm_log.py
Normal file
@@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
import inspect
|
||||
import logging
|
||||
import time
|
||||
|
||||
logging.basicConfig(
|
||||
format="[%(asctime)s] [%(levelname)s] [%(pathname)s] [line:%(lineno)d] %(message)s", level=logging.INFO
|
||||
)
|
||||
|
||||
|
||||
class CommLog:
|
||||
@staticmethod
|
||||
def cilog_get_timestamp():
|
||||
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
||||
|
||||
@staticmethod
|
||||
def cilog_print_element(cilog_element):
|
||||
print("[" + cilog_element + "]", end=" ")
|
||||
return
|
||||
|
||||
@staticmethod
|
||||
def cilog_logmsg(log_level, filename, line_no, log_msg, *log_paras):
|
||||
log_timestamp = CommLog.cilog_get_timestamp()
|
||||
CommLog.cilog_print_element(log_timestamp)
|
||||
CommLog.cilog_print_element(log_level)
|
||||
CommLog.cilog_print_element(filename)
|
||||
CommLog.cilog_print_element(str(line_no))
|
||||
print(log_msg % log_paras[0])
|
||||
return
|
||||
|
||||
@staticmethod
|
||||
def cilog_error(log_msg, *log_paras):
|
||||
frame = inspect.currentframe().f_back
|
||||
line_no = frame.f_lineno
|
||||
filename = frame.f_code.co_filename
|
||||
CommLog.cilog_logmsg("ERROR", filename, line_no, log_msg, log_paras)
|
||||
return
|
||||
|
||||
@staticmethod
|
||||
def cilog_warning(log_msg, *log_paras):
|
||||
frame = inspect.currentframe().f_back
|
||||
line_no = frame.f_lineno
|
||||
filename = frame.f_code.co_filename
|
||||
CommLog.cilog_logmsg("WARNING", filename, line_no, log_msg, log_paras)
|
||||
return
|
||||
|
||||
@staticmethod
|
||||
def cilog_info(log_msg, *log_paras):
|
||||
frame = inspect.currentframe().f_back
|
||||
line_no = frame.f_lineno
|
||||
filename = frame.f_code.co_filename
|
||||
CommLog.cilog_logmsg("INFO", filename, line_no, log_msg, log_paras)
|
||||
return
|
||||
94
csrc/scripts/package/common/py/utils/funcbase.py
Normal file
94
csrc/scripts/package/common/py/utils/funcbase.py
Normal file
@@ -0,0 +1,94 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
"""函数基础库。"""
|
||||
|
||||
import operator
|
||||
from collections.abc import Callable, Iterator
|
||||
from typing import TypeVar
|
||||
|
||||
A = TypeVar("A")
|
||||
|
||||
|
||||
def constant(value: A) -> Callable[..., A]:
|
||||
"""常量值。"""
|
||||
|
||||
def constant_inner(*_args, **_kwargs) -> A:
|
||||
return value
|
||||
|
||||
return constant_inner
|
||||
|
||||
|
||||
def dispatch(*funcs):
|
||||
"""分派应用。"""
|
||||
|
||||
def dispatch_inner(*args, **kwargs) -> Iterator:
|
||||
return (func(*args, **kwargs) for func in funcs)
|
||||
|
||||
return dispatch_inner
|
||||
|
||||
|
||||
def pipe(*funcs):
|
||||
"""串联多个函数。"""
|
||||
|
||||
def pipe_func(*args, **k_args):
|
||||
result = funcs[0](*args, **k_args)
|
||||
for func in funcs[1:]:
|
||||
result = func(result)
|
||||
return result
|
||||
|
||||
return pipe_func
|
||||
|
||||
|
||||
def identity(value: A) -> A:
|
||||
"""同一。"""
|
||||
return value
|
||||
|
||||
|
||||
def invoke(func, *args, **kwargs):
|
||||
"""调用。"""
|
||||
return func(*args, **kwargs)
|
||||
|
||||
|
||||
def side_effect(*funcs):
|
||||
"""调用函数,产生副作用,但不影响管道结果。"""
|
||||
|
||||
def side_effect_func(arg):
|
||||
for func in funcs:
|
||||
# 不保留结果
|
||||
func(arg)
|
||||
return arg
|
||||
|
||||
return side_effect_func
|
||||
|
||||
|
||||
def star_apply(func):
|
||||
"""列表展开再应用。"""
|
||||
|
||||
def star_apply_func(arg):
|
||||
return func(*arg)
|
||||
|
||||
return star_apply_func
|
||||
|
||||
|
||||
def any_(*funcs) -> Callable:
|
||||
"""高阶any。
|
||||
注意,any有短路效果。"""
|
||||
return pipe(
|
||||
dispatch(*funcs),
|
||||
any,
|
||||
)
|
||||
|
||||
|
||||
def not_(func) -> Callable:
|
||||
"""高阶not。"""
|
||||
return pipe(func, operator.not_)
|
||||
181
csrc/scripts/package/common/py/utils/pkg_utils.py
Normal file
181
csrc/scripts/package/common/py/utils/pkg_utils.py
Normal file
@@ -0,0 +1,181 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
"""基础构件。"""
|
||||
|
||||
import os
|
||||
from collections.abc import Callable, Iterator
|
||||
from itertools import chain, tee
|
||||
from pathlib import Path
|
||||
from typing import Optional, TypeVar
|
||||
|
||||
TOP_DIR = str(Path(__file__).resolve().parents[5])
|
||||
TOP_SOURCE_DIR = TOP_DIR + "/scripts/"
|
||||
DELIVERY_PATH = "build/_CPack_Packages/makeself_staging"
|
||||
CONFIG_SCRIPT_PATH = "package"
|
||||
BLOCK_CONFIG_PATH = "package/module"
|
||||
|
||||
SUCCESS = 0
|
||||
FAIL = -1
|
||||
|
||||
|
||||
A = TypeVar("A")
|
||||
|
||||
|
||||
class PackageError(Exception):
|
||||
"""打包异常基类。"""
|
||||
|
||||
|
||||
class PackageConfigError(PackageError):
|
||||
"""打包配置错误异常。"""
|
||||
|
||||
|
||||
class BlockConfigError(PackageError):
|
||||
"""块配置错误异常。"""
|
||||
|
||||
|
||||
class ParseOsArchError(PackageError):
|
||||
"""解析os_arch失败异常。"""
|
||||
|
||||
|
||||
class EnvNotSupported(PackageError):
|
||||
"""环境变量不支持异常。"""
|
||||
|
||||
|
||||
class ContainAsteriskError(PackageError):
|
||||
"""包含星号异常。"""
|
||||
|
||||
def __init__(self, value: str):
|
||||
super().__init__()
|
||||
self.value = value
|
||||
|
||||
|
||||
class FilelistError(PackageError):
|
||||
"""文件列表异常。"""
|
||||
|
||||
|
||||
class UnknownOperateTypeError(PackageError):
|
||||
"""未知的操作类型。"""
|
||||
|
||||
|
||||
class PackageNameEmptyError(PackageError):
|
||||
"""包名为空错误。"""
|
||||
|
||||
|
||||
class GenerateFilelistError(PackageError):
|
||||
"""生成文件列表文件异常。"""
|
||||
|
||||
def __init__(self, filename: str):
|
||||
super().__init__()
|
||||
self.filename = filename
|
||||
|
||||
|
||||
class IllegalVersionDir(PackageError):
|
||||
"""version_dir配置错误。"""
|
||||
|
||||
|
||||
class CompressError(PackageError):
|
||||
"""打包错误。"""
|
||||
|
||||
def __init__(self, package_name: str | None):
|
||||
super().__init__(package_name)
|
||||
self.package_name = package_name
|
||||
|
||||
|
||||
def flatten(list_of_lists):
|
||||
"""Flatten one level of nesting"""
|
||||
return chain.from_iterable(list_of_lists)
|
||||
|
||||
|
||||
def merge_dict(base: dict, *news: dict):
|
||||
"""合并两个字典。"""
|
||||
result = base.copy()
|
||||
for new in news:
|
||||
result.update(new)
|
||||
return result
|
||||
|
||||
|
||||
def star_pipe(*funcs):
|
||||
"""串联多个函数。解包结果。"""
|
||||
|
||||
def pipe_func(*args, **k_args):
|
||||
result = funcs[0](*args, **k_args)
|
||||
for func in funcs[1:]:
|
||||
# 解包元组或列表结果
|
||||
result = func(*result)
|
||||
return result
|
||||
|
||||
return pipe_func
|
||||
|
||||
|
||||
def swap_args(func):
|
||||
"""交换函数前两个参数。"""
|
||||
|
||||
def inner(fst, snd, *args, **k_args):
|
||||
return func(snd, fst, *args, **k_args)
|
||||
|
||||
return inner
|
||||
|
||||
|
||||
def conditional_apply(predicate, func):
|
||||
"""条件下应用函数。"""
|
||||
|
||||
def conditional_apply_func(arg):
|
||||
if predicate(arg):
|
||||
return func(arg)
|
||||
return arg
|
||||
|
||||
return conditional_apply_func
|
||||
|
||||
|
||||
def pairwise(iterable):
|
||||
"""s -> (s0,s1), (s1,s2), (s2, s3), ..."""
|
||||
a, b = tee(iterable)
|
||||
next(b, None)
|
||||
return zip(a, b)
|
||||
|
||||
|
||||
def path_join(base: Optional, *others: str) -> Optional:
|
||||
"""路径联合。"""
|
||||
if base is None:
|
||||
return None
|
||||
return os.path.join(base, *others)
|
||||
|
||||
|
||||
def yield_if(data, predicate: Callable) -> Iterator:
|
||||
"""条件满足则产生。"""
|
||||
if predicate(data):
|
||||
yield data
|
||||
|
||||
|
||||
def config_feature_to_set(feature_str: str, feature_type: str = "feature") -> set[str]:
|
||||
"""配置feature转换为集合。"""
|
||||
if feature_str is None:
|
||||
return set()
|
||||
|
||||
if isinstance(feature_str, set):
|
||||
return feature_str
|
||||
|
||||
if feature_str == "":
|
||||
raise PackageConfigError(f"Not allow to config {feature_type} empty.")
|
||||
|
||||
features = set(feature_str.split(";"))
|
||||
if "all" in features:
|
||||
raise PackageConfigError(f"Not allow to config {feature_type} all.")
|
||||
return features
|
||||
|
||||
|
||||
def config_feature_to_string(features: set[str]) -> str:
|
||||
"""配置feature集合转换为字符串。"""
|
||||
if not features:
|
||||
return "all"
|
||||
return ";".join(sorted(features))
|
||||
435
csrc/scripts/package/common/py/version_info.py
Normal file
435
csrc/scripts/package/common/py/version_info.py
Normal file
@@ -0,0 +1,435 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
import os
|
||||
import xml.etree.ElementTree as ET
|
||||
from functools import total_ordering
|
||||
from pathlib import Path
|
||||
from typing import NamedTuple
|
||||
|
||||
import regex as re
|
||||
|
||||
|
||||
class VersionInfoError(Exception):
|
||||
"""版本信息异常基类。"""
|
||||
|
||||
|
||||
class VersionFormatNotMatch(VersionInfoError):
|
||||
"""版本格式未匹配。"""
|
||||
|
||||
|
||||
class IntervalFormatNotMatch(VersionInfoError):
|
||||
"""区间格式未匹配。"""
|
||||
|
||||
|
||||
class DuplicatedPkgConfig(VersionInfoError):
|
||||
"""解析版本配置失败。重复的包配置。"""
|
||||
|
||||
def __init__(self, pkg_name):
|
||||
super().__init__(pkg_name)
|
||||
self.pkg_name = pkg_name
|
||||
|
||||
|
||||
class ParseVersionFailed(VersionInfoError):
|
||||
"""解析版本失败。"""
|
||||
|
||||
|
||||
class CollectRequiresFailed(VersionInfoError):
|
||||
"""收集包需求失败。"""
|
||||
|
||||
def __init__(self, pkg_name, version_str, msg):
|
||||
super().__init__(pkg_name, version_str, msg)
|
||||
self.pkg_name = pkg_name
|
||||
self.version_str = version_str
|
||||
self.msg = msg
|
||||
|
||||
|
||||
@total_ordering
|
||||
class Version:
|
||||
"""版本号。"""
|
||||
|
||||
def __init__(self, version):
|
||||
self.version = version
|
||||
|
||||
@classmethod
|
||||
def match(cls, input_str):
|
||||
"""输入字符串是否匹配版本号模式。"""
|
||||
m = re.match(r"[.a-zA-Z0-9]+$", input_str)
|
||||
return bool(m)
|
||||
|
||||
@classmethod
|
||||
def parse(cls, input_str):
|
||||
"""解析版本号。"""
|
||||
if not cls.match(input_str):
|
||||
raise VersionFormatNotMatch()
|
||||
|
||||
return cls(input_str)
|
||||
|
||||
@classmethod
|
||||
def try_convert_to_int_list(cls, str_list):
|
||||
"""尝试转换为int数组。"""
|
||||
for idx, item in enumerate(str_list):
|
||||
try:
|
||||
int_item = int(item)
|
||||
str_list[idx] = int_item
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
def to_required_list(self):
|
||||
"""转换为版本需求字符串列表。"""
|
||||
return [self.version]
|
||||
|
||||
def __eq__(self, other):
|
||||
"""等于。"""
|
||||
if not isinstance(other, self.__class__):
|
||||
return False
|
||||
return self.version == other.version
|
||||
|
||||
def __lt__(self, other):
|
||||
"""小于。"""
|
||||
if not isinstance(other, self.__class__):
|
||||
return True
|
||||
|
||||
self_list = self.version.split(".")
|
||||
other_list = other.version.split(".")
|
||||
|
||||
self.try_convert_to_int_list(self_list)
|
||||
self.try_convert_to_int_list(other_list)
|
||||
|
||||
self_tuple = tuple(self_list)
|
||||
other_tuple = tuple(other_list)
|
||||
|
||||
return self_tuple < other_tuple
|
||||
|
||||
def __str__(self):
|
||||
return self.version
|
||||
|
||||
def __repr__(self):
|
||||
return repr(self.version)
|
||||
|
||||
|
||||
class Point(NamedTuple):
|
||||
"""区间端点。"""
|
||||
|
||||
type_: int # 类型,0为闭区间,1为开区间
|
||||
value: Version
|
||||
|
||||
|
||||
class Interval(NamedTuple):
|
||||
"""版本号区间。"""
|
||||
|
||||
low: Point
|
||||
high: Point
|
||||
|
||||
@classmethod
|
||||
def match(cls, input_str: str) -> bool:
|
||||
"""输入字符串是否匹配区间模式。"""
|
||||
if not input_str.startswith("(") and not input_str.startswith("["):
|
||||
return False
|
||||
if not input_str.endswith(")") and not input_str.endswith("]"):
|
||||
return False
|
||||
input_str = input_str[1:-1]
|
||||
return input_str.count(",") <= 1
|
||||
|
||||
@classmethod
|
||||
def parse(cls, input_str):
|
||||
"""解析版本号区间。"""
|
||||
if not cls.match(input_str):
|
||||
raise IntervalFormatNotMatch()
|
||||
|
||||
if input_str[0] == "[":
|
||||
low_type = 0
|
||||
elif input_str[0] == "(":
|
||||
low_type = 1
|
||||
else:
|
||||
raise AssertionError("should not go here.")
|
||||
|
||||
if input_str[-1] == "]":
|
||||
high_type = 0
|
||||
elif input_str[-1] == ")":
|
||||
high_type = 1
|
||||
else:
|
||||
raise AssertionError("should not go here.")
|
||||
|
||||
input_str = input_str[1:-1]
|
||||
input_list = input_str.split(",")
|
||||
low = input_list[0].strip()
|
||||
if len(input_list) > 1:
|
||||
high = input_list[1].strip()
|
||||
else:
|
||||
high = None
|
||||
|
||||
if low:
|
||||
low_version = Point(low_type, Version(low))
|
||||
else:
|
||||
low_version = None
|
||||
|
||||
if high:
|
||||
high_version = Point(high_type, Version(high))
|
||||
else:
|
||||
high_version = None
|
||||
|
||||
return cls(low=low_version, high=high_version)
|
||||
|
||||
def to_required_list(self):
|
||||
"""转换为版本需求字符串列表。"""
|
||||
result = []
|
||||
|
||||
if self.low:
|
||||
if self.low.type_ == 0:
|
||||
operator = ">="
|
||||
else:
|
||||
operator = ">"
|
||||
required_str = f"{operator}{self.low.value.version}"
|
||||
result.append(required_str)
|
||||
|
||||
if self.high:
|
||||
if self.high.type_ == 0:
|
||||
operator = "<="
|
||||
else:
|
||||
operator = "<"
|
||||
required_str = f"{operator}{self.high.value.version}"
|
||||
result.append(required_str)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
class Require(NamedTuple):
|
||||
"""包需求。"""
|
||||
|
||||
pkg_name: str
|
||||
versions: list
|
||||
|
||||
@classmethod
|
||||
def _sort_key(cls, item) -> tuple:
|
||||
"""排序键。"""
|
||||
if isinstance(item, Interval):
|
||||
# 如果存在区间左值,则左值参与排序。
|
||||
if item.low:
|
||||
return item.low.value, item.low.type_
|
||||
# 否则使用区间右值,由于开区间更小,所以type_取负。
|
||||
return item.high.value, -item.high.type_
|
||||
|
||||
return item, 0
|
||||
|
||||
@classmethod
|
||||
def _sort_versions(cls, versions: list) -> bool:
|
||||
"""排序版本序列。"""
|
||||
versions.sort(key=cls._sort_key)
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def _to_required_list(cls, versions: list) -> list[str]:
|
||||
"""转换为版本需求字符串列表。"""
|
||||
result = []
|
||||
for version in versions:
|
||||
requires = version.to_required_list()
|
||||
result.extend(requires)
|
||||
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def _to_required_str(cls, versions: list) -> str:
|
||||
"""转换为版本需求字符串。"""
|
||||
requires = cls._to_required_list(versions)
|
||||
required_str = ", ".join(requires)
|
||||
|
||||
return required_str
|
||||
|
||||
def sort_versions(self) -> bool:
|
||||
"""排序版本序列。"""
|
||||
return self._sort_versions(self.versions)
|
||||
|
||||
def to_required_full_str(self) -> str:
|
||||
"""转换为版本需求字符串。"""
|
||||
required_str = self._to_required_str(self.versions)
|
||||
required_full_str = f'required_package_{self.pkg_name}_version="{required_str}"'
|
||||
return required_full_str
|
||||
|
||||
|
||||
class ItemElement(NamedTuple):
|
||||
"""item元素。"""
|
||||
|
||||
name: str
|
||||
version: str
|
||||
|
||||
@classmethod
|
||||
def parse(cls, item_ele: ET.Element, cur_ver: str):
|
||||
"""解析item元素。"""
|
||||
name = item_ele.attrib["name"]
|
||||
version = item_ele.attrib["version"].replace("$(CUR_VER)", cur_ver)
|
||||
return cls(name=name, version=version)
|
||||
|
||||
@classmethod
|
||||
def skip(cls, item_ele: ET.Element):
|
||||
"""是否跳过item元素。"""
|
||||
version = item_ele.attrib["version"]
|
||||
return version.strip() == ""
|
||||
|
||||
|
||||
class CompatibleElement(NamedTuple):
|
||||
"""compatible元素。"""
|
||||
|
||||
items: list
|
||||
|
||||
@classmethod
|
||||
def parse(cls, compatible_ele: ET.Element, cur_ver: str):
|
||||
"""解析compatible元素。"""
|
||||
items = []
|
||||
for item_ele in compatible_ele.findall("./item"):
|
||||
if ItemElement.skip(item_ele):
|
||||
continue
|
||||
item = ItemElement.parse(item_ele, cur_ver)
|
||||
items.append(item)
|
||||
return cls(items=items)
|
||||
|
||||
|
||||
def is_version_number(version: str) -> bool:
|
||||
"""字符串是否为版本号。"""
|
||||
has_slash = "/" in version
|
||||
return not has_slash and len(version.split(".")) >= 3
|
||||
|
||||
|
||||
class VersionXml(NamedTuple):
|
||||
"""版本配置。"""
|
||||
|
||||
release_version: str
|
||||
version_dir: str
|
||||
packages: dict
|
||||
|
||||
@classmethod
|
||||
def match(cls, filepath: Path | str) -> bool:
|
||||
"""文件路径是否匹配版本信息文件。"""
|
||||
return str(filepath).endswith(".xml")
|
||||
|
||||
@classmethod
|
||||
def parse_version(cls, version_str: str):
|
||||
"""解析版本配置。"""
|
||||
ret = Interval.match(version_str)
|
||||
if ret:
|
||||
result = Interval.parse(version_str)
|
||||
return result
|
||||
|
||||
ret = Version.match(version_str)
|
||||
if ret:
|
||||
result = Version.parse(version_str)
|
||||
return result
|
||||
|
||||
raise ParseVersionFailed()
|
||||
|
||||
def get_release_version(self):
|
||||
"""获取发布版本号。"""
|
||||
return self.release_version
|
||||
|
||||
def get_version_dir(self):
|
||||
"""获取多版本目录。"""
|
||||
return self.version_dir
|
||||
|
||||
def collect_requires(self, package: str) -> list[Require]:
|
||||
"""收集对应包的包需求列表。"""
|
||||
requires = {}
|
||||
|
||||
if package not in self.packages:
|
||||
return []
|
||||
|
||||
compatible = self.packages[package]
|
||||
|
||||
for item in compatible.items:
|
||||
pkg_name = item.name
|
||||
if pkg_name not in requires:
|
||||
requires[pkg_name] = Require(pkg_name=pkg_name, versions=[])
|
||||
|
||||
version_str = item.version
|
||||
try:
|
||||
version = self.parse_version(version_str)
|
||||
except ParseVersionFailed as ex:
|
||||
msg = f"parse pkg {pkg_name} version {version_str} failed"
|
||||
raise CollectRequiresFailed(pkg_name, version_str, msg) from ex
|
||||
|
||||
requires[pkg_name].versions.append(version)
|
||||
|
||||
result = []
|
||||
for pkg_name in sorted(requires.keys()):
|
||||
requires[pkg_name].sort_versions()
|
||||
result.append(requires[pkg_name])
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def get_version_dir(version_xml: VersionXml | None, disable_multi_version: bool, version_dir: str | None) -> str | None:
|
||||
"""获取版本目录名。"""
|
||||
if disable_multi_version:
|
||||
return None
|
||||
|
||||
if version_dir:
|
||||
return version_dir
|
||||
|
||||
# 支持从version.xml中获取version_dir
|
||||
if version_xml and version_xml.get_version_dir():
|
||||
return version_xml.get_version_dir()
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def is_multi_version(version_dir: str) -> bool:
|
||||
"""是否多版本。"""
|
||||
return bool(version_dir)
|
||||
|
||||
|
||||
class VersionInfo(NamedTuple):
|
||||
"""版本信息。"""
|
||||
|
||||
install_version_info: bool
|
||||
install_version_info_attrib: dict[str, str] | None
|
||||
itf_versions: list[str]
|
||||
version: str
|
||||
version_xml: VersionXml | None
|
||||
timestamp: str | None
|
||||
|
||||
|
||||
class VersionInfoFile(NamedTuple):
|
||||
"""生成的版本配置。"""
|
||||
|
||||
version: str
|
||||
itf_version_info: str | None = None
|
||||
requires: list[Require] | None = None
|
||||
version_dir: str | None = None
|
||||
timestamp: str | None = None
|
||||
|
||||
def _get_content(self) -> str:
|
||||
"""获取版本配置内容。"""
|
||||
lines = [f"Version={self.version}"]
|
||||
if self.version_dir:
|
||||
lines.append(f"version_dir={self.version_dir}")
|
||||
if self.timestamp:
|
||||
lines.append(f"timestamp={self.timestamp}")
|
||||
if self.itf_version_info:
|
||||
lines.append(self.itf_version_info)
|
||||
|
||||
if self.requires:
|
||||
requires_str = [require.to_required_full_str() for require in self.requires]
|
||||
lines.extend(requires_str)
|
||||
|
||||
lines.append("")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
def save(self, target_path: Path | str):
|
||||
"""保存版本配置。"""
|
||||
content = self._get_content()
|
||||
|
||||
target_dir = os.path.dirname(target_path)
|
||||
if not os.path.exists(target_dir):
|
||||
os.makedirs(target_dir)
|
||||
|
||||
with open(target_path, "w") as file:
|
||||
file.write(content)
|
||||
281
csrc/scripts/package/common/sh/check_version_required.awk
Normal file
281
csrc/scripts/package/common/sh/check_version_required.awk
Normal file
@@ -0,0 +1,281 @@
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
function strip(input) {
|
||||
sub("^ +", "", input)
|
||||
sub(" +$", "", input)
|
||||
return input
|
||||
}
|
||||
|
||||
function check_compatible_le(version_arr, len_version_arr, require_arr, len_require_arr, i) {
|
||||
for (i = 1; i <= len_require_arr; i++) {
|
||||
if (require_arr[i] == "") {
|
||||
continue
|
||||
}
|
||||
# len_version_arr lt len_require_arr
|
||||
if (i > len_version_arr) {
|
||||
return 1
|
||||
}
|
||||
if (version_arr[i] < require_arr[i]) {
|
||||
return 1
|
||||
}
|
||||
if (version_arr[i] > require_arr[i]) {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
if (len_version_arr > len_require_arr) {
|
||||
return 1
|
||||
}
|
||||
# len_version_arr eq len_require_arr
|
||||
return 1
|
||||
}
|
||||
|
||||
function check_compatible_lt(version_arr, len_version_arr, require_arr, len_require_arr, i) {
|
||||
for (i = 1; i <= len_require_arr; i++) {
|
||||
if (require_arr[i] == "") {
|
||||
continue
|
||||
}
|
||||
# len_version_arr lt len_require_arr
|
||||
if (i > len_version_arr) {
|
||||
return 1
|
||||
}
|
||||
if (version_arr[i] < require_arr[i]) {
|
||||
return 1
|
||||
}
|
||||
if (version_arr[i] > require_arr[i]) {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
if (len_version_arr > len_require_arr) {
|
||||
return 0
|
||||
}
|
||||
# len_version_arr eq len_require_arr
|
||||
return 0
|
||||
}
|
||||
|
||||
function check_compatible_ge(version_arr, len_version_arr, require_arr, len_require_arr, i) {
|
||||
for (i = 1; i <= len_require_arr; i++) {
|
||||
if (require_arr[i] == "") {
|
||||
continue
|
||||
}
|
||||
# len_version_arr lt len_require_arr
|
||||
if (i > len_version_arr) {
|
||||
return 0
|
||||
}
|
||||
if (version_arr[i] < require_arr[i]) {
|
||||
return 0
|
||||
}
|
||||
if (version_arr[i] > require_arr[i]) {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
if (len_version_arr > len_require_arr) {
|
||||
return 1
|
||||
}
|
||||
# len_version_arr eq len_require_arr
|
||||
return 1
|
||||
}
|
||||
|
||||
function check_compatible_gt(version_arr, len_version_arr, require_arr, len_require_arr, i) {
|
||||
for (i = 1; i <= len_require_arr; i++) {
|
||||
if (require_arr[i] == "") {
|
||||
continue
|
||||
}
|
||||
# len_version_arr lt len_require_arr
|
||||
if (i > len_version_arr) {
|
||||
return 0
|
||||
}
|
||||
if (version_arr[i] < require_arr[i]) {
|
||||
return 0
|
||||
}
|
||||
if (version_arr[i] > require_arr[i]) {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
if (len_version_arr > len_require_arr) {
|
||||
return 1
|
||||
}
|
||||
# len_version_arr eq len_require_arr
|
||||
return 0
|
||||
}
|
||||
|
||||
function check_compatible_eq(version_arr, len_version_arr, require_arr, len_require_arr, i) {
|
||||
for (i = 1; i <= len_require_arr; i++) {
|
||||
if (require_arr[i] == "") {
|
||||
continue
|
||||
}
|
||||
# len_version_arr lt len_require_arr
|
||||
if (i > len_version_arr) {
|
||||
return 0
|
||||
}
|
||||
if (version_arr[i] != require_arr[i]) {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
if (len_version_arr > len_require_arr) {
|
||||
return 1
|
||||
}
|
||||
# len_version_arr eq len_require_arr
|
||||
return 1
|
||||
}
|
||||
|
||||
function check_compatible(version_arr, len_version_arr, require, require_arr, len_require_arr, pos) {
|
||||
len_require_arr = split(require, require_arr, ".")
|
||||
|
||||
pos = match(require_arr[1], /^>=/)
|
||||
if (pos != 0) {
|
||||
require_arr[1] = substr(require_arr[1], pos + RLENGTH)
|
||||
return check_compatible_ge(version_arr, len_version_arr, require_arr, len_require_arr)
|
||||
}
|
||||
|
||||
pos = match(require_arr[1], /^>/)
|
||||
if (pos != 0) {
|
||||
require_arr[1] = substr(require_arr[1], pos + RLENGTH)
|
||||
return check_compatible_gt(version_arr, len_version_arr, require_arr, len_require_arr)
|
||||
}
|
||||
|
||||
pos = match(require_arr[1], /^<=/)
|
||||
if (pos != 0) {
|
||||
require_arr[1] = substr(require_arr[1], pos + RLENGTH)
|
||||
return check_compatible_le(version_arr, len_version_arr, require_arr, len_require_arr)
|
||||
}
|
||||
|
||||
pos = match(require_arr[1], /^</)
|
||||
if (pos != 0) {
|
||||
require_arr[1] = substr(require_arr[1], pos + RLENGTH)
|
||||
return check_compatible_lt(version_arr, len_version_arr, require_arr, len_require_arr)
|
||||
}
|
||||
|
||||
return check_compatible_eq(version_arr, len_version_arr, require_arr, len_require_arr)
|
||||
}
|
||||
|
||||
BEGIN {
|
||||
len_all_required_arr = split(all_required, all_required_arr, ",")
|
||||
|
||||
compated = 0
|
||||
|
||||
in_gt = 0
|
||||
matched_gt = 0
|
||||
|
||||
len_version_arr = split(version, version_arr, ".")
|
||||
|
||||
for (i = 1; i <= len_all_required_arr; i++) {
|
||||
all_required_arr[i] = strip(all_required_arr[i])
|
||||
one_compated = check_compatible(version_arr, len_version_arr, all_required_arr[i])
|
||||
|
||||
pos = match(all_required_arr[i], /^>/)
|
||||
if (pos != 0) {
|
||||
gt_require = 1
|
||||
lt_require = 0
|
||||
eq_require = 0
|
||||
} else {
|
||||
pos = match(all_required_arr[i], /^</)
|
||||
if (pos != 0) {
|
||||
gt_require = 0
|
||||
lt_require = 1
|
||||
eq_require = 0
|
||||
} else {
|
||||
gt_require = 0
|
||||
lt_require = 0
|
||||
eq_require = 1
|
||||
}
|
||||
}
|
||||
|
||||
if (matched_gt) {
|
||||
if (one_compated) {
|
||||
# gt after gt, all compated.
|
||||
if (gt_require) {
|
||||
matched_gt = 1
|
||||
in_gt = 1
|
||||
continue
|
||||
}
|
||||
# lt after gt, all compated.
|
||||
if (lt_require) {
|
||||
compated = 1
|
||||
matched_gt = 0
|
||||
in_gt = 0
|
||||
break
|
||||
}
|
||||
# eq after gt, all compated.
|
||||
if (eq_require) {
|
||||
# eq compated, go.
|
||||
compated = 1
|
||||
break
|
||||
}
|
||||
} else {
|
||||
# miscompated.
|
||||
# gt after gt, compated first gt. miscompated second gt.
|
||||
if (gt_require) {
|
||||
matched_gt = 0
|
||||
in_gt = 1
|
||||
continue
|
||||
}
|
||||
# lt after gt, compated first gt. miscompated second lt.
|
||||
if (lt_require) {
|
||||
matched_gt = 0
|
||||
in_gt = 0
|
||||
continue
|
||||
}
|
||||
# eq after gt, compated first gt. miscompated second eq.
|
||||
if (eq_require) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (one_compated) {
|
||||
if (gt_require) {
|
||||
matched_gt = 1
|
||||
in_gt = 1
|
||||
continue
|
||||
}
|
||||
if (lt_require) {
|
||||
if (in_gt) {
|
||||
matched_gt = 0
|
||||
in_gt = 0
|
||||
continue
|
||||
} else {
|
||||
compated = 1
|
||||
break
|
||||
}
|
||||
}
|
||||
if (eq_require) {
|
||||
# eq compated, go.
|
||||
compated = 1
|
||||
break
|
||||
}
|
||||
} else {
|
||||
# miscompated.
|
||||
if (gt_require) {
|
||||
matched_gt = 0
|
||||
in_gt = 1
|
||||
continue
|
||||
}
|
||||
if (lt_require) {
|
||||
matched_gt = 0
|
||||
in_gt = 0
|
||||
continue
|
||||
}
|
||||
if (eq_require) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (matched_gt) {
|
||||
compated = 1
|
||||
}
|
||||
|
||||
if (compated == 0) {
|
||||
printf("F")
|
||||
} else {
|
||||
printf("T")
|
||||
}
|
||||
}
|
||||
14
csrc/scripts/package/common/sh/cleanup.sh
Normal file
14
csrc/scripts/package/common/sh/cleanup.sh
Normal file
@@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
set -e
|
||||
|
||||
rm -rf $(pwd)
|
||||
1269
csrc/scripts/package/common/sh/common_func.inc
Normal file
1269
csrc/scripts/package/common/sh/common_func.inc
Normal file
File diff suppressed because it is too large
Load Diff
1729
csrc/scripts/package/common/sh/common_func_v2.inc
Normal file
1729
csrc/scripts/package/common/sh/common_func_v2.inc
Normal file
File diff suppressed because it is too large
Load Diff
55
csrc/scripts/package/common/sh/common_installer.inc
Normal file
55
csrc/scripts/package/common/sh/common_installer.inc
Normal file
@@ -0,0 +1,55 @@
|
||||
#!/bin/sh
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
# 通知latest管理器创建版本软链
|
||||
notify_latest_manager_create_version_softlink() {
|
||||
local curpath install_path version_dir var_path
|
||||
|
||||
set_comm_log "Notifier"
|
||||
|
||||
curpath="$(dirname $(readlink -f "${BASH_SOURCE:-$0}"))"
|
||||
install_path="$(readlink -f "$curpath/..")"
|
||||
version_dir="$(basename "$curpath")"
|
||||
var_path="$install_path/$LATEST_DIR/var"
|
||||
|
||||
if [ ! -f "$var_path/manager.sh" ]; then
|
||||
comm_log "ERROR" "$var_path/manager.sh doesn't exist!"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if ! "$var_path/manager.sh" --version-dir "$version_dir" create_version_softlink; then
|
||||
comm_log "ERROR" "create version softlink failed!"
|
||||
exit 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
# 通知latest管理器删除latest软链
|
||||
notify_latest_manager_remove_latest_softlink() {
|
||||
local curpath install_path var_path
|
||||
|
||||
set_comm_log "Notifier"
|
||||
|
||||
curpath="$(dirname $(readlink -f "${BASH_SOURCE:-$0}"))"
|
||||
install_path="$(readlink -f "$curpath/..")"
|
||||
var_path="$install_path/$LATEST_DIR/var"
|
||||
|
||||
if [ ! -f "$var_path/manager.sh" ]; then
|
||||
comm_log "ERROR" "$var_path/manager.sh doesn't exist!"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if ! "$var_path/manager.sh" remove_latest_softlink; then
|
||||
comm_log "ERROR" "remove latest softlink failed!"
|
||||
exit 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
37
csrc/scripts/package/common/sh/common_interface.csh
Normal file
37
csrc/scripts/package/common/sh/common_interface.csh
Normal file
@@ -0,0 +1,37 @@
|
||||
#!/bin/csh
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
set func_name = "$1"
|
||||
switch ( "$func_name" )
|
||||
case "mk_custom_path":
|
||||
if ( "`id -u`" == 0 ) then
|
||||
exit 0
|
||||
endif
|
||||
set file_path = "$2"
|
||||
foreach line ("` cat $file_path `")
|
||||
set custom_path = "`echo '$line' | cut --only-delimited -d= -f2`"
|
||||
if ( "$custom_path" == "" ) then
|
||||
continue
|
||||
endif
|
||||
set custom_path = "` eval echo $custom_path `"
|
||||
if ( ! -d "$custom_path" ) then
|
||||
mkdir -p "$custom_path"
|
||||
if ( $status != 0 ) then
|
||||
set cur_date = "`date +'%Y-%m-%d %H:%M:%S'`"
|
||||
echo "[Common] [$cur_date] [ERROR]: create $custom_path failed."
|
||||
exit 1
|
||||
endif
|
||||
endif
|
||||
end
|
||||
breaksw
|
||||
default:
|
||||
breaksw
|
||||
endsw
|
||||
33
csrc/scripts/package/common/sh/common_interface.fish
Normal file
33
csrc/scripts/package/common/sh/common_interface.fish
Normal file
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env fish
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
function mk_custom_path
|
||||
set -l custom_file_path $argv[1]
|
||||
if test (id -u) -eq 0
|
||||
return 0
|
||||
end
|
||||
while read line
|
||||
set -l _custom_path (echo "$line" | cut --only-delimited -d= -f2)
|
||||
if test -z $_custom_path
|
||||
continue
|
||||
end
|
||||
set -l _custom_path (eval echo "$_custom_path")
|
||||
if not test -d $_custom_path
|
||||
mkdir -p "$_custom_path"
|
||||
if not test $status -eq 0
|
||||
set -l cur_date (date +"%Y-%m-%d %H:%M:%S")
|
||||
echo "[Common] [$cur_date] [ERROR]: create $_custom_path failed."
|
||||
return 1
|
||||
end
|
||||
end
|
||||
end < $custom_file_path
|
||||
return 0
|
||||
end
|
||||
61
csrc/scripts/package/common/sh/common_interface.sh
Normal file
61
csrc/scripts/package/common/sh/common_interface.sh
Normal file
@@ -0,0 +1,61 @@
|
||||
#!/bin/sh
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
mk_custom_path() {
|
||||
if [ $(id -u) -eq 0 ]; then
|
||||
return 0
|
||||
fi
|
||||
local _custom_path_file="$1"
|
||||
while read line || [ -n "$line" ]
|
||||
do
|
||||
local _custom_path="$(echo "$line" | cut --only-delimited -d= -f2)"
|
||||
if [ -z "$_custom_path" ]; then
|
||||
continue
|
||||
fi
|
||||
eval "_custom_path=$_custom_path"
|
||||
if [ ! -d "$_custom_path" ]; then
|
||||
mkdir -p "$_custom_path"
|
||||
if [ $? -ne 0 ]; then
|
||||
cur_date="$(date +"%Y-%m-%d %H:%M:%S")"
|
||||
echo "[Common] [$cur_date] [ERROR]: create $_custom_path failed."
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
done < $_custom_path_file
|
||||
return 0
|
||||
}
|
||||
|
||||
py_version_check(){
|
||||
local pyver_set="3.7 3.8 3.9 3.10 3.11 3.12"
|
||||
local cur_date="$(date +"%Y-%m-%d %H:%M:%S")"
|
||||
which python3 > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
local python_version="$(python3 --version 2>&1 | head -n 1)"
|
||||
local python3_version=$(echo "$python_version" | sed -n 's/.*[^\.0-9]\([0-9]\+\.[0-9]\+\).*/\1/p')
|
||||
if [ "x$python3_version" != "x" ]; then
|
||||
for ver in $pyver_set; do
|
||||
if [ "x$ver" = "x$python3_version" ]; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
echo "[Common] [$cur_date] [WARNING]: $python_version is not in Python3.7.x, Python3.8.x, Python3.9.x, Python3.10.x, Python3.11.x, Python3.12.x"
|
||||
return 1
|
||||
else
|
||||
echo "[Common] [$cur_date] [WARNING]: $python_version cannot be identified as a standard version, please check manually."
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
echo "[Common] [$cur_date] [WARNING]: python3 is not found."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
2192
csrc/scripts/package/common/sh/install_common_parser.sh
Normal file
2192
csrc/scripts/package/common/sh/install_common_parser.sh
Normal file
File diff suppressed because it is too large
Load Diff
305
csrc/scripts/package/common/sh/multi_version.inc
Normal file
305
csrc/scripts/package/common/sh/multi_version.inc
Normal file
@@ -0,0 +1,305 @@
|
||||
#!/bin/sh
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
# 多版本函数库
|
||||
# 创建版本目录
|
||||
create_version_dir() {
|
||||
local install_path="$1"
|
||||
local version_dir="$2"
|
||||
local username="$3"
|
||||
local usergroup="$4"
|
||||
local install_for_all="$5"
|
||||
local ret
|
||||
|
||||
if [ ! -d "${install_path}/${version_dir}" ]; then
|
||||
make_dir "${install_path}/${version_dir}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
fi
|
||||
|
||||
# 约束版本号目录权限
|
||||
change_mod "${install_path}/${version_dir}" "750" "${install_for_all}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
change_own "${install_path}/${version_dir}" "${username}:${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 检查版本包安装结果
|
||||
check_version_install() {
|
||||
local install_path="$1"
|
||||
local version_dir="$2"
|
||||
local package="$3"
|
||||
local version_info_path
|
||||
|
||||
get_package_version_info "version_info_path" "$install_path" "$version_dir" "$package"
|
||||
|
||||
if [ ! -f "$version_info_path" ]; then
|
||||
comm_log "ERROR" "$version_info_path doesn't exist in check version install!"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
# 安装latest管理器
|
||||
install_latest_manager() {
|
||||
local var_path="$1"
|
||||
shift 1
|
||||
sh latest_manager/install.sh --install-path="$var_path" "$@"
|
||||
}
|
||||
|
||||
# 卸载latest管理器
|
||||
uninstall_latest_manager_for_upgrade() {
|
||||
local var_path="$1"
|
||||
${var_path}/manager/uninstall.sh --upgrade
|
||||
}
|
||||
|
||||
# 升级latest管理器
|
||||
upgrade_latest_manager() {
|
||||
local var_path="$1"
|
||||
local latest_version_info latest_manager_version local_manager_version
|
||||
|
||||
latest_version_info="$var_path/manager/version.info"
|
||||
if [ -f "$latest_version_info" ]; then
|
||||
get_version latest_manager_version "$latest_version_info"
|
||||
get_version local_manager_version "latest_manager/version.info"
|
||||
|
||||
set_default "latest_manager_version" "$latest_manager_version" "0"
|
||||
set_default "local_manager_version" "$local_manager_version" "0"
|
||||
|
||||
if [ "$latest_manager_version" -lt "$local_manager_version" ]; then
|
||||
uninstall_latest_manager_for_upgrade "$var_path"
|
||||
install_latest_manager "$var_path" "--upgrade"
|
||||
fi
|
||||
else
|
||||
install_latest_manager "$var_path"
|
||||
fi
|
||||
}
|
||||
|
||||
get_install_for_all_param() {
|
||||
local _outvar="$1"
|
||||
local _install_for_all="$2"
|
||||
local _result=""
|
||||
|
||||
if [ "$_install_for_all" = "y" ]; then
|
||||
_result="--install-for-all"
|
||||
fi
|
||||
|
||||
eval "${_outvar}=\"${_result}\""
|
||||
}
|
||||
|
||||
get_docker_root_param() {
|
||||
local _outvar="$1"
|
||||
local _docker_root="$2"
|
||||
local _result=""
|
||||
|
||||
if [ "$_docker_root" != "" ]; then
|
||||
_result="--docker-root \\\"$_docker_root\\\""
|
||||
fi
|
||||
|
||||
eval "${_outvar}=\"${_result}\""
|
||||
}
|
||||
|
||||
# 通知latest管理器
|
||||
notify_latest_manager() {
|
||||
local var_path="$1"
|
||||
local package="$2"
|
||||
local version="$3"
|
||||
local version_dir="$4"
|
||||
local install_for_all="$5"
|
||||
local docker_root="$6"
|
||||
local ext_params="$7"
|
||||
local operation="$8"
|
||||
local ret package_dir install_for_all_param docker_root_param
|
||||
|
||||
if [ ! -f "$var_path/manager.sh" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ "${USE_SHARE_INFO}" == "y" ]; then
|
||||
ext_params="$ext_params --use-share-info"
|
||||
fi
|
||||
|
||||
get_package_dir package_dir "$package"
|
||||
get_install_for_all_param "install_for_all_param" "$install_for_all"
|
||||
get_docker_root_param "docker_root_param" "$docker_root"
|
||||
|
||||
eval "\"$var_path/manager.sh\"" --version "\"$version\"" --version-dir "\"$version_dir\"" \
|
||||
--package "\"$package\"" --package-dir "\"$package_dir\"" \
|
||||
"$install_for_all_param" "$docker_root_param" "$ext_params" "$operation"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 通知latest管理器安装完成
|
||||
notify_latest_manager_installed() {
|
||||
local local_manager_version
|
||||
local ext_params
|
||||
|
||||
get_version local_manager_version "latest_manager/version.info"
|
||||
set_default "local_manager_version" "$local_manager_version" "0"
|
||||
|
||||
if [ "$INCREMENT" = "y" ]; then
|
||||
ext_params="--serial $local_manager_version --increment"
|
||||
else
|
||||
ext_params="--serial $local_manager_version"
|
||||
fi
|
||||
|
||||
notify_latest_manager "$@" "$ext_params" "package_installed"
|
||||
}
|
||||
|
||||
# 通知latest管理器创建软链
|
||||
# 老版本全部卸载后,latest回滚到新版本时,会用老版本的install_common_parser.sh,
|
||||
# 调用新版本的--create-package-latest-softlink,会走到这个流程。
|
||||
notify_latest_manager_create_softlink() {
|
||||
notify_latest_manager "$@" "" "package_create_softlink"
|
||||
}
|
||||
|
||||
# 通知latest管理器删除软链
|
||||
notify_latest_manager_remove_softlink() {
|
||||
notify_latest_manager "$@" "" "package_remove_softlink"
|
||||
}
|
||||
|
||||
# 通知latest管理器准备卸载
|
||||
notify_latest_manager_pre_uninstall() {
|
||||
notify_latest_manager "$@" "" "package_pre_uninstall"
|
||||
}
|
||||
|
||||
# 通知latest管理器卸载完成
|
||||
notify_latest_manager_uninstalled() {
|
||||
local is_recreate_softlink="$1"
|
||||
local recreate_softlink=""
|
||||
local ret
|
||||
shift 1
|
||||
|
||||
if [ "$is_recreate_softlink" = "y" ]; then
|
||||
recreate_softlink="--recreate-softlink"
|
||||
fi
|
||||
|
||||
notify_latest_manager "$@" "$recreate_softlink" "package_uninstalled"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 多版本安装流程
|
||||
multi_version_install() {
|
||||
local install_type="$1"
|
||||
local install_path="$2"
|
||||
local filelist_path="$3"
|
||||
local package="$4"
|
||||
local feature_param="$5"
|
||||
local version="$6"
|
||||
local version_dir="$7"
|
||||
local username="$8"
|
||||
local usergroup="$9"
|
||||
local setenv="${10}"
|
||||
local is_upgrade="${11}"
|
||||
local docker_root="${12}"
|
||||
local custom_options="${13}"
|
||||
local install_for_all="${14}"
|
||||
local ret total_ret="0" pkg_running_version version_pair_arr last_version last_version_dir
|
||||
|
||||
create_version_dir "${install_path}" "${version_dir}" "${username}" "${usergroup}" "${install_for_all}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
version_install "${install_type}" "${install_path}" "${filelist_path}" "${package}" "${feature_param}" \
|
||||
"${version_dir}" "${username}" "${usergroup}" "${setenv}" "${is_upgrade}" "${docker_root}" "${custom_options}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
check_version_install "$install_path" "$version_dir" "$package"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
return ${total_ret}
|
||||
}
|
||||
|
||||
# 删除latest下空目录
|
||||
del_empty_dirs_in_latest() {
|
||||
local install_type="$1"
|
||||
local install_path="$2"
|
||||
local latest_dir="$3"
|
||||
local filelist_path="$4"
|
||||
local feature_param="$5"
|
||||
local ret
|
||||
|
||||
create_stash_mod "${install_path}/${latest_dir}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
foreach_filelist "filter_common_dirs" "reset_mod_dirs_with_stash_mod" "${install_type}" "${install_path}/${latest_dir}" "mkdir" \
|
||||
"${filelist_path}" "${feature_param}" "no" "normal"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
foreach_filelist "filter_common_dirs" "remove_install_dirs" "${install_type}" "${install_path}/${latest_dir}" "mkdir" \
|
||||
"${filelist_path}" "${feature_param}" "reverse" "normal"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
foreach_stashmod "restore_stash_mod" "${install_path}/${latest_dir}" "reverse"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
remove_stash_mod "${install_path}/${latest_dir}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 多版本卸载流程
|
||||
multi_version_uninstall() {
|
||||
local install_type="$1"
|
||||
local install_path="$2"
|
||||
local filelist_path="$3"
|
||||
local package="$4"
|
||||
local feature_param="$5"
|
||||
local version="$6"
|
||||
local version_dir="$7"
|
||||
local username="$8"
|
||||
local usergroup="$9"
|
||||
local docker_root="${10}"
|
||||
local custom_options="${11}"
|
||||
local is_recreate_softlink="${12}"
|
||||
local tmp_root tmp_filelist_path
|
||||
local ret total_ret=0 install_path_full="" is_running="" is_upgrade
|
||||
local running_packages is_final_running="false"
|
||||
|
||||
check_param_not_empty "usergroup" "need set usergroup parameter in multi version uninstall!"
|
||||
ret="$?" && [ ${ret} -ne 0 ] && return ${ret}
|
||||
|
||||
get_tmp_root "tmp_root"
|
||||
tmp_filelist_path=$(mktemp "$tmp_root/filelist_XXXXXX" || exit 1)
|
||||
cp -f "${filelist_path}" "${tmp_filelist_path}"
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
log "ERROR" "cp -f ${filelist_path} ${tmp_filelist_path} failed!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
del_tmp_filelist="rm -f \"${tmp_filelist_path}\""
|
||||
|
||||
version_uninstall "${install_type}" "${install_path}" "${filelist_path}" "${package}" "${feature_param}" \
|
||||
"${version_dir}" "${username}" "${docker_root}" "${custom_options}"
|
||||
if [ $? -ne 0 ]; then
|
||||
eval "${del_tmp_filelist}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 删除临时文件tmp_filelist_path
|
||||
eval "${del_tmp_filelist}"
|
||||
|
||||
# 删除版本空目录
|
||||
is_dir_empty "${install_path}/${version_dir}"
|
||||
if [ $? -eq 0 ]; then
|
||||
remove_dir_icp "${install_path}/${version_dir}"
|
||||
ret="$?" && [ $ret -ne 0 ] && total_ret="1"
|
||||
fi
|
||||
|
||||
return ${total_ret}
|
||||
}
|
||||
469
csrc/scripts/package/common/sh/script_operator.inc
Normal file
469
csrc/scripts/package/common/sh/script_operator.inc
Normal file
@@ -0,0 +1,469 @@
|
||||
#!/bin/sh
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
# 公共脚本操作库
|
||||
ENV_SHELL_TYPES="bash csh fish"
|
||||
|
||||
# 检查参数。
|
||||
__check_param() {
|
||||
local name="$1"
|
||||
local value
|
||||
|
||||
value="$(eval echo \${${name}})"
|
||||
|
||||
if [ "${value}" = "" ]; then
|
||||
log "ERROR" "need set ${name} parameter!"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 设置用户家目录路径
|
||||
__set_userpath() {
|
||||
local username="$1"
|
||||
local docker_root="$2"
|
||||
|
||||
if [ -z "${docker_root}" ] || [ "${docker_root}" = "/" ]; then
|
||||
userpath="$(eval echo "~${username}")"
|
||||
else
|
||||
if [ "${username}" = "root" ]; then
|
||||
userpath="${docker_root}/root"
|
||||
else
|
||||
userpath="${docker_root}/home/${username}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 获取setenv.[shell]路径正则
|
||||
get_setenv_path_regex() {
|
||||
local _outvar="$1"
|
||||
local _package="$2"
|
||||
local _shell_type="$3"
|
||||
# setenv传入路径正则规则
|
||||
# 必须以/开头(绝对路径)
|
||||
# 必须以/${package}/bin/setenv.${shell_type}结尾
|
||||
local _path_regex="\/\(.\+\/\)\?${_package}\/bin\/setenv.${_shell_type}"
|
||||
|
||||
eval "${_outvar}=\"${_path_regex}\""
|
||||
}
|
||||
|
||||
# 创建setenv文件
|
||||
__create_setenv_file() {
|
||||
local file="$1"
|
||||
local shell_type="$2"
|
||||
local add_multi_version_param="$3"
|
||||
local install_path="$4"
|
||||
local ret
|
||||
|
||||
if [ ! -f "${file}" ]; then
|
||||
echo "#!/usr/bin/env ${shell_type}" > ${file}
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
if [ "${add_multi_version_param}" = "true" ]; then
|
||||
if [ "${shell_type}" = "bash" ]; then
|
||||
echo "export ASCEND_HOME_PATH=\"${install_path}\"" >> "${file}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
elif [ "${shell_type}" = "fish" ]; then
|
||||
echo "set -gx ASCEND_HOME_PATH \"${install_path}\"" >> "${file}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
elif [ "${shell_type}" = "csh" ]; then
|
||||
echo "setenv ASCEND_HOME_PATH \"${install_path}\"" >> "${file}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
# 是否存在ASCEND_HOME_PATH环境变量
|
||||
has_ascend_home_path_env() {
|
||||
local file="$1"
|
||||
[ ! -f "${file}" ] && return 0
|
||||
grep "\<ASCEND_HOME_PATH\>" "${file}" > /dev/null 2>&1
|
||||
}
|
||||
|
||||
# 添加ASCEND_HOME_PATH环境变量
|
||||
add_ascend_home_path_env() {
|
||||
local file="$1"
|
||||
local shell_type="$2"
|
||||
local install_path="$3"
|
||||
|
||||
if [ "${shell_type}" = "bash" ]; then
|
||||
sed -i "1aexport ASCEND_HOME_PATH=\"${install_path}\"" "${file}"
|
||||
elif [ "${shell_type}" = "fish" ]; then
|
||||
sed -i "1aset -gx ASCEND_HOME_PATH \"${install_path}\"" "${file}"
|
||||
elif [ "${shell_type}" = "csh" ]; then
|
||||
sed -i "1asetenv ASCEND_HOME_PATH \"${install_path}\"" "${file}"
|
||||
fi
|
||||
}
|
||||
|
||||
# 删除rcfile中的source <path>
|
||||
__remove_path_regex() {
|
||||
local path_regex="$1"
|
||||
local rcfile="$2"
|
||||
|
||||
if [ -f "${rcfile}" ]; then
|
||||
sed -i "/source ${path_regex}\( \"multi_version\"\)\?$/d" "${rcfile}"
|
||||
if [ $? -ne 0 ]; then
|
||||
log "ERROR" "remove ${rcfile} source command failed!"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 获取setenv.${shell_type}文件路径
|
||||
get_setenv_filepath() {
|
||||
local _outvar="$1"
|
||||
local _install_path="$2"
|
||||
local _shell_type="$3"
|
||||
|
||||
eval "${_outvar}=\"${_install_path}/bin/setenv.${_shell_type}\""
|
||||
}
|
||||
|
||||
# setenv.[shell]总脚本中添加一条语句
|
||||
add_setenv_cmd() {
|
||||
local install_path="$1"
|
||||
local setenv_filepath="$2"
|
||||
local package="$3"
|
||||
local shell_type="$4"
|
||||
local username="$5"
|
||||
local usergroup="$6"
|
||||
local add_multi_version_param="$7"
|
||||
local path_regex config_path multi_version_param ret
|
||||
|
||||
get_setenv_path_regex "path_regex" "${package}" "${shell_type}"
|
||||
|
||||
get_setenv_filepath "config_path" "$install_path" "$shell_type"
|
||||
__create_setenv_file "${config_path}" "${shell_type}" "${add_multi_version_param}" "${install_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
change_own "${config_path}" "${username}:${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
change_mod "${config_path}" "${SETENV_WRITEABLE_MOD}" ""
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__remove_path_regex "${path_regex}" "${config_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
if [ "${add_multi_version_param}" = "true" ]; then
|
||||
multi_version_param=" \"multi_version\""
|
||||
fi
|
||||
|
||||
if [ "${shell_type}" = "bash" ] || [ "${shell_type}" = "fish" ]; then
|
||||
echo "source ${setenv_filepath}${multi_version_param}" >> "${config_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
elif [ "${shell_type}" = "csh" ]; then
|
||||
echo "set argv=(\"${setenv_filepath}\"${multi_version_param}); source ${setenv_filepath}" >> "${config_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
fi
|
||||
change_mod "${config_path}" "${SETENV_MOD}" "${INSTALL_FOR_ALL}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 修改路径的own
|
||||
__chown_path() {
|
||||
local path="$1"
|
||||
local username="$2"
|
||||
local usergroup="$3"
|
||||
|
||||
if [ "${username}" != "" ] && [ "${usergroup}" != "" ]; then
|
||||
chown -h "${username}:${usergroup}" "${path}"
|
||||
if [ $? -ne 0 ]; then
|
||||
log "ERROR" "${path} chown failed!"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 创建配置所在目录
|
||||
__create_config_dir() {
|
||||
local dir="$1"
|
||||
local username="$2"
|
||||
local usergroup="$3"
|
||||
local ret
|
||||
|
||||
if [ ! -d "${dir}" ]; then
|
||||
mkdir -p "${dir}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__chown_path "${dir}" "${username}" "${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 创建配置文件
|
||||
__create_config_file() {
|
||||
local file="$1"
|
||||
local username="$2"
|
||||
local usergroup="$3"
|
||||
local ret
|
||||
|
||||
if [ ! -f "${file}" ]; then
|
||||
touch "${file}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__chown_path "${file}" "${username}" "${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 为bash添加rc配置
|
||||
add_bash_env_rc() {
|
||||
local userpath="$1"
|
||||
local username="$2"
|
||||
local usergroup="$3"
|
||||
local path_regex="$4"
|
||||
local setenv_filepath="$5"
|
||||
local config_path="${userpath}/.bashrc"
|
||||
local ret
|
||||
|
||||
__create_config_dir "${userpath}" "${username}" "${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__create_config_file "${config_path}" "${username}" "${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__remove_path_regex "${path_regex}" "${config_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
echo "source ${setenv_filepath}" >> "${config_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
}
|
||||
|
||||
# 为fish添加rc配置
|
||||
add_fish_env_rc() {
|
||||
local userpath="$1"
|
||||
local username="$2"
|
||||
local usergroup="$3"
|
||||
local path_regex="$4"
|
||||
local setenv_filepath="$5"
|
||||
local config_path="${userpath}/.config/fish/config.fish"
|
||||
local ret
|
||||
|
||||
__create_config_dir "${userpath}" "${username}" "${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__create_config_dir "${userpath}/.config" "${username}" "${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__create_config_dir "${userpath}/.config/fish" "${username}" "${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__create_config_file "${config_path}" "${username}" "${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__remove_path_regex "${path_regex}" "${config_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
echo "source ${setenv_filepath}" >> "${config_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
}
|
||||
|
||||
# 为csh添加rc配置
|
||||
add_csh_env_rc() {
|
||||
local userpath="$1"
|
||||
local username="$2"
|
||||
local usergroup="$3"
|
||||
local path_regex="$4"
|
||||
local setenv_filepath="$5"
|
||||
local config_path="${userpath}/.cshrc"
|
||||
local ret
|
||||
|
||||
__create_config_dir "${userpath}" "${username}" "${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__create_config_file "${config_path}" "${username}" "${usergroup}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__remove_path_regex "${path_regex}" "${config_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
echo "set argv=(\"${setenv_filepath}\"); source ${setenv_filepath}" >> "${config_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
}
|
||||
|
||||
# 添加source setenv.[shell]脚本到rc文件中
|
||||
add_env_rc() {
|
||||
local install_path="$1"
|
||||
local setenv_filepath="$2"
|
||||
local package="$3"
|
||||
local shell_type="$4"
|
||||
local setenv="$5"
|
||||
local username="$6"
|
||||
local usergroup="$7"
|
||||
local add_multi_version_param="$8"
|
||||
local docker_root="$9"
|
||||
local path_suffix="${package}/bin/setenv.${shell_type}"
|
||||
local path_regex
|
||||
local matched
|
||||
local userpath
|
||||
local config_path
|
||||
local ret
|
||||
|
||||
__check_param "package"
|
||||
__check_param "username"
|
||||
__check_param "usergroup"
|
||||
|
||||
echo "${shell_type}" | grep -E "^(bash|fish|csh)$" > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
log "ERROR" "shell type ${shell_type} not support!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
get_setenv_path_regex "path_regex" "${package}" "${shell_type}"
|
||||
|
||||
matched="$(echo "${setenv_filepath}" | sed -n "/^${path_regex}$/p")"
|
||||
if [ -z "${matched}" ]; then
|
||||
log "ERROR" "setenv filepath is illegal, should endswith ${path_suffix}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${setenv}" = "y" ]; then
|
||||
__set_userpath "${username}" "${docker_root}"
|
||||
case "${shell_type}" in
|
||||
bash) add_bash_env_rc "${userpath}" "${username}" "${usergroup}" "${path_regex}" "${setenv_filepath}" ;;
|
||||
fish) add_fish_env_rc "${userpath}" "${username}" "${usergroup}" "${path_regex}" "${setenv_filepath}" ;;
|
||||
csh) add_csh_env_rc "${userpath}" "${username}" "${usergroup}" "${path_regex}" "${setenv_filepath}" ;;
|
||||
esac
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
fi
|
||||
|
||||
# 如果bin目录不存在,则不处理
|
||||
[ ! -d "${install_path}/bin" ] && return 0
|
||||
|
||||
add_setenv_cmd "${install_path}" "${setenv_filepath}" "${package}" "${shell_type}" "${username}" "${usergroup}" "${add_multi_version_param}"
|
||||
}
|
||||
|
||||
# 删除setenv文件,如果已经没有setenv内容
|
||||
__remove_setenv_file_if_no_content() {
|
||||
local file="$1"
|
||||
local shell_type="$2"
|
||||
local num
|
||||
|
||||
if [ ! -f "${file}" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
num=$(grep "setenv.${shell_type}" ${file} | wc -l)
|
||||
if [ ${num} -eq 0 ]; then
|
||||
rm -f "${file}" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
log "WARNING" "Delete file:${file} failed, please delete it by yourself."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 从rc文件中删除source setenv.[shell]
|
||||
del_env_rc() {
|
||||
local install_path="$1"
|
||||
local setenv_filepath="$2"
|
||||
local shell_type="$3"
|
||||
local username="$4"
|
||||
local docker_root="$5"
|
||||
local path_regex
|
||||
local userpath
|
||||
local config_path
|
||||
local oldmod
|
||||
|
||||
__check_param "username"
|
||||
|
||||
echo "${shell_type}" | grep -E "^(bash|fish|csh)$" > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
log "ERROR" "shell type ${shell_type} not support!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
__set_userpath "${username}" "${docker_root}"
|
||||
|
||||
# 将路径中的/转换为\/
|
||||
path_to_regex "path_regex" "${setenv_filepath}"
|
||||
|
||||
if [ "${shell_type}" = "bash" ]; then
|
||||
__remove_path_regex "${path_regex}" "${userpath}/.bashrc"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
elif [ "${shell_type}" = "fish" ]; then
|
||||
__remove_path_regex "${path_regex}" "${userpath}/.config/fish/config.fish"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
elif [ "${shell_type}" = "csh" ]; then
|
||||
__remove_path_regex "${path_regex}" "${userpath}/.cshrc"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
fi
|
||||
|
||||
get_setenv_filepath "config_path" "$install_path" "$shell_type"
|
||||
|
||||
if [ ! -f "${config_path}" ]; then
|
||||
# 如果文件不存在,则不处理
|
||||
return 0
|
||||
fi
|
||||
|
||||
get_file_mod "oldmod" "${config_path}"
|
||||
change_mod "${config_path}" "${SETENV_WRITEABLE_MOD}" ""
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__remove_path_regex "${path_regex}" "${config_path}"
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
change_mod "${config_path}" "${oldmod}" ""
|
||||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||||
|
||||
__remove_setenv_file_if_no_content "${config_path}" "${shell_type}"
|
||||
}
|
||||
|
||||
# 移除路径中的docker_root
|
||||
remove_path_docker_root() {
|
||||
local _outvar="$1"
|
||||
local _path="$2"
|
||||
local _docker_root="$3"
|
||||
local _path_rpdr="$(echo "${_path}" | sed "s/^.\{${#_docker_root}\}//")"
|
||||
|
||||
eval "${_outvar}=\"${_path_rpdr}\""
|
||||
}
|
||||
|
||||
# 获取脚本路径与脚本真实路径(docker_root)
|
||||
get_shell_path_and_shell_path_real() {
|
||||
local _outvar="$1"
|
||||
local _install_path="$2"
|
||||
local _package="$3"
|
||||
local _shell_filename="$4"
|
||||
local _docker_root="$5"
|
||||
local _package_dirpath _shell_path _shell_path_real
|
||||
|
||||
get_package_dirpath "_package_dirpath" "${_package}"
|
||||
_shell_path_real="${_install_path}/${_package_dirpath}/bin/${_shell_filename}"
|
||||
|
||||
if [ "${_docker_root}" != "" ]; then
|
||||
# 移除脚本路径中的docker_root前缀
|
||||
remove_path_docker_root "_shell_path" "${_shell_path_real}" "${_docker_root}"
|
||||
else
|
||||
_shell_path="${_shell_path_real}"
|
||||
fi
|
||||
|
||||
eval "${_outvar}=\"${_shell_path} ${_shell_path_real}\""
|
||||
}
|
||||
|
||||
|
||||
# 设置环境变量
|
||||
add_setenv() {
|
||||
return 0
|
||||
}
|
||||
|
||||
# 删除环境变量
|
||||
del_setenv() {
|
||||
return 0
|
||||
}
|
||||
1075
csrc/scripts/package/common/sh/version_cfg.inc
Normal file
1075
csrc/scripts/package/common/sh/version_cfg.inc
Normal file
File diff suppressed because it is too large
Load Diff
174
csrc/scripts/package/common/sh/version_compatiable.inc
Normal file
174
csrc/scripts/package/common/sh/version_compatiable.inc
Normal file
@@ -0,0 +1,174 @@
|
||||
#!/bin/sh
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
# 获取版本号,用于版本兼容性对比
|
||||
get_package_compat_version() {
|
||||
local _outvar="$1"
|
||||
local _version_info_path="$2"
|
||||
local _result
|
||||
|
||||
if [ ! -f "${_version_info_path}" ]; then
|
||||
read -r "$_outvar" <<EOF
|
||||
EOF
|
||||
return 1
|
||||
fi
|
||||
|
||||
read -r "$_outvar" <<EOF
|
||||
$(grep "^Version=" "$_version_info_path" | cut -d= -f2- | cut -d- -f1 | cut -d. -f-3)
|
||||
EOF
|
||||
}
|
||||
|
||||
# 获取正式包名
|
||||
get_formal_package_name() {
|
||||
local _outvar="$1"
|
||||
local _package="$2"
|
||||
read -r "$_outvar" <<EOF
|
||||
$(echo "$_package" | sed 's/_/-/g')
|
||||
EOF
|
||||
}
|
||||
|
||||
# 获取非正式包名
|
||||
get_informal_package_name() {
|
||||
local _outvar="$1"
|
||||
local _package="$2"
|
||||
read -r "$_outvar" <<EOF
|
||||
$(echo "$_package" | sed 's/-/_/g')
|
||||
EOF
|
||||
}
|
||||
|
||||
# 获取需求包列表。
|
||||
_get_required_packages() {
|
||||
local _version_info_path="$1"
|
||||
|
||||
if [ ! -f "$_version_info_path" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
awk '
|
||||
function join(items, len, sep, result, i) {
|
||||
if (len >= 1) {
|
||||
result = items[1]
|
||||
for (i = 2; i <= len; i++) {
|
||||
result = sprintf("%s%s%s", result, sep, items[i])
|
||||
}
|
||||
return result
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
/^required_package_.+_version=/ {
|
||||
split($0, line_tokens, "=")
|
||||
len_require_tokens = split(line_tokens[1], require_tokens, "_")
|
||||
len_package_names = 0
|
||||
for (i = 3; i < len_require_tokens; i++) {
|
||||
len_package_names++
|
||||
package_names[len_package_names] = require_tokens[i]
|
||||
}
|
||||
package_name = join(package_names, len_package_names, "_")
|
||||
print package_name
|
||||
}
|
||||
' "${_version_info_path}"
|
||||
}
|
||||
|
||||
# 获取需求包信息。
|
||||
_get_required_package_info() {
|
||||
local _outvar="$1"
|
||||
local _version_info_path="$2"
|
||||
local _pkg_name="$3"
|
||||
local _required_pkg_name
|
||||
local _required_value
|
||||
|
||||
if [ ! -f "${_version_info_path}" ]; then
|
||||
eval "${_outvar}=\"\""
|
||||
return 1
|
||||
fi
|
||||
|
||||
_required_pkg_name="required_package_${_pkg_name}_version"
|
||||
_required_value="$(grep "^${_required_pkg_name}=" "${_version_info_path}" | cut -d= -f2-)"
|
||||
# _required_value取得的值带有双引号,eval时不可以在外侧再添加双引号
|
||||
|
||||
eval "${_outvar}=${_required_value}"
|
||||
}
|
||||
|
||||
# 检查版本与需求版本兼容性。
|
||||
# 兼容返回0,不兼容返回1
|
||||
_check_version_required() {
|
||||
local version="$1"
|
||||
local require="$2"
|
||||
local script_dir="$3"
|
||||
local src_pkg="$4"
|
||||
local dst_pkg="$5"
|
||||
local result
|
||||
|
||||
result=$(awk -f "${script_dir}/check_version_required.awk" -v version="${version}" -v all_required="${require}")
|
||||
if [ "${result}" = "T" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "Version compatibility check failed, $src_pkg required $dst_pkg version $require, but $dst_pkg version is $version!"
|
||||
return 1
|
||||
}
|
||||
|
||||
# 检查版本兼容性。
|
||||
_check_version_compatiable() {
|
||||
local package="$1"
|
||||
local install_path="$2"
|
||||
local script_dir="$3"
|
||||
local version_info_path="$script_dir/../version.info"
|
||||
local err_msgs package_formal self_version src_pkg src_pkg_formal dst_pkg dst_pkg_formal
|
||||
local installed_version_info pkg_version_info_path
|
||||
|
||||
get_formal_package_name "package_formal" "$package"
|
||||
get_package_compat_version "self_version" "$version_info_path"
|
||||
|
||||
if [ -d "$install_path/share/info" ]; then
|
||||
err_msgs="$(
|
||||
ls "$install_path/share/info" | grep -v "^${package}$" | while read src_pkg; do
|
||||
get_formal_package_name "src_pkg_formal" "$package"
|
||||
installed_version_info="$install_path/share/info/$src_pkg/version.info"
|
||||
grep "^required_package_${package_formal}_version=" "$installed_version_info" | cut -d= -f2- | tr -d '"' | while read required; do
|
||||
_check_version_required "$self_version" "$required" "$script_dir" "$src_pkg_formal" "$package_formal"
|
||||
done
|
||||
done
|
||||
)"
|
||||
if [ "$err_msgs" != "" ]; then
|
||||
while read err_msg; do
|
||||
comm_log "ERROR" "$err_msg"
|
||||
done <<EOF
|
||||
$err_msgs
|
||||
EOF
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
err_msgs="$(
|
||||
_get_required_packages "${version_info_path}" | while read dst_pkg_formal; do
|
||||
get_informal_package_name "dst_pkg" "$dst_pkg_formal"
|
||||
pkg_version_info_path="$install_path/share/info/$dst_pkg_formal/version.info"
|
||||
if [ ! -f "$pkg_version_info_path" ]; then
|
||||
pkg_version_info_path="$install_path/share/info/$dst_pkg/version.info"
|
||||
fi
|
||||
if [ -f "$pkg_version_info_path" ]; then
|
||||
get_package_compat_version "pkg_version" "$pkg_version_info_path"
|
||||
_get_required_package_info "required" "$version_info_path" "$dst_pkg_formal"
|
||||
_check_version_required "$pkg_version" "$required" "$script_dir" "$package_formal" "$dst_pkg_formal"
|
||||
fi
|
||||
done
|
||||
)"
|
||||
if [ "$err_msgs" != "" ]; then
|
||||
while read err_msg; do
|
||||
comm_log "ERROR" "$err_msg"
|
||||
done <<EOF
|
||||
$err_msgs
|
||||
EOF
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
16
csrc/scripts/package/latest_manager/scripts/filelist.csv
Normal file
16
csrc/scripts/package/latest_manager/scripts/filelist.csv
Normal file
@@ -0,0 +1,16 @@
|
||||
module,operation,relative_path_in_pkg,relative_install_path,is_in_docker,permission,owner:group,install_type,softlink,feature,is_common_path,configurable,hash,block,pkg_inner_softlink,chip
|
||||
NA,mkdir,NA,manager,TRUE,550,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/filelist.csv,manager/filelist.csv,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/install.sh,manager/install.sh,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/manager.sh,manager.sh,TRUE,550,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/manager_func.sh,manager/manager_func.sh,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/script_operator.inc,manager/script_operator.inc,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/uninstall.sh,manager/uninstall.sh,TRUE,550,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/version.info,manager/version.info,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/version_compatiable.inc,manager/version_compatiable.inc,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/check_version_required.awk,manager/check_version_required.awk,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/common_func_v2.inc,manager/common_func_v2.inc,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/common_func.inc,manager/common_func.inc,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/common_installer.inc,manager/common_installer.inc,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/install_common_parser.sh,manager/install_common_parser.sh,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
NA,copy,latest_manager/version_cfg.inc,manager/version_cfg.inc,TRUE,440,\\$username:\\$usergroup,all,NA,all,N,FALSE,NA,latest_manager,NA,all
|
||||
|
59
csrc/scripts/package/latest_manager/scripts/install.sh
Normal file
59
csrc/scripts/package/latest_manager/scripts/install.sh
Normal file
@@ -0,0 +1,59 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
CURPATH=$(dirname $(readlink -f "$0"))
|
||||
USERNAME=$(id -un)
|
||||
USERGROUP=$(id -gn)
|
||||
common_func_path="${CURPATH}/common_func.inc"
|
||||
|
||||
. "$common_func_path"
|
||||
|
||||
INSTALL_PATH=""
|
||||
IS_UPGRADE="n"
|
||||
|
||||
set_comm_log "Latest_manager" "$COMM_LOGFILE"
|
||||
|
||||
while true
|
||||
do
|
||||
case "$1" in
|
||||
--install-path=*)
|
||||
INSTALL_PATH="$(echo "$1" | cut -d"=" -f2-)"
|
||||
shift
|
||||
;;
|
||||
--upgrade)
|
||||
IS_UPGRADE="y"
|
||||
shift
|
||||
;;
|
||||
-*)
|
||||
comm_log "ERROR" "Unsupported parameters : $1"
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "$INSTALL_PATH" = "" ]; then
|
||||
comm_log "ERROR" "--install-path parameter is required!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! sh "$CURPATH/install_common_parser.sh" --package="latest_manager" --install --username="$USERNAME" --usergroup="$USERGROUP" \
|
||||
--simple-install "full" "$INSTALL_PATH" "$CURPATH/filelist.csv" "all"; then
|
||||
comm_log "ERROR" "install failed!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$IS_UPGRADE" = "y" ] && ! "$INSTALL_PATH/manager.sh" "migrate_latest_data"; then
|
||||
comm_log "ERROR" "migrate latest data failed!"
|
||||
exit 1
|
||||
fi
|
||||
128
csrc/scripts/package/latest_manager/scripts/manager.sh
Normal file
128
csrc/scripts/package/latest_manager/scripts/manager.sh
Normal file
@@ -0,0 +1,128 @@
|
||||
#!/bin/sh
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
CURPATH=$(dirname "$(readlink -f "$0")")
|
||||
VAR_PATH="$CURPATH"
|
||||
common_func_path="$CURPATH/manager/common_func.inc"
|
||||
version_compatiable_path="$CURPATH/manager/version_compatiable.inc"
|
||||
common_func_v2_path="$CURPATH/manager/common_func_v2.inc"
|
||||
version_cfg_path="$CURPATH/manager/version_cfg.inc"
|
||||
script_operator_path="$CURPATH/manager/script_operator.inc"
|
||||
manager_func_path="$CURPATH/manager/manager_func.sh"
|
||||
|
||||
. "$common_func_path"
|
||||
. "$version_compatiable_path"
|
||||
. "$common_func_v2_path"
|
||||
. "$version_cfg_path"
|
||||
. "$script_operator_path"
|
||||
. "$manager_func_path"
|
||||
|
||||
set_comm_log "Latest_manager" "$COMM_LOGFILE"
|
||||
|
||||
VERSION=""
|
||||
VERSION_DIR=""
|
||||
PACKAGE=""
|
||||
DOCKER_ROOT=""
|
||||
INTPUT_INSTALL_FOR_ALL="n"
|
||||
IS_RECREATE_SOFTLINK="n"
|
||||
INCREMENT="n"
|
||||
USE_SHARE_INFO="n"
|
||||
|
||||
while true
|
||||
do
|
||||
case "$1" in
|
||||
--version)
|
||||
VERSION="$2"
|
||||
shift 2
|
||||
;;
|
||||
--version-dir)
|
||||
VERSION_DIR="$2"
|
||||
shift 2
|
||||
;;
|
||||
--package)
|
||||
PACKAGE="$2"
|
||||
shift 2
|
||||
;;
|
||||
--package-dir)
|
||||
shift 2
|
||||
;;
|
||||
--serial)
|
||||
shift 2
|
||||
;;
|
||||
--install-type)
|
||||
shift 2
|
||||
;;
|
||||
--feature)
|
||||
shift 2
|
||||
;;
|
||||
--chip)
|
||||
shift 2
|
||||
;;
|
||||
--filelist)
|
||||
shift 2
|
||||
;;
|
||||
--docker-root)
|
||||
DOCKER_ROOT="$2"
|
||||
shift 2
|
||||
;;
|
||||
--recreate-softlink)
|
||||
IS_RECREATE_SOFTLINK="y"
|
||||
shift 1
|
||||
;;
|
||||
--install-for-all)
|
||||
INTPUT_INSTALL_FOR_ALL="y"
|
||||
shift 1
|
||||
;;
|
||||
--increment)
|
||||
INCREMENT="y"
|
||||
shift 1
|
||||
;;
|
||||
--use-share-info)
|
||||
USE_SHARE_INFO="y"
|
||||
shift 1
|
||||
;;
|
||||
-*)
|
||||
comm_log "ERROR" "Unsupported parameters : $1"
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "$PACKAGE" != "" ]; then
|
||||
get_titled_package_name "TITLED_PACKAGE" "$PACKAGE"
|
||||
set_comm_log "$TITLED_PACKAGE" "$COMM_LOGFILE"
|
||||
fi
|
||||
|
||||
OPERATION="$1"
|
||||
|
||||
if [ "$OPERATION" = "package_installed" ]; then
|
||||
package_installed "$CURPATH" "$VERSION" "$VERSION_DIR" "$PACKAGE" \
|
||||
"$INTPUT_INSTALL_FOR_ALL" "$DOCKER_ROOT"
|
||||
elif [ "$OPERATION" = "package_pre_uninstall" ]; then
|
||||
package_pre_uninstall "$CURPATH" "$VERSION" "$VERSION_DIR" "$PACKAGE" \
|
||||
"$INTPUT_INSTALL_FOR_ALL" "$DOCKER_ROOT"
|
||||
elif [ "$OPERATION" = "package_uninstalled" ]; then
|
||||
package_uninstalled "$CURPATH" "$VERSION" "$VERSION_DIR" "$PACKAGE" "$IS_RECREATE_SOFTLINK" \
|
||||
"$DOCKER_ROOT"
|
||||
elif [ "$OPERATION" = "package_create_softlink" ]; then
|
||||
package_create_softlink "$CURPATH" "$VERSION" "$VERSION_DIR" "$PACKAGE" "$DOCKER_ROOT"
|
||||
elif [ "$OPERATION" = "package_remove_softlink" ]; then
|
||||
package_remove_softlink "$CURPATH" "$VERSION" "$VERSION_DIR" "$PACKAGE" "$DOCKER_ROOT"
|
||||
elif [ "$OPERATION" = "create_version_softlink" ]; then
|
||||
create_version_softlink "$CURPATH" "$VERSION_DIR"
|
||||
elif [ "$OPERATION" = "remove_latest_softlink" ]; then
|
||||
remove_latest_softlink "$CURPATH"
|
||||
elif [ "$OPERATION" = "migrate_latest_data" ]; then
|
||||
migrate_latest_data "$CURPATH"
|
||||
fi
|
||||
1736
csrc/scripts/package/latest_manager/scripts/manager_func.sh
Normal file
1736
csrc/scripts/package/latest_manager/scripts/manager_func.sh
Normal file
File diff suppressed because it is too large
Load Diff
52
csrc/scripts/package/latest_manager/scripts/uninstall.sh
Normal file
52
csrc/scripts/package/latest_manager/scripts/uninstall.sh
Normal file
@@ -0,0 +1,52 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
CURPATH=$(dirname $(readlink -f "$0"))
|
||||
VARPATH="$(dirname "$CURPATH")"
|
||||
USERNAME=$(id -un)
|
||||
USERGROUP=$(id -gn)
|
||||
common_func_path="$CURPATH/common_func.inc"
|
||||
manager_func_path="$CURPATH/manager_func.sh"
|
||||
|
||||
. "$common_func_path"
|
||||
. "$manager_func_path"
|
||||
|
||||
set_comm_log "Latest_manager" "$COMM_LOGFILE"
|
||||
|
||||
IS_UPGRADE="n"
|
||||
|
||||
while true
|
||||
do
|
||||
case "$1" in
|
||||
--upgrade)
|
||||
IS_UPGRADE="y"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if ! sh "$CURPATH/install_common_parser.sh" --package="latest_manager" --uninstall --username="$USERNAME" --usergroup="$USERGROUP" \
|
||||
--simple-uninstall "full" "$VARPATH" "$CURPATH/filelist.csv" "all"; then
|
||||
comm_log "ERROR" "uninstall failed!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$IS_UPGRADE" = "n" ]; then
|
||||
remove_manager_refs "$VARPATH"
|
||||
fi
|
||||
|
||||
if ! remove_dir_if_empty "$VARPATH"; then
|
||||
comm_log "ERROR" "uninstall failed!"
|
||||
exit 1
|
||||
fi
|
||||
1
csrc/scripts/package/latest_manager/scripts/version.info
Normal file
1
csrc/scripts/package/latest_manager/scripts/version.info
Normal file
@@ -0,0 +1 @@
|
||||
Version=45
|
||||
14
csrc/scripts/package/module/ascend/EngineeringCommon.xml
Normal file
14
csrc/scripts/package/module/ascend/EngineeringCommon.xml
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<block name="EngineeringCommon" install_own="$username:$usergroup" install_mod="440" install_type="all">
|
||||
<dir_info value="common" install_mod="550">
|
||||
<path value="$(TARGET_ENV)"/>
|
||||
<path value="$(TARGET_ENV)/bin" install_softlink="bin"/>
|
||||
<path value="$(TARGET_ENV)/include" install_softlink="include"/>
|
||||
<path value="$(TARGET_ENV)/include/version" install_type="devel"/>
|
||||
<path value="$(TARGET_ENV)/lib64" install_softlink="lib64"/>
|
||||
<path value="$(TARGET_ENV)/devlib" install_softlink="devlib"/>
|
||||
<path value="$(TARGET_ENV)/conf" install_softlink="conf"/>
|
||||
<path value="$(TARGET_ENV)/pkg_inc" install_softlink="pkg_inc"/>
|
||||
<path value="var" install_mod="750"/>
|
||||
</dir_info>
|
||||
</block>
|
||||
6
csrc/scripts/package/module/ascend/EngineeringFiles.xml
Normal file
6
csrc/scripts/package/module/ascend/EngineeringFiles.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<block name="EngineeringFiles" install_own="$username:$usergroup" install_mod="440" install_type="all">
|
||||
<file_info value="conf" copy_type="source" src_path="build/release/config/common" dst_path="conf" install_path="$(TARGET_ENV)/conf">
|
||||
<file value="path.cfg"/>
|
||||
</file_info>
|
||||
</block>
|
||||
26
csrc/scripts/package/module/ascend/OpsTransformer.xml
Normal file
26
csrc/scripts/package/module/ascend/OpsTransformer.xml
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<block name="OpsTransformer" copy_type="delivery" src_path="" dst_path="" install_path="" install_own="$username:$usergroup" install_mod="550" install_type="run;devel">
|
||||
<dir_info install_mod="550">
|
||||
<path value="$(TARGET_ENV)/lib64"/>
|
||||
<path value="$(TARGET_ENV)/include"/>
|
||||
<path value="$(TARGET_ENV)/include/aclnn_kernels"/>
|
||||
<path value="$(TARGET_ENV)/include/aclnnop"/>
|
||||
</dir_info>
|
||||
<file_info value="opapi_transformer_lib" copy_type="delivery" src_path=""
|
||||
dst_path="built-in/op_impl/ai_core/tbe/op_api/lib/linux/$(ARCH)/"
|
||||
install_path="$(TARGET_ENV)/lib64/">
|
||||
<file value="libopapi_transformer.so" install_mod="550"/>
|
||||
</file_info>
|
||||
<file_info copy_type="delivery" src_path=""
|
||||
dst_path="built-in/op_impl/ai_core/tbe/op_api/include"
|
||||
install_path="$(TARGET_ENV)/include/" install_type="all">
|
||||
<file value="aclnnop" install_mod="550"/>
|
||||
</file_info>
|
||||
<file_info value="rtkb" copy_type="source" src_path="" dst_path="built-in/data" install_path="opp/built-in/data">
|
||||
<file value="op" entity="true" optional="true"/>
|
||||
</file_info>
|
||||
<dir_info value="rtkb_path" install_mod="750" install_type="all">
|
||||
<path value="opp/built-in/data"/>
|
||||
<path value="opp/built-in/data/op"/>
|
||||
</dir_info>
|
||||
</block>
|
||||
49
csrc/scripts/package/module/ascend/OpsTransformerInc.xml
Normal file
49
csrc/scripts/package/module/ascend/OpsTransformerInc.xml
Normal file
@@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<block name="OpsTransformerInc" copy_type="delivery" src_path="" dst_path="" install_path="" install_own="$username:$usergroup" install_mod="550"
|
||||
install_type="all" pkg_feature="opp_binary">
|
||||
<file_info copy_type="delivery" src_path=""
|
||||
dst_path="built-in/op_impl/aicpu/"
|
||||
install_path="opp/built-in/op_impl/aicpu/" install_type="all" optional="true">
|
||||
<file value="config" install_mod="755"/>
|
||||
<file value="kernel" install_mod="755"/>
|
||||
</file_info>
|
||||
<file_info copy_type="delivery" src_path=""
|
||||
dst_path="built-in/op_graph/inc"
|
||||
install_path="opp/built-in/op_graph/inc" install_type="all">
|
||||
<file value="ops_proto_transformer.h" install_mod="550"/>
|
||||
</file_info>
|
||||
<file_info value="opgraph_transformer_lib" copy_type="delivery" src_path=""
|
||||
dst_path="built-in/op_graph/lib/linux/$(ARCH)/"
|
||||
install_path="opp/built-in/op_graph/lib/linux/$(ARCH)">
|
||||
<file value="libopgraph_transformer.so" install_mod="550"/>
|
||||
</file_info>
|
||||
<file_info copy_type="delivery" src_path=""
|
||||
dst_path="built-in/op_impl/ai_core/tbe"
|
||||
install_path="opp/built-in/op_impl/ai_core/tbe" install_type="all">
|
||||
<file value="config" install_mod="550"/>
|
||||
</file_info>
|
||||
<file_info copy_type="delivery" src_path=""
|
||||
dst_path="built-in/op_impl/ai_core/tbe"
|
||||
install_path="opp/built-in/op_impl/ai_core/tbe" install_type="all">
|
||||
<file value="impl" install_mod="550"/>
|
||||
</file_info>
|
||||
<file_info copy_type="delivery" src_path=""
|
||||
dst_path="built-in/op_impl/ai_core/tbe"
|
||||
install_path="opp/built-in/op_impl/ai_core/tbe" install_type="all">
|
||||
<file value="kernel" optional="true" install_mod="550"/>
|
||||
</file_info>
|
||||
<file_info copy_type="delivery" src_path=""
|
||||
dst_path="built-in/op_impl/ai_core/tbe"
|
||||
install_path="opp/built-in/op_impl/ai_core/tbe" install_type="all">
|
||||
<file value="op_tiling_device" optional="true" install_mod="550"/>
|
||||
</file_info>
|
||||
<file_info value="ophost_transformer_lib" copy_type="delivery" src_path=""
|
||||
dst_path="built-in/op_impl/ai_core/tbe/op_host/lib/linux/$(ARCH)/"
|
||||
install_path="opp/built-in/op_impl/ai_core/tbe/op_host/lib/linux/$(ARCH)/">
|
||||
<file value="libophost_transformer.so" install_mod="550"/>
|
||||
</file_info>
|
||||
<file_info value="op_transformer_onnx_plugin_lib" copy_type="delivery" src_path=""
|
||||
dst_path="built-in/framework/onnx/" install_path="opp/built-in/framework/onnx">
|
||||
<file value="libop_transformer_onnx_plugin.so" install_mod="550"/>
|
||||
</file_info>
|
||||
</block>
|
||||
59
csrc/scripts/package/ops_transformer/ops_transformer.xml
Normal file
59
csrc/scripts/package/ops_transformer/ops_transformer.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<config name="ops_transformer" copy_type="delivery" src_path="lib/" dst_path="ops_transformer" install_type="all" install_mod="550" install_own="$username:$usergroup">
|
||||
<package_info>
|
||||
<product_name>cann</product_name>
|
||||
<chip_name>910b</chip_name>
|
||||
<func_name>ops-transformer</func_name>
|
||||
<suffix>run</suffix>
|
||||
<install_script>share/info/ops_transformer/script/install.sh</install_script>
|
||||
<help>share/info/ops_transformer/script/help.info</help>
|
||||
<cleanup>share/info/ops_transformer/script/cleanup.sh</cleanup>
|
||||
</package_info>
|
||||
<generate_info value="ops_transformer_version.h" dst_path="share/info/ops_transformer" install_path="$(TARGET_ENV)/include/version" install_mod="440" install_type="devel" generator="version_header">
|
||||
<OPS_TRANSFORMER_VERSION>$(ASCEND_VER)</OPS_TRANSFORMER_VERSION>
|
||||
<OPS_TRANSFORMER_TIMESTAMP>$(TIMESTAMP_NO)</OPS_TRANSFORMER_TIMESTAMP>
|
||||
</generate_info>
|
||||
<generate_info value="scene.info" dst_path="share/info/ops_transformer" install_path="share/info/ops_transformer" install_mod="440">
|
||||
<os>$(OS_NAME)</os>
|
||||
<os_version>$(OS_VER)</os_version>
|
||||
<arch>$(ARCH)</arch>
|
||||
</generate_info>
|
||||
<file_info value="ops_transformer_script" copy_type="source" src_path="" dst_path="share/info/ops_transformer" install_path="share/info/ops_transformer">
|
||||
<file value="script" entity="true"/>
|
||||
<file value="version.info"/>
|
||||
</file_info>
|
||||
<block_info dependtree="false" dst_path="ops_transformer" block_conf_path="ascend">
|
||||
<block name="EngineeringCommon"/>
|
||||
<block name="EngineeringFiles"/>
|
||||
<block name="OpsTransformer"/>
|
||||
<block name="OpsTransformerInc"/>
|
||||
</block_info>
|
||||
<dir_info value="ops_transformer" install_path="ops_transformer" install_type="all">
|
||||
<path value="share" install_mod="550"/>
|
||||
<path value="share/info" install_mod="750"/>
|
||||
<path value="share/info/ops_transformer" install_mod="550"/>
|
||||
<path value="share/info/ops_transformer/script" install_mod="550"/>
|
||||
</dir_info>
|
||||
<dir_info value="opp" install_path="opp" install_type="all">
|
||||
<path value="opp" install_mod="750"/>
|
||||
<path value="opp/script" install_mod="550"/>
|
||||
<path value="opp/bin" install_mod="550"/>
|
||||
<path value="opp/include" install_mod="550"/>
|
||||
<path value="opp/lib64" install_mod="550"/>
|
||||
<path value="opp/built-in" install_mod="550"/>
|
||||
<path value="opp/built-in/op_graph" install_mod="550"/>
|
||||
<path value="opp/built-in/op_graph/inc" install_mod="550"/>
|
||||
<path value="opp/built-in/op_graph/lib" install_mod="550"/>
|
||||
<path value="opp/built-in/op_graph/lib/linux" install_mod="550"/>
|
||||
<path value="opp/built-in/op_graph/lib/linux/$(ARCH)" install_mod="550"/>
|
||||
<path value="opp/built-in/op_impl" install_mod="550"/>
|
||||
<path value="opp/built-in/op_impl/ai_core" install_mod="550"/>
|
||||
<path value="opp/built-in/op_impl/ai_core/tbe" install_mod="550"/>
|
||||
<path value="opp/built-in/op_impl/ai_core/tbe/op_host" install_mod="550"/>
|
||||
<path value="opp/built-in/op_impl/ai_core/tbe/op_host/lib" install_mod="550"/>
|
||||
<path value="opp/built-in/op_impl/ai_core/tbe/op_host/lib/linux" install_mod="550"/>
|
||||
<path value="opp/built-in/op_impl/ai_core/tbe/op_host/lib/linux/$(ARCH)" install_mod="550"/>
|
||||
<path value="opp/built-in/framework" install_mod="550"/>
|
||||
<path value="opp/built-in/framework/onnx" install_mod="550"/>
|
||||
</dir_info>
|
||||
</config>
|
||||
14
csrc/scripts/package/ops_transformer/scripts/cleanup.sh
Normal file
14
csrc/scripts/package/ops_transformer/scripts/cleanup.sh
Normal file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
set -e
|
||||
|
||||
rm -rf $(pwd)
|
||||
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,36 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# error number and description
|
||||
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
_LOG_PATH=$(echo "${HOME}")"/var/log/ascend_seclog"
|
||||
_INSTALL_LOG_FILE="${_LOG_PATH}/ascend_install.log"
|
||||
else
|
||||
_LOG_PATH="/var/log/ascend_seclog"
|
||||
_INSTALL_LOG_FILE="${_LOG_PATH}/ascend_install.log"
|
||||
fi
|
||||
|
||||
# log functions
|
||||
getdate() {
|
||||
_cur_date=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
echo "${_cur_date}"
|
||||
}
|
||||
|
||||
logandprint() {
|
||||
is_error_level=$(echo $1 | grep -E 'ERROR|WARN|INFO')
|
||||
if [ "${is_quiet}" != "y" ] || [ "${is_error_level}" != "" ]; then
|
||||
echo "[OpsTransformer] [$(getdate)] ""$1"
|
||||
fi
|
||||
echo "[OpsTransformer] [$(getdate)] ""$1" >>"${_INSTALL_LOG_FILE}"
|
||||
}
|
||||
logandprint "[INFO]: Opp package installed successfully! The new version takes effect immediately."
|
||||
|
||||
exit 0
|
||||
10
csrc/scripts/package/ops_transformer/scripts/help.info
Normal file
10
csrc/scripts/package/ops_transformer/scripts/help.info
Normal file
@@ -0,0 +1,10 @@
|
||||
--full Install full mode
|
||||
--install-path=<path> Install product to specific dir path
|
||||
--install-for-all Install for all user
|
||||
--quiet Quiet install mode, skip human-computer interactions
|
||||
--uninstall Uninstall product with compatible run package which is installed before
|
||||
--install-path=<path> Uninstall specific ops_transformer dir path
|
||||
--upgrade Upgrade product immediately
|
||||
--install-path=<path> Upgrade specific ops_transformer dir path
|
||||
--install-for-all Install for all user
|
||||
--quiet Quiet install mode, skip human-computer interactions
|
||||
617
csrc/scripts/package/ops_transformer/scripts/install.sh
Normal file
617
csrc/scripts/package/ops_transformer/scripts/install.sh
Normal file
@@ -0,0 +1,617 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# error number and description
|
||||
OPERATE_FAILED="0x0001"
|
||||
PARAM_INVALID="0x0002"
|
||||
FILE_NOT_EXIST="0x0080"
|
||||
FILE_NOT_EXIST_DES="File not found."
|
||||
OPP_COMPATIBILITY_CEHCK_ERR="0x0092"
|
||||
OPP_COMPATIBILITY_CEHCK_ERR_DES="OppTransformer compatibility check error."
|
||||
PERM_DENIED="0x0093"
|
||||
PERM_DENIED_DES="Permission denied."
|
||||
|
||||
OPP_PLATFORM_DIR=ops_transformer
|
||||
OPP_PLATFORM_UPPER=$(echo "${OPP_PLATFORM_DIR}" | tr '[:lower:]' '[:upper:]')
|
||||
CURR_OPERATE_USER="$(id -nu 2>/dev/null)"
|
||||
CURR_OPERATE_GROUP="$(id -ng 2>/dev/null)"
|
||||
# defaults for general user
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
DEFAULT_INSTALL_PATH="${HOME}/Ascend"
|
||||
else
|
||||
IS_FOR_ALL="y"
|
||||
DEFAULT_INSTALL_PATH="/usr/local/Ascend"
|
||||
fi
|
||||
|
||||
# run package's files info, CURR_PATH means current temp path
|
||||
CURR_PATH=$(dirname $(readlink -f $0))
|
||||
INSTALL_SHELL_FILE="${CURR_PATH}/opp_install.sh"
|
||||
RUN_PKG_INFO_FILE="${CURR_PATH}/../scene.info"
|
||||
VERSION_INFO_FILE="${CURR_PATH}/../version.info"
|
||||
COMMON_INC_FILE="${CURR_PATH}/common_func.inc"
|
||||
VERCHECK_FILE="${CURR_PATH}/ver_check.sh"
|
||||
VERSION_COMPAT_FUNC_PATH="${CURR_PATH}/version_compatiable.inc"
|
||||
COMMON_FUNC_V2_PATH="${CURR_PATH}/common_func_v2.inc"
|
||||
VERSION_CFG_PATH="${CURR_PATH}/version_cfg.inc"
|
||||
OPP_COMMON_FILE="${CURR_PATH}/opp_common.sh"
|
||||
|
||||
. "${VERSION_COMPAT_FUNC_PATH}"
|
||||
. "${COMMON_INC_FILE}"
|
||||
. "${COMMON_FUNC_V2_PATH}"
|
||||
. "${VERSION_CFG_PATH}"
|
||||
. "${OPP_COMMON_FILE}"
|
||||
|
||||
ARCH_INFO=$(grep -e "arch" "$RUN_PKG_INFO_FILE" | cut --only-delimited -d"=" -f2-)
|
||||
# 包内路径
|
||||
GRAPH_SO_PATH="${CURR_PATH}/../../../../${OPP_PLATFORM_DIR}/built-in/op_graph/lib/linux/${ARCH_INFO}/libopgraph_transformer.so"
|
||||
HOST_SO_PATH="${CURR_PATH}/../../../../${OPP_PLATFORM_DIR}/built-in/op_impl/ai_core/tbe/op_host/lib/linux/${ARCH_INFO}/libophost_transformer.so"
|
||||
|
||||
# defaults info determined by user's inputs
|
||||
ASCEND_INSTALL_INFO="ascend_install.info"
|
||||
TARGET_INSTALL_PATH="${DEFAULT_INSTALL_PATH}" #--input-path
|
||||
TARGET_USERNAME="${CURR_OPERATE_USER}"
|
||||
TARGET_USERGROUP="${CURR_OPERATE_GROUP}"
|
||||
TARGET_VERSION_DIR="" # TARGET_INSTALL_PATH + PKG_VERSION_DIR
|
||||
TARGET_SHARED_INFO_DIR=""
|
||||
|
||||
# keys of infos in ascend_install.info
|
||||
KEY_INSTALLED_UNAME="USERNAME"
|
||||
KEY_INSTALLED_UGROUP="USERGROUP"
|
||||
KEY_INSTALLED_TYPE="${OPP_PLATFORM_UPPER}_INSTALL_TYPE"
|
||||
KEY_INSTALLED_PATH="${OPP_PLATFORM_UPPER}_INSTALL_PATH_VAL"
|
||||
KEY_INSTALLED_VERSION="${OPP_PLATFORM_UPPER}_VERSION"
|
||||
KEY_INSTALLED_FEATURE="${OPP_PLATFORM_UPPER}_INSTALL_FEATURE"
|
||||
KEY_INSTALLED_CHIP="${OPP_PLATFORM_UPPER}_INSTALL_CHIP"
|
||||
|
||||
# keys of infos in run package
|
||||
KEY_RUNPKG_VERSION="Version"
|
||||
|
||||
# init install cmd status, set default as n
|
||||
CMD_LIST="$*"
|
||||
IS_UNINSTALL=n
|
||||
IS_INSTALL=n
|
||||
IS_UPGRADE=n
|
||||
IS_QUIET=n
|
||||
IS_INPUT_PATH=n
|
||||
IS_CHECK=n
|
||||
IN_INSTALL_TYPE=""
|
||||
IN_INSTALL_PATH=""
|
||||
IS_DOCKER_INSTALL=n
|
||||
IS_SETENV=n
|
||||
DOCKER_ROOT=""
|
||||
CONFLICT_CMD_NUMS=0
|
||||
IN_FEATURE="All"
|
||||
|
||||
# log functions
|
||||
# start info before shell executing
|
||||
startlog() {
|
||||
echo "[OpsTransformer] [$(getdate)] [INFO]: Start Time: $(getdate)"
|
||||
}
|
||||
|
||||
exitlog() {
|
||||
echo "[OpsTransformer] [$(getdate)] [INFO]: End Time: $(getdate)"
|
||||
}
|
||||
|
||||
#check ascend_install.info for the change in code warning
|
||||
get_installed_info() {
|
||||
local key="$1"
|
||||
local res=""
|
||||
if [ -f "${INSTALL_INFO_FILE}" ]; then
|
||||
chmod 644 "${INSTALL_INFO_FILE}" >/dev/null 2>&1
|
||||
res=$(cat ${INSTALL_INFO_FILE} | grep "${key}" | awk -F = '{print $2}')
|
||||
fi
|
||||
echo "${res}"
|
||||
}
|
||||
|
||||
clean_before_reinstall() {
|
||||
local installed_path=$(get_installed_info "${KEY_INSTALLED_PATH}")
|
||||
local existed_files=$(find ${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR} -type f -print 2>/dev/null)
|
||||
if [ -z "${existed_files}" ]; then
|
||||
logandprint "[INFO]: Directory is empty, directly install opp module."
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "${IS_QUIET}" = "y" ]; then
|
||||
logandprint "[WARNING]: Directory has file existed or installed opp\
|
||||
module, are you sure to keep installing opp module in it? y"
|
||||
else
|
||||
if [ ! -f "${INSTALL_INFO_FILE}" ]; then
|
||||
logandprint "[INFO]: Directory has file existed, do you want to continue? [y/n]"
|
||||
else
|
||||
logandprint "[INFO]: Opp package has been installed on the path $(get_installed_info "${KEY_INSTALLED_PATH}"),\
|
||||
the version is $(get_installed_info "${KEY_INSTALLED_VERSION}"),\
|
||||
and the version of this package is ${RUN_PKG_VERSION}, do you want to continue? [y/n]"
|
||||
fi
|
||||
while true; do
|
||||
read yn
|
||||
if [ "$yn" = "n" ]; then
|
||||
logandprint "[INFO]: Exit to install opp module."
|
||||
exitlog
|
||||
exit 0
|
||||
elif [ "$yn" = "y" ]; then
|
||||
break
|
||||
else
|
||||
echo "[WARNING]: Input error, please input y or n to choose!"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ "${installed_path}" = "${TARGET_VERSION_DIR}" ]; then
|
||||
logandprint "[INFO]: Clean the installed opp module before install."
|
||||
if [ ! -f "${UNINSTALL_SHELL_FILE}" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST};ERR_DES:${FILE_NOT_EXIST_DES}.The file\
|
||||
(${UNINSTALL_SHELL_FILE}) not exists. Please set the correct install \
|
||||
path or clean the previous version opp install info (${INSTALL_INFO_FILE}) and then reinstall it."
|
||||
return 1
|
||||
fi
|
||||
bash "${UNINSTALL_SHELL_FILE}" "${TARGET_VERSION_DIR}" "upgrade" "${IS_QUIET}" ${IN_FEATURE} "${IS_DOCKER_INSTALL}" "${DOCKER_ROOT}" "$pkg_version_dir"
|
||||
if [ "$?" != 0 ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${INSTALL_FAILED};ERR_DES:Clean the installed directory failed."
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
select_last_dir_component() {
|
||||
path="$1"
|
||||
last_component=$(basename ${path})
|
||||
if [ "${last_component}" = "atc" ]; then
|
||||
last_component="atc"
|
||||
return
|
||||
elif [ "${last_component}" = "fwkacllib" ]; then
|
||||
last_component="fwkacllib"
|
||||
return
|
||||
elif [ "${last_component}" = "compiler" ]; then
|
||||
last_component="compiler"
|
||||
return
|
||||
fi
|
||||
}
|
||||
|
||||
# check_version_file() {
|
||||
# pkg_path="$1"
|
||||
# component_ret="$2"
|
||||
# run_pkg_path_temp=$(dirname "${pkg_path}")
|
||||
# run_pkg_path_temp2=${run_pkg_path_temp%/*}
|
||||
# run_pkg_path="${run_pkg_path_temp}""/${component_ret}"
|
||||
# run_pkg_path_temp2=${run_pkg_path%/*}
|
||||
# version_file="${run_pkg_path}""/version.info"
|
||||
# version_file_tmp="${run_pkg_path_temp2}""/version.info"
|
||||
# if [ -f "${version_file_tmp}" ]; then
|
||||
# version_file=${version_file_tmp}
|
||||
# fi
|
||||
# if [ -f "${version_file}" ]; then
|
||||
# echo "${version_file}" 2 >>/dev/null
|
||||
# else
|
||||
# logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST}; The [${component_ret}] version.info in path [${pkg_path}] not exists."
|
||||
# exitlog
|
||||
# exit 1
|
||||
# fi
|
||||
# return
|
||||
# }
|
||||
|
||||
check_opp_version_file() {
|
||||
if [ -f "${CURR_PATH}/../../version.info" ]; then
|
||||
opp_ver_info="${CURR_PATH}/../../version.info"
|
||||
elif [ -f "${DEFAULT_INSTALL_PATH}/${OPP_PLATFORM_DIR}/share/info/version.info" ]; then
|
||||
opp_ver_info="${DEFAULT_INSTALL_PATH}/${OPP_PLATFORM_DIR}/share/info/version.info"
|
||||
else
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST}; The [${OPP_PLATFORM_DIR}] version.info not exists."
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
echo "find opp_ver_info: ${opp_ver_info}"
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
check_docker_path() {
|
||||
docker_path="$1"
|
||||
if [[ "${docker_path}" != /* ]]; then
|
||||
echo "[OpsTransformer] [ERROR]: ERR_NO:${PARAM_INVALID};ERR_DES:Parameter --docker-root\
|
||||
must with absolute path that which is start with root directory /. Such as --docker-root=/${docker_path}"
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -d "${docker_path}" ]; then
|
||||
echo "[OpsTransformer] [ERROR]: ERR_NO:${FILE_NOT_EXIST}; The directory:${docker_path} not exist, please create this directory."
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
judgment_path() {
|
||||
. "${COMMON_INC_FILE}"
|
||||
check_install_path_valid "${1}"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "[OpsTransformer][ERROR]: The opp install path ${1} is invalid, only characters in [a-z,A-Z,0-9,-,_] are supported!"
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_install_path() {
|
||||
TARGET_INSTALL_PATH="$1"
|
||||
# empty patch check
|
||||
if [ "x${TARGET_INSTALL_PATH}" = "x" ]; then
|
||||
echo "[OpsTransformer] [ERROR]: ERR_NO:${PARAM_INVALID};ERR_DES:Parameter --install-path\
|
||||
not support that the install path is empty."
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
# space check
|
||||
if echo "x${TARGET_INSTALL_PATH}" | grep -q " "; then
|
||||
echo "[OpsTransformer] [ERROR]: ERR_NO:${PARAM_INVALID};ERR_DES:Parameter --install-path\
|
||||
not support that the install path contains space character."
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
# delete last "/"
|
||||
local temp_path="${TARGET_INSTALL_PATH}"
|
||||
temp_path=$(echo "${temp_path%/}")
|
||||
if [ x"${temp_path}" = "x" ]; then
|
||||
temp_path="/"
|
||||
fi
|
||||
# convert relative path to absolute path
|
||||
local prefix=$(echo "${temp_path}" | cut -d"/" -f1 | cut -d"~" -f1)
|
||||
if [ "x${prefix}" = "x" ]; then
|
||||
TARGET_INSTALL_PATH="${temp_path}"
|
||||
else
|
||||
prefix=$(echo "${RUN_PATH}" | cut -d"/" -f1 | cut -d"~" -f1)
|
||||
if [ x"${prefix}" = "x" ]; then
|
||||
TARGET_INSTALL_PATH="${RUN_PATH}/${temp_path}"
|
||||
else
|
||||
echo "[OpsTransformer] [ERROR]: ERR_NO:${PARAM_INVALID};ERR_DES: Run package path is invalid: $RUN_PATH"
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
# convert '~' to home path
|
||||
local home=$(echo "${TARGET_INSTALL_PATH}" | cut -d"~" -f1)
|
||||
if [ "x${home}" = "x" ]; then
|
||||
local temp_path_value=$(echo "${TARGET_INSTALL_PATH}" | cut -d"~" -f2)
|
||||
if [ "$(id -u)" -eq 0 ]; then
|
||||
TARGET_INSTALL_PATH="/root$temp_path_value"
|
||||
else
|
||||
local home_path=$(eval echo "${USER}")
|
||||
home_path=$(echo "${home_path}%/")
|
||||
TARGET_INSTALL_PATH="$home_path$temp_path_value"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
#get the dir of xxx.run
|
||||
#opp_install_path_curr=`echo "$2" | cut -d"/" -f2- `
|
||||
# cut first two params from *.run
|
||||
get_run_path() {
|
||||
RUN_PATH=$(echo "$2" | cut -d"-" -f3-)
|
||||
if [ x"${RUN_PATH}" = x"" ]; then
|
||||
RUN_PATH=$(pwd)
|
||||
else
|
||||
# delete last "/"
|
||||
RUN_PATH=$(echo "${RUN_PATH%/}")
|
||||
if [ "x${RUN_PATH}" = "x" ]; then
|
||||
# root path
|
||||
RUN_PATH=$(pwd)
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
get_opts() {
|
||||
i=0
|
||||
while true
|
||||
do
|
||||
if [ "x$1" = "x" ]; then
|
||||
break
|
||||
fi
|
||||
if [ "$(expr substr "$1" 1 2)" = "--" ]; then
|
||||
i=$(expr $i + 1)
|
||||
fi
|
||||
if [ $i -gt 2 ]; then
|
||||
break
|
||||
fi
|
||||
shift 1
|
||||
done
|
||||
|
||||
if [ "$*" = "" ]; then
|
||||
echo "[ERROR]: ERR_NO:${PARAM_INVALID}; ERR_DES:Unrecognized parameters.Try './xxx.run --help for more information.'"
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while true; do
|
||||
# skip 2 parameters avoid run pkg and directory as input parameter
|
||||
case "$1" in
|
||||
--full)
|
||||
IN_INSTALL_TYPE=$(echo ${1} | awk -F"--" '{print $2}')
|
||||
IS_INSTALL="y"
|
||||
CONFLICT_CMD_NUMS=$(expr $CONFLICT_CMD_NUMS + 1)
|
||||
shift
|
||||
;;
|
||||
--upgrade)
|
||||
IS_UPGRADE="y"
|
||||
CONFLICT_CMD_NUMS=$(expr $CONFLICT_CMD_NUMS + 1)
|
||||
shift
|
||||
;;
|
||||
--uninstall)
|
||||
IS_UNINSTALL="y"
|
||||
CONFLICT_CMD_NUMS=$(expr $CONFLICT_CMD_NUMS + 1)
|
||||
shift
|
||||
;;
|
||||
--install-path=*)
|
||||
IS_INPUT_PATH="y"
|
||||
IN_INSTALL_PATH=$(echo ${1} | cut -d"=" -f2-)
|
||||
# check path
|
||||
judgment_path "${IN_INSTALL_PATH}"
|
||||
check_install_path "${IN_INSTALL_PATH}"
|
||||
shift
|
||||
;;
|
||||
--quiet)
|
||||
IS_QUIET="y"
|
||||
shift
|
||||
;;
|
||||
--install-for-all)
|
||||
IS_FOR_ALL="y"
|
||||
shift
|
||||
;;
|
||||
-*)
|
||||
echo "[OpsTransformer] [ERROR]: ERR_NO:${PARAM_INVALID};ERR_DES:Unsupported parameters [$1],\
|
||||
operation execute failed. Please use [--help] to see the usage."
|
||||
exitlog
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# pre-check
|
||||
check_opts() {
|
||||
if [ "${CONFLICT_CMD_NUMS}" != 1 ]; then
|
||||
echo "[OpsTransformer] [ERROR]: ERR_NO:${PARAM_INVALID};ERR_DES:\
|
||||
only support one type: full/run/devel/upgrade/uninstall/check, operation execute failed!\
|
||||
Please use [--help] to see the usage."
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# init target_dir and log for install
|
||||
init_env() {
|
||||
# create log folder and log file
|
||||
comm_init_log
|
||||
|
||||
if is_version_dirpath "$TARGET_INSTALL_PATH"; then
|
||||
pkg_version_dir="$(basename "$TARGET_INSTALL_PATH")"
|
||||
TARGET_INSTALL_PATH="$(dirname "$TARGET_INSTALL_PATH")"
|
||||
else
|
||||
pkg_version_dir="cann"
|
||||
fi
|
||||
TARGET_VERSION_DIR="$TARGET_INSTALL_PATH/$pkg_version_dir" # Splicing docker-root and install-path
|
||||
if [ "${IS_DOCKER_INSTALL}" = "y" ]; then
|
||||
# delete last "/"
|
||||
local temp_path_param="${DOCKER_ROOT}"
|
||||
local temp_path_val=$(echo "${temp_path_param%/}")
|
||||
if [ "x${temp_path_val}" = "x" ]; then
|
||||
temp_path_val="/"
|
||||
fi
|
||||
TARGET_VERSION_DIR=${temp_path_val}${TARGET_VERSION_DIR}
|
||||
fi
|
||||
|
||||
TARGET_SHARED_INFO_DIR=${TARGET_VERSION_DIR}/share/info
|
||||
UNINSTALL_SHELL_FILE="${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/script/opp_uninstall.sh"
|
||||
INSTALL_INFO_FILE="${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/${ASCEND_INSTALL_INFO}"
|
||||
|
||||
logandprint "[INFO]: Execute the opp run package."
|
||||
logandprint "[INFO]: OperationLogFile path: ${COMM_LOGFILE}."
|
||||
logandprint "[INFO]: Input params: $CMD_LIST"
|
||||
|
||||
get_package_version "RUN_PKG_VERSION" "$VERSION_INFO_FILE"
|
||||
local installed_version=$(get_installed_info "${KEY_INSTALLED_VERSION}")
|
||||
if [ "${installed_version}" = "" ]; then
|
||||
logandprint "[INFO]: Version of installing opp module is ${RUN_PKG_VERSION}."
|
||||
else
|
||||
if [ "${RUN_PKG_VERSION}" != "" ]; then
|
||||
logandprint "[INFO]: Existed opp module version is ${installed_version},\
|
||||
the new opp module version is ${RUN_PKG_VERSION}."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
check_pre_install() {
|
||||
local installed_user=$(get_installed_info "${KEY_INSTALLED_UNAME}")
|
||||
local installed_group=$(get_installed_info "${KEY_INSTALLED_UGROUP}")
|
||||
if [ "${installed_user}" != "" ] || [ "${installed_group}" != "" ]; then
|
||||
if [ "${installed_user}" != "${TARGET_USERNAME}" ] || [ "${installed_group}" != "${TARGET_USERGROUP}" ]; then
|
||||
logandprint "[ERROR]: The user and group are not same with last installation,\
|
||||
do not support overwriting installation!"
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "${IS_UPGRADE}" = "y" ]; then
|
||||
if [ ! -e "${INSTALL_INFO_FILE}" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST}; The directory:${TARGET_INSTALL_PATH} not install OpsTransformer, upgrade failed."
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
IN_INSTALL_TYPE=$(get_installed_info "${KEY_INSTALLED_TYPE}")
|
||||
fi
|
||||
}
|
||||
|
||||
#Support the installation script when the specified path (relative path and absolute path) does not exist
|
||||
mkdir_install_path() {
|
||||
local base_dir=$(dirname ${TARGET_INSTALL_PATH})
|
||||
if [ ! -d ${base_dir} ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST}; The directory:${base_dir} not exist, please create this directory."
|
||||
exitlog
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -d "${TARGET_INSTALL_PATH}" ]; then
|
||||
test -w ${TARGET_INSTALL_PATH} >>/dev/null 2>&1
|
||||
if [ "$?" -ne 0 ]; then
|
||||
#All paths exist with write permission
|
||||
logandprint "[ERROR]: ERR_NO:${PERM_DENIED};ERR_DES:${PERM_DENIED_DES}. The ${TARGET_USERNAME} do\
|
||||
access ${TARGET_INSTALL_PATH} failed, please reset the directory to a right permission."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
test -w ${base_dir} >>/dev/null 2>&1
|
||||
if [ "$?" -ne 0 ]; then
|
||||
#All paths exist with write permission
|
||||
logandprint "[ERROR]: ERR_NO:${PERM_DENIED};ERR_DES:${PERM_DENIED_DES}. The ${TARGET_USERNAME} do\
|
||||
access ${base_dir} failed, please reset the directory to a right permission."
|
||||
exit 1
|
||||
else
|
||||
comm_create_dir "${TARGET_INSTALL_PATH}" "750" "${TARGET_USERNAME}:${TARGET_USERGROUP}" "${IS_FOR_ALL}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
install_package() {
|
||||
if [ "${IS_INSTALL}" = "n" ] && [ "${IS_UPGRADE}" = "n" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
local architecture=$(uname -m)
|
||||
local graph_so_dir_path="${TARGET_VERSION_DIR}/opp/built-in/op_graph/lib/linux/${ARCH_INFO}"
|
||||
local host_so_dir_path="${TARGET_VERSION_DIR}/opp/built-in/op_impl/ai_core/tbe/op_host/lib/linux/${ARCH_INFO}"
|
||||
# check platform
|
||||
if [ "${architecture}" != "${ARCH_INFO}" ] ; then
|
||||
logandprint "[INFO]: the architecture of the run package is inconsistent with that of the current environment. "
|
||||
# 异构安装场景,拷贝so到指定目录
|
||||
if [ -d "${TARGET_VERSION_DIR}/opp/built-in/op_graph/lib/linux" ] ; then
|
||||
chmod u+w ${TARGET_VERSION_DIR}/opp/built-in/op_graph/lib/linux
|
||||
fi
|
||||
if [ -d "${TARGET_VERSION_DIR}/opp/built-in/op_impl/ai_core/tbe/op_host/lib/linux" ] ; then
|
||||
chmod u+w ${TARGET_VERSION_DIR}/opp/built-in/op_impl/ai_core/tbe/op_host/lib/linux
|
||||
fi
|
||||
mkdir -p ${graph_so_dir_path}
|
||||
mkdir -p ${host_so_dir_path}
|
||||
cp ${GRAPH_SO_PATH} ${graph_so_dir_path}
|
||||
cp ${HOST_SO_PATH} ${host_so_dir_path}
|
||||
chmod 755 ${graph_so_dir_path}/*
|
||||
chmod 755 ${host_so_dir_path}/*
|
||||
|
||||
chmod u-w ${TARGET_VERSION_DIR}/opp/built-in/op_graph/lib/linux
|
||||
chmod u-w ${TARGET_VERSION_DIR}/opp/built-in/op_impl/ai_core/tbe/op_host/lib/linux
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# use uninstall to clean the install folder
|
||||
clean_before_reinstall
|
||||
if [ "$?" != 0 ]; then
|
||||
comm_log_operation "Install" "${IN_INSTALL_TYPE}" "OpsTransformer" "$?" "${CMD_LIST}"
|
||||
fi
|
||||
|
||||
bash "${INSTALL_SHELL_FILE}" "${TARGET_INSTALL_PATH}" "${TARGET_USERNAME}" "${TARGET_USERGROUP}" "${IN_FEATURE}" \
|
||||
"${IN_INSTALL_TYPE}" "${IS_FOR_ALL}" "${IS_SETENV}" "${IS_DOCKER_INSTALL}" "${DOCKER_ROOT}" "$pkg_version_dir"
|
||||
if [ "$?" != 0 ]; then
|
||||
comm_log_operation "Install" "${IN_INSTALL_TYPE}" "OpsTransformer" "$?" "${CMD_LIST}"
|
||||
fi
|
||||
if [ $(id -u) -eq 0 ]; then
|
||||
chown -R "root":"root" "${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/script" 2>/dev/null
|
||||
chown "root":"root" "${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}" 2>/dev/null
|
||||
chmod -R 555 "${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/script" 2>/dev/null
|
||||
chmod 444 "${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/script/filelist.csv" 2>/dev/null
|
||||
else
|
||||
chmod -R 550 "${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/script" 2>/dev/null
|
||||
chmod 440 "${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/script/filelist.csv" 2>/dev/null
|
||||
fi
|
||||
comm_log_operation "Install" "${IN_INSTALL_TYPE}" "OpsTransformer" "$?" "${CMD_LIST}"
|
||||
}
|
||||
|
||||
uninstall_package() {
|
||||
if [ "${IS_UNINSTALL}" = "n" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
if [ ! -f "${UNINSTALL_SHELL_FILE}" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST};ERR_DES:The file\
|
||||
(${UNINSTALL_SHELL_FILE}) not exists. Please make sure that the opp module\
|
||||
installed in (${TARGET_VERSION_DIR}) and then set the correct install path."
|
||||
uninstall_path=$(ls "${TARGET_INSTALL_PATH}" 2>/dev/null)
|
||||
if [ "${uninstall_path}" = "" ]; then
|
||||
rm -rf "${TARGET_INSTALL_PATH}"
|
||||
fi
|
||||
comm_log_operation "Uninstall" "${IN_INSTALL_TYPE}" "OpsTransformer" "$?" "${CMD_LIST}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 如果是异构卸载
|
||||
local architecture=$(uname -m)
|
||||
if [ "${architecture}" != ${ARCH_INFO} ]; then
|
||||
target_arch=${ARCH_INFO}
|
||||
else
|
||||
# 判断异构so是否存在,存在则删除
|
||||
if [ "${architecture}" = "x86_64" ]; then
|
||||
target_arch="aarch64"
|
||||
else
|
||||
target_arch="x86_64"
|
||||
fi
|
||||
fi
|
||||
local graph_so_path="${TARGET_VERSION_DIR}/opp/built-in/op_graph/lib/linux/${target_arch}/libopgraph_transformer.so"
|
||||
local graph_so_dir_path="${TARGET_VERSION_DIR}/opp/built-in/op_graph/lib/linux/${target_arch}"
|
||||
local host_so_path="${TARGET_VERSION_DIR}/opp/built-in/op_impl/ai_core/tbe/op_host/lib/linux/${target_arch}/libophost_transformer.so"
|
||||
local host_so_dir_path="${TARGET_VERSION_DIR}/opp/built-in/op_impl/ai_core/tbe/op_host/lib/linux/${target_arch}"
|
||||
if [ -f "${graph_so_path}" ]; then
|
||||
rm -f "${graph_so_path}"
|
||||
fi
|
||||
if [ -f "${host_so_path}" ]; then
|
||||
rm -f "${host_so_path}"
|
||||
fi
|
||||
# 判断目录是否存在且是否为空
|
||||
if [ -d "${graph_so_dir_path}" ]; then
|
||||
if [ -z "$(ls -A "${graph_so_dir_path}")" ]; then
|
||||
rm -rf "${graph_so_dir_path}"
|
||||
fi
|
||||
fi
|
||||
if [ -d "${host_so_dir_path}" ]; then
|
||||
if [ -z "$(ls -A "${host_so_dir_path}")" ]; then
|
||||
rm -rf "${host_so_dir_path}"
|
||||
fi
|
||||
fi
|
||||
if [ "${architecture}" != ${ARCH_INFO} ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
bash "${UNINSTALL_SHELL_FILE}" "${TARGET_INSTALL_PATH}" "uninstall" "${IS_QUIET}" ${IN_FEATURE} "${IS_DOCKER_INSTALL}" "${DOCKER_ROOT}" "$pkg_version_dir"
|
||||
logandprint "[INFO]: Remove precheck info."
|
||||
|
||||
comm_log_operation "Uninstall" "${IN_INSTALL_TYPE}" "OpsTransformer" "$?" "${CMD_LIST}"
|
||||
}
|
||||
|
||||
main() {
|
||||
get_run_path "$@"
|
||||
|
||||
startlog
|
||||
|
||||
get_opts "$@"
|
||||
|
||||
check_opts
|
||||
|
||||
init_env
|
||||
|
||||
check_pre_install
|
||||
|
||||
mkdir_install_path
|
||||
|
||||
install_package
|
||||
|
||||
uninstall_package
|
||||
|
||||
}
|
||||
|
||||
main "$@"
|
||||
exit 0
|
||||
271
csrc/scripts/package/ops_transformer/scripts/opp_common.sh
Normal file
271
csrc/scripts/package/ops_transformer/scripts/opp_common.sh
Normal file
@@ -0,0 +1,271 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
_LOG_PATH=$(echo "${HOME}")"/var/log/ascend_seclog"
|
||||
_INSTALL_LOG_FILE="${_LOG_PATH}/ascend_install.log"
|
||||
else
|
||||
_LOG_PATH="/var/log/ascend_seclog"
|
||||
_INSTALL_LOG_FILE="${_LOG_PATH}/ascend_install.log"
|
||||
fi
|
||||
|
||||
# log functions
|
||||
getdate() {
|
||||
_cur_date=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
echo "${_cur_date}"
|
||||
}
|
||||
|
||||
logandprint() {
|
||||
is_error_level=$(echo $1 | grep -E 'ERROR|WARN|INFO')
|
||||
if [ "${is_quiet}" != "y" ] || [ "${is_error_level}" != "" ]; then
|
||||
echo "[OpsTransformer] [$(getdate)] ""$1"
|
||||
fi
|
||||
echo "[OpsTransformer] [$(getdate)] ""$1" >>"${_INSTALL_LOG_FILE}"
|
||||
}
|
||||
|
||||
# create opapi soft link
|
||||
createrelativelysoftlink() {
|
||||
local src_path_="$1"
|
||||
local dst_path_="$2"
|
||||
local dst_parent_path_=$(dirname ${dst_path_})
|
||||
# echo "dst_parent_path_: ${dst_parent_path_}"
|
||||
local relative_path_=$(realpath --relative-to="$dst_parent_path_" "$src_path_")
|
||||
# echo "relative_path_: ${relative_path_}"
|
||||
if [ -L "$2" ]; then
|
||||
return 0
|
||||
fi
|
||||
ln -s "${relative_path_}" "${dst_path_}" 2>/dev/null
|
||||
if [ "$?" != "0" ]; then
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
createOpapiLatestSoftlink() {
|
||||
targetPkg=$2
|
||||
if [ "${targetPkg}x" = "x" ]; then
|
||||
#CHANGED
|
||||
targetPkg=ops_transformer
|
||||
fi
|
||||
|
||||
osName=""
|
||||
if [ -f "$1/$targetPkg/scene.info" ]; then
|
||||
. $1/$targetPkg/scene.info
|
||||
osName=${os}
|
||||
fi
|
||||
opapi_lib_path="$1/opp/built-in/op_impl/ai_core/tbe/op_api/lib/${osName}/${architecture}"
|
||||
opapi_include_level1_path="$1/opp/built-in/op_impl/ai_core/tbe/op_api/include/aclnnop"
|
||||
opapi_include_level2_path="${opapi_include_level1_path}/level2"
|
||||
if [ ! -d ${opapi_lib_path} ] || [ ! -d ${opapi_include_level1_path} ] || [ ! -d ${opapi_include_level2_path} ]; then
|
||||
return 3
|
||||
fi
|
||||
if [ -d $(dirname $1)/latest/${architectureDir}/lib64 ]; then
|
||||
for file_so in $(ls -1 $1/${architectureDir}/lib64 | grep -E "libaclnn_|libopapi.so"); do
|
||||
latest_arch_lib64_src_path="$1/${architectureDir}/lib64/${file_so}"
|
||||
latest_arch_lib64_dst_path="$(dirname $1)/latest/${architectureDir}/lib64/${file_so}"
|
||||
if [ -f $latest_arch_lib64_dst_path ] || [ -L $latest_arch_lib64_dst_path ]; then
|
||||
rm -fr "$latest_arch_lib64_dst_path"
|
||||
fi
|
||||
createrelativelysoftlink ${latest_arch_lib64_src_path} ${latest_arch_lib64_dst_path}
|
||||
done
|
||||
fi
|
||||
|
||||
# second the headfiles with 1 and 2 level
|
||||
if [ -d $1/${architectureDir}/include/aclnnop ]; then
|
||||
for file_level1 in $(ls -1 -F ${opapi_include_level1_path} | grep -v [/$] | sed 's/\*$//'); do
|
||||
latest_arch_include_src_path="${opapi_include_level1_path}/${file_level1}"
|
||||
latest_arch_include_dst_path="$(dirname $1)/latest/${architectureDir}/include/aclnnop/${file_level1}"
|
||||
if [ -f $latest_arch_include_dst_path ] || [ -L $latest_arch_include_dst_path ]; then
|
||||
rm -fr "$latest_arch_include_dst_path"
|
||||
fi
|
||||
createrelativelysoftlink ${latest_arch_include_src_path} ${latest_arch_include_dst_path}
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -d $1/${architectureDir}/include/aclnnop/level2 ]; then
|
||||
for file_level2 in $(ls -1 -F ${opapi_include_level2_path} | grep -v [/$] | sed 's/\*$//'); do
|
||||
latest_arch_include_src_path="${opapi_include_level2_path}/${file_level2}"
|
||||
latest_arch_include_dst_path="$(dirname $1)/latest/${architectureDir}/include/aclnnop/level2/${file_level2}"
|
||||
if [ -f $latest_arch_include_dst_path ] || [ -L $latest_arch_include_dst_path ]; then
|
||||
rm -fr "$latest_arch_include_dst_path"
|
||||
fi
|
||||
createrelativelysoftlink ${latest_arch_include_src_path} ${latest_arch_include_dst_path}
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
createOpapiSoftlink() {
|
||||
osName=""
|
||||
if [ -f "$1/opp/scene.info" ]; then
|
||||
. $1/opp/scene.info
|
||||
osName=${os}
|
||||
fi
|
||||
opapi_lib_path="$1/opp/built-in/op_impl/ai_core/tbe/op_api/lib/${osName}/${architecture}"
|
||||
opapi_include_level1_path="$1/opp/built-in/op_impl/ai_core/tbe/op_api/include/aclnnop"
|
||||
opapi_include_level2_path="${opapi_include_level1_path}/level2"
|
||||
|
||||
if [ ! -d ${opapi_lib_path} ] || [ ! -d ${opapi_include_level1_path} ] || [ ! -d ${opapi_include_level2_path} ]; then
|
||||
return 3
|
||||
fi
|
||||
# first the libopapi.so
|
||||
if [ -d $1/${architectureDir}/lib64 ]; then
|
||||
for file_so in $(ls -1 ${opapi_lib_path} | grep "so"$); do
|
||||
arch_lib64_src_path="${opapi_lib_path}/${file_so}"
|
||||
arch_lib64_dst_path="$1/${architectureDir}/lib64/${file_so}"
|
||||
if [ -f $arch_lib64_dst_path ] || [ -L $arch_lib64_dst_path ]; then
|
||||
rm -fr "$arch_lib64_dst_path"
|
||||
fi
|
||||
createrelativelysoftlink ${arch_lib64_src_path} ${arch_lib64_dst_path}
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -d $1/opp/lib64 ]; then
|
||||
for file_so in $(ls -1 $1/${architectureDir}/lib64 | grep -E "libaclnn_|libopapi.so"); do
|
||||
opp_lib64_src_path="$1/${architectureDir}/lib64/${file_so}"
|
||||
opp_lib64_dst_path="$1/opp/lib64/${file_so}"
|
||||
if [ -f $opp_lib64_dst_path ] || [ -L $opp_lib64_dst_path ]; then
|
||||
rm -fr "$opp_lib64_dst_path"
|
||||
fi
|
||||
createrelativelysoftlink ${opp_lib64_src_path} ${opp_lib64_dst_path}
|
||||
done
|
||||
fi
|
||||
|
||||
# second the headfiles with 1 and 2 level
|
||||
if [ -d $1/${architectureDir}/include/aclnnop ]; then
|
||||
for file_level1 in $(ls -1 -F ${opapi_include_level1_path} | grep -v [/$] | sed 's/\*$//'); do
|
||||
arch_include_src_path="${opapi_include_level1_path}/${file_level1}"
|
||||
arch_include_dst_path="$1/${architectureDir}/include/aclnnop/${file_level1}"
|
||||
if [ -f $arch_include_dst_path ] || [ -L $arch_include_dst_path ]; then
|
||||
rm -fr "$arch_include_dst_path"
|
||||
fi
|
||||
createrelativelysoftlink ${arch_include_src_path} ${arch_include_dst_path}
|
||||
|
||||
opp_include_src_path="${arch_include_dst_path}"
|
||||
opp_include_dst_path="$1/opp/include/aclnnop/${file_level1}"
|
||||
if [ -f $opp_include_dst_path ] || [ -L $opp_include_dst_path ]; then
|
||||
rm -fr "$opp_include_dst_path"
|
||||
fi
|
||||
createrelativelysoftlink ${opp_include_src_path} ${opp_include_dst_path}
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -d $1/${architectureDir}/include/aclnnop/level2 ]; then
|
||||
for file_level2 in $(ls -1 -F ${opapi_include_level2_path} | grep -v [/$] | sed 's/\*$//'); do
|
||||
arch_include_src_path="${opapi_include_level2_path}/${file_level2}"
|
||||
arch_include_dst_path="$1/${architectureDir}/include/aclnnop/level2/${file_level2}"
|
||||
if [ -f $arch_include_dst_path ] || [ -L $arch_include_dst_path ]; then
|
||||
rm -fr "$arch_include_dst_path"
|
||||
fi
|
||||
createrelativelysoftlink ${arch_include_src_path} ${arch_include_dst_path}
|
||||
|
||||
opp_include_src_path="${arch_include_dst_path}"
|
||||
opp_include_dst_path="$1/opp/include/aclnnop/level2/${file_level2}"
|
||||
if [ -f $opp_include_dst_path ] || [ -L $opp_include_dst_path ]; then
|
||||
rm -fr "$opp_include_dst_path"
|
||||
fi
|
||||
createrelativelysoftlink ${opp_include_src_path} ${opp_include_dst_path}
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
# remove opapi soft link
|
||||
removeopapisoftlink() {
|
||||
local path="$1"
|
||||
if [ -L "$1" ]; then
|
||||
rm -fr ${path}
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
latestSoftlinksRemove() {
|
||||
targetdir=$1
|
||||
osName=""
|
||||
if [ -f "$targetdir/opp/scene.info" ]; then
|
||||
. $targetdir/opp/scene.info
|
||||
osName=${os}
|
||||
fi
|
||||
opapi_lib_path="$targetdir/opp/built-in/op_impl/ai_core/tbe/op_api/lib/${osName}/${architecture}"
|
||||
opapi_include_level1_path="$1/opp/built-in/op_impl/ai_core/tbe/op_api/include/aclnnop"
|
||||
opapi_include_level2_path="${opapi_include_level1_path}/level2"
|
||||
|
||||
if [ -d $(dirname $targetdir)/latest/${architectureDir}/lib64 ]; then
|
||||
for file_so in $(ls -l "$(dirname $targetdir)/latest/${architectureDir}/lib64/" | grep -E "libaclnn_|libopapi.so"); do
|
||||
latest_arch_lib64_path="$(dirname $targetdir)/latest/${architectureDir}/lib64/${file_so}"
|
||||
removeopapisoftlink ${latest_arch_lib64_path}
|
||||
done
|
||||
fi
|
||||
|
||||
# second the headfiles with 1 and 2 level
|
||||
if [ -d $(dirname $targetdir)/latest/${architectureDir}/include/aclnnop ]; then
|
||||
for file_level1 in $(ls -1 -F ${opapi_include_level1_path} | grep -v [/$] | sed 's/\*$//'); do
|
||||
latest_arch_include_path="$(dirname $targetdir)/latest/${architectureDir}/include/aclnnop/${file_level1}"
|
||||
removeopapisoftlink ${latest_arch_include_path}
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -d $(dirname $targetdir)/latest/${architectureDir}/include/aclnnop/level2 ]; then
|
||||
for file_level2 in $(ls -1 -F ${opapi_include_level2_path} | grep -v [/$] | sed 's/\*$//'); do
|
||||
latest_arch_include_path="$(dirname $targetdir)/latest/${architectureDir}/include/aclnnop/level2/${file_level2}"
|
||||
removeopapisoftlink ${latest_arch_include_path}
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
softlinksRemove() {
|
||||
targetdir=$1
|
||||
osName=""
|
||||
if [ -f "$targetdir/opp/scene.info" ]; then
|
||||
. $targetdir/opp/scene.info
|
||||
osName=${os}
|
||||
fi
|
||||
opapi_lib_path="$targetdir/opp/built-in/op_impl/ai_core/tbe/op_api/lib/${osName}/${architecture}"
|
||||
opapi_include_level1_path="$targetdir/opp/built-in/op_impl/ai_core/tbe/op_api/include/aclnnop"
|
||||
opapi_include_level2_path="${opapi_include_level1_path}/level2"
|
||||
|
||||
# first the libopapi.so
|
||||
if [ -d $targetdir/${architectureDir}/lib64 ]; then
|
||||
for file_so in $(ls -1 $targetdir/${architectureDir}/lib64 | grep -E "libaclnn_|libopapi.so"); do
|
||||
arch_lib64_path="$targetdir/${architectureDir}/lib64/${file_so}"
|
||||
removeopapisoftlink ${arch_lib64_path}
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -d $targetdir/opp/lib64 ]; then
|
||||
for file_so in $(ls -l $targetdir/opp/lib64 | grep -E "libaclnn_|libopapi.so"); do
|
||||
opp_lib64_path="$targetdir/opp/lib64/${file_so}"
|
||||
removeopapisoftlink ${opp_lib64_path}
|
||||
done
|
||||
fi
|
||||
|
||||
# second the headfiles with 1 and 2 level
|
||||
if [ -d $targetdir/${architectureDir}/include/aclnnop ]; then
|
||||
for file_level1 in $(ls -1 -F ${opapi_include_level1_path} | grep -v [/$] | sed 's/\*$//'); do
|
||||
arch_include_path="$targetdir/${architectureDir}/include/aclnnop/${file_level1}"
|
||||
removeopapisoftlink ${arch_include_path}
|
||||
|
||||
opp_include_path="$targetdir/opp/include/aclnnop/${file_level1}"
|
||||
removeopapisoftlink ${opp_include_path}
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -d $targetdir/${architectureDir}/include/aclnnop/level2 ]; then
|
||||
for file_level2 in $(ls -1 -F ${opapi_include_level2_path} | grep -v [/$] | sed 's/\*$//'); do
|
||||
arch_include_path="$targetdir/${architectureDir}/include/aclnnop/level2/${file_level2}"
|
||||
removeopapisoftlink ${arch_include_path}
|
||||
|
||||
opp_include_path="$targetdir/opp/include/aclnnop/level2/${file_level2}"
|
||||
removeopapisoftlink ${opp_include_path}
|
||||
done
|
||||
fi
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
curpath=$(dirname $(readlink -f "$0"))
|
||||
SCENE_FILE="${curpath}""/../scene.info"
|
||||
OPP_COMMON="${curpath}""/opp_common.sh"
|
||||
common_func_path="${curpath}/common_func.inc"
|
||||
. "${OPP_COMMON}"
|
||||
. "${common_func_path}"
|
||||
# init arch
|
||||
architecture=$(uname -m)
|
||||
architectureDir="${architecture}-linux"
|
||||
|
||||
while true; do
|
||||
case "$1" in
|
||||
--install-path=*)
|
||||
install_path=$(echo "$1" | cut -d"=" -f2-)
|
||||
shift
|
||||
;;
|
||||
--version-dir=*)
|
||||
version_dir=$(echo "$1" | cut -d"=" -f2)
|
||||
shift
|
||||
;;
|
||||
--latest-dir=*)
|
||||
latest_dir=$(echo "$1" | cut -d"=" -f2)
|
||||
shift
|
||||
;;
|
||||
-*)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
get_version_dir "opp_kernel_version_dir" "$install_path/$version_dir/opp_kernel/version.info"
|
||||
|
||||
if [ -z "$opp_kernel_version_dir" ]; then
|
||||
# create op_api soft link
|
||||
logandprint "[INFO]: Start create opapi softlinks."
|
||||
createOpapiSoftlink "${install_path}/${version_dir}"
|
||||
return_code=$?
|
||||
if [ ${return_code} -eq 0 ]; then
|
||||
logandprint "[INFO]: Create opapi softlinks successfully!"
|
||||
elif [ ${return_code} -eq 3 ]; then
|
||||
logandprint "[WARNING]: opapi source file does not exist!"
|
||||
else
|
||||
logandprint "[ERROR]: Create opapi softlinks failed!"
|
||||
fi
|
||||
fi
|
||||
@@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
curpath=$(dirname $(readlink -f "$0"))
|
||||
SCENE_FILE="${curpath}""/../scene.info"
|
||||
OPP_COMMON="${curpath}""/opp_common.sh"
|
||||
common_func_path="${curpath}/common_func.inc"
|
||||
. "${OPP_COMMON}"
|
||||
. "${common_func_path}"
|
||||
# init arch
|
||||
architecture=$(uname -m)
|
||||
architectureDir="${architecture}-linux"
|
||||
|
||||
while true; do
|
||||
case "$1" in
|
||||
--install-path=*)
|
||||
install_path=$(echo "$1" | cut -d"=" -f2-)
|
||||
shift
|
||||
;;
|
||||
--version-dir=*)
|
||||
version_dir=$(echo "$1" | cut -d"=" -f2)
|
||||
shift
|
||||
;;
|
||||
--latest-dir=*)
|
||||
latest_dir=$(echo "$1" | cut -d"=" -f2)
|
||||
shift
|
||||
;;
|
||||
-*)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
get_version_dir "opp_kernel_version_dir" "$install_path/$version_dir/opp_kernel/version.info"
|
||||
|
||||
if [ -z "$opp_kernel_version_dir" ]; then
|
||||
# before remove the oppkernel, remove the softlinks
|
||||
logandprint "[INFO]: Start remove opapi softlinks."
|
||||
softlinksRemove ${install_path}/${version_dir}
|
||||
if [ $? -ne 0 ]; then
|
||||
logandprint "[WARNING]: Remove opapi softlinks failed, some softlinks may not exist."
|
||||
else
|
||||
logandprint "[INFO]: Remove opapi softlinks successfully."
|
||||
fi
|
||||
fi
|
||||
414
csrc/scripts/package/ops_transformer/scripts/opp_install.sh
Normal file
414
csrc/scripts/package/ops_transformer/scripts/opp_install.sh
Normal file
@@ -0,0 +1,414 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
PARAM_INVALID="0x0002"
|
||||
INSTALL_FAILED="0x0000"
|
||||
INSTALL_FAILED_DES="Update successfully."
|
||||
FILE_NOT_EXIST="0x0080"
|
||||
FILE_NOT_EXIST_DES="File not found."
|
||||
FILE_READ_FAILED="0x0082"
|
||||
FILE_READ_FAILED_DES="File read failed."
|
||||
FILE_WRITE_FAILED="0x0081"
|
||||
FILE_WRITE_FAILED_DES="File write failed."
|
||||
PERM_DENIED="0x0093"
|
||||
PERM_DENIED_DES="Permission denied."
|
||||
|
||||
# run package's files info
|
||||
CURR_PATH=$(dirname $(readlink -f $0))
|
||||
VERSION_INFO_FILE="${CURR_PATH}/../version.info"
|
||||
FILELIST_FILE="${CURR_PATH}/filelist.csv"
|
||||
COMMON_PARSER_FILE="${CURR_PATH}/install_common_parser.sh"
|
||||
SCENE_FILE="${CURR_PATH}/../scene.info"
|
||||
ASCEND_INSTALL_INFO="ascend_install.info"
|
||||
|
||||
ARCH_INFO=$(uname -m)
|
||||
OPP_PLATFORM_DIR=ops_transformer
|
||||
OPP_PLATFORM_UPPER=$(echo "${OPP_PLATFORM_DIR}" | tr '[:lower:]' '[:upper:]')
|
||||
|
||||
TARGET_INSTALL_PATH=""
|
||||
TARGET_MOULDE_DIR="" # TARGET_INSTALL_PATH + PKG_VERSION_DIR + OPP_PLATFORM_DIR
|
||||
TARGET_VERSION_DIR="" # TARGET_INSTALL_PATH + PKG_VERSION_DIR
|
||||
TARGET_SHARED_INFO_DIR="" # TARGET_INSTALL_PATH + PKG_VERSION_DIR + share/info
|
||||
TARGET_OPP_BUILT_IN=""
|
||||
|
||||
COMMON_INC_FILE="${CURR_PATH}/common_func.inc"
|
||||
COMMON_FUNC_V2_PATH="${CURR_PATH}/common_func_v2.inc"
|
||||
VERSION_CFG="${CURR_PATH}/version_cfg.inc"
|
||||
OPP_COMMON_FILE="${CURR_PATH}/opp_common.sh"
|
||||
|
||||
. "${COMMON_INC_FILE}"
|
||||
. "${COMMON_FUNC_V2_PATH}"
|
||||
. "${VERSION_CFG}"
|
||||
. "${OPP_COMMON_FILE}"
|
||||
|
||||
# keys of infos in ascend_install.info
|
||||
KEY_INSTALLED_UNAME="USERNAME"
|
||||
KEY_INSTALLED_UGROUP="USERGROUP"
|
||||
KEY_INSTALLED_TYPE="${OPP_PLATFORM_UPPER}_INSTALL_TYPE"
|
||||
KEY_INSTALLED_FEATURE="${OPP_PLATFORM_UPPER}_INSTALL_FEATURE"
|
||||
KEY_INSTALLED_CHIP="${OPP_PLATFORM_UPPER}_INSTALL_CHIP"
|
||||
KEY_INSTALLED_PATH="${OPP_PLATFORM_UPPER}_INSTALL_PATH_VAL"
|
||||
KEY_INSTALLED_VERSION="${OPP_PLATFORM_UPPER}_VERSION"
|
||||
|
||||
get_opts() {
|
||||
TARGET_INSTALL_PATH="$1"
|
||||
TARGET_USERNAME="$2"
|
||||
TARGET_USERGROUP="$3"
|
||||
IN_FEATURE="$4"
|
||||
INSTALL_TYPE="$5"
|
||||
IS_FOR_ALL="$6"
|
||||
IS_SETENV="$7"
|
||||
IS_DOCKER_INSTALL="$8"
|
||||
DOCKER_ROOT="$9"
|
||||
PKG_VERSION_DIR="${10}"
|
||||
|
||||
if [ "${TARGET_INSTALL_PATH}" = "" ] || [ "${TARGET_USERNAME}" = "" ] ||
|
||||
[ "${TARGET_USERGROUP}" = "" ] || [ "${INSTALL_TYPE}" = "" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${PARAM_INVALID};ERR_DES:Empty parameters is invalid for install."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
INSTALL_FOR_ALL=""
|
||||
if [ "${IS_FOR_ALL}" = "y" ]; then
|
||||
INSTALL_FOR_ALL="--install_for_all"
|
||||
fi
|
||||
}
|
||||
|
||||
init_install_env() {
|
||||
get_package_version "RUN_PKG_VERSION" "$VERSION_INFO_FILE"
|
||||
if [ "${PKG_VERSION_DIR}" = "" ]; then
|
||||
TARGET_VERSION_DIR=${TARGET_INSTALL_PATH}
|
||||
else
|
||||
TARGET_VERSION_DIR=${TARGET_INSTALL_PATH}/${PKG_VERSION_DIR}
|
||||
fi
|
||||
TARGET_MOULDE_DIR=${TARGET_VERSION_DIR}/${OPP_PLATFORM_DIR}
|
||||
TARGET_OPP_BUILT_IN=${TARGET_VERSION_DIR}/opp/built-in
|
||||
TARGET_SHARED_INFO_DIR=${TARGET_VERSION_DIR}/share/info
|
||||
INSTALL_INFO_FILE=${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/${ASCEND_INSTALL_INFO}
|
||||
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
LOG_PATH_PERM="740"
|
||||
LOG_FILE_PERM="640"
|
||||
INSTALL_INFO_PERM="600"
|
||||
else
|
||||
LOG_PATH_PERM="750"
|
||||
LOG_FILE_PERM="640"
|
||||
INSTALL_INFO_PERM="644"
|
||||
fi
|
||||
|
||||
if [ "${IS_FOR_ALL}" = "y" ]; then
|
||||
BUILTIN_PERM="555"
|
||||
CUSTOM_PERM="755"
|
||||
CREATE_DIR_PERM="755"
|
||||
ONLYREAD_PERM="444"
|
||||
else
|
||||
BUILTIN_PERM="550"
|
||||
CUSTOM_PERM="750"
|
||||
CREATE_DIR_PERM="750"
|
||||
ONLYREAD_PERM="440"
|
||||
fi
|
||||
}
|
||||
|
||||
log_with_errorlevel() {
|
||||
local ret_status="$1"
|
||||
local level="$2"
|
||||
local msg="$3"
|
||||
if [ "${ret_status}" != 0 ]; then
|
||||
if [ "${level}" = "error" ]; then
|
||||
logandprint "${msg}"
|
||||
exit 1
|
||||
else
|
||||
logandprint "${msg}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
get_installed_info() {
|
||||
local key="$1"
|
||||
local res=""
|
||||
if [ -f "${INSTALL_INFO_FILE}" ]; then
|
||||
res=$(cat ${INSTALL_INFO_FILE} | grep "${key}" | awk -F = '{print $2}')
|
||||
fi
|
||||
echo "${res}"
|
||||
}
|
||||
|
||||
update_install_info() {
|
||||
local key_val="$1"
|
||||
local val="$2"
|
||||
local old_val=$(get_installed_info "${key_val}")
|
||||
if [ -f "${INSTALL_INFO_FILE}" ]; then
|
||||
if [ "x${old_val}" = "x" ]; then
|
||||
echo "${key_val}=${val}" >>"${INSTALL_INFO_FILE}"
|
||||
else
|
||||
sed -i "/${key_val}/c ${key_val}=${val}" "${INSTALL_INFO_FILE}"
|
||||
fi
|
||||
else
|
||||
echo "${key_val}=${val}" >"${INSTALL_INFO_FILE}"
|
||||
fi
|
||||
}
|
||||
|
||||
update_install_infos() {
|
||||
local uname="$1"
|
||||
local ugroup="$2"
|
||||
local type="$3"
|
||||
local path="$4"
|
||||
local version
|
||||
get_package_version "version" "$VERSION_INFO_FILE"
|
||||
comm_create_file "${INSTALL_INFO_FILE}" "${INSTALL_INFO_PERM}" "${TARGET_USERNAME}:${TARGET_USERGROUP}" "${IS_FOR_ALL}"
|
||||
|
||||
update_install_info "${KEY_INSTALLED_UNAME}" "${uname}"
|
||||
update_install_info "${KEY_INSTALLED_UGROUP}" "${ugroup}"
|
||||
update_install_info "${KEY_INSTALLED_TYPE}" "${type}"
|
||||
update_install_info "${KEY_INSTALLED_PATH}" "${path}"
|
||||
update_install_info "${KEY_INSTALLED_VERSION}" "${version}"
|
||||
}
|
||||
|
||||
check_file_exist() {
|
||||
local path_param="${1}"
|
||||
if [ ! -f "${path_param}" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST};ERR_DES:The file (${path_param}) does not existed."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_env() {
|
||||
check_file_exist "${FILELIST_FILE}"
|
||||
check_file_exist "${COMMON_PARSER_FILE}"
|
||||
}
|
||||
|
||||
createsoftlink() {
|
||||
local src_path="$1"
|
||||
local dst_path="$2"
|
||||
if [ -e "$dst_path" ]; then
|
||||
if [ -L "$dst_path" ]; then
|
||||
`rm -f $dst_path`
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
ln -s "${src_path}" "${dst_path}" 2>/dev/null
|
||||
log_with_errorlevel "$?" "error" "[ERROR]: ERR_NO:${PERM_DENIED};ERR_DES:${src_path} Create softlink to ${dst_path} failed."
|
||||
}
|
||||
|
||||
get_install_path() {
|
||||
docker_root_tmp="$(echo "${DOCKER_ROOT}" | sed "s#/\+\$##g")"
|
||||
docker_root_regex="$(echo "${docker_root_tmp}" | sed "s#\/#\\\/#g")"
|
||||
relative_path_val=$(echo "${TARGET_VERSION_DIR}" | sed "s/^${docker_root_regex}//g" | sed "s/\/\+\$//g")
|
||||
return
|
||||
}
|
||||
|
||||
setenv() {
|
||||
logandprint "[INFO]: Set the environment path [ export ASCEND_OPP_PATH=${relative_path_val}/opp ]."
|
||||
if [ "${IS_DOCKER_INSTALL}" = y ]; then
|
||||
INSTALL_OPTION="--docker-root=${DOCKER_ROOT}"
|
||||
else
|
||||
INSTALL_OPTION=""
|
||||
fi
|
||||
if [ "${IS_SETENV}" = "y" ]; then
|
||||
INSTALL_OPTION="${INSTALL_OPTION} --setenv"
|
||||
fi
|
||||
}
|
||||
|
||||
# 创建单个文件的软链接,链接文件级别
|
||||
create_file_softlink() {
|
||||
local src_file=$1
|
||||
local dst_file=$2
|
||||
local base_dir=$(dirname ${dst_file})
|
||||
|
||||
comm_create_dir "${base_dir}" "${CREATE_DIR_PERM}" "${TARGET_USERNAME}:${TARGET_USERGROUP}" "${IS_FOR_ALL}"
|
||||
|
||||
local relative_file_path=$(realpath -s --relative-to="${base_dir}" "${src_file}")
|
||||
# 创建软连接
|
||||
createsoftlink "${relative_file_path}" "${dst_file}"
|
||||
}
|
||||
|
||||
# 创建单个目录的软连接,链接目录级别
|
||||
create_dir_softlink() {
|
||||
local src_dir=$1
|
||||
local dst_dir=$2
|
||||
local base_dir=$(dirname ${dst_dir})
|
||||
|
||||
comm_create_dir "${base_dir}" "${CREATE_DIR_PERM}" "${TARGET_USERNAME}:${TARGET_USERGROUP}" "${IS_FOR_ALL}"
|
||||
|
||||
if [ ! -d "${src_dir}" ]; then
|
||||
logandprint "[ERROR]: src dir ["${src_dir}"] not exists to create soft link."
|
||||
fi
|
||||
|
||||
# 获取相对路径
|
||||
relative_dir_path=$(realpath -s --relative-to="${base_dir}" "${src_dir}")
|
||||
# 创建软连接
|
||||
createsoftlink "${relative_dir_path}" "${dst_dir}"
|
||||
}
|
||||
|
||||
# 创建目录下子目录的软连接,链接子目录级别
|
||||
create_softlink_for_dirs() {
|
||||
local src_dir=$1
|
||||
local dst_dir=$2
|
||||
|
||||
if [ ! -d "${src_dir}" ]; then
|
||||
logandprint "[ERROR]: src dir ["${src_dir}"] not exists to create soft link."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
comm_create_dir "${dst_dir}" "${CREATE_DIR_PERM}" "${TARGET_USERNAME}:${TARGET_USERGROUP}" "${IS_FOR_ALL}"
|
||||
|
||||
find "${src_dir}" -mindepth 1 -maxdepth 1 -type d -print0 | while IFS= read -r -d '' src_dir_path; do
|
||||
local sub_dir_name=$(basename ${src_dir_path})
|
||||
local dst_dir_path="${dst_dir}/${sub_dir_name}"
|
||||
# 计算目录相对路径
|
||||
local relative_dir_path=$(realpath -s --relative-to="${dst_dir}" "${src_dir_path}")
|
||||
# 创建软连接
|
||||
createsoftlink "${relative_dir_path}" "${dst_dir_path}"
|
||||
done
|
||||
}
|
||||
|
||||
# 创建某目录下所有文件的软链接,链接文件级别,要求目录中不能有子目录
|
||||
create_softlink_for_files() {
|
||||
local src_dir=$1
|
||||
local dst_dir=$2
|
||||
local exclude_list="$3"
|
||||
|
||||
if [ ! -d "${src_dir}" ]; then
|
||||
logandprint "[ERROR]: src dir ["${src_dir}"] not exists, cannot create soft link."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
comm_create_dir "${dst_dir}" "${CREATE_DIR_PERM}" "${TARGET_USERNAME}:${TARGET_USERGROUP}" "${IS_FOR_ALL}"
|
||||
|
||||
find "${src_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | while IFS= read -r -d '' src_file_path; do
|
||||
# 文件名
|
||||
local file_name=$(basename ${src_file_path})
|
||||
if $(echo ${exclude_list} | grep -wq ${file_name}); then
|
||||
continue
|
||||
fi
|
||||
local dst_file_path="${dst_dir}/${file_name}"
|
||||
# 获取相对路径
|
||||
local relative_file_path=$(realpath --relative-to="${dst_dir}" "${src_file_path}")
|
||||
# 创建软连接
|
||||
createsoftlink "${relative_file_path}" "${dst_file_path}"
|
||||
done
|
||||
}
|
||||
|
||||
# 递归创建目录下所有文件的软链接,链接文件级别,目录中可以有子目录,对于子目录会创建对应目录不是链接
|
||||
create_softlink_for_files_and_dirs() {
|
||||
local src_dir=$1
|
||||
local dst_dir=$2
|
||||
|
||||
if [ ! -d "${src_dir}" ]; then
|
||||
logandprint "[ERROR]: src dir ["${src_dir}"] not exists, cannot create soft link."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
comm_create_dir "${dst_dir}" "${CREATE_DIR_PERM}" "${TARGET_USERNAME}:${TARGET_USERGROUP}" "${IS_FOR_ALL}"
|
||||
find "${src_dir}" -mindepth 1 -maxdepth 1 -type d -print0 | while IFS= read -r -d '' src_dir_path; do
|
||||
local base_dir=$(basename ${src_dir_path})
|
||||
local dst_dir_path="${dst_dir}/${base_dir}"
|
||||
create_softlink_for_files_and_dirs ${src_dir_path} ${dst_dir_path}
|
||||
done
|
||||
|
||||
create_softlink_for_files ${src_dir} ${dst_dir}
|
||||
}
|
||||
|
||||
add_init_py() {
|
||||
local opp_builtin_mod=""
|
||||
local built_in_impl_path=${TARGET_OPP_BUILT_IN}/op_impl/ai_core/tbe/impl/ops_transformer
|
||||
if [ -d ${built_in_impl_path} ]; then
|
||||
opp_builtin_mod=$(stat -c %a ${built_in_impl_path})
|
||||
if [ "$(id -u)" != 0 ] && [ ! -w "${built_in_impl_path}" ]; then
|
||||
chmod u+w -R "${built_in_impl_path}" 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
touch ${built_in_impl_path}/__init__.py
|
||||
|
||||
[ -d ${built_in_impl_path}/dynamic ] && touch ${built_in_impl_path}/dynamic/__init__.py
|
||||
|
||||
if [ -n "${opp_builtin_mod}" ]; then
|
||||
chmod ${opp_builtin_mod} -R "${built_in_impl_path}" 2>/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
install_opp() {
|
||||
logandprint "[INFO]: Begin install opp module."
|
||||
comm_create_dir "${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}" "${CREATE_DIR_PERM}" "${TARGET_USERNAME}:${TARGET_USERGROUP}" "${IS_FOR_ALL}"
|
||||
|
||||
setenv
|
||||
|
||||
logandprint "[INFO]: Update the opp install info."
|
||||
|
||||
update_install_infos "${TARGET_USERNAME}" "${TARGET_USERGROUP}" "${INSTALL_TYPE}" "${relative_path_val}"
|
||||
log_with_errorlevel "$?" "error" "[ERROR]: ERR_NO:${INSTALL_FAILED};ERR_DES:Update opp install info failed."
|
||||
|
||||
bash "${COMMON_PARSER_FILE}" --package="${OPP_PLATFORM_DIR}" --install --username="${TARGET_USERNAME}" \
|
||||
--usergroup="${TARGET_USERGROUP}" --set-cann-uninstall --version=$RUN_PKG_VERSION \
|
||||
--use-share-info --version-dir=$PKG_VERSION_DIR $INSTALL_OPTION ${INSTALL_FOR_ALL} "--feature=all" "--chip=all" \
|
||||
"${INSTALL_TYPE}" "${TARGET_INSTALL_PATH}" "${FILELIST_FILE}"
|
||||
log_with_errorlevel "$?" "error" "[ERROR]: ERR_NO:${INSTALL_FAILED};ERR_DES:Install opp module files failed."
|
||||
|
||||
logandprint "[INFO]: upgradePercentage:30%"
|
||||
|
||||
add_init_py
|
||||
|
||||
logandprint "[INFO]: upgradePercentage:50%"
|
||||
}
|
||||
|
||||
main() {
|
||||
logandprint "[INFO]: Command opp_install"
|
||||
|
||||
get_opts "$@"
|
||||
|
||||
init_install_env
|
||||
|
||||
get_package_upgrade_version_dir "upgrade_version_dir" "$TARGET_INSTALL_PATH" "${OPP_PLATFORM_DIR}"
|
||||
get_package_last_installed_version "last_installed" "$TARGET_INSTALL_PATH" "${OPP_PLATFORM_DIR}"
|
||||
last_installed_version=$(echo ${last_installed} | cut --only-delimited -d":" -f2-)
|
||||
|
||||
get_install_path
|
||||
|
||||
check_env
|
||||
|
||||
install_opp
|
||||
|
||||
# change log dir and file owner and rights
|
||||
chmod "${LOG_PATH_PERM}" "${COMM_LOG_DIR}" 2>/dev/null
|
||||
chmod "${LOG_FILE_PERM}" "${COMM_LOGFILE}" 2>/dev/null
|
||||
chmod "${LOG_FILE_PERM}" "${COMM_OPERATION_LOGFILE}" 2>/dev/null
|
||||
|
||||
if [ "$(id -u)" = "0" ]; then
|
||||
chmod "${CUSTOM_PERM}" -R "${TARGET_OPP_BUILT_IN}" 2>/dev/null
|
||||
else
|
||||
chmod "${BUILTIN_PERM}" -R "${TARGET_OPP_BUILT_IN}" 2>/dev/null
|
||||
fi
|
||||
|
||||
chmod "${ONLYREAD_PERM}" "${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/scene.info" 2>/dev/null
|
||||
chmod "${ONLYREAD_PERM}" "${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/version.info" 2>/dev/null
|
||||
chmod "${ONLYREAD_PERM}" "${INSTALL_INFO_FILE}" 2>/dev/null
|
||||
|
||||
# change installed folder's owner and group except aicpu
|
||||
log_with_errorlevel "$?" "error" "[ERROR]: ERR_NO:${INSTALL_FAILED};ERR_DES:Change opp ownership failed.."
|
||||
|
||||
logandprint "[INFO]: upgradePercentage:100%"
|
||||
|
||||
logandprint "[INFO]: Installation information listed below:"
|
||||
logandprint "[INFO]: Install path: (${TARGET_VERSION_DIR}/opp)"
|
||||
logandprint "[INFO]: Install log file path: (${COMM_LOGFILE})"
|
||||
logandprint "[INFO]: Operation log file path: (${COMM_OPERATION_LOGFILE})"
|
||||
|
||||
if [ "${IS_SETENV}" != "y" ]; then
|
||||
logandprint "[INFO]: Using requirements: when opp module install finished or \
|
||||
before you run the opp module, execute the command \
|
||||
[ export ASCEND_OPP_PATH=${TARGET_INSTALL_PATH}/cann/opp ] to set the environment path."
|
||||
fi
|
||||
|
||||
logandprint "[INFO]: Opp package installed successfully! The new version takes effect immediately."
|
||||
}
|
||||
|
||||
main "$@"
|
||||
exit 0
|
||||
225
csrc/scripts/package/ops_transformer/scripts/opp_uninstall.sh
Normal file
225
csrc/scripts/package/ops_transformer/scripts/opp_uninstall.sh
Normal file
@@ -0,0 +1,225 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
OPERATE_FAILED="0x0001"
|
||||
PARAM_INVALID="0x0002"
|
||||
PARAM_INVALID_DES="Invalid input parameter."
|
||||
FILE_NOT_EXIST="0x0080"
|
||||
FILE_NOT_EXIST_DES="File not found."
|
||||
FILE_READ_FAILED="0x0082"
|
||||
FILE_READ_FAILED_DES="File read failed."
|
||||
|
||||
CURR_PATH=$(dirname $(readlink -f $0))
|
||||
COMMON_INC_FILE="${CURR_PATH}/common_func.inc"
|
||||
OPP_COMMON_FILE="${CURR_PATH}/opp_common.sh"
|
||||
|
||||
. "${COMMON_INC_FILE}"
|
||||
. "${OPP_COMMON_FILE}"
|
||||
|
||||
ARCH_INFO=$(uname -m)
|
||||
OPP_PLATFORM_DIR=ops_transformer
|
||||
OPP_PLATFORM_UPPER=$(echo "${OPP_PLATFORM_DIR}" | tr '[:lower:]' '[:upper:]')
|
||||
FILELIST_FILE="${CURR_PATH}/filelist.csv"
|
||||
COMMON_PARSER_FILE="${CURR_PATH}/install_common_parser.sh"
|
||||
|
||||
TARGET_INSTALL_PATH=""
|
||||
TARGET_VERSION_DIR="${CURR_PATH}/../../../.."
|
||||
TARGET_VERSION_DIR=$(readlink -f ${TARGET_VERSION_DIR}) # TARGET_INSTALL_PATH + PKG_VERSION_DIR
|
||||
TARGET_MOULDE_DIR=${TARGET_VERSION_DIR}/${OPP_PLATFORM_DIR} # TARGET_INSTALL_PATH + PKG_VERSION_DIR + OPP_PLATFORM_DIR
|
||||
TARGET_OPP_BUILT_IN=${TARGET_VERSION_DIR}/opp/built-in
|
||||
TARGET_SHARED_INFO_DIR=${TARGET_VERSION_DIR}/share/info
|
||||
|
||||
ASCEND_INSTALL_INFO="ascend_install.info"
|
||||
# init log file path
|
||||
INSTALL_INFO_FILE="${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/${ASCEND_INSTALL_INFO}"
|
||||
|
||||
VERSION_INFO_FILE="${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/version.info"
|
||||
|
||||
# keys of infos in ascend_install.info
|
||||
KEY_INSTALLED_UNAME="USERNAME"
|
||||
KEY_INSTALLED_UGROUP="USERGROUP"
|
||||
KEY_INSTALLED_TYPE="${OPP_PLATFORM_UPPER}_INSTALL_TYPE"
|
||||
KEY_INSTALLED_FEATURE="${OPP_PLATFORM_UPPER}_INSTALL_FEATURE"
|
||||
KEY_INSTALLED_PATH="${OPP_PLATFORM_UPPER}_INSTALL_PATH_VAL"
|
||||
KEY_INSTALLED_VERSION="${OPP_PLATFORM_UPPER}_VERSION"
|
||||
|
||||
get_opts() {
|
||||
INSTALLED_PATH="$1"
|
||||
UNINSTALL_MODE="$2"
|
||||
IS_QUIET="$3"
|
||||
IN_FEATURE="$4"
|
||||
IS_DOCKER_INSTALL="$5"
|
||||
DOCKER_ROOT="$6"
|
||||
PKG_VERSION_DIR="$7"
|
||||
local paramter_num="$#"
|
||||
|
||||
if [ "${paramter_num}" != 0 ]; then
|
||||
if [ "${INSTALLED_PATH}" = "" ] ||
|
||||
[ "${UNINSTALL_MODE}" = "" ] ||
|
||||
[ "${IS_QUIET}" = "" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${PARAM_INVALID};ERR_DES:Empty parameters is invalid\
|
||||
for call uninstall functions."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
get_docker_install_path() {
|
||||
local docker_root_tmp="$(echo "${DOCKER_ROOT}" | sed "s#/\+\$##g")"
|
||||
local docker_root_regex="$(echo "${docker_root_tmp}" | sed "s#\/#\\\/#g")"
|
||||
relative_path_val=$(echo "${TARGET_VERSION_DIR}" | sed "s/^${docker_root_regex}//g" | sed "s/\/\+\$//g")
|
||||
return
|
||||
}
|
||||
|
||||
log_with_errorlevel() {
|
||||
local ret_status="$1"
|
||||
local level="$2"
|
||||
local msg="$3"
|
||||
if [ "${ret_status}" != 0 ]; then
|
||||
if [ "${level}" = "error" ]; then
|
||||
logandprint "${msg}"
|
||||
exit 1
|
||||
else
|
||||
logandprint "${msg}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
check_directory_exist() {
|
||||
local path="${1}"
|
||||
if [ ! -d "${path}" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST};ERR_DES:Installation directory [${path}] does not exist, uninstall failed."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_file_exist() {
|
||||
local path_param="${1}"
|
||||
if [ ! -f "${path_param}" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST};ERR_DES:The file (${path_param}) does not existed."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_installed_files() {
|
||||
# check install folder existed
|
||||
check_file_exist "${INSTALL_INFO_FILE}"
|
||||
|
||||
check_file_exist "${FILELIST_FILE}"
|
||||
|
||||
check_file_exist "${COMMON_PARSER_FILE}"
|
||||
|
||||
}
|
||||
|
||||
check_installed_type() {
|
||||
local type="$1"
|
||||
if [ "${type}" != "run" ] &&
|
||||
[ "${type}" != "full" ] &&
|
||||
[ "${type}" != "devel" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${UNAME_NOT_EXIST};ERR_DES:Install type of opp module is not right!"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
unsetenv() {
|
||||
logandprint "[INFO]: Unset the environment path [ export ASCEND_OPP_PATH=${relative_path_val}/opp ]."
|
||||
if [ "${IS_DOCKER_INSTALL}" = y ]; then
|
||||
UNINSTALL_OPTION="--docker-root=${DOCKER_ROOT}"
|
||||
else
|
||||
UNINSTALL_OPTION=""
|
||||
fi
|
||||
}
|
||||
|
||||
get_installed_info() {
|
||||
local key="$1"
|
||||
local res=""
|
||||
if [ -f "${INSTALL_INFO_FILE}" ]; then
|
||||
chmod 644 "${INSTALL_INFO_FILE}" >/dev/null 2>&1
|
||||
res=$(cat ${INSTALL_INFO_FILE} | grep "${key}" | awk -F = '{print $2}')
|
||||
fi
|
||||
echo "${res}"
|
||||
}
|
||||
|
||||
get_installed_param() {
|
||||
INSTALLED_TYPE=$(get_installed_info "${KEY_INSTALLED_TYPE}")
|
||||
TARGET_USERNAME=$(get_installed_info "${KEY_INSTALLED_UNAME}")
|
||||
TARGET_USERGROUP=$(get_installed_info "${KEY_INSTALLED_UGROUP}")
|
||||
get_package_version "RUN_PKG_VERSION" "$VERSION_INFO_FILE"
|
||||
if [ "${PKG_VERSION_DIR}" = "" ]; then
|
||||
TARGET_INSTALL_PATH=${TARGET_VERSION_DIR}
|
||||
else
|
||||
TARGET_INSTALL_PATH=$(readlink -f "${TARGET_VERSION_DIR}/../")
|
||||
fi
|
||||
}
|
||||
|
||||
remove_module() {
|
||||
chmod u+w ${TARGET_SHARED_INFO_DIR}/${OPP_PLATFORM_DIR}/scene.info
|
||||
|
||||
logandprint "[INFO]: Delete the installed opp source files in (${TARGET_VERSION_DIR})."
|
||||
|
||||
bash "${COMMON_PARSER_FILE}" --package="${OPP_PLATFORM_DIR}" --uninstall --remove-install-info \
|
||||
--username="${TARGET_USERNAME}" --usergroup="${TARGET_USERGROUP}" --version=$RUN_PKG_VERSION \
|
||||
--use-share-info --version-dir=$PKG_VERSION_DIR ${UNINSTALL_OPTION} "${INSTALLED_TYPE}" "${TARGET_INSTALL_PATH}" \
|
||||
"${FILELIST_FILE}" "${IN_FEATURE}" --recreate-softlink
|
||||
log_with_errorlevel "$?" "error" "[ERROR]: ERR_NO:${OPERATE_FAILED};ERR_DES:Uninstall opp module failed."
|
||||
}
|
||||
|
||||
remove_init_py() {
|
||||
local built_in_impl_path=${TARGET_OPP_BUILT_IN}/op_impl/ai_core/tbe/impl/ops_transformer
|
||||
|
||||
[ -e ${built_in_impl_path}/__init__.py ] && rm ${built_in_impl_path}/__init__.py > /dev/null 2>&1
|
||||
|
||||
[ -e ${built_in_impl_path}/dynamic/__init__.py ] && rm ${built_in_impl_path}/dynamic/__init__.py > /dev/null 2>&1
|
||||
}
|
||||
|
||||
remove_ops_transformer() {
|
||||
if [ "$(id -u)" != 0 ] && [ ! -w "${TARGET_OPP_BUILT_IN}" ]; then
|
||||
chmod u+w -R "${TARGET_OPP_BUILT_IN}" 2>/dev/null
|
||||
fi
|
||||
|
||||
remove_init_py
|
||||
|
||||
remove_module
|
||||
|
||||
if [ "${UNINSTALL_MODE}" != "upgrade" ]; then
|
||||
logandprint "[INFO]: Delete the install info file (${INSTALL_INFO_FILE})."
|
||||
rm -f "${INSTALL_INFO_FILE}"
|
||||
log_with_errorlevel "$?" "warn" "[WARNING] Delete ops install info file failed, please delete it by yourself."
|
||||
fi
|
||||
}
|
||||
|
||||
logandprint "[INFO]: Begin uninstall the opp module."
|
||||
|
||||
main() {
|
||||
get_opts "$@"
|
||||
|
||||
get_docker_install_path
|
||||
|
||||
check_installed_files
|
||||
|
||||
get_installed_param
|
||||
|
||||
check_installed_type "${INSTALLED_TYPE}"
|
||||
|
||||
unsetenv
|
||||
|
||||
remove_ops_transformer
|
||||
|
||||
if [ "${UNINSTALL_MODE}" != "upgrade" ]; then
|
||||
remove_dir_if_empty ${TARGET_VERSION_DIR}
|
||||
fi
|
||||
remove_dir_if_empty ${INSTALLED_PATH}
|
||||
|
||||
logandprint "[INFO]: Opp package uninstalled successfully! Uninstallation takes effect immediately."
|
||||
}
|
||||
|
||||
main "$@"
|
||||
exit 0
|
||||
84
csrc/scripts/package/ops_transformer/scripts/uninstall.sh
Normal file
84
csrc/scripts/package/ops_transformer/scripts/uninstall.sh
Normal file
@@ -0,0 +1,84 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
CURR_PATH=$(dirname $(readlink -f $0))
|
||||
|
||||
# error number and description
|
||||
FILE_NOT_EXIST="0x0080"
|
||||
PERM_DENIED="0x0093"
|
||||
PERM_DENIED_DES="Permission denied."
|
||||
# log functions
|
||||
getdate() {
|
||||
_cur_date=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
echo "${_cur_date}"
|
||||
}
|
||||
|
||||
logandprint() {
|
||||
is_error_level=$(echo $1 | grep -E 'ERROR|WARN|INFO')
|
||||
if [ "${is_quiet}" != "y" ] || [ "${is_error_level}" != "" ]; then
|
||||
echo "[OpsTransformer] [$(getdate)] ""$1"
|
||||
fi
|
||||
echo "[OpsTransformer] [$(getdate)] ""$1" >> "${_INSTALL_LOG_FILE}"
|
||||
}
|
||||
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
_LOG_PATH=$(echo "${HOME}")"/var/log/ascend_seclog"
|
||||
_INSTALL_LOG_FILE="${_LOG_PATH}/ascend_install.log"
|
||||
else
|
||||
_LOG_PATH="/var/log/ascend_seclog"
|
||||
_INSTALL_LOG_FILE="${_LOG_PATH}/ascend_install.log"
|
||||
fi
|
||||
|
||||
# init install cmd status, set default as n
|
||||
is_quiet=n
|
||||
quiet_parameter=""
|
||||
if [ "$#" != "0" ]; then
|
||||
if [ "$1" = "--quiet" ] && [ "$#" = "1" ]; then
|
||||
is_quiet=y
|
||||
quiet_parameter="--quiet"
|
||||
else
|
||||
logandprint "Please use correct parameters, only support input nothing or only --quiet parameter."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
install_shell="${CURR_PATH}/install.sh"
|
||||
|
||||
# shell exist check
|
||||
if [ ! -f "${install_shell}" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST};OpsTransformer module is not installed or some ops_transformer source files are lost.\
|
||||
If there are any residual files, please manually remove those files."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# shell execute perm check
|
||||
if [ ! -x "${install_shell}" ]; then
|
||||
logandprint "[ERROR]: ERR_NO:${PERM_DENIED};ERR_DES:The user do \
|
||||
not have the permission to execute this file, please reset the file \
|
||||
to a right permission."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
installed_path="$(cd "${CURR_PATH}/../../../../"; pwd)"
|
||||
parent_installed_path="$(cd "${installed_path}/../"; pwd)"
|
||||
cd ~
|
||||
sh "${install_shell}" "--aa" "--aa" "--uninstall" "--install-path=${installed_path}" "${quiet_parameter}"
|
||||
ret_status="$?"
|
||||
if [ "${ret_status}" != "0" ]; then
|
||||
exit 1
|
||||
fi
|
||||
if [ -d "${parent_installed_path}" ];then
|
||||
subdirs_param_install=$(ls "${parent_installed_path}" 2> /dev/null)
|
||||
if [ "${subdirs_param_install}" = "" ]; then
|
||||
rm -rf "${parent_installed_path}"
|
||||
fi
|
||||
fi
|
||||
exit 0
|
||||
173
csrc/scripts/package/ops_transformer/scripts/ver_check.sh
Normal file
173
csrc/scripts/package/ops_transformer/scripts/ver_check.sh
Normal file
@@ -0,0 +1,173 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
req_ver_path=$1
|
||||
_CURR_PATH=$(dirname $(readlink -f $0))
|
||||
_DEFAULT_INSTALL_PATH="/usr/local/Ascend"
|
||||
FILE_NOT_EXIST="0x0080"
|
||||
|
||||
getdate() {
|
||||
_cur_date=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
echo "${_cur_date}"
|
||||
}
|
||||
|
||||
logandprint() {
|
||||
echo "[OpsTransformer] [$(getdate)] ""$1"
|
||||
}
|
||||
|
||||
check_path_pre() {
|
||||
in_checkpath_0="$1"
|
||||
in_checkpath_1=$(echo ${in_checkpath_0} | cut -d"=" -f2)
|
||||
if [ "${in_checkpath_1}" = "" ]; then
|
||||
logandprint "[WARNING]: please input correct path"
|
||||
exit 1
|
||||
fi
|
||||
arr=$(echo ${in_checkpath_1} | awk '{split($0,arr," ");for(i in arr) print arr[i]}')
|
||||
index=0
|
||||
for i in $arr; do
|
||||
id=$((${id:=-1} + 1))
|
||||
eval arr_$id=$i
|
||||
index=$(expr $index + 1)
|
||||
done
|
||||
len="${index}"
|
||||
b=0
|
||||
for i in $(seq 0 ${len}); do
|
||||
select_last_dir_component "$(eval echo '$'arr_$i)"
|
||||
ret=$last_component
|
||||
if [ "${ret}" != "" ]; then
|
||||
eval checked_path_temp_$b=$(eval echo '$'arr_$i)
|
||||
b=$(expr $b + 1)
|
||||
fi
|
||||
done
|
||||
check_all_path=""
|
||||
for i in $(seq 0 ${len}); do
|
||||
check_all_path="$(eval echo '$'checked_path_temp_$i) $check_all_path"
|
||||
done
|
||||
checked_path="${check_all_path}"
|
||||
return
|
||||
}
|
||||
|
||||
select_last_dir_component() {
|
||||
path="$1"
|
||||
last_component=$(basename "${path}")
|
||||
if [ "${last_component}" = "atc" ]; then
|
||||
last_component="atc"
|
||||
return
|
||||
elif [ "${last_component}" = "fwkacllib" ]; then
|
||||
last_component="fwkacllib"
|
||||
return
|
||||
elif [ "${last_component}" = "compiler" ]; then
|
||||
last_component="compiler"
|
||||
return
|
||||
elif [ "${last_component}" = "fwkplugin" ]; then
|
||||
last_component="fwkplugin"
|
||||
return
|
||||
else
|
||||
last_component="atc or fwkacllib or compiler"
|
||||
return
|
||||
fi
|
||||
}
|
||||
|
||||
check_version_file() {
|
||||
pkg_path="$1"
|
||||
component_ret="$2"
|
||||
run_pkg_path_temp=$(dirname "${pkg_path}")
|
||||
run_pkg_path="${run_pkg_path_temp}""/${component_ret}"
|
||||
version_file="${run_pkg_path}""/version.info"
|
||||
if [ -f "${version_file}" ]; then
|
||||
echo "${version_file}" 2 >>/dev/null
|
||||
else
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST}; The [${component_ret}] version.info in path [${pkg_path}] not exists."
|
||||
exit 1
|
||||
fi
|
||||
return
|
||||
}
|
||||
|
||||
check_opp_version_file() {
|
||||
if [ -f "${_CURR_PATH}/../../version.info" ]; then
|
||||
ver_info="${_CURR_PATH}/../../version.info"
|
||||
# ops_transformer/version.info -> ops_transformer
|
||||
elif [ -f "${_DEFAULT_INSTALL_PATH}/ops_transformer/version.info" ]; then
|
||||
ver_info="${_DEFAULT_INSTALL_PATH}/ops_transformer/version.info"
|
||||
else
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST}; The [ops_transformer] version.info not exists."
|
||||
fi
|
||||
return
|
||||
}
|
||||
|
||||
check_relation() {
|
||||
opp_ver_info="$1"
|
||||
req_pkg_name="$2"
|
||||
req_pkg_version="$3"
|
||||
_COMMON_INC_FILE="${_CURR_PATH}/common_func.inc"
|
||||
if [ -f "${_COMMON_INC_FILE}" ]; then
|
||||
. "${_COMMON_INC_FILE}"
|
||||
check_pkg_ver_deps "${opp_ver_info}" "${req_pkg_name}" "${req_pkg_version}"
|
||||
ret_situation=$ver_check_status
|
||||
else
|
||||
logandprint "[ERROR]: ERR_NO:${FILE_NOT_EXIST}; The ${_COMMON_INC_FILE} not exists."
|
||||
fi
|
||||
return
|
||||
}
|
||||
|
||||
show_relation() {
|
||||
relation_situation="$1"
|
||||
req_pkg_name_val="$2"
|
||||
req_pkg_path="$3"
|
||||
if [ "$relation_situation" = "SUCC" ]; then
|
||||
logandprint "[INFO]: Relationship of ops_transformer with ${req_pkg_name_val} in path ${req_pkg_path} check successfully"
|
||||
return 0
|
||||
else
|
||||
logandprint "[WARNING]: Relationship of ops_transformer with ${req_pkg_name_val} in path ${req_pkg_path} check failed. \
|
||||
do you want to continue. [y/n] "
|
||||
while true; do
|
||||
read yn
|
||||
if [ "$yn" == "n" ]; then
|
||||
echo "stop check!"
|
||||
exit 1
|
||||
elif [ "$yn" = y ]; then
|
||||
break
|
||||
else
|
||||
echo "[WARNING]: Input error, please input y or n to choose!"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
version_check() {
|
||||
path_val="$1"
|
||||
#get ops_transformer version
|
||||
check_opp_version_file
|
||||
ret_check_opp_version_file=$ver_info
|
||||
#get checked path
|
||||
check_path_pre "${path_val}"
|
||||
ret_check_path_pre=$checked_path
|
||||
if [ "${ret_check_path_pre}" != "" ]; then
|
||||
for var in ${ret_check_path_pre}; do
|
||||
# select_last_dir_component "${var}"
|
||||
# component_ret=$last_component
|
||||
#get atc or fwkacllib name
|
||||
select_last_dir_component "${var}"
|
||||
ret_last_component=$last_component
|
||||
#get the version of atc/fwkacllib
|
||||
check_version_file "${var}" "${ret_last_component}"
|
||||
ret_check_version_file=$version_file
|
||||
#check relation
|
||||
check_relation "${ret_check_opp_version_file}" "${ret_last_component}" "${ret_check_version_file}"
|
||||
ret_check_relation=$ret_situation
|
||||
#show relation
|
||||
show_relation "${ret_check_relation}" "${ret_last_component}" "${var}"
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
version_check "${req_ver_path}"
|
||||
exit 0
|
||||
823
csrc/scripts/package/package.py
Normal file
823
csrc/scripts/package/package.py
Normal file
@@ -0,0 +1,823 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
import argparse
|
||||
import csv
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import traceback
|
||||
from argparse import Namespace
|
||||
from collections import namedtuple
|
||||
from collections.abc import Iterator
|
||||
from datetime import datetime, timezone
|
||||
from functools import partial
|
||||
from itertools import chain
|
||||
from typing import TextIO
|
||||
|
||||
import regex as re
|
||||
from common.py.filelist import (
|
||||
FileItem,
|
||||
FileList,
|
||||
check_filelist,
|
||||
create_file_item,
|
||||
generate_filelist,
|
||||
get_transform_nested_path_func,
|
||||
)
|
||||
from common.py.packer import PackageName, create_makeself_pkg_params_factory, create_run_package_command, exec_pack_cmd
|
||||
from common.py.pkg_parser import ParseOption, XmlConfig, get_cann_version_info, parse_xml_config
|
||||
from common.py.utils import pkg_utils
|
||||
from common.py.utils.comm_log import CommLog
|
||||
from common.py.utils.funcbase import invoke, pipe
|
||||
from common.py.utils.pkg_utils import (
|
||||
CONFIG_SCRIPT_PATH,
|
||||
DELIVERY_PATH,
|
||||
FAIL,
|
||||
SUCCESS,
|
||||
TOP_DIR,
|
||||
CompressError,
|
||||
ContainAsteriskError,
|
||||
FilelistError,
|
||||
GenerateFilelistError,
|
||||
PackageNameEmptyError,
|
||||
UnknownOperateTypeError,
|
||||
path_join,
|
||||
)
|
||||
|
||||
|
||||
def get_comments(package_name: PackageName) -> str:
|
||||
"""获取run包注释。"""
|
||||
comments = "_".join([package_name.chip_name.upper(), package_name.func_name.upper(), "RUN_PACKAGE"])
|
||||
return f'"{comments}"'
|
||||
|
||||
|
||||
def get_compress_cmd(delivery_dir: str, pkg_args: Namespace, xml_config: XmlConfig) -> str:
|
||||
"""获取makeself压缩命令"""
|
||||
suffix = xml_config.package_attr.get("suffix")
|
||||
if suffix == "run":
|
||||
package_name = PackageName(xml_config.package_attr, pkg_args, xml_config.version)
|
||||
factory = create_makeself_pkg_params_factory(
|
||||
pkg_args.pkg_output_dir, package_name.getvalue(), get_comments(package_name)
|
||||
)
|
||||
params = factory(pkg_args.makeself_dir, xml_config.package_attr, pkg_args.independent_pkg)
|
||||
pack_cmd, err_msg = create_run_package_command(params)
|
||||
if err_msg:
|
||||
CommLog.cilog_error(err_msg)
|
||||
CommLog.cilog_error("create_run_command failed!")
|
||||
raise CompressError(package_name.getvalue())
|
||||
if pkg_args.independent_pkg:
|
||||
exec_pack_cmd(delivery_dir, pack_cmd, package_name.getvalue())
|
||||
else:
|
||||
CommLog.cilog_error("the repack type '%s' is not support!", suffix)
|
||||
sys.exit(FAIL)
|
||||
try:
|
||||
makeself_dir = os.path.join(TOP_DIR, "build/makeself.txt")
|
||||
with open(makeself_dir, "w") as f:
|
||||
f.write(pack_cmd)
|
||||
except Exception as exception:
|
||||
CommLog.cilog_error(f"save makeself.txt failed!{str(exception)}")
|
||||
sys.exit(FAIL)
|
||||
return package_name.getvalue()
|
||||
|
||||
|
||||
def make_parse_option(args_: argparse.Namespace) -> ParseOption:
|
||||
"""创建解析参数。"""
|
||||
|
||||
return ParseOption(args_.os_arch, args_.pkg_version, args_.build_type, args_.package_check, args_.ext_name)
|
||||
|
||||
|
||||
PrivatePackageOption = namedtuple(
|
||||
"PrivatePackageOption",
|
||||
[
|
||||
"os_arch",
|
||||
"package_suffix",
|
||||
"not_in_name",
|
||||
"pkg_version",
|
||||
"ext_name",
|
||||
"chip_name",
|
||||
"func_name",
|
||||
"version_dir",
|
||||
"disable_multi_version",
|
||||
"suffix",
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
class PackageOption(PrivatePackageOption):
|
||||
"""打包配置参数。"""
|
||||
|
||||
__slots__ = () # 优化内存,避免创建 __dict__
|
||||
|
||||
def __new__(cls, *package_option_args, **kwargs):
|
||||
return super().__new__(cls, *package_option_args, **kwargs)
|
||||
|
||||
|
||||
def generate_info_content(target_conf, ext_name) -> list[str]:
|
||||
"""生成info内容。"""
|
||||
|
||||
def toolchain_llvm_config() -> Iterator[tuple[str, str]]:
|
||||
if "llvm" in ext_name:
|
||||
yield "toolchain", "llvm"
|
||||
|
||||
content_list = [f"{key}={value}" for key, value in chain(target_conf["content"].items(), toolchain_llvm_config())]
|
||||
return content_list
|
||||
|
||||
|
||||
def generate_version_header_content(target_conf) -> Iterator[str]:
|
||||
"""生成version_header内容。"""
|
||||
guard_name = target_conf["value"].replace(".", "_").upper()
|
||||
yield f"#ifndef {guard_name}"
|
||||
yield f"#define {guard_name}"
|
||||
yield ""
|
||||
for name, value in target_conf["content"].items():
|
||||
if name.endswith("_VERSION"):
|
||||
version_infos = get_cann_version_info(name, value)
|
||||
for version_name, version_value in version_infos:
|
||||
yield f"#define {version_name} {version_value}"
|
||||
else:
|
||||
yield f"#define {name} {value}"
|
||||
yield ""
|
||||
yield f"#endif /* {guard_name} */"
|
||||
yield ""
|
||||
|
||||
|
||||
def generate_customized_file(target_conf, ext_name):
|
||||
filepath = os.path.join(TOP_DIR, "build", target_conf.get("value"))
|
||||
|
||||
generator = target_conf.get("generator", "info")
|
||||
if generator == "version_header":
|
||||
content_list = generate_version_header_content(target_conf)
|
||||
else:
|
||||
content_list = generate_info_content(target_conf, ext_name)
|
||||
|
||||
file_content = "\n".join(content_list)
|
||||
try:
|
||||
with open(filepath, "w") as file:
|
||||
file.write(file_content)
|
||||
except Exception as ex:
|
||||
CommLog.cilog_error(f"generate customized file {filepath} failed: {ex}!")
|
||||
return FAIL
|
||||
|
||||
return SUCCESS
|
||||
|
||||
|
||||
def get_module(target_config) -> str:
|
||||
"""获取配置模块。"""
|
||||
module = target_config.get("module", "NA")
|
||||
return module if module else "NA"
|
||||
|
||||
|
||||
def get_operation(operation, target_config) -> str:
|
||||
"""获取操作类型。"""
|
||||
if operation in ("copy", "move") and target_config.get("entity") == "true":
|
||||
return "copy_entity"
|
||||
return operation
|
||||
|
||||
|
||||
def get_permission(target_config) -> str:
|
||||
"""获取配置权限。"""
|
||||
return target_config.get("install_mod", "NA")
|
||||
|
||||
|
||||
def get_owner_group(target_config) -> str:
|
||||
"""获取配置属主。"""
|
||||
# install_own的可能值为$username:$usergroup
|
||||
# 防止变量在install_common_parser.sh中,被eval展开,添加\转义$
|
||||
# 由于awk会消耗1个\,所以需要2个转义符
|
||||
return target_config.get("install_own", "NA").replace("$", "\\\\$")
|
||||
|
||||
|
||||
def get_install_type(target_config) -> str:
|
||||
"""获取安装类型。"""
|
||||
return target_config.get("install_type", "NA")
|
||||
|
||||
|
||||
def get_softlink(target_config) -> list[str]:
|
||||
"""获取配置软链。"""
|
||||
softlink_str = target_config.get("install_softlink")
|
||||
if not softlink_str:
|
||||
return []
|
||||
return softlink_str.split(";")
|
||||
|
||||
|
||||
def get_feature(target_config) -> set[str]:
|
||||
"""获取配置特性。"""
|
||||
return target_config["feature"]
|
||||
|
||||
|
||||
def get_chip(target_config) -> set[str]:
|
||||
"""获取配置芯片。"""
|
||||
return target_config["chip"]
|
||||
|
||||
|
||||
def get_configurable(target_config) -> str:
|
||||
"""获取配置是否为配置文件。"""
|
||||
return target_config.get("configurable", "FALSE")
|
||||
|
||||
|
||||
def get_hash_value(target_config) -> str:
|
||||
"""获取配置哈希值。"""
|
||||
return target_config.get("hash", "NA")
|
||||
|
||||
|
||||
def get_block(target_config) -> str:
|
||||
"""获取配置块信息。"""
|
||||
return target_config.get("name", "NA")
|
||||
|
||||
|
||||
def get_pkg_inner_softlink(target_config) -> list[str]:
|
||||
"""获取配置包内软链。"""
|
||||
softlink_str = target_config.get("pkg_inner_softlink")
|
||||
if not softlink_str:
|
||||
return []
|
||||
return softlink_str.split(";")
|
||||
|
||||
|
||||
def parse_install_info(infos: list, operate_type, filter_key) -> Iterator[FileItem]:
|
||||
"""根据配置解析生成安装信息。"""
|
||||
for target_config in infos:
|
||||
target_name = get_target_name(target_config)
|
||||
if target_config.get("optional") == "true" and operate_type in ("copy", "move"):
|
||||
path = os.path.join(TOP_DIR, DELIVERY_PATH, target_config.get("dst_path"))
|
||||
value = os.path.join(TOP_DIR, DELIVERY_PATH, target_config.get("dst_path"), target_name)
|
||||
if not os.path.exists(path):
|
||||
continue
|
||||
if not os.path.exists(value):
|
||||
continue
|
||||
if operate_type in ("copy", "move"):
|
||||
relative_path_in_pkg = os.path.join(target_config.get("dst_path"), target_name)
|
||||
relative_install_path = path_join(target_config.get("install_path"), target_name)
|
||||
is_dir = target_config.get("is_dir", False)
|
||||
elif operate_type == "mkdir":
|
||||
relative_path_in_pkg = "NA"
|
||||
relative_install_path = target_config.get("value")
|
||||
is_dir = False
|
||||
elif operate_type == "del":
|
||||
relative_path_in_pkg = "NA"
|
||||
relative_install_path = path_join(target_config.get("install_path"), target_name)
|
||||
is_dir = False
|
||||
else:
|
||||
raise UnknownOperateTypeError(f"unknown operate type {operate_type}")
|
||||
|
||||
if relative_install_path is None:
|
||||
continue
|
||||
|
||||
install_type = get_install_type(target_config)
|
||||
if any(key in install_type for key in filter_key):
|
||||
is_in_docker = "TRUE"
|
||||
else:
|
||||
is_in_docker = "FALSE"
|
||||
|
||||
file_item = create_file_item(
|
||||
get_module(target_config),
|
||||
get_operation(operate_type, target_config),
|
||||
relative_path_in_pkg,
|
||||
relative_install_path,
|
||||
is_in_docker,
|
||||
get_permission(target_config),
|
||||
get_owner_group(target_config),
|
||||
install_type,
|
||||
get_softlink(target_config),
|
||||
get_feature(target_config),
|
||||
"N",
|
||||
get_configurable(target_config),
|
||||
get_hash_value(target_config),
|
||||
get_block(target_config),
|
||||
get_pkg_inner_softlink(target_config),
|
||||
get_chip(target_config),
|
||||
is_dir,
|
||||
)
|
||||
|
||||
yield file_item
|
||||
|
||||
|
||||
def execute_repack_process(
|
||||
xml_config: XmlConfig,
|
||||
delivery_dir: str,
|
||||
pkg_args: Namespace,
|
||||
package_name: PackageName = None,
|
||||
package_option: PackageOption = None,
|
||||
):
|
||||
"""
|
||||
功能描述: 执行打包流程(拷贝--->签名--->打包)
|
||||
返回值: SUCCESS/FAIL
|
||||
"""
|
||||
release_dir = os.path.join(delivery_dir, xml_config.default_config.get("name", "default"))
|
||||
# 生成自定义文件
|
||||
for item in xml_config.generate_infos:
|
||||
if generate_customized_file(item, package_option.ext_name):
|
||||
return FAIL
|
||||
|
||||
# 校验包中文件或目录大小
|
||||
if pkg_args.check_size == "True":
|
||||
limit_list, tag = processing_csv_file(
|
||||
release_dir, package_name.func_name, package_name.chip_name, pkg_args.build_type
|
||||
)
|
||||
if not tag:
|
||||
return FAIL
|
||||
if limit_list:
|
||||
abspath = os.path.abspath(release_dir)
|
||||
replace_path = abspath + "/"
|
||||
result = check_add_dir(replace_path, abspath, limit_list)
|
||||
if not result:
|
||||
return FAIL
|
||||
try:
|
||||
package_name = get_compress_cmd(pkg_args.pkg_output_dir, pkg_args, xml_config)
|
||||
except CompressError:
|
||||
return FAIL
|
||||
|
||||
CommLog.cilog_info("package %s generate filelist.csv and makeself cmd successfully!", package_name)
|
||||
return SUCCESS
|
||||
|
||||
|
||||
def check_path_is_conflict(xml_config):
|
||||
"""
|
||||
功能描述: 检查打包时安装路径与软连接路径是否冲突
|
||||
参数: xml_config
|
||||
返回值: SUCCESS/FAIL
|
||||
"""
|
||||
install_path_list = set()
|
||||
pkg_softlink_list = set()
|
||||
for item in xml_config.package_content_list:
|
||||
value_list = item.get("value").split("/")
|
||||
target_name = value_list[-1] if value_list[-1] else value_list[-2]
|
||||
if item.get("install_path"):
|
||||
install_path_list.add(os.path.join(item["install_path"], target_name))
|
||||
if item.get("pkg_inner_softlink"):
|
||||
pkg_softlink = item.get("pkg_inner_softlink")
|
||||
pkg_softlink_list.add(pkg_softlink)
|
||||
if install_path_list & pkg_softlink_list:
|
||||
CommLog.cilog_info("intersection:{}".format(install_path_list & pkg_softlink_list))
|
||||
CommLog.cilog_info("path conflicting: pkg_inner_softlink dir equals install_path!!")
|
||||
return FAIL
|
||||
return SUCCESS
|
||||
|
||||
|
||||
def checksum_value(limit_value, release_dir):
|
||||
"""
|
||||
功能描叙: 校验传入的文件或目录大小是否合格
|
||||
参数:
|
||||
limit_value: limit.csv中的一行数据如[compiler/bin, 3976, 110%]
|
||||
返回值: True/False
|
||||
"""
|
||||
path = os.path.join(release_dir, limit_value[1])
|
||||
if len(limit_value) >= 7:
|
||||
try:
|
||||
max_value = int(limit_value[4])
|
||||
except ValueError:
|
||||
CommLog.cilog_error(f"{path} configuration is not standard., Please check limit.csv.")
|
||||
return True
|
||||
else:
|
||||
CommLog.cilog_error(f"{path} configuration is less than four, Please check limit.csv.")
|
||||
return True
|
||||
if not os.path.exists(path):
|
||||
CommLog.cilog_warning(f"{path} doesn't exist, Please check limit.csv.")
|
||||
return True
|
||||
size = 0
|
||||
for root, dirs, files in os.walk(path):
|
||||
size += os.path.getsize(root)
|
||||
for f in files:
|
||||
filepath = os.path.join(root, f)
|
||||
if os.path.islink(filepath):
|
||||
continue
|
||||
if not os.path.exists(filepath):
|
||||
continue
|
||||
size += os.path.getsize(os.path.join(root, f))
|
||||
if size == 0:
|
||||
size = os.path.getsize(path)
|
||||
if size > max_value * 1024:
|
||||
CommLog.cilog_error(f"\n{path} size {size} bytes exceeds maximum {max_value * 1024} bytes")
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def processing_csv_file(release_dir, package_name, chip_name, build_type):
|
||||
"""
|
||||
功能描叙: 处理limit.csv文件数据
|
||||
返回值: [],True/[],False
|
||||
"""
|
||||
ret = True
|
||||
limit_list = []
|
||||
product = os.path.basename(os.path.dirname(release_dir))
|
||||
limit_path = os.path.join(pkg_utils.TOP_SOURCE_DIR, CONFIG_SCRIPT_PATH, "common/limit.csv")
|
||||
if not os.path.exists(limit_path):
|
||||
CommLog.cilog_warning(f"{limit_path} doesn't exist.")
|
||||
return limit_list, ret
|
||||
with open(limit_path) as file:
|
||||
reader = csv.reader(file)
|
||||
next(reader)
|
||||
for data in reader:
|
||||
if not data:
|
||||
CommLog.cilog_warning("The limit.csv file contains empty lines.")
|
||||
continue
|
||||
if is_match_line(package_name, chip_name, product, build_type, data):
|
||||
if data[1][-1] == "/":
|
||||
limit_list.append(data[1][:-1])
|
||||
else:
|
||||
limit_list.append(data[1])
|
||||
res = checksum_value(data, release_dir)
|
||||
if not res:
|
||||
ret = False
|
||||
return limit_list, ret
|
||||
|
||||
|
||||
def is_match_line(package_name, chip_name, product, build_type, data):
|
||||
return package_name == data[0] and chip_name == data[5] and product == data[6] and build_type == data[7].lower()
|
||||
|
||||
|
||||
def check_add_dir(package_path, dirs, limit_list, ret=True):
|
||||
"""
|
||||
功能描述: 校验新增目录
|
||||
参数: path, limit_list
|
||||
返回值: False/True
|
||||
"""
|
||||
for limit_path in limit_list:
|
||||
if dirs == os.path.join(os.path.split(dirs)[0], limit_path):
|
||||
return ret
|
||||
for dir_file in os.listdir(dirs):
|
||||
path = os.path.join(dirs, dir_file)
|
||||
relative_path = path.replace(package_path, "")
|
||||
if os.path.isfile(path) and relative_path not in limit_list:
|
||||
CommLog.cilog_error(f"{path} is not in limit.csv file and is newly added.")
|
||||
ret = False
|
||||
elif os.path.isdir(path) and relative_path not in limit_list:
|
||||
ret = check_add_dir(package_path, path, limit_list, ret)
|
||||
return ret
|
||||
|
||||
|
||||
def get_target_name(target_conf) -> str:
|
||||
"""获取目标名。"""
|
||||
rename = target_conf.get("rename")
|
||||
if rename:
|
||||
return rename
|
||||
|
||||
value_list = target_conf.get("value").split("/")
|
||||
target_name = value_list[-1] if value_list[-1] else value_list[-2]
|
||||
return target_name
|
||||
|
||||
|
||||
def gen_file_install_list(xml_config: XmlConfig, filter_key) -> tuple[FileList, FileList]:
|
||||
"""生成filelist列表。"""
|
||||
file_install_list = []
|
||||
|
||||
dir_filelist = parse_install_info(xml_config.dir_install_list, "mkdir", filter_key)
|
||||
move_filelist = parse_install_info(xml_config.move_content_list, "move", filter_key)
|
||||
pkg_filelist = parse_install_info(xml_config.package_content_list, "copy", filter_key)
|
||||
gen_filelist = parse_install_info(xml_config.generate_infos, "copy", filter_key)
|
||||
# file_info中配置为文件夹,这里是被展开的文件,则需要单独删除
|
||||
del_filelist = parse_install_info(xml_config.expand_content_list, "del", filter_key)
|
||||
collect_filelist = list(chain(dir_filelist, move_filelist, pkg_filelist, gen_filelist))
|
||||
collect_filelist = list(xml_config.packer_config.fill_is_common_path(collect_filelist))
|
||||
all_filelist = list(chain(collect_filelist, del_filelist))
|
||||
for file_item in all_filelist:
|
||||
file_install_list.append(file_item)
|
||||
|
||||
return file_install_list, []
|
||||
|
||||
|
||||
def generate_filelist_file_by_xml_config(xml_config: XmlConfig, filter_key: list[str], package_check: bool):
|
||||
"""生成文件列表文件。"""
|
||||
check_move = xml_config.package_attr.get("use_move", False)
|
||||
transform_nested_path_func = get_transform_nested_path_func(xml_config.package_attr.get("parallel") or check_move)
|
||||
check_features = xml_config.package_attr.get("check_features", False)
|
||||
|
||||
file_install_list, [] = invoke(
|
||||
pipe(
|
||||
gen_file_install_list,
|
||||
partial(map, transform_nested_path_func),
|
||||
tuple,
|
||||
),
|
||||
xml_config,
|
||||
filter_key,
|
||||
)
|
||||
generate_filelist(file_install_list, "filelist.csv")
|
||||
# 先生成再检查,有利于问题定位
|
||||
check_filelist(file_install_list, check_features, check_move)
|
||||
|
||||
|
||||
def get_pkg_xml_relative_path(pkg_args: Namespace) -> str:
|
||||
"""获取包配置文件相对路径。"""
|
||||
|
||||
def parts():
|
||||
yield CONFIG_SCRIPT_PATH
|
||||
yield pkg_args.pkg_name
|
||||
if pkg_args.chip_scenes:
|
||||
yield pkg_args.chip_scenes
|
||||
# 可以通過build_rule指定xml_file,而且优先级高于默认值
|
||||
if pkg_args.xml_file:
|
||||
yield pkg_args.xml_file
|
||||
else:
|
||||
yield f"{pkg_args.pkg_name}.xml"
|
||||
|
||||
return os.path.join(*parts())
|
||||
|
||||
|
||||
def write_config_inc_var(name: str, package_attr: dict, file: TextIO):
|
||||
"""向config.inc文件写入变量。"""
|
||||
if name in package_attr:
|
||||
value = str(package_attr[name]).lower()
|
||||
file.write(f"{name.upper()}={value}\n")
|
||||
|
||||
|
||||
def generate_config_inc(package_attr: dict):
|
||||
"""生成config.inc文件。"""
|
||||
if "parallel" not in package_attr and "parallel_limit" not in package_attr and "use_move" not in package_attr:
|
||||
return
|
||||
year = datetime.now(timezone.utc).year
|
||||
config_inc = os.path.join(TOP_DIR, "build", "config.inc")
|
||||
header = [
|
||||
"#!/bin/sh\n",
|
||||
"#----------------------------------------------------------------------------\n",
|
||||
f"# Copyright Huawei Technologies Co., Ltd. 2023-{year}. All rights reserved.\n",
|
||||
"#----------------------------------------------------------------------------\n",
|
||||
"\n",
|
||||
]
|
||||
if os.path.isfile(config_inc):
|
||||
os.chmod(config_inc, 0o700)
|
||||
with open(config_inc, "w", encoding="utf-8") as file:
|
||||
file.writelines(header)
|
||||
write_config_inc_var("parallel", package_attr, file)
|
||||
write_config_inc_var("parallel_limit", package_attr, file)
|
||||
write_config_inc_var("use_move", package_attr, file)
|
||||
|
||||
os.chmod(config_inc, 0o500)
|
||||
|
||||
|
||||
def update_version_info(new_version: str):
|
||||
version_path = os.path.join(pkg_utils.TOP_DIR, "version.info")
|
||||
with open(version_path) as file:
|
||||
content = file.read()
|
||||
content = re.sub(r"Version=.*", f"Version={new_version}", content)
|
||||
content = re.sub(r"vension_dir=.*", f"version_dir={new_version}", content)
|
||||
with open(version_path, "w") as file:
|
||||
file.write(content)
|
||||
|
||||
|
||||
def main(pkg_name="", xml_file="", main_args=None):
|
||||
"""
|
||||
功能描述: 执行打包流程(解析配置--->生成文件列表--->执行拷贝/打包动作)
|
||||
参数: pkg_name, os_arch, type
|
||||
返回值: SUCCESS/FAIL
|
||||
"""
|
||||
delivery_dir = os.path.join(TOP_DIR, DELIVERY_PATH)
|
||||
if not os.path.exists(delivery_dir):
|
||||
return FAIL
|
||||
|
||||
config_relative_path = get_pkg_xml_relative_path(main_args)
|
||||
pkg_xml_file = os.path.join(pkg_utils.TOP_SOURCE_DIR, config_relative_path)
|
||||
parse_option = make_parse_option(main_args)
|
||||
if main_args.version_dir:
|
||||
update_version_info(main_args.version_dir)
|
||||
|
||||
try:
|
||||
xml_config = parse_xml_config(pkg_xml_file, delivery_dir, parse_option, main_args)
|
||||
except ContainAsteriskError as ex:
|
||||
CommLog.cilog_error(f"Value contain '*' in {config_relative_path}. value is '{ex.value}'.")
|
||||
return FAIL
|
||||
|
||||
if pkg_name in ["driver", "firmware"]:
|
||||
filter_key = ["all", "docker"]
|
||||
elif pkg_name in ["aicpu_kernels_device", "aicpu_kernels_host"]:
|
||||
filter_key = []
|
||||
else:
|
||||
filter_key = ["all", "run"]
|
||||
|
||||
# 生成filelist.csv安装列表文件
|
||||
try:
|
||||
generate_filelist_file_by_xml_config(
|
||||
xml_config, filter_key, main_args.package_check or xml_config.package_attr.get("package_check")
|
||||
)
|
||||
except PackageNameEmptyError:
|
||||
CommLog.cilog_error(f"package name is empty in {xml_file}, please check it")
|
||||
return FAIL
|
||||
except GenerateFilelistError as ex:
|
||||
CommLog.cilog_error(
|
||||
f"generate filelist {ex.filename} failed!",
|
||||
)
|
||||
return FAIL
|
||||
except FilelistError as ex:
|
||||
CommLog.cilog_error("check filelist error! %s", str(ex))
|
||||
return FAIL
|
||||
|
||||
generate_config_inc(xml_config.package_attr)
|
||||
|
||||
if main_args.independent_pkg:
|
||||
src_file_path = os.path.join(TOP_DIR, "build", "filelist.csv")
|
||||
dst_file_path = os.path.join(main_args.pkg_output_dir, "share", "info", main_args.pkg_name, "script")
|
||||
shutil.copy(src_file_path, dst_file_path)
|
||||
|
||||
package_option = PackageOption(
|
||||
main_args.os_arch,
|
||||
main_args.package_suffix,
|
||||
main_args.not_in_name,
|
||||
main_args.pkg_version,
|
||||
main_args.ext_name,
|
||||
chip_name=main_args.chip_name,
|
||||
func_name=main_args.func_name,
|
||||
version_dir=main_args.version_dir,
|
||||
disable_multi_version=main_args.disable_multi_version,
|
||||
suffix=main_args.suffix,
|
||||
)
|
||||
|
||||
package_name = PackageName(xml_config.package_attr, main_args, xml_config.version)
|
||||
|
||||
# 检查install_path与pkg_inner_softlink路径是否冲突,若冲突则报错
|
||||
if check_path_is_conflict(xml_config) == FAIL:
|
||||
return FAIL
|
||||
|
||||
# 生成打包命令
|
||||
return execute_repack_process(
|
||||
xml_config, delivery_dir, main_args, package_name=package_name, package_option=package_option
|
||||
)
|
||||
|
||||
|
||||
def args_parse():
|
||||
"""
|
||||
功能描述 : 脚本入参解析
|
||||
参数 : 调用脚本的传参
|
||||
返回值 : 解析后的参数值
|
||||
"""
|
||||
parser = argparse.ArgumentParser(description="This script is for package repack processing.")
|
||||
parser.add_argument(
|
||||
"-c",
|
||||
"--chip_scenes",
|
||||
metavar="chip_scenes",
|
||||
required=False,
|
||||
dest="chip_scenes",
|
||||
nargs="?",
|
||||
const="",
|
||||
default="",
|
||||
help="This parameter define chip id for package.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-n", "--pkg_name", metavar="pkg_name", required=False, help="This parameter define pkg_name for config_xml."
|
||||
)
|
||||
parser.add_argument(
|
||||
"-o",
|
||||
"--os_arch",
|
||||
metavar="os_arch",
|
||||
required=False,
|
||||
dest="os_arch",
|
||||
nargs="?",
|
||||
const="",
|
||||
default=None,
|
||||
help="This parameter define the package's os_arch",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-t",
|
||||
"--type",
|
||||
metavar="type",
|
||||
required=False,
|
||||
dest="type",
|
||||
nargs="?",
|
||||
const="",
|
||||
default="repack",
|
||||
help="This parameter define this script's function",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-i",
|
||||
"--not_in_name",
|
||||
metavar="not_in_name",
|
||||
required=False,
|
||||
dest="not_in_name",
|
||||
nargs="?",
|
||||
const="",
|
||||
default="",
|
||||
help="This parameter define the package's name not contain the element",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-v",
|
||||
"--pkg_version",
|
||||
metavar="pkg_version",
|
||||
required=False,
|
||||
dest="pkg_version",
|
||||
nargs="?",
|
||||
const="",
|
||||
default="",
|
||||
help="This parameter define the version for package.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-e",
|
||||
"--ext_name",
|
||||
metavar="ext_name",
|
||||
required=False,
|
||||
dest="ext_name",
|
||||
nargs="?",
|
||||
const="",
|
||||
default="",
|
||||
help="This parameter define the package's ext_name",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--package_suffix",
|
||||
nargs="?",
|
||||
const="none",
|
||||
default="none",
|
||||
help="This parameter define the package suffix, debug or none",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--suffix",
|
||||
metavar="suffix",
|
||||
required=False,
|
||||
dest="suffix",
|
||||
nargs="?",
|
||||
const="",
|
||||
default=None,
|
||||
help="This parameter define the package suffix, for example such as tar.gz",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-b",
|
||||
"--build_type",
|
||||
metavar="build_type",
|
||||
required=False,
|
||||
dest="build_type",
|
||||
nargs="?",
|
||||
const="",
|
||||
default="debug",
|
||||
help="This parameter define release type of package",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-x",
|
||||
"--xml",
|
||||
metavar="xml_file",
|
||||
required=False,
|
||||
dest="xml_file",
|
||||
nargs="?",
|
||||
const="",
|
||||
default="",
|
||||
help="This parameter define xml file",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--chip_name",
|
||||
metavar="chip_name",
|
||||
required=False,
|
||||
dest="chip_name",
|
||||
nargs="?",
|
||||
const=None,
|
||||
default=None,
|
||||
help="This parameter define package chip name, has higher priority than chip name in xml",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--func_name",
|
||||
metavar="func_name",
|
||||
required=False,
|
||||
dest="func_name",
|
||||
nargs="?",
|
||||
const=None,
|
||||
default=None,
|
||||
help="This parameter define package func name, has higher priority than func name in xml",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--source_root",
|
||||
metavar="source_root",
|
||||
required=False,
|
||||
dest="source_root",
|
||||
nargs="?",
|
||||
const="",
|
||||
help="source root dir.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--makeself_dir",
|
||||
metavar="makeself_dir",
|
||||
required=False,
|
||||
dest="makeself_dir",
|
||||
nargs="?",
|
||||
const="",
|
||||
help="makeself dir.",
|
||||
)
|
||||
parser.add_argument("--independent_pkg", action="store_true", help="Independent pkg.")
|
||||
parser.add_argument("--pkg-output-dir", default="", help="Package dirpath.")
|
||||
parser.add_argument("--version_dir", nargs="?", const="", default="", help="Set version dir.")
|
||||
parser.add_argument("--tag", metavar="tag", nargs="?", const="", default="")
|
||||
parser.add_argument("--disable-multi-version", action="store_true", help="Disable multi version.")
|
||||
# 检查打包配置
|
||||
parser.add_argument("--package-check", action="store_true", help="check package config.")
|
||||
parser.add_argument("--check_size", nargs="?", const="", default="", help="Check the size of a file or directory.")
|
||||
parser.add_argument("--pkg-name-style", metavar="pkg_name_style", default="common", help="Package name style.")
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
CommLog.cilog_info("%s", " ".join(sys.argv))
|
||||
args = args_parse()
|
||||
try:
|
||||
if args.source_root:
|
||||
pkg_utils.TOP_SOURCE_DIR = args.source_root
|
||||
if args.build_type == "":
|
||||
args.build_type = "debug"
|
||||
else:
|
||||
args.build_type = args.build_type.lower()
|
||||
status = main(args.pkg_name, args.xml_file, main_args=args)
|
||||
except Exception as e:
|
||||
CommLog.cilog_error("exception is occurred (%s)!", e)
|
||||
CommLog.cilog_info("%s", traceback.format_exc())
|
||||
status = FAIL
|
||||
sys.exit(status)
|
||||
Reference in New Issue
Block a user