鲲鹏 DevKit 实战!华为开发者空间演示 C/C++ 源码迁移

1 概述
1.1 背景介绍
鲲鹏和传统 X86 两者的指令集不同(X86 是复杂指令集、鲲鹏使用精简指令集),一样的代码经过编译后,在不同的芯片架构下转换成的不同的机器码,从而不能交叉运行。为了帮助开发者解决将软件从 X86 平台迁移到鲲鹏平台过程中遇到的疑难问题,鲲鹏提供了 DevKit 迁移工具,帮助开发者更快更方便的实现跨平台软件的迁移。
在案例中将完成鲲鹏 DevKit 代码迁移工具的使用,了解其基本功能和使用方法。本案例将指导开发者如何使用鲲鹏 DevKit 代码迁移工具,以 smartdenovo 软件包为待迁移案例展示 C&C++软件的快速迁移过程,达到快速完成 C&C++源码迁移的目的。
如果希望更进一步了解 DevKit 代码迁移工具 Porting Advisor,欢迎大家前往鲲鹏社区了解代码迁移工具的详细使用方法。
1.2 适用对象
企业
个人开发者
高校学生
1.3 案例时间
本案例总时长预计 60 分钟。
1.4 案例流程

说明:
① 下载迁移源码;
② 自动部署装有 DevKit 的鲲鹏云服务器;
③ 安装鲲鹏代码迁移插件;
④ 登录 DevKit 工具;
⑤ 执行源码扫描任务;
⑥ 根据扫描报告修改源码。
最新案例动态,请查阅 《鲲鹏DevKit快速完成C&C++源码迁移》。小伙伴快来领取华为开发者空间进行实操吧!
2 操作步骤
2.1 开发者空间配置
进入华为开发者空间工作台界面,点击打开云主机 > 进入桌面连接云主机。如果还没由领取云主机进入工作台界面后点击配置云主机,选择 Ubuntu 操作系统。


2.2 下载迁移源码
Smartdenovo 是一款在 github 上开源的一款基于 C 语言开发的开源软件,基于 X86 平台进行开发,源码地址如下:https://github.com/ruanjue/smartdenovo。
在案例的过程中,还需要 avxToNeon 的源代码,当应用程序从 x86 架构移植到鲲鹏架构时,由于 Arm64 指令名称和功能与 x86 不同,需要进一步开发指令。
为了减少用户的移植工作量,在 avxToNeon 项目中,常用的 AVX 指令被封装为独立的模块, AVX 指令被相关的 NEON SIMD 指令取代,而指令名称和功能保持不变。用户可以通过将相关头文件导入应用软件来调用相应的指令。avxToNeon 的源码存放地址如下:https://github.com/kunpengcompute/AvxToNeon。
在云主机桌面创建 smart-denovo 文件夹,在该文件夹下打开终端命令窗口,克隆两个开源项目代码:

将 AvxToNeon 复制到 smartdenovo 项目目录下,然后将 smartdenovo 打成 zip 压缩包,留作后面创建源码迁移任务。注:系统可能未预装 zip 工具,需要手动安装,安装完成后进行文件压缩:


压缩完成后查看文件夹结构:

2.3 自动部署装有 DevKit 的鲲鹏云服务器
在云主机打开终端窗口,执行自动部署命令:
命令的参数说明:
password:password 关键字后设置的是鲲鹏云服务器的 root 用户密码,命令中给出的默认为 abcd1234@,开发者可以替换成自定义密码(至少 8 个字符)。
time:time 关键字后面设置的为鲲鹏云服务器的可用时间,单位为秒,至少 600 秒。当前案例预估需要 1 小时,为了保证时间充足,在命令中申请的时间为 2 小时,即 7200 秒。
该命令会自动部署鲲鹏云服务器并安装 DevKit。首次部署会直接执行,旧资源未到期时重复部署,会提示是否删除前面创建的资源,可以删除旧资源再次部署。
记录部署远端服务器公网 IP、Devkit 平台访问地址,如:124.XX.XX.XX、https://124.XX.XX.XX:8084;实际使用中以个人部署返回IP和地址为准。

2.4 安装鲲鹏代码迁移插件
方式一:在线安装
进入云主机,打开 CodeArts IDE,点击右侧“扩展”搜索“Kunpeng Porting Advisor Plugin”点击安装该插件。

方式二:本地安装
前往 CodeArts IDE 插件市场下载插件 Kunpeng Porting Advisor Plugin 到云主机,下载地址为:CodeArts IDE插件市场。

在云主机桌面,打开 CodeArts IDE 开发环境,单击右侧“扩展”按钮,点击从本地安装,选择下载好的插件安装。

