1 概述

1.1 背景介绍

鲲鹏和传统X86两者的指令集不同(X86是复杂指令集、鲲鹏使用精简指令集),一样的代码经过编译后,在不同的芯片架构下转换成的不同的机器码,从而不能交叉运行。为了帮助开发者解决将软件从X86平台迁移到鲲鹏平台过程中遇到的疑难问题,鲲鹏提供了DevKit迁移工具,帮助开发者更快更方便的实现跨平台软件的迁移。

在案例中将完成鲲鹏DevKit代码迁移工具的使用,了解其基本功能和使用方法。本案例将指导开发者如何使用鲲鹏DevKit代码迁移工具,以smartdenovo软件包为待迁移案例展示C&C++软件的快速迁移过程,达到快速完成C&C++源码迁移的目的。

如果希望更进一步了解DevKit代码迁移工具Porting Advisor,欢迎大家前往鲲鹏社区了解代码迁移工具的详细使用方法。

1.2 适用对象

  • 企业
  • 个人开发者
  • 高校学生

1.3 案例时间

本案例总时长预计60分钟。

1.4 案例流程

image.png

说明:

① 下载迁移源码;

② 自动部署装有DevKit的鲲鹏云服务器;

③ 安装鲲鹏代码迁移插件;

④ 登录DevKit工具;

⑤ 执行源码扫描任务;

⑥ 根据扫描报告修改源码。

1.5 资源总览

本案例预计花费0元。

资源名称 规格 单价(元) 时长(分钟)
开发者空间-云主机 鲲鹏通用计算增强型 kC2 | 4vCPUs | 8G | Ubuntu 0 60

最新案例动态,请查阅 《鲲鹏DevKit快速完成C&C++源码迁移》。小伙伴快来领取华为开发者空间进行实操吧!

2 操作步骤

2.1 开发者空间配置

进入华为开发者空间工作台界面,点击打开云主机 > 进入桌面连接云主机。
如果还没由领取云主机进入工作台界面后点击配置云主机,选择Ubuntu操作系统。

image.png
image.png

2.2 下载迁移源码

Smartdenovo是一款在github上开源的一款基于C语言开发的开源软件,基于X86平台进行开发,源码地址如下:https://github.com/ruanjue/smartdenovo

git clone https://github.com/ruanjue/smartdenovo

在案例的过程中,还需要avxToNeon的源代码,当应用程序从x86架构移植到鲲鹏架构时,由于Arm64指令名称和功能与x86不同,需要进一步开发指令。

为了减少用户的移植工作量,在avxToNeon项目中,常用的AVX指令被封装为独立的模块, AVX指令被相关的NEON SIMD指令取代,而指令名称和功能保持不变。用户可以通过将相关头文件导入应用软件来调用相应的指令。avxToNeon的源码存放地址如下:https://github.com/kunpengcompute/AvxToNeon

git clone https://github.com/kunpengcompute/AvxToNeon

在云主机桌面创建smart-denovo文件夹,在该文件夹下打开终端命令窗口,克隆两个开源项目代码:

image.png

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

# 工具安装
sudo apt-get install zip unzip

image.png

# 文件压缩
zip -r smartdenovo.zip smartdenovo/

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

unzip -l smartdenovo.zip

image.png

2.3 自动部署装有DevKit的鲲鹏云服务器

在云主机打开终端窗口,执行自动部署命令:

hcd deploy --password abcd1234@ --time 7200

命令的参数说明:

  • 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和地址为准。

image.png

2.4 安装鲲鹏代码迁移插件

方式一:在线安装

进入云主机,打开CodeArts IDE,点击右侧“扩展”搜索“Kunpeng Porting Advisor Plugin”点击安装该插件。

image.png

方式二:本地安装

前往CodeArts IDE插件市场下载插件Kunpeng Porting Advisor Plugin到云主机,下载地址为:CodeArts IDE插件市场

