【开发者空间实践指导】鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移
一、 案例介绍
鲲鹏和传统X86两者的指令集不同(X86是复杂指令集、鲲鹏使用精简指令集),一样的代码经过编译后,在不同的芯片架构下转换成的不同的机器码,从而不能交叉运行。为了帮助开发者解决将软件从X86平台迁移到鲲鹏平台过程中遇到的疑难问题,鲲鹏提供了DevKit迁移工具,帮助开发者更快更方便的实现跨平台软件的迁移。
本次实验将完成鲲鹏DevKit代码迁移工具的使用,了解其基本功能和使用方法。本案例将指导开发者如何使用鲲鹏DevKit代码迁移工具,以smartdenovo软件包为待迁移案例展示C/C++软件的快速迁移过程,达到快速完成C&C++源码迁移的实验目的。
如果希望更进一步了解DevKit代码迁移工具Porting Advisor,欢迎大家前往鲲鹏社区了解代码迁移工具的详细使用方法:
https://www.hikunpeng.com/document/detail/zh/kunpengdevps/porting/qs/qs-pa-kunpengdevps.html
二、 免费领取云主机
如您还没有云主机,可点击链接,根据领取指南进行操作。
如您已领取云主机,可直接开始实验。
三、 实验流程
说明:
① 下载迁移源码;
② 自动部署装有DevKit的鲲鹏服务器;
③ 安装鲲鹏代码迁移插件;
④ 登录DevKit工具;
⑤ 执行源码扫描任务;
⑥ 根据扫描报告修改源码。
四、下载迁移源码
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压缩包,留作后面创建源码迁移任务。
五、自动部署装有DevKit的鲲鹏服务器
在云主机打开终端窗口,执行自动部署命令:
hcd deploy --password 远端服务器密码 --time 3600
# --password 待部署项目所在ECS的root用户密码(至少8个字符)
# --time value 待部署资源的保留期(单位为秒,至少600秒,默认600秒)。当前实验预估需要1小时,可以配置time为1-2小时保留期。
该命令会自动部署鲲鹏服务器并安装DevKit。首次部署会直接执行,旧资源未到期时重复部署,会提示是否删除前面创建的资源,可以删除旧资源再次部署。
记录部署远端服务器公网IP、Devkit平台访问地址,如截图中对应的就是:124.71.195.85、https://124.71.195.85:8084。
六、安装鲲鹏代码迁移插件
方式一:在线安装
进入云主机 ,打开CodeArts IDE,点击左侧“扩展”搜索“Kunpeng Porting Advisor Plugin”点击安装该插件
方式二:本地安装
前往鲲鹏社区官网下载插件Kunpeng Porting Advisor Plugin到云主机,下载地址为:CodeArts IDE插件市场 。
在云主机桌面,打开CodeArts IDE开发环境,单击右侧“扩展”按钮,点击从本地安装,选择下载好的插件安装。
使用任一方式安装好插件后,在CodeArts IDE点击左上角“文件”,选择“设置”,在设置界面选择“应用程序”-“代理服务器”,将“Proxy Support”设置为“off”。
七、登录DevKit工具
在云主机进入CodeArts IDE,打开安装好的鲲鹏代码迁移插件,点击“…”中的“配置远端服务器”。
填配置远端服务器成功后,点击“登录”,首次登录需要创建管理员密码。
安装完成后选择“采用SSH连接时输入的IP地址xxx.xxx.xx.xx”然后点击立即登录。
首次登录需要设置密码,设置密码后进行登录。
八、执行源码扫描任务
登录代码迁移工具成功后,在插件窗口新建源码迁移任务。
在新建源码迁移任务界面,上传步骤五打好的smartdenovo.zip压缩包,目标操作系统切换成CentOS 7.6,其他保持默认,点击“开始分析”。
扫描完成完成后,点击CodeArts IDE下面“终端”登录到远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中执行以下命令,编译迁移前的代码,对比迁移效果。
尝试编译未进行迁移修改的代码,查看是否可以编译成功。编译运行命令如下:
cd /opt/portadv/portadmin/sourcecode/smartdenovo/
make
从执行结果中可以看到,编译过程报错,无法成功编译smartdenovo软件包。
接下来根据扫描报告修改源码后再编译。
九、根据扫描报告修改源码
在扫描报告界面,可以在“需要迁移的源文件”下查看需要修改文件,点击“查看建议代码”后可跳转到源码页面,根据修改建议直接修改源码。从迁移报告中可以得知,有Makefile和ksw.c两个文件需要修改。首先点击ksw.c对应的“查看建议代码”按钮,修改ksw.c的源代码
1、 修改源码文件ksw.c
根据源码页面中的红色波浪线发现一共有两处修改点
修改点一:
点击“快速修复…”按钮后,在右下角的弹框中点击确认按钮,自动完成此处的代码适配。
修改后,效果如下:
修改点二:
使用快速自动修改,修改效果如下图所示,增加了ARM的NEON指令库头文件。
增加的头文件需要引入到工程中,点击CodeArts IDE下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中执行以下命令将头文件目录复制一份到/opt/portadv/portadmin/sourcecode/smartdenovo的include目录里。
cd /opt/portadv/portadmin/sourcecode/smartdenovo
mkdir include
cp -r /opt/portadv/portadmin/sourcecode/smartdenovo/AvxToNeon /opt/portadv/portadmin/sourcecode/smartdenovo/include/AvxToNeon
2、 修改构建文件Makefile
在“源码迁移建议”页面,查看Makefile文件的修改建议,悬浮在黄色波浪线的语句上,可以看到详细的迁移建议。
根据建议,Makefile文件中需要给CFLAGS变量增加选项内容-march=armv8-a -fsigned-char,同时,还需要删除CFLAGS变量中的选项“-mpopcnt”和“-msse3”。 同时,由于增加了额外的Neon库头文件,Makefile文件中还需要给CFLAGS变量增加选项内容-I./include/AvxToNeon。同时由于CentOS7.6编译器GCC4.8.5默认采用C89标准编译,需执行使用C99标准编译,还需要给CFLAGS变量增加选项内容 -std=c99。修改效果如下:
图片中5-7行代码修改为如下:
CFLAGS=-I./include/AvxToNeon -g3 -W -Wall -O0 -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -march=armv8-a -fsigned-char -std=c99
else
CFLAGS=-I./include/AvxToNeon -W -Wall -O4 -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -march=armv8-a -fsigned-char -std=c99
此外,因smartdenovo的系统兼容性问题,在CodeArts IDE的系统中无法直接编译,还需要修改 smartdenovo/wtlay.h 文件。点击CodeArts IDE下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中执行以下命令进行修改:
cd /opt/portadv/portadmin/sourcecode/smartdenovo/
vi wtlay.h
回车后进入编辑界面,点击ESC按键后,输入:515,按回车后跳转到515行,按下键盘上的A按键,进入编辑模式,如下图所示。
在该行前面添加“static”,修改完成后点击ESC按键,输入:wq!,点击回车。
至此,所有源码迁移修改都已经完毕。点击CodeArts IDE下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中执行以下命令进行编译,从输出中可以看到,编译成功完成,无报错信息展示:
cd /opt/portadv/portadmin/sourcecode/smartdenovo/
make
迁移后可以在远端鲲鹏服务器上编译成功。点击CodeArts IDE下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中编译生成的二进制文件有 wtmsa,wtcns,wtlay等。可以执行这些文件看看。
./wtmsa
至此该实验已完成。
更多学习内容
到这里整个实验流程就已经结束了,通过上面的源码迁移动作我们拿到了可以在鲲鹏平台上运行的smartdenovo软件包。各位鲲鹏开发者也可以参考上面的软件迁移过程迁移一些其他的跨平台软件,同时探索迁移工具提供的软件包扫描、亲和分析等功能,更深入的掌握迁移工具的使用方法。
除了上述学习内容,我们还提供了很多辅助学习资源(课程/实验/文档/文章),希望能帮助到您更好的使用鲲鹏DevKit迁移工具:
- 点赞
- 收藏
- 关注作者
评论(0)