合并受阻
变更摘要
本 PR 旨在修复 rpm/deb 包安装后缺少关键文件(tools/ascend_system_advisor、tools/hccl_test、tools/msaicerr、tools/profiler 及 lib64/libascend_dump_parser.so)导致工具不可用的问题。根本原因是 rpm/deb 模式下 INSTALL_LIBRARY_DIR 被设为相对路径 .,而各组件的 install 规则硬编码为 ${INSTALL_LIBRARY_DIR}/tools/...,实际路径变成 ./tools/...,被 CPack 文件收集逻辑遗漏。本 PR 在 CMakeLists.txt 中新增条件化变量 INSTALL_TOOLS_DIR 与 INSTALL_LIB64_DIR:rpm/deb 包使用相对路径 tools/、lib64/(符合 FHS 标准),run 包保持原有绝对路径不变;同时在 cmake/package.cmake 中禁用 rpm 的 brp-strip,避免对 Ascend NPU 非标准 ELF 格式的 .o 文件执行 strip 失败,并为 msprofbin、acp 等二进制显式设置执行权限,修复安装后缺少执行权限的问题。
主要改动
- 新增条件化安装目录变量:在
CMakeLists.txt中根据PACKAGE_TYPE引入INSTALL_TOOLS_DIR(rpm/deb 为tools,run 为${OAM_STAGING_DIR}/tools)与INSTALL_LIB64_DIR(rpm/deb 为lib64,run 为${OAM_STAGING_DIR}/${CMAKE_SYSTEM_PROCESSOR}-linux/lib64),确保各组件在 rpm/deb 包中按 FHS 路径被正确收集。 - 禁用 rpm 的 brp-strip:
cmake/package.cmake的pack_built_in中,当PACKAGE_TYPE为rpm时通过CPACK_RPM_SPEC_MORE_DEFINE将__strip、__objdump指向/bin/true并置空debug_package,避免对 Ascend NPU 的.o文件(非标准 ELF 格式)执行 strip 失败。 - 显式设置二进制执行权限:
src/msprof/collector/dvvp/msprofbin/CMakeLists.txt与acp/CMakeLists.txt的install(TARGETS ...)增加PERMISSIONS(owner/group/world 读+执行),修复二进制文件安装后缺少执行权限。 - 组件 install 规则改用新变量:
src/asys、src/hccl_test、src/operator_cmp、src/msprof等改用INSTALL_TOOLS_DIR,src/msaicerr/proto_parse改用INSTALL_LIB64_DIR,替代原先基于INSTALL_LIBRARY_DIR的硬编码路径。


Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
For more, you also can visit HICANN.
PR Approval Progress
⚠️ This PR does not yet meet the following requirements:lgtm (requires ≥ 2 person(s) per module)、approve (requires ≥ 1 person(s) per module)
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| repo-cann/oam-tools | ❌ 金瑛琪 (1/2)(You can also ask: 袁江, 姚广修, chenhao_1209, wulinyu, fujun19) | ❌ (0/1)(You can also ask: newstarzj, fujun19, chenhao_1209, 姚广修, zhuliangying) |
| src/hccl_test | ❌ 金瑛琪 (1/2)(You can also ask: 姚广修, ouyangxizi, wulinyu, ccl_ligang, temper7620) | ❌ (0/1)(You can also ask: lilianlin_hw, lilin_137, ccl_ligang, temper7620, Innoecho) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
sinat_31531339, thanks for your pull request. All authors of the commits have signed the CLA. 👍


