在适用于Ultra96/Ultra96-V2的Debian GNU/Linux上运行XRT(Xilinx Runtime)(构建部分)【未完成】

请注意(2020年3月26日添加)

此文章是在为Ultra96/Ultra96-V2设备上的Debian GNU/Linux系统尝试运行XRT(Xilinx Runtime)时发布的,其中包含了旧内容。请参考于2020年3月26日发布的下一篇文章。

    • 『Ultra96/Ultra96-V2 向け Debian GNU/Linux で XRT(Xilinx Runtime) を動かす(概要編)』@Qiita

 

    • 『Ultra96/Ultra96-V2 向け Debian GNU/Linux で XRT(Xilinx Runtime) を動かす(ビルド編)』@Qiita

 

    『Ultra96/Ultra96-V2 向け Debian GNU/Linux で XRT(Xilinx Runtime) を動かす(インストール編)』@Qiita

首先

XRT(赛灵思运行时)是由赛灵思公司在Vitis开发环境中开发的用于在平台上运行程序的环境。XRT由用户空间和内核驱动程序组件的组合实现。XRT的源代码在GitHub上公开。

    https://github.com/Xilinx/XRT

以下是来自GitHub仓库的引用,展示了XRT软件栈的示意图。

Fig.1 XRT Software Stack

图1 XRT 软件堆栈

我正在GitHub上提供UltraZed/Ultra96/Ultra96-V2的平台,构建了Debian GNU/Linux。

    https://github.com/ikwzm/ZynqMP-FPGA-Linux

我想在ZynqMP-FPGA-Linux上尝试使用Debian GNU/Linux来运行XRT,它是基于Xilinx公司提供的Petalinux的。

本文将解释如何从源代码编译XRT并制作Debian软件包。

此外,Debian 包已在 GitHub 上公开。由于设置构建环境很麻烦且构建时间需花费1-2小时,如果觉得麻烦的话,可以从这里下载。

https://github.com/ikwzm/ZynqMP-FPGA-XRT

xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb
zocl-dkms_2.6.0_arm64.deb

此外,请参考以下文章以进行安装。

    『Ultra96/Ultra96-V2 向け Debian GNU/Linux で XRT(Xilinx Runtime) を動かす(インストール編)【未完】』@Qiita

请注意

目前(2020年3月23日),雖然可以安裝,但尚未運作。本文只是試驗過程的記錄。

XRT的构建。

建构环境

对于 UltraZed/Ultra96/Ultra96-V2,构建 XRT 有点麻烦。构建 XRT 需要 Ubuntu 或 CentOS 等 Linux 发行版。还需要安装各种开发工具。而且,为了创建 Debian 软件包,或为 ARM64 交叉编译,需要麻烦地将 PC 作为主机。

那么,我们可以在 Ultra96-V2 上运行 Ubuntu 18.04,并在其上进行自行编译。

Ultra96-V2 的 Ubuntu 18.04 可以在以下网址上公开获取。

    https://github.com/ikwzm/ZynqMP-FPGA-Ubuntu18.04-Ultra96

下载 XRT。

我們可以從以下的網址下載XRT的源代碼。

    https://github.com/Xilinx/XRT
fpga@ubuntu-fpga:~$ cd work
fpga@ubuntu-fpga:~/work$ git clone https://github.com/Xilinx/XRT
Cloning into 'XRT'...
remote: Enumerating objects: 30, done.
remote: Counting objects: 100% (30/30), done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 43591 (delta 13), reused 7 (delta 0), pack-reused 43561
Receiving objects: 100% (43591/43591), 58.10 MiB | 2.57 MiB/s, done.
Resolving deltas: 100% (33849/33849), done.
Checking out files: 100% (1682/1682), done.
fpga@ubuntu-fpga:~/work$ cd XRT
fpga@ubuntu-fpga:~/work/XRT$

为了将 XRT 构建为适用于 Ultra96/Ultra96-V2,需要修改一些文件。因此,与直接克隆 https://github.com/Xilinx/XRT 相比,最好是进行分支(fork)操作。

XRT 的修改

因为需要对XRT的构建文件进行一些修正,所以我们将创建一个新的分支。

fpga@ubuntu-fpga:~/work/XRT$ git checkout -b 2019.2_Ultra96
Switched to a new branch '2019.2_Ultra96'

