bmv2 build from source
  • get source code
$ git clone https://github.com/p4lang/behavioral-model.git

  • install dep
$ sudo apt install automake cmake libjudy-dev libgmp-dev libpcap-dev libboost-dev libboost-test-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev libboost-thread-dev libevent-dev libtool flex bison pkg-config g++ libssl-dev

  • 使用腳本安裝
$ ./autogen.sh
$ ./configure
$ make

  • 在這邊注意到,需要 thrift + nanomsg 的相依性!才可以做安裝
  • →再重新 ./configure
  • →由於在 PI那時候什麼configure參數都沒有指定,所以重新 configure後還是沒有enable PI(先暫時跳過,不過紀錄下來)

  • Q:這邊有趣的地方,是 bmv2與 PI彼此間都有對方的 configure選項
  • 到底要誰先編譯安裝呢?

  • 12/06紀錄:(已解決 → 看下面)
  • 在 make指令時,遇到原始碼 shareptr問題
  • 從錯誤訊息中,看起來像是 boost跟 thrift上面出了問題
  • 可以要回 thrift當初編譯時可能遺漏了什麼有關係,以及他對應的boost的安裝(不過那好像是針對 ubuntu 12 舊版使用者的要求 → 確認!)
server.cpp:66:1: error: reference to 'shared_ptr' is ambiguous
shared_ptr<StandardIf> get_handler(bm::SwitchWContexts *switch_);
...
In file included from /usr/include/boost/throw_exception.hpp:42:0,
                 from /usr/include/boost/numeric/conversion/converter_policies.hpp:16,
                 from /usr/include/boost/numeric/conversion/converter.hpp:14,
                 from /usr/include/boost/numeric/conversion/cast.hpp:33,
                 from /usr/local/include/thrift/transport/TTransportException.h:23,
                 from /usr/local/include/thrift/transport/TTransport.h:25,
                 from /usr/local/include/thrift/protocol/TProtocol.h:28,
                 from /usr/local/include/thrift/protocol/TBinaryProtocol.h:23,
                 from server.cpp:31:
/usr/include/boost/exception/exception.hpp:148:11: note: candidates are: template<class T> class boost::shared_ptr
  • →問題待解決
  • 12/06 Solution → 重新安裝 dependencies (thrift)
  • 於 project 根目錄中的 install_dep.sh 來安裝相依性
  • 並且運行在專案 根目錄中 travis/ 底下的 install_thrift.sh 來安裝 thrift 的相依性(也許安裝這裡的比較符合 bmv2 需求,上面錯誤發生是由手動安裝)
  • 12/22 確認的確經過這裡的安裝才會成功

  • 在透過安裝腳本修正相依性錯誤後,重新 make clean && make 下去重新編譯,便成功修正!


$ sudo apt-get install automake bison flex g++ git libboost-all-dev libevent-dev libssl-dev libtool make pkg-config