更正:我此前贴的权限对照数据无效
@jinyingqi @newstarzj 我此前在本 PR 里贴过一组"XML=440 → 安装后 440 → Permission denied"的对照数据,那组数据是无效的:我改了 XML 但没有重新构建 run 包,量到的是旧包的行为。重新做了控制变量实测,结论相反,更正如下。
实测:只变 XML install_mod 一个变量,各自重建 + 全新安装
XML install_mod |
filelist 逐文件 mode | 安装后实际权限 | 可执行 |
|---|---|---|---|
440(改动前) |
440 | 550 r-xr-x--- |
✅ |
550(本 PR) |
550 | 550 r-xr-x--- |
✅ |
两者一致 —— 本 PR 的 XML 改动对 run 包是 no-op。
run 包权限的真正来源是 entity 递归
oam_tools.xml:32:
<file value="profiler" install_mod="550" entity="true"/>
entity="true" 生成 copy_entity tools/profiler mode=550 条目,change_mod_and_own_files_recursive 对整棵子树递归赋 550。在 install_common_parser.sh:do_chmod_file_dir 里,该递归跑在逐文件那一遍之后;且 <copy_all>true</copy_all> 使逐文件那遍被 COPY_ALL != y 闸门跳过。所以逐文件的 440 在 run 包侧从未生效。
随之作废的另两条说法
- 我说过"打包期是 555,CMake PERMISSIONS 生效"——我当时量的 run 包构建于加
PERMISSIONS之前,包内实际是 CMake 默认 755。重建后才是 555。 - 我说过"440 之下
asys profiling三种包形态都坏"——对 run 包不成立。我量到的PermissionError来自我自己手动chmod 440的文件,不是 run 包真实安装态。
但 XML 改动对 rpm/deb 仍必需
不对称在 gen_postinst_prerm.py:generate_set_permission:它没有 copy_entity 递归那一遍(该文件内 copy_entity / recursive 零命中),只按逐条 install_mod 产 chmod。因此逐文件的 440 在 rpm/deb 侧是终值 → case "440" ... chmod 444 → 不可执行。
这也说明 @jinyingqi 那条 major 意见成立,但影响面仅在 rpm/deb:run 包有 entity 递归兜底,rpm/deb 没有。RPM 侧实测:改后 postinst 里 profiler/bin 三处赋权为 case "550",彻底卸载后全新安装、不手动改权限,msprof --help 可直接执行。
更彻底的修法是让 generate_set_permission 支持 copy_entity 递归、与 run 包对齐,但那在 cann-cmake 不在本仓范围,故本 PR 改本仓能改的逐文件值(对 run 冗余、对 rpm/deb 必需)。
关于 @newstarzj 的"缺打包验证测试"
这条我此前判断为"可作后续 CI 增强、不阻塞本 PR",这个判断是错的。我在本轮里标为"已验证"而事后查出未做的三处(deb 安装权限、.spec 三条 define、上面这张对照表),全都落在"只在打包末端体现、无用例保护"的位置。你说的"路径类问题易漏到发版",先漏在了评审环节。


问题:新增的 rpm/deb 安装布局分支依赖 PACKAGE_TYPE,但仓库当前 build.sh 没有解析 --pkg-type,也没有向 cmake 传入 -DPACKAGE_TYPE,用户按 PR 描述执行 bash build.sh --pkg-type=rpm/deb 时不会进入该分支,甚至会被 getopt 判为非法参数。
- 严重程度:major
- 影响:rpm/deb 包构建入口不可用或仍按默认 run 分支生成安装路径,PR 声称修复的 rpm/deb 缺文件问题无法通过项目标准构建命令稳定复现和交付。
- 修改建议:同步修改 build.sh,增加 --pkg-type 参数校验,仅允许 run/rpm/deb,并在 CMAKE_ARGS 中传入 -DPACKAGE_TYPE=${PKG_TYPE};同时按包类型调用对应 CPack 生成流程并回归验证这三个入口命令。


结论:有问题,下面几处建议先处理。
- 新增的 rpm/deb 安装布局分支依赖 PACKAGE_TYPE,但仓库当前 build.sh 没有解析 --pkg-type,也没有向 cmake 传入 -DPACKAGE_TYPE,用户按 PR 描述执行 bash build.sh --pkg-type=rpm/deb 时不会进入该分支,甚至会被 getopt 判为非法参数。 (CMakeLists.txt:37)
- 严重程度:major
- 影响:rpm/deb 包构建入口不可用或仍按默认 run 分支生成安装路径,PR 声称修复的 rpm/deb 缺文件问题无法通过项目标准构建命令稳定复现和交付。
- 修改建议:同步修改 build.sh,增加 --pkg-type 参数校验,仅允许 run/rpm/deb,并在 CMAKE_ARGS 中传入 -DPACKAGE_TYPE=${PKG_TYPE};同时按包类型调用对应 CPack 生成流程并回归验证这三个入口命令。


我建议按这个顺序处理,改起来会比较顺:
- CMakeLists.txt:37 同步修改 build.sh,增加 --pkg-type 参数校验,仅允许 run/rpm/deb,并在 CMAKE_ARGS 中传入 -DPACKAGE_TYPE=${PKG_TYPE};同时按包类型调用对应 CPack 生成流程并回归验证这三个入口命令
这些处理完后,我再看一遍剩下的风险点。