更改软件包文件名

原始版本的XRT中,Debian软件包的名称为xrt_202010.2.6.0_18.04-arm64-xrt.deb,但为了明确其为Ubuntu的软件包,将其更改为xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb。

fpga@ubuntu-fpga:~/work/XRT$ git diff src/CMake/cpackLin.cmake
diff --git a/src/CMake/cpackLin.cmake b/src/CMake/cpackLin.cmake
index 4f45f97a..9f6eebe4 100644
--- a/src/CMake/cpackLin.cmake
+++ b/src/CMake/cpackLin.cmake
@@ -79,7 +79,7 @@ else ()
   SET (CPACK_GENERATOR "TGZ")
 endif()
-SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${XRT_VERSION_RELEASE}.${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}_${CPACK_REL_VER}-${CPACK_ARCH}")
+SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${XRT_VERSION_RELEASE}.${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}_${LINUX_FLAVOR}_${CPACK_REL_VER}-${CPACK_ARCH}")
 message("-- ${CMAKE_BUILD_TYPE} ${PACKAGE_KIND} package")
fpga@ubuntu-fpga:~/work/XRT$ git add src/CMake/cpackLin.cmake
fpga@ubuntu-fpga:~/work/XRT$ git commit -m "[add] linux flavor name to built debian package name"
[2019.2_Ultra96 f6d3236b] [add] linux flavor name to built debian package name
 1 file changed, 1 insertion(+), 1 deletion(-)

取消 Debian Package 的版本上限依存

在原始版本中,构建的Debian软件包所依赖的软件包在 src/CMake/cpackLin.cmake 文件中被设置如下。

  SET(CPACK_DEBIAN_XRT_PACKAGE_DEPENDS "ocl-icd-opencl-dev (>= 2.2.0), 
libboost-dev (>= ${Boost_VER_STR}), libboost-dev (<< ${Boost_VER_STR_ONEGREATER}), 
libboost-filesystem-dev (>=${Boost_VER_STR}), libboost-filesystem-dev (<<${Boost_VER_STR_ONEGREATER}),
uuid-dev (>= 2.27.1), dkms (>= 2.2.0), libprotoc-dev (>=2.6.1), libssl-dev (>=1.0.2), protobuf-compiler (>=2.6.1), 
libncurses5-dev (>=6.0), lsb-release, libxml2-dev (>=2.9.1), libyaml-dev (>= 0.1.6), 
libc6 (>= ${GLIBC_VERSION}), libc6 (<< ${GLIBC_VERSION_ONEGREATER}),
python (>= 2.7), python-pip, libudev-dev ")

构建的Debian软件包已经设置了限制版本,其中包括libboost-dev、libboost-filesystem-dev和libc6。这表明安装软件包的发行版限制太严格,可能会导致安装失败。例如,如果尝试将此Debian软件包安装到Debian10上,将会失败。

因此,尽管以后可能会引起问题,但我们可以通过以下方式修改 cpackLin.cmake 文件,取消版本的上限限制。

fpga@ubuntu-fpga:~/work/XRT$ git diff src/CMake/cpackLin.cmake
--- a/src/CMake/cpackLin.cmake
+++ b/src/CMake/cpackLin.cmake
@@ -49,7 +49,7 @@ if (${LINUX_FLAVOR} MATCHES "^(Ubuntu|Debian)")
   SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS "OFF")
   SET(CPACK_DEBIAN_AWS_PACKAGE_DEPENDS "xrt (>= ${XRT_VERSION_MAJOR}.${XRT_VERSION_MINOR}.${XRT_VERSION_PATCH})")
   SET(CPACK_DEBIAN_XBTEST_PACKAGE_DEPENDS "xrt (>= ${XRT_VERSION_MAJOR}.${XRT_VERSION_MINOR}.${XRT_VERSION_PATCH}), libjson-glib-dev")
