搭建P4C与P4FPGA联合编译环境

服务器 数据中心
这是P4C和P4FPGA的联合编译环境的配置,希望能给他人提供帮助,同时也欢迎大家多多进行指正和交流。

一、简介

在2016 SIGCOMM大会上HanW发表了一篇名为《P4FPGA: High Level Synthesis for Networking》的论文,该论文实现了一个从P4语言到Bluespec的编译器。这个P4FPGA的工作发表在会议***天的NetPL workshop上,P4语言与FPGA的结合引起了工业界的重视。因此,本文将分享搭建P4C与P4FPGA联合编译环境的经验。

二、编译流程解析

***更新的P4C支持P4_14和P4_16两个版本,首先将P4_14和P4_16编写的P4源程序转换成通用的中间表示IR,然后经过前端编译器生成为通用的后端中间表示IR,***经过不同的后端编译器生成特定目标平台的代码。具体流程如图所示:

其中,P4C源码中包含3个后端编译器原型:eBPF、BMv2和p4test。eBPF能够生成可以扩展Berkeley数据***滤程序的C代码;BMv2能够生成可以用BMv2进行简单的网络交换仿真的JSON文件;p4test是一个测试用的后端编译器。以及可以编写或定制其他任意的目标平台的后端编译器。

三、基本环境配置

系统:Ubuntu 16.04、Ubuntu14.04(以下均在root用户下操作)

(1)需要安装boost库

在P4FPGA的makefile文件中有使用到boost库,如果缺少boost库编译时会报如下错误信息:

  1. /usr/bin/ld: cannot find -lboost_system  
  2. /usr/bin/ld: cannot find -lboost_filesystem 

(2)boost中用到了其他函数库,因此需要先安装依赖库。

  1. apt-get install mpi-default-dev #安装mpi库  
  2. apt-get install libicu-dev   #支持正则表达式的UNICODE字符集  
  3. apt-get install python-dev    #需要python的话  
  4. #如果编译出现错误:bzlib.h: No such file or directory  
  5. apt-get install libbz2-dev  
  6. #如果在安装以上库失败的话可以尝试更新后再进行安装。  
  7. sudo apt-get update 

(3)上述函数库装好之后,就可以编译boost库了。boost下载链接:https://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.gz/download解压boost_1_63_0.tar.gz到/home/目录下,执行以下操作:

  1. cd /home/boost_1_63_0/  
  2. ./bootstrap.sh #运行bootstrap.sh脚本 

编译完成后,进行安装,也就是将头文件和生成的库。

  1. ./b2 install #安装boost库 

安装结束后在/usr/local/lib和/usr/local/include目录下生成相应库文件和头文件。

(4)测试boost库是否安装成功

可参考:http://blog.csdn.net/yhrun/article/details/8099630

重要提示:编译成功后运行执行时,如果出现以下信息

error while loading shared libraries: libboost_system.so.1.63.0: cannot open shared object file: No such file or directory

是因为系统在当前注册的搜索路径中找不到所需的共享库。

执行以下操作(或在/etc/profile文件添加):

  1. export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib:/usr/local/include 

四、搭建P4C与P4FPGA联合编译环境

(1)下载P4C与P4FPGA源码

  1. cd /home/  
  2. git clone https://github.com/p4lang/p4c.git  
  3. git clone https://github.com/hanw/p4fpga.git 

(2)关键一:建立p4c与p4fpga

打开p4c源码目录预编译:Java

  1. cd p4c  
  2. ./bootstrap.sh 

运行完后在p4c目录下会生成build和extensions文件夹。

建立一个软连接:

  1. ln -s /home/p4fpga/compiler /home/p4c/extensions/c++ 

(注:在源码README.md中为ln -s extensions/c++ /c++,笔者在 ***的源码目录中并未找到c++目录,因此认为是作者未及时更新导致)

(3)关键二:需要修改p4fpga中的源文件

文件一:/home/p4fpga/compiler/src/p4-fpga.cpp

编译报错信息:

  1. ../extensions/c++/src/p4-fpga.cpp:110:17: error: no member named 'verbosity' in 'FPGAOptions'  
  2. if (options.verbosity > 0) 

说明:笔者认为是由于p4fpga没有随着p4c的版本更新进行维护导致,在与options 相关源码中并为找到verbosity这个成员,因此这里仅做简单注释处理。

将p4-fpga.cpp 中110行和111行注释:

  1. // if (options.verbosity > 0)  
  2. // std::cerr << "Done." << std::endl; 

文件二:/home/p4fpga/compiler/src/midend.cpp

编译报错信息:

  1. ../extensions/c++/src/midend.cpp:62:13: error: no matching constructor for initialization of 'P4::UniqueParameters'  

说明:midend.cpp中第62行没有对应的构造函数UniqueParameters(&refMap),查看 P4C中的相关源码文件,其构造函数为UniqueParameters(&refMap, &typeMap),因此 修改如下:

  1. //new P4::UniqueParameters(&refMap),  
  2. new P4::UniqueParameters(&refMap, &typeMap), 

文件三:/home/p4fpga/compiler/src/profile.cpp

编译报错信息:

  1. ../extensions/c++/src/profile.cpp:17:19: error: no member named 'TableProperty' in namespace 'IR' 

说明:在profile.cpp 第17和18行没有成员函数,在P4C相关源码中,IR类并没有 TableProperty成员函数,笔者认为是与之相关的Property成员函数,因此修改如下:

  1. // if (p->is()) { 
  2. // auto pp = p->to(); 
  3. if (p->is()) { 
  4. auto pp = p->to(); 

(3)重新编译Java

  1. cd /home/p4c/ 
  2. ./bootstrap.sh 
  3. cd build 
  4. make –j8 

编译成功后会在build目录下生成四个不同后端的P4联合编译器:

  1. p4c-bm2-ss 
  2. p4c-ebpf 
  3. p4test 
  4. p4fpga 

执行make check –j8结果如下:(由于笔者未安装bmv2环境因此,有一个FAIL)

至此P4C与P4FPGA联合编译环境环境搭建完成。

五、结语

以上是P4C和P4FPGA的联合编译环境的配置,希望能给他人提供帮助,同时也欢迎大家多多进行指正和交流。

责任编辑:武晓燕 来源: SDNLAB
相关推荐

2011-06-03 16:05:20

IOS 环境搭建

2020-12-14 08:46:31

阿里晋升转岗

2017-04-19 17:59:48

中国 峰会

2011-11-23 15:07:00

社交媒体IBM营销

2015-09-23 10:43:09

P4语言OpenFlowSDN

2016-09-09 13:26:07

数据编程SDN

2010-03-22 15:27:40

云计算

2012-09-25 13:47:43

C#网络协议P2P

2023-08-11 14:06:58

鸿蒙Windows

2009-08-20 12:29:46

C#调用PInvoke

2016-01-09 14:54:57

2015-09-16 11:33:29

PMCP2P数据传输

2023-10-30 07:42:12

2011-12-20 17:12:25

笔记本评测

2009-05-18 09:11:00

IPTV融合宽带

2009-01-08 09:52:00

2009-07-20 09:53:43

Java混合编程

2011-03-09 16:17:20

2018-12-20 15:25:29

P4NAT64UCloud

2016-10-14 14:01:28

点赞
收藏

51CTO技术栈公众号