| #!/usr/bin/env bash |
| # ----------------------------------------------------------------------------- |
| # Builds and installs all tools needed for developing and testing P4 support in |
| # ONOS. |
| # |
| # Tested on Ubuntu 14.04. |
| # |
| # Recommended minimum system requirements: |
| # 4 GB of RAM |
| # 2 cores |
| # 8 GB free hard drive space (~4 GB to build everything) |
| # ----------------------------------------------------------------------------- |
| |
| # Exit on errors. |
| set -e |
| |
| BUILD_DIR=~/p4tools |
| BMV2_COMMIT="41c1f2ed487ff086a1d582069e8bc68cab8ffdb0" |
| PI_COMMIT="f110570ca0c8ddc5feaf5028b08a0f477ceb4eea" |
| P4C_COMMIT="adce375fd961a9e467c7e77ad1bef647ef28e5e8" |
| P4C_BM_COMMIT="8f4abeaa6f8374aaf95ea2aacfc2b750069391b5" |
| PROTOBUF_COMMIT="tags/v3.0.2" |
| GRPC_COMMIT="tags/v1.3.0" |
| |
| NUM_CORES=`grep -c ^processor /proc/cpuinfo` |
| |
| function do_requirements { |
| sudo apt update |
| sudo apt install -y python-software-properties software-properties-common |
| sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test |
| sudo apt update |
| sudo apt install -y \ |
| autoconf \ |
| automake \ |
| bison \ |
| curl \ |
| dpkg-dev \ |
| flex \ |
| g++-4.9 \ |
| gcc-4.9 \ |
| git \ |
| libboost-dev \ |
| libboost-iostreams-dev \ |
| libfl-dev \ |
| libgc-dev \ |
| libgmp-dev \ |
| libreadline6 \ |
| libreadline6-dev \ |
| libtool \ |
| libc6-dev \ |
| make \ |
| pkg-config \ |
| python \ |
| python-ipaddr \ |
| python-scapy \ |
| tcpdump \ |
| unzip |
| |
| # Needed for p4c. |
| sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 50 |
| sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 50 |
| } |
| |
| function do_protobuf { |
| # Protobuf |
| cd ${BUILD_DIR} |
| if [ ! -d protobuf ]; then |
| git clone https://github.com/google/protobuf.git |
| fi |
| cd protobuf |
| git fetch |
| git checkout ${PROTOBUF_COMMIT} |
| ./autogen.sh |
| ./configure --prefix=/usr |
| make -j${NUM_CORES} |
| sudo make install |
| sudo ldconfig |
| } |
| |
| function do_grpc { |
| # gRPC |
| cd ${BUILD_DIR} |
| if [ ! -d grpc ]; then |
| git clone https://github.com/grpc/grpc.git |
| fi |
| cd grpc |
| git fetch |
| git checkout ${GRPC_COMMIT} |
| git submodule update --init |
| make -j${NUM_CORES} |
| sudo make install |
| sudo ldconfig |
| } |
| |
| function do_bmv2 { |
| # BMv2 part 1 (without PI) |
| cd ${BUILD_DIR} |
| if [ ! -d bmv2 ]; then |
| git clone https://github.com/p4lang/behavioral-model.git bmv2 |
| fi |
| cd bmv2 |
| git fetch |
| git checkout ${BMV2_COMMIT} |
| ./install_deps.sh |
| ./autogen.sh |
| ./configure --enable-debugger |
| make -j${NUM_CORES} |
| sudo make install |
| sudo ldconfig |
| } |
| |
| function do_p4runtime { |
| # P4Runtime (PI) |
| cd ${BUILD_DIR} |
| if [ ! -d p4runtime ]; then |
| git clone https://github.com/p4lang/PI.git p4runtime |
| fi |
| cd p4runtime |
| git fetch |
| git checkout ${PI_COMMIT} |
| git submodule update --init --recursive |
| ./autogen.sh |
| ./configure --with-bmv2 --with-proto |
| make -j${NUM_CORES} |
| sudo make install |
| sudo ldconfig |
| } |
| |
| function do_bmv2_with_pi { |
| # BMv2 part 2 (with PI) |
| cd ${BUILD_DIR}/bmv2 |
| ./configure --enable-debugger --with-pi |
| make -j${NUM_CORES} |
| sudo make install |
| sudo ldconfig |
| |
| # Simple_switch_grpc target |
| cd targets/simple_switch_grpc |
| ./autogen.sh |
| ./configure |
| make -j${NUM_CORES} |
| sudo make install |
| sudo ldconfig |
| } |
| |
| function do_p4c { |
| # p4c |
| cd ${BUILD_DIR} |
| if [ ! -d p4c ]; then |
| git clone https://github.com/p4lang/p4c.git |
| fi |
| cd p4c |
| git fetch |
| git checkout ${P4C_COMMIT} |
| git submodule update --init --recursive |
| ./bootstrap.sh |
| cd build |
| make -j${NUM_CORES} |
| sudo make install |
| sudo ldconfig |
| } |
| |
| function do_p4c_bm { |
| # p4c-bmv2 (old BMv2 compiler) |
| cd ${BUILD_DIR} |
| if [ ! -d p4c-bmv2 ]; then |
| git clone https://github.com/p4lang/p4c-bm.git p4c-bmv2 |
| fi |
| cd p4c-bmv2 |
| git fetch |
| git checkout ${P4C_BM_COMMIT} |
| sudo pip install -r requirements.txt |
| sudo python setup.py install |
| } |
| |
| function check_commit { |
| if [ ! -e $2 ]; then |
| return 0 # true |
| fi |
| if [[ $(< $2) != "$1" ]]; then |
| return 0 # true |
| fi |
| return 1 # false |
| } |
| |
| MUST_DO_ALL=false |
| DID_REQUIREMENTS=false |
| function check_and_do { |
| # Check if the latest built commit is the same we are trying to build now, or if all projects |
| # must be built. If true builds this project. |
| commit_id="$1" |
| proj_dir="$2" |
| func_name="$3" |
| if ${MUST_DO_ALL} = true || check_commit ${commit_id} ${proj_dir}/.last_built_commit; then |
| echo "#" |
| echo "# Building ${proj_dir} (${commit_id})" |
| echo "#" |
| if ! ${DID_REQUIREMENTS} = true; then |
| do_requirements |
| DID_REQUIREMENTS=true |
| fi |
| eval ${func_name} |
| echo ${commit_id} > ${BUILD_DIR}/${proj_dir}/.last_built_commit |
| # Build all next projects as they might depend on this one. |
| MUST_DO_ALL=true |
| else |
| echo "${proj_dir} is up to date (commit ${commit_id})" |
| fi |
| } |
| |
| mkdir -p ${BUILD_DIR} |
| cd ${BUILD_DIR} |
| # In dependency order. |
| check_and_do ${PROTOBUF_COMMIT} protobuf do_protobuf |
| check_and_do ${GRPC_COMMIT} grpc do_grpc |
| check_and_do ${BMV2_COMMIT} bmv2 do_bmv2 |
| check_and_do ${PI_COMMIT} p4runtime do_p4runtime |
| check_and_do ${BMV2_COMMIT} bmv2 do_bmv2_with_pi |
| check_and_do ${P4C_COMMIT} p4c do_p4c |
| check_and_do ${P4C_BM_COMMIT} p4c-bmv2 do_p4c_bm |
| |
| echo "Done!" |