-  SET(CPACK_DEBIAN_XRT_PACKAGE_DEPENDS "ocl-icd-opencl-dev (>= 2.2.0), libboost-dev (>= ${Boost_VER_STR}), libboost-dev (<< ${Boost_VER_STR_ONEGREATER}), libboost-filesystem-dev (>=${Boost_VER_STR}), libboost-filesystem-dev (<<${Boost_VER_STR_ONEGREATER}), uuid-dev (>= 2.27.1), dkms (>= 2.2.0), libprotoc-dev (>=2.6.1), libssl-dev (>=1.0.2), protobuf-compiler (>=2.6.1), libncurses5-dev (>=6.0), lsb-release, libxml2-dev (>=2.9.1), libyaml-dev (>= 0.1.6), libc6 (>= ${GLIBC_VERSION}), libc6 (<< ${GLIBC_VERSION_ONEGREATER}), python (>= 2.7), python-pip, libudev-dev ")
+  SET(CPACK_DEBIAN_XRT_PACKAGE_DEPENDS "ocl-icd-opencl-dev (>= 2.2.0), libboost-dev (>= ${Boost_VER_STR}), libboost-filesystem-dev (>=${Boost_VER_STR}), uuid-dev (>= 2.27.1), dkms (>= 2.2.0), libprotoc-dev (>=2.6.1), libssl-dev (>=1.0.2), protobuf-compiler (>=2.6.1), libncurses5-dev (>=6.0), lsb-release, libxml2-dev (>=2.9.1), libyaml-dev (>= 0.1.6), libc6 (>= ${GLIBC_VERSION}), python (>= 2.7), python-pip, libudev-dev ")
 elseif (${LINUX_FLAVOR} MATCHES "^(RedHat|CentOS|Amazon)")
   execute_process(
fpga@ubuntu-fpga:~/work/XRT$ git add src/CMake/cpackLin.cmake
fpga@ubuntu-fpga:~/work/XRT$ git commit -m "[remove] upper limit of version of depend packages"
[2019.2_Ultra96 b69d97cd] [remove] upper limit of version of depend packages
 1 file changed, 1 insertion(+), 1 deletion(-)

安装所需的Debian软件包来构建。

安装构建所需的软件包。幸运的是,XRT已经准备了一个安装构建所需的软件包的脚本。

当以超级用户权限运行./src/runtime_src/tools/scripts/xrtdeps.sh时,apt程序将安装所需的Debian包。

fpga@ubuntu-fpga:~/work/XRT$ sudo ./src/runtime_src/tools/scripts/xrtdeps.sh
Installing packages...
Reading package lists... Done
Building dependency tree
Reading state information... Done
    :
(中略)
    :
The following packages were automatically installed and are no longer required:
  libgl2ps1.4 libibverbs1 liblept5 libnetcdf-c++4 libnl-route-3-200
  libopencv-flann-dev libopencv-flann3.2 libopencv-ml-dev libopencv-ml3.2
  libopencv-photo-dev libopencv-photo3.2 libopencv-shape-dev
  libopencv-shape3.2 libopencv-ts-dev libopencv-video-dev libopencv-video3.2
  libtcl8.6 libtesseract4 libtk8.6 libxss1
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 26 not upgraded.

建筑

进入build目录,执行其中的build.sh脚本即可开始构建。对于Ultra96/Ultra96-V2,构建过程会耗费相当长的时间。在我的环境中,大约需要1到2小时。

fpga@ubuntu-fpga:~/work/XRT$ cd build/
fpga@ubuntu-fpga:~/work/XRT/build$ ./build.sh
cmake -DRDI_CCACHE=0 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_TOOLCHAIN_FILE= ../../src
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
-- Check for working C compiler: /usr/bin/gcc-8
-- Check for working C compiler: /usr/bin/gcc-8 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/g++-8
-- Check for working CXX compiler: /usr/bin/g++-8 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Host system processor is aarch64
-- Target system processor is aarch64
    :
(後略)
    :
fpga@ubuntu-fpga:~/work/XRT/build$ 

当构建完成后,Debian软件包将生成在build/Release目录下。

fpga@ubuntu-fpga:~/work/XRT$ cd build/
fpga@ubuntu-fpga:~/work/XRT/build$ ls -1 Release/xrt_*
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-aws.deb
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-aws.tar.gz
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-azure.deb
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-azure.tar.gz
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-container.deb
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-container.tar.gz
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-xbtest.deb
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-xbtest.tar.gz
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.tar.gz

Ultra96 / Ultra96-V2所需的Debian软件包为Release / xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb。

编译 zocl

在前一章中构建的xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb中不包含zocl(请参考图1的XRT软件栈)。zocl是用于Ultra96/Ultra96-V2等边缘设备的Linux内核模块。

在这一章中,我们将介绍如何使用dkms构建zocl的Debian软件包。

创建源代码目录

首先,在 /usr/src/ 目录下创建名为zocl-2.6.0的文件夹。其中,zocl是内核模块的名称,2.6.0是XRT的版本号。

fpga@ubuntu-fpga:~/work/XRT$ sudo mkdir /usr/src/zocl-2.6.0
fpga@ubuntu-fpga:~/work/XRT$ sudo chmod o+w /usr/src/zocl-2.6.0

准备源文件

zocl的源代码位于XRT的src/runtime_src/core/edge/drm/zocl。还需要一些其他目录中的头文件。将这些文件复制到前一节准备好的目录中。

fpga@ubuntu-fpga:~/work/XRT$ mkdir /usr/src/zocl-2.6.0/src
fpga@ubuntu-fpga:~/work/XRT$ mkdir /usr/src/zocl-2.6.0/src/edge
fpga@ubuntu-fpga:~/work/XRT$ mkdir /usr/src/zocl-2.6.0/src/edge/drm
fpga@ubuntu-fpga:~/work/XRT$ cp -r src/runtime_src/core/edge/drm/zocl /usr/src/zocl-2.6.0/src/edge/drm
fpga@ubuntu-fpga:~/work/XRT$ cp -r src/runtime_src/core/include/ /usr/src/zocl-2.6.0/src
fpga@ubuntu-fpga:~/work/XRT$ cp -r src/runtime_src/core/edge/include /usr/src/zocl-2.6.0/src/edge/
fpga@ubuntu-fpga:~/work/XRT$ cp src/runtime_src/core/common/drv/xrt_drv.h /usr/src/zocl-2.6.0/src/edge/drm/zocl
fpga@ubuntu-fpga:~/work/XRT$ cp LICENSE /usr/src/zocl-2.6.0/

安装用于构建的工具

要构建/建置(一应用/软件等),必须安装以下工具方能实现。

    • dkms

 

    • debhelper

 

    fakeroot

创建 dkms.conf 文件

创建一个 /usr/src/zocl-2.6.0/dkms.conf 文件,其内容如下:

PACKAGE_NAME="zocl-dkms"
PACKAGE_VERSION="2.6.0"
MAKE="make -C src/edge/drm/zocl/ KERNELDIR=/lib/modules/${kernelver}/build"
CLEAN="make -C src/edge/drm/zocl/ clean"
BUILT_MODULE_NAME="zocl"
BUILT_MODULE_LOCATION="src/edge/drm/zocl/"
DEST_MODULE_LOCATION="/updates"

向 dkms 添加

将zocl-2.6.0添加到dkms中。

fpga@ubuntu-fpga:/usr/src/zocl-2.6.0$ sudo dkms add -m zocl -v 2.6.0
Creating symlink /var/lib/dkms/zocl/2.6.0/source ->
                 /usr/src/zocl-2.6.0
DKMS: add completed.

内核模块的构建

试试使用dkms来构建内核模块,并确认是否成功。

fpga@ubuntu-fpga:/usr/src/zocl-2.6.0$ sudo dkms build -m zocl -v 2.6.0
Kernel preparation unnecessary for this kernel.  Skipping...
Building module:
cleaning build area...
make -j4 KERNELRELEASE=4.19.0-xlnx-v2019.2-zynqmp-fpga -C src/edge/drm/zocl/ KERNELDIR=/lib/modules/4.19.0-xlnx-v2019.2-zynqmp-fpga/build.......
cleaning build area...
DKMS: build completed.

Debian源码包的构建

fpga@ubuntu-fpga:/usr/src/zocl-2.6.0$ sudo dkms mkdsc -m zocl -v 2.6.0 --source-only
Using /etc/dkms/template-dkms-mkdsc
copying template...
modifying debian/changelog...
modifying debian/compat...
modifying debian/control...
modifying debian/copyright...
modifying debian/dirs...
modifying debian/postinst...
modifying debian/prerm...
modifying debian/README.Debian...
modifying debian/rules...
copying legacy postinstall template...
Copying source tree...
Building source package... dpkg-source --before-build zocl-dkms-2.6.0
 debian/rules clean
dh_clean: Compatibility levels before 9 are deprecated (level 7 in use)
 dpkg-source -b zocl-dkms-2.6.0
dpkg-source: warning: no source format specified in debian/source/format, see dpkg-source(1)
 dpkg-genbuildinfo --build=source
 dpkg-genchanges --build=source >../zocl-dkms_2.6.0_source.changes
dpkg-genchanges: info: including full source code in upload
 dpkg-source --after-build zocl-dkms-2.6.0
DKMS: mkdsc completed.
Moving built files to /var/lib/dkms/zocl/2.6.0/dsc...
Cleaning up temporary files...

在这里构建的 Debian Package 位于 /var/lib/dkms/zocl/2.6.0/dsc。

    • /var/lib/dkms/zocl/2.6.0/dsc/zocl-dkms_2.6.0.dsc

 

    • /var/lib/dkms/zocl/2.6.0/dsc/zocl-dkms_2.6.0_source.changes

 

    /var/lib/dkms/zocl/2.6.0/dsc/zocl-dkms_2.6.0_tar.gz

Debian二进制软件包的构建

fpga@ubuntu-fpga:/usr/src/zocl-2.6.0$ sudo dkms mkdeb -m zocl -v 2.6.0 --source-only
Using /etc/dkms/template-dkms-mkdeb
copying template...
modifying debian/changelog...
modifying debian/compat...
modifying debian/control...
modifying debian/copyright...
modifying debian/dirs...
modifying debian/postinst...
modifying debian/prerm...
modifying debian/README.Debian...
modifying debian/rules...
copying legacy postinstall template...
Copying source tree...
Building binary package...dpkg-buildpackage: warning: using a gain-root-command while being root
 dpkg-source --before-build zocl-dkms-2.6.0
 fakeroot debian/rules clean
dh_clean: Compatibility levels before 9 are deprecated (level 7 in use)
 debian/rules build
 fakeroot debian/rules binary
dh_installdirs: Compatibility levels before 9 are deprecated (level 7 in use)
dh_strip: Compatibility levels before 9 are deprecated (level 7 in use)
dh_compress: Compatibility levels before 9 are deprecated (level 7 in use)
dh_installdeb: Compatibility levels before 9 are deprecated (level 7 in use)
dh_shlibdeps: Compatibility levels before 9 are deprecated (level 7 in use)
 dpkg-genbuildinfo --build=binary
 dpkg-genchanges --build=binary >../zocl-dkms_2.6.0_arm64.changes
dpkg-genchanges: info: binary-only upload (no source code included)
 dpkg-source --after-build zocl-dkms-2.6.0
DKMS: mkdeb completed.
Moving built files to /var/lib/dkms/zocl/2.6.0/deb...
Cleaning up temporary files...

在这里构建的Debian软件包位于/var/lib/dkms/zocl/2.6.0/deb。

    /var/lib/dkms/zocl/2.6.0/deb/zocl-dkms_2.6.0_arm64.deb

Debian软件包的复制

复制之前在前一节中构建的Debian软件包。

fpga@ubuntu-fpga:/usr/src/zocl-2.6.0$ cd ~/work/XRT/build
fpga@ubuntu-fpga:~/work/XRT/build$ cp /var/lib/dkms/zocl/2.6.0/deb/* .
fpga@ubuntu-fpga:~/work/XRT/build$ cp /var/lib/dkms/zocl/2.6.0/dsc/* .

解决问题的最后结果

为了安装构建好的Debian包,需要先从dkms中移除zocl,以免与Debian包产生冲突。

fpga@ubuntu-fpga:~/work/XRT/build$ sudo rm -r /var/lib/dkms/zocl/

请参考。

    • https://github.com/Xilinx/XRT

 

    • https://github.com/ikwzm/ZynqMP-FPGA-Linux

 

    • https://github.com/ikwzm/ZynqMP-FPGA-XRT

 

    『Ultra96/Ultra96-V2 向け Debian GNU/Linux で XRT(Xilinx Runtime) を動かす(インストール編)【未完】』@Qiita
广告
将在 10 秒后关闭
bannerAds