使用任一方式安装好插件后,在 CodeArts IDE 点击左上角“文件”,选择“设置”,在设置界面选择“应用程序”-“代理服务器”,将“Proxy Support”设置为“off”。

2.5 登录 DevKit 工具
在云主机进入 CodeArts IDE,打开安装好的鲲鹏代码迁移插件,点击“…”中的“配置远端服务器”。

配置远端服务器成功后,点击“登录”,首次登录需要创建管理员密码。

设置密码后进行登录。

2.6 执行源码扫描任务
登录代码迁移工具成功后,在插件窗口新建源码迁移任务。

在新建源码迁移任务界面,上传 2.2 步骤打好的 smartdenovo.zip 压缩包,目标操作系统切换成 EulerOS 2.8,其他保持默认,点击“开始分析”。


扫描完成完成后,点击 CodeArts IDE 下面“终端”登录到远端弹性云服务器(命令:ssh root@远端服务器公网 IP),在远端服务器中执行以下命令,编译迁移前的代码,对比迁移效果。
尝试编译未进行迁移修改的代码,查看是否可以编译成功。编译运行命令如下:
从执行结果中可以看到,编译过程报错,无法成功编译 smartdenovo 软件包。

接下来根据扫描报告修改源码后再编译。
2.7 根据扫描报告修改源码
在扫描报告界面,可以在“需要迁移的源文件”下查看需要修改文件,点击“查看建议代码”后可跳转到源码页面,根据修改建议直接修改源码。从迁移报告中可以得知,有 Makefile 和 ksw.c 两个文件需要修改。首先点击 ksw.c 对应的“查看建议代码”按钮,修改 ksw.c 的源代码。

修改源码文件 ksw.c
根据源码页面中的红色波浪线发现一共有两处修改点。修改点一:

点击“快速修复…”按钮后,在右下角的弹框中点击确认按钮,自动完成此处的代码适配。
修改后,效果如下:

修改点二:

使用快速自动修改,修改效果如下图所示,增加了 ARM 的 NEON 指令库头文件。

增加的头文件需要引入到工程中,点击 CodeArts IDE 下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网 IP),在远端服务器中执行以下命令将头文件目录复制一份到/opt/portadv/portadmin/sourcecode/smartdenovo 的 include 目录里。

修改构建文件 Makefile
在“源码迁移建议”页面,查看 Makefile 文件的修改建议,悬浮在黄色波浪线的语句上,可以看到详细的迁移建议。

根据建议,Makefile 文件中需要给 CFLAGS 变量增加选项内容-march=armv8-a -fsigned-char,同时,还需要删除 CFLAGS 变量中的选项“-mpopcnt”和“-msse3”。 同时,由于增加了额外的 Neon 库头文件,Makefile 文件中还需要给 CFLAGS 变量增加选项内容-I./include/AvxToNeon。修改效果如下:

图片中 5-7 行代码修改为如下:
此外,因 smartdenovo 的系统兼容性问题,在 CodeArts IDE 的系统中无法直接编译,还需要修改 smartdenovo/wtlay.h 文件。点击 CodeArts IDE 下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网 IP),在远端服务器中执行以下命令进行修改:
回车后进入编辑界面,点击 ESC 按键后,输入:516,按回车后跳转到 516 行,按下键盘上的 A 按键,进入编辑模式,如下图所示。

在该行前面添加“static”,修改完成后点击 ESC 按键,输入:wq!,点击回车。
至此,所有源码迁移修改都已经完毕。点击 CodeArts IDE 下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网 IP),在远端服务器中执行以下命令进行编译,从输出中可以看到,编译成功完成,无报错信息展示:

迁移后可以在远端鲲鹏云服务器上编译成功。点击 CodeArts IDE 下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网 IP),在远端服务器中编译生成的二进制文件有 wtmsa,wtcns,wtlay 等。可以执行这些文件看看。
到这里整个迁移流程就已经结束了,通过上面的源码迁移动作我们拿到了可以在鲲鹏平台上运行的 smartdenovo 软件包。各位鲲鹏开发者也可以参考上面的软件迁移过程迁移一些其他的跨平台软件,同时探索迁移工具提供的软件包扫描、亲和分析等功能,更深入的掌握迁移工具的使用方法。
除了上述学习内容,鲲鹏社区还提供了很多辅助学习资源(课程/实验/文档/文章),希望能帮助到您更好的使用鲲鹏 DevKit 迁移工具:
2.8 反馈改进建议
如您在案例实操过程中遇到问题或有改进建议,可以到论坛帖评论区反馈即可,我们会及时响应处理,谢谢!
评论