Adapting p4c and bmv2 setup script for 14.04 and 16.04

At the time of commit on a 4 core VM running on VirtualBox on
a 2016 MacBook Pro takes the following amount of time:
  Ubuntu 16.04 - 19m13.451s
  Ubuntu 14.04 - 21m58.665s

Change-Id: I06960d8f27883dab518363678c8bcbf3fee94382
diff --git a/tools/dev/bin/onos-setup-p4-dev b/tools/dev/bin/onos-setup-p4-dev
index 65179ef..63ac02a 100755
--- a/tools/dev/bin/onos-setup-p4-dev
+++ b/tools/dev/bin/onos-setup-p4-dev
@@ -3,7 +3,7 @@
 # Builds and installs all tools needed for developing and testing P4 support in
 # ONOS.
 #
-# Tested on Ubuntu 14.04.
+# Tested on Ubuntu 14.04 and 16.04.
 #
 # Recommended minimum system requirements:
 # 4 GB of RAM
@@ -26,12 +26,7 @@
 
 function do_requirements {
     sudo apt update
-    #FIXME the following two lines seem like they are not required, at least for 16.04
-    sudo apt install -y python-software-properties software-properties-common
-    sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
-    sudo apt update
-    #FIXME 14.04 needs special gcc, 16.04 can use apt-get default
-    sudo apt install -y --no-install-recommends \
+    sudo apt-get install -y --no-install-recommends \
         autoconf \
         automake \
         bison \
@@ -39,14 +34,14 @@
         cmake \
         cpp \
         curl \
-        dpkg-dev \
         flex \
-        g++-4.9 \
-        gcc-4.9 \
         git \
         libboost-dev \
+        libboost-program-options-dev \
+        libboost-system-dev \
         libboost-filesystem-dev \
-        libboost-iostreams-dev \
+        libboost-thread-dev \
+        libboost-filesystem-dev \
         libboost-program-options-dev \
         libboost-system-dev \
         libboost-test-dev \
@@ -59,6 +54,8 @@
         libgc1c2 \
         libgflags-dev \
         libgmp-dev \
+        libjudy-dev \
+        libpcap-dev \
         libgmp10 \
         libgmpxx4ldbl \
         libjudy-dev \
@@ -78,12 +75,31 @@
         tcpdump \
         wget \
         unzip
+}
+
+function do_requirements_1404 {
+    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 \
+        dpkg-dev \
+        g++-4.9 \
+        gcc-4.9 \
+        libboost-iostreams-dev
 
     # 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_requirements_1604 {
+    sudo apt-get update
+    sudo apt-get install -y --no-install-recommends \
+        ca-certificates \
+        g++ \
+        libboost-iostreams1.58-dev
+}
+
 function do_protobuf {
     cd ${BUILD_DIR}
     if [ ! -d protobuf ]; then
@@ -148,7 +164,7 @@
     git checkout ${BMV2_COMMIT}
 
     ./autogen.sh
-    # FIXME: to build with debugger, we need to install nanomsg first (see bmv2's install_deps.sh)
+    # TODO: to build with debugger, we need to install nanomsg first (see bmv2's install_deps.sh)
     ./configure --without-thrift --without-nanomsg --with-pi
     make -j${NUM_CORES}
     sudo make install
@@ -180,20 +196,6 @@
     sudo ldconfig
 }
 
-# FIXME: Can we deprecate this?
-function do_p4c_bm {
-    # 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
@@ -204,6 +206,14 @@
     return 1 # false
 }
 
+# The following is borrowed from Mininet's util/install.sh
+function version_ge {
+    # sort -V sorts by *version number*
+    latest=`printf "$1\n$2" | sort -V | tail -1`
+    # If $1 is latest version, then $1 >= $2
+    [ "$1" == "$latest" ]
+}
+
 MUST_DO_ALL=false
 DID_REQUIREMENTS=false
 function check_and_do {
@@ -216,15 +226,28 @@
         echo "#"
         echo "# Building ${proj_dir} (${commit_id})"
         echo "#"
+        # Print commands used to install to aid debugging
+        set -x
         if ! ${DID_REQUIREMENTS} = true; then
-        #FIXME need version check for 14.04 vs 16.04
             do_requirements
+            #TODO consider other Linux distros; presently this script assumes that it is running on Ubuntu
+            RELEASE=`lsb_release -rs`
+            if version_ge $RELEASE 16.04; then
+                do_requirements_1604
+            elif version_ge $RELEASE 14.04; then
+                do_requirements_1404
+            else
+                echo "Ubuntu version $RELEASE is not supported"
+                exit 1
+            fi
             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
+        # Disable printing to reduce output
+        set +x
     else
         echo "${proj_dir} is up to date (commit ${commit_id})"
     fi
@@ -238,6 +261,5 @@
 check_and_do ${PI_COMMIT} p4runtime do_p4runtime
 check_and_do ${BMV2_COMMIT} bmv2 do_bmv2
 check_and_do ${P4C_COMMIT} p4c do_p4c
-check_and_do ${P4C_BM_COMMIT} p4c-bmv2 do_p4c_bm
 
 echo "Done!"