Add bf-p4c compiler output from BF SDE 9.0.0 (part 1)

Change-Id: I589644d529edcf7f534c5f4fe5085ba1a9fa7bac
diff --git a/src/main/p4/build.sh b/src/main/p4/build.sh
new file mode 100755
index 0000000..3ceea41
--- /dev/null
+++ b/src/main/p4/build.sh
@@ -0,0 +1,82 @@
+#!/usr/bin/env bash
+# Copyright 2019-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+MAVERICKS_CPU_PORT=320
+MONTARA_CPU_PORT=192
+
+if [ -z "$ONOS_ROOT" ]; then
+  echo "Error: ONOS_ROOT is not set"
+  exit 1
+fi
+
+P4_SRC_DIR=${ONOS_ROOT}/pipelines/fabric/impl/src/main/resources
+
+if [ ! -d "${P4_SRC_DIR}" ]; then
+  echo "Error: unable to locate fabric P4 sources at ${P4_SRC_DIR}"
+fi
+
+set -e
+
+PROFILE=$1
+OTHER_PP_FLAGS=$2
+
+# PWD is the directory where this script is called from (should be the root of
+# this repo).
+P4C_OUT=${PWD}/tmp/${PROFILE}
+
+# DIR is this file directory.
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+# Where the compiler output should be placed to be included in the pipeconf.
+DEST_DIR=${DIR}/../resources/p4c-out/${PROFILE}/tofino
+
+# If SDE_DOCKER_IMG env is set, use containerized version of the compiler
+if [ -z "${SDE_DOCKER_IMG}" ]; then
+  P4C_CMD="bf-p4c"
+else
+  P4C_CMD="docker run --rm -v ${P4C_OUT}:${P4C_OUT} -v ${P4_SRC_DIR}:${P4_SRC_DIR} -v ${DIR}:${DIR} -w ${DIR} ${SDE_DOCKER_IMG} bf-p4c"
+fi
+
+SDE_VER=$( ${P4C_CMD} --version | cut -d' ' -f2 )
+
+# shellcheck disable=SC2086
+function do_p4c() {
+  pltf="$1_sde_${SDE_VER//./_}"
+  cpu_port=$2
+  echo "*** Compiling profile '${PROFILE}' for ${pltf} platform..."
+  echo "*** Output in ${P4C_OUT}/${pltf}"
+  pp_flags="-DCPU_PORT=${cpu_port}"
+  mkdir -p ${P4C_OUT}/${pltf}
+  (
+    set -x
+    $P4C_CMD --arch v1model -g  --create-graphs --verbose 2 \
+      -o ${P4C_OUT}/${pltf} -I ${P4_SRC_DIR} \
+      ${pp_flags} ${OTHER_PP_FLAGS} \
+      --p4runtime-files ${P4C_OUT}/${pltf}/p4info.txt \
+      ${DIR}/fabric-tofino.p4
+  )
+
+  # Copy only the relevant files to the pipeconf resources
+  mkdir -p ${DEST_DIR}/${pltf}/pipe
+  cp ${P4C_OUT}/${pltf}/p4info.txt ${DEST_DIR}/${pltf}
+  cp ${P4C_OUT}/${pltf}/pipe/context.json ${DEST_DIR}/${pltf}/pipe
+  cp ${P4C_OUT}/${pltf}/pipe/tofino.bin ${DEST_DIR}/${pltf}/pipe
+  echo "${cpu_port}" > ${DEST_DIR}/${pltf}/cpu_port.txt
+
+  echo
+}
+
+do_p4c "mavericks" ${MAVERICKS_CPU_PORT}
+do_p4c "montara" ${MONTARA_CPU_PORT}