7b114df43076b0b8aa5deb2e9208e350.png

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

image.png

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

image.png

2.5 登录DevKit工具

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

image.png

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

acd16eb68ac1e7c9dd04b3846f7045dc.png

设置密码后进行登录。

9d277c2c70319bd6aee889f91df6ac4c.png

2.6 执行源码扫描任务

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

9cac5cb55ad3844017aa1d8e911fab3b.png

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

31b1314cd44f8d92143e794cae52195f.png

abba6a9d083f1e9211a21aed04601ee2.png

扫描完成完成后,点击CodeArts IDE下面“终端”登录到远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中执行以下命令,编译迁移前的代码,对比迁移效果。

尝试编译未进行迁移修改的代码,查看是否可以编译成功。编译运行命令如下:

cd /opt/portadv/portadmin/sourcecode/smartdenovo/

make

从执行结果中可以看到,编译过程报错,无法成功编译smartdenovo软件包。

8a78f45644542dde8ff867f0404796d6.png

接下来根据扫描报告修改源码后再编译。

2.7 根据扫描报告修改源码

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

869edeac198557fd9ef8ad1bfd816016.png

  1. 修改源码文件ksw.c

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

c831326e61c5cc26d202375e867e4b82.png

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

修改后,效果如下:

47199b9b19679abee05717193a54ecc0.png

修改点二:

0c51a2b359b9a8b41c228001c7d99111.png

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

47d122639535a7152886faf623acb2bb.png

增加的头文件需要引入到工程中,点击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

46dcf116c6d9db8406ab66348dda833e.png

  1. 修改构建文件Makefile

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

14cb83372669426729285c0e054d4e41.png

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

e9aa6da449f191526dad92223f62f6e6.png

图片中5-7行代码修改为如下:

CFLAGS=-I./include/AvxToNeon -g3 -W -Wall -O0 -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -march=armv8-a -fsigned-char
else
CFLAGS=-I./include/AvxToNeon -W -Wall -O4 -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -march=armv8-a -fsigned-char

此外,因smartdenovo的系统兼容性问题,在CodeArts IDE的系统中无法直接编译,还需要修改 smartdenovo/wtlay.h 文件。点击CodeArts IDE下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中执行以下命令进行修改:

cd /opt/portadv/portadmin/sourcecode/smartdenovo/

vi wtlay.h

回车后进入编辑界面,点击ESC按键后,输入:516,按回车后跳转到516行,按下键盘上的A按键,进入编辑模式,如下图所示。

0a338d255f7f16916d5166e415abd328.png

在该行前面添加“static”,修改完成后点击ESC按键,输入:wq!,点击回车。

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

cd /opt/portadv/portadmin/sourcecode/smartdenovo/

make

9425b57dbd4362837d72d6323800c347.png

迁移后可以在远端鲲鹏云服务器上编译成功。点击CodeArts IDE下面菜单栏中“终端”,登录远端弹性云服务器(命令:ssh root@远端服务器公网IP),在远端服务器中编译生成的二进制文件有 wtmsa,wtcns,wtlay等。可以执行这些文件看看。

./wtmsa

到这里整个迁移流程就已经结束了,通过上面的源码迁移动作我们拿到了可以在鲲鹏平台上运行的smartdenovo软件包。各位鲲鹏开发者也可以参考上面的软件迁移过程迁移一些其他的跨平台软件,同时探索迁移工具提供的软件包扫描、亲和分析等功能,更深入的掌握迁移工具的使用方法。

除了上述学习内容,鲲鹏社区还提供了很多辅助学习资源(课程/实验/文档/文章),希望能帮助到您更好的使用鲲鹏DevKit迁移工具:

鲲鹏代码迁移工具介绍(课程)

学习路径 - 应用跨平台迁移(课程)

2.8 反馈改进建议

如您在案例实操过程中遇到问题或有改进建议,可以到论坛帖评论区反馈即可,我们会及时响应处理,谢谢!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