描述
rpm 和 deb 包安装后缺少以下关键文件,导致工具无法使用:
tools/ascend_system_advisor/- 系统诊断工具tools/hccl_test/- HCCL 测试工具tools/msaicerr/- AI Core 错误分析工具tools/profiler/- 性能分析工具(包含 msprof、acp)lib64/libascend_dump_parser.so- dump 数据解析库变更类型
根本原因
INSTALL_LIBRARY_DIR在 rpm/deb 模式下设置为相对路径.,但各组件的 install 规则硬编码为${INSTALL_LIBRARY_DIR}/tools/...,导致实际路径变成./tools/...,被 CPack 的文件收集逻辑遗漏。此外还存在:
.o文件(非标准 ELF 格式)执行 strip 失败解决方案
1. 引入条件化变量
if(PACKAGE_TYPE STREQUAL "rpm" OR PACKAGE_TYPE STREQUAL "deb") set(INSTALL_LIBRARY_DIR .) set(INSTALL_TOOLS_DIR tools) # 新增 set(INSTALL_LIB64_DIR lib64) # 新增 else() set(INSTALL_LIBRARY_DIR ${OAM_STAGING_DIR}) set(INSTALL_TOOLS_DIR ${OAM_STAGING_DIR}/tools) set(INSTALL_LIB64_DIR ${OAM_STAGING_DIR}/${CMAKE_SYSTEM_PROCESSOR}-linux/lib64) endif()tools/,lib64/),符合 FHS 标准2. 禁用 rpm 的 brp-strip
if(PACKAGE_TYPE STREQUAL "rpm") set(CPACK_RPM_SPEC_MORE_DEFINE "%define __strip /bin/true %define __objdump /bin/true %define debug_package %{nil}") endif()避免对 bundle/opp/built-in 中的 Ascend NPU
.o文件执行 strip 失败。3. 显式设置二进制执行权限
install(TARGETS msprofbin ${INSTALL_OPTIONAL} RUNTIME DESTINATION ${INSTALL_TOOLS_DIR}/profiler/bin PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE COMPONENT oam-tools )修改内容
CMakeLists.txtcmake/package.cmakesrc/asys/CMakeLists.txtsrc/msaicerr/CMakeLists.txtsrc/msaicerr/proto_parse/CMakeLists.txtsrc/hccl_test/CMakeLists.txtsrc/operator_cmp/CMakeLists.txtsrc/msprof/CMakeLists.txtsrc/msprof/collector/dvvp/msprofbin/CMakeLists.txtsrc/msprof/collector/dvvp/acp/CMakeLists.txt总计:10 个文件,~50 行代码,18 处修改点
验证结果
RPM 包 ✅
DEB 包 ✅
bash build.sh --pkg-type=deb -j16 sudo dpkg -i build_out/cann-oam-tools_*.deb功能验证:
python3 /usr/local/Ascend/cann-9.1.0/tools/ascend_system_advisor/asys/asys.py --help ✅ /usr/local/Ascend/cann-9.1.0/tools/profiler/bin/msprof --help ✅ python3 -c "import ctypes; ctypes.CDLL('/usr/local/Ascend/cann-9.1.0/lib64/libascend_dump_parser.so')" ✅RUN 包兼容性 ✅
路径对比:
lib64/aarch64-linux/lib64/如何测试
构建验证
# 构建所有包类型 bash build.sh --pkg-type=rpm -j16 bash build.sh --pkg-type=deb -j16 bash build.sh --pkg-type=run -j16 # 验证包内容 rpm -qpl build_out/cann-oam-tools_*.rpm | grep -E "tools/|lib64/" dpkg-deb -c build_out/cann-oam-tools_*.deb | grep -E "tools/|lib64/"安装测试
# DEB 包 sudo dpkg -i build_out/cann-oam-tools_*.deb ls -la /usr/local/Ascend/cann-9.1.0/tools/ ls -la /usr/local/Ascend/cann-9.1.0/lib64/libascend_dump_parser.so # RPM 包 sudo rpm -ivh build_out/cann-oam-tools_*.rpm ls -la /usr/local/Ascend/cann-9.1.0/tools/功能测试
# asys python3 /usr/local/Ascend/cann-9.1.0/tools/ascend_system_advisor/asys/asys.py --help # msprof /usr/local/Ascend/cann-9.1.0/tools/profiler/bin/msprof --help # 库加载 python3 -c "import ctypes; ctypes.CDLL('/usr/local/Ascend/cann-9.1.0/lib64/libascend_dump_parser.so')"参考
核对清单
其他信息
影响范围