blob: e3ccdcdcd24584971ae3124ba925e986c674d42c [file] [log] [blame]
Carmelo Casconeb7e618d2018-01-12 18:31:33 -08001#!/usr/bin/env bash
2# -----------------------------------------------------------------------------
3# Builds and installs all tools needed for developing and testing P4 support in
4# ONOS.
5#
6# Tested on Ubuntu 14.04 and 16.04.
7#
8# Recommended minimum system requirements:
9# 4 GB of RAM
10# 2 cores
11# 8 GB free hard drive space (~4 GB to build everything)
Carmelo Cascone95e5afd2018-07-17 14:45:23 +020012#
13# To execute up to a given step, pass the step name as the first argument. For
14# example, to install PI, but not BMv2, p4c, etc:
15# ./install-p4-tools.sh PI
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080016# -----------------------------------------------------------------------------
17
18# Exit on errors.
19set -e
20
21BUILD_DIR=~/p4tools
Esin Karaman971fb7f2017-12-28 13:44:52 +000022# in case BMV2_COMMIT value is updated, the same variable in
23# protocols/bmv2/thrift-api/BUCK file should also be updated
Carmelo Cascone03ae0ac2018-10-11 08:31:59 -070024BMV2_COMMIT="ae87b4d4523488ac935133b4aef437796ad1bbd1"
25PI_COMMIT="539e4624f16aac39f8890a6dfb11c65040e735ad"
26P4C_COMMIT="380830f6c26135d1d65e1312e3ba2da628c18145"
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080027PROTOBUF_COMMIT="tags/v3.2.0"
28GRPC_COMMIT="tags/v1.3.2"
29LIBYANG_COMMIT="v0.14-r1"
30SYSREPO_COMMIT="v0.7.2"
31
32NUM_CORES=`grep -c ^processor /proc/cpuinfo`
33
Carmelo Casconef02872d2018-06-20 08:49:02 +020034# If false, build tools without debug features to improve throughput of BMv2 and
Carmelo Cascone03ae0ac2018-10-11 08:31:59 -070035# reduce CPU/memory footprint. Default is true.
Carmelo Casconef02872d2018-06-20 08:49:02 +020036DEBUG_FLAGS=${DEBUG_FLAGS:-true}
37
Carmelo Cascone95e5afd2018-07-17 14:45:23 +020038# Execute up to the given step (first argument), or all if not defined.
39LAST_STEP=${1:-all}
40
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080041function do_requirements {
42 sudo apt update
43 sudo apt-get install -y --no-install-recommends \
44 autoconf \
45 automake \
46 bison \
47 build-essential \
48 cmake \
49 cpp \
50 curl \
51 flex \
52 git \
53 libavl-dev \
54 libboost-dev \
55 libboost-program-options-dev \
56 libboost-system-dev \
57 libboost-filesystem-dev \
58 libboost-thread-dev \
59 libboost-filesystem-dev \
60 libboost-program-options-dev \
61 libboost-system-dev \
62 libboost-test-dev \
63 libboost-thread-dev \
64 libc6-dev \
65 libev-dev \
66 libevent-dev \
67 libffi-dev \
68 libfl-dev \
69 libgc-dev \
70 libgc1c2 \
71 libgflags-dev \
72 libgmp-dev \
73 libgmp10 \
74 libgmpxx4ldbl \
75 libjudy-dev \
76 libpcap-dev \
77 libpcre3-dev \
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080078 libreadline6 \
79 libreadline6-dev \
80 libssl-dev \
81 libtool \
82 make \
83 mktemp \
84 pkg-config \
85 protobuf-c-compiler \
Carmelo Cascone57defd32018-05-11 14:34:01 -070086 python2.7 \
87 python2.7-dev \
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080088 tcpdump \
89 wget \
90 unzip
91
Charles Chan87dc82e2018-08-05 16:27:10 -070092 sudo -H pip install setuptools cffi ipaddr ipaddress pypcap
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080093}
94
95function do_requirements_1404 {
96 sudo apt install -y python-software-properties software-properties-common
97 sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
98 sudo add-apt-repository -y ppa:george-edison55/cmake-3.x
99 sudo apt update
100 sudo apt install -y \
101 dpkg-dev \
102 g++-4.9 \
103 gcc-4.9 \
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800104 cmake \
105 libbz2-dev
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800106
107 # Needed for p4c.
108 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 50
109 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 50
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800110
111 if [ -z "$(ldconfig -p | grep libboost_iostreams.so.1.58.0)" ]; then
112 do_boost
113 fi
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800114}
115
116function do_requirements_1604 {
117 sudo apt-get update
118 sudo apt-get install -y --no-install-recommends \
119 ca-certificates \
120 g++ \
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800121 libboost-iostreams1.58-dev \
122 libprotobuf-c-dev
123}
124
125function do_boost {
126 cd ${BUILD_DIR}
127 wget https://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.bz2/download -O boost_1_58_0.tar.bz2
128 tar --bzip2 -xf boost_1_58_0.tar.bz2
129 cd boost_1_58_0
130
131 ./bootstrap.sh --with-libraries=iostreams
132 sudo ./b2 install
133 sudo ldconfig
134
135 cd ..
136 sudo rm -rf boost_1_58_0
137}
138
139function do_protobuf-c {
140 cd ${BUILD_DIR}
141 git clone https://github.com/protobuf-c/protobuf-c.git
142 cd protobuf-c
143
144 ./autogen.sh
145 ./configure --prefix=/usr
146 make -j${NUM_CORES}
147 sudo make install
148 sudo ldconfig
149
150 cd ..
151 sudo rm -rf protobuf-c
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800152}
153
154function do_protobuf {
155 cd ${BUILD_DIR}
156 if [ ! -d protobuf ]; then
157 git clone https://github.com/google/protobuf.git
158 fi
159 cd protobuf
160 git fetch
161 git checkout ${PROTOBUF_COMMIT}
162
163 export CFLAGS="-Os"
164 export CXXFLAGS="-Os"
165 export LDFLAGS="-Wl,-s"
166 ./autogen.sh
167 ./configure --prefix=/usr
168 make -j${NUM_CORES}
169 sudo make install
170 sudo ldconfig
171 unset CFLAGS CXXFLAGS LDFLAGS
Carmelo Casconef645e842018-07-16 18:31:52 +0200172
173 cd python
174 sudo python setup.py install --cpp_implementation
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800175}
176
177function do_grpc {
178 cd ${BUILD_DIR}
179 if [ ! -d grpc ]; then
180 git clone https://github.com/grpc/grpc.git
181 fi
182 cd grpc
183 git fetch
184 git checkout ${GRPC_COMMIT}
185 git submodule update --init
186
187 export LDFLAGS="-Wl,-s"
188 make -j${NUM_CORES}
189 sudo make install
190 sudo ldconfig
191 unset LDFLAGS
Carmelo Casconef645e842018-07-16 18:31:52 +0200192
193 sudo pip install -r requirements.txt
194 sudo pip install .
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800195}
196
197function do_libyang {
198 cd ${BUILD_DIR}
199 if [ ! -d libyang ]; then
200 git clone https://github.com/CESNET/libyang.git
201 fi
202 cd libyang
203 git fetch
204 git checkout ${LIBYANG_COMMIT}
205
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800206 mkdir -p build
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800207 cd build
208 cmake ..
209 make -j${NUM_CORES}
210 sudo make install
211 sudo ldconfig
212}
213
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800214function do_sysrepo_deps {
215 RELEASE=`lsb_release -rs`
216 if version_ge $RELEASE 14.04 && [ -z "$(ldconfig -p | grep libprotobuf-c)" ]; then
217 do_protobuf-c
218 fi
219}
220
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800221function do_sysrepo {
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800222 do_sysrepo_deps
223
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800224 cd ${BUILD_DIR}
225 if [ ! -d sysrepo ]; then
226 git clone https://github.com/sysrepo/sysrepo.git
227 fi
228 cd sysrepo
229 git fetch
230 git checkout ${SYSREPO_COMMIT}
231
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800232 mkdir -p build
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800233 cd build
234 cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=Off \
235 -DCALL_TARGET_BINS_DIRECTLY=Off ..
236 make -j${NUM_CORES}
237 sudo make install
238 sudo ldconfig
239}
240
241function checkout_bmv2 {
242 cd ${BUILD_DIR}
243 if [ ! -d bmv2 ]; then
244 git clone https://github.com/p4lang/behavioral-model.git bmv2
245 fi
246 cd bmv2
247 git fetch
248 git checkout ${BMV2_COMMIT}
249}
250
251function do_pi_bmv2_deps {
252 checkout_bmv2
253 # From bmv2's install_deps.sh.
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200254 # Nanomsg is required also by PI.
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800255 tmpdir=`mktemp -d -p .`
256 cd ${tmpdir}
257 bash ../travis/install-thrift.sh
258 bash ../travis/install-nanomsg.sh
259 sudo ldconfig
260 bash ../travis/install-nnpy.sh
261 cd ..
262 sudo rm -rf $tmpdir
263}
264
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200265function do_PI {
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800266 cd ${BUILD_DIR}
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200267 if [ ! -d PI ]; then
268 git clone https://github.com/p4lang/PI.git
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800269 fi
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200270 cd PI
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800271 git fetch
272 git checkout ${PI_COMMIT}
273 git submodule update --init --recursive
274
275 ./autogen.sh
Carmelo Cascone4f985cd2018-02-11 17:36:42 -0800276 # FIXME: re-enable --with-sysrepo when gNMI support becomes more stable
Carmelo Cascone03ae0ac2018-10-11 08:31:59 -0700277 # ./configure --with-proto --with-sysrepo
278 ./configure --with-proto --without-internal-rpc --without-cli
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800279 make -j${NUM_CORES}
280 sudo make install
281 sudo ldconfig
282
Carmelo Cascone4f985cd2018-02-11 17:36:42 -0800283 # FIXME: re-enable when gNMI support becomes more stable
284 # sudo proto/sysrepo/install_yangs.sh
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800285}
286
287function do_bmv2 {
288 checkout_bmv2
289
290 ./autogen.sh
Carmelo Casconef02872d2018-06-20 08:49:02 +0200291 if [ "${DEBUG_FLAGS}" = true ] ; then
Carmelo Cascone03ae0ac2018-10-11 08:31:59 -0700292 ./configure --with-pi --disable-elogger --without-nanomsg
Carmelo Casconef02872d2018-06-20 08:49:02 +0200293 else
Carmelo Cascone03ae0ac2018-10-11 08:31:59 -0700294 ./configure --with-pi --disable-elogger --without-nanomsg --disable-logging-macros
Carmelo Casconef02872d2018-06-20 08:49:02 +0200295 fi
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800296 make -j${NUM_CORES}
297 sudo make install
298 sudo ldconfig
299
300 # Simple_switch_grpc target
301 cd targets/simple_switch_grpc
302 ./autogen.sh
Carmelo Cascone03ae0ac2018-10-11 08:31:59 -0700303 ./configure --with-thrift
Carmelo Cascone4f985cd2018-02-11 17:36:42 -0800304 # FIXME: re-enable --with-sysrepo when gNMI support becomes more stable
Carmelo Cascone03ae0ac2018-10-11 08:31:59 -0700305 # ./configure --with-sysrepo --with-thrift
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800306 make -j${NUM_CORES}
307 sudo make install
308 sudo ldconfig
309}
310
311function do_p4c {
312 cd ${BUILD_DIR}
313 if [ ! -d p4c ]; then
314 git clone https://github.com/p4lang/p4c.git
315 fi
316 cd p4c
317 git fetch
318 git checkout ${P4C_COMMIT}
319 git submodule update --init --recursive
320
321 mkdir -p build
322 cd build
Carmelo Cascone03ae0ac2018-10-11 08:31:59 -0700323 cmake .. -DENABLE_EBPF=OFF
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800324 make -j${NUM_CORES}
325 sudo make install
326 sudo ldconfig
327}
328
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200329function do_scapy-vxlan {
Carmelo Cascone76b3ee62018-01-30 15:45:27 -0800330 cd ${BUILD_DIR}
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200331 if [ ! -d scapy-vxlan ]; then
332 git clone https://github.com/p4lang/scapy-vxlan.git
Carmelo Cascone76b3ee62018-01-30 15:45:27 -0800333 fi
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200334 cd scapy-vxlan
335
Carmelo Cascone76b3ee62018-01-30 15:45:27 -0800336 git pull origin master
337
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200338 sudo python setup.py install
339}
340
341function do_ptf {
342 cd ${BUILD_DIR}
343 if [ ! -d ptf ]; then
344 git clone https://github.com/p4lang/ptf.git
345 fi
346 cd ptf
347 git pull origin master
348
349 sudo python setup.py install
Carmelo Cascone76b3ee62018-01-30 15:45:27 -0800350}
351
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800352function check_commit {
353 if [ ! -e $2 ]; then
354 return 0 # true
355 fi
356 if [[ $(< $2) != "$1" ]]; then
357 return 0 # true
358 fi
359 return 1 # false
360}
361
362# The following is borrowed from Mininet's util/install.sh
363function version_ge {
364 # sort -V sorts by *version number*
365 latest=`printf "$1\n$2" | sort -V | tail -1`
366 # If $1 is latest version, then $1 >= $2
367 [ "$1" == "$latest" ]
368}
369
370MUST_DO_ALL=false
371DID_REQUIREMENTS=false
372function check_and_do {
373 # Check if the latest built commit is the same we are trying to build now,
374 # or if all projects must be built. If true builds this project.
375 commit_id="$1"
376 proj_dir="$2"
377 func_name="$3"
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200378 step_name="$4"
379 commit_file=${BUILD_DIR}/${proj_dir}/.last_built_commit_${step_name}
Carmelo Cascone05354672018-04-10 13:24:03 -0700380 if [ ${MUST_DO_ALL} = true ] \
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200381 || check_commit ${commit_id} ${commit_file}; then
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800382 echo "#"
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200383 echo "# Building ${step_name} (${commit_id})"
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800384 echo "#"
385 # Print commands used to install to aid debugging
386 set -x
387 if ! ${DID_REQUIREMENTS} = true; then
388 do_requirements
389 # TODO consider other Linux distros; presently this script assumes
390 # that it is running on Ubuntu.
391 RELEASE=`lsb_release -rs`
392 if version_ge $RELEASE 16.04; then
393 do_requirements_1604
394 elif version_ge $RELEASE 14.04; then
395 do_requirements_1404
396 else
397 echo "Ubuntu version $RELEASE is not supported"
398 exit 1
399 fi
400 DID_REQUIREMENTS=true
401 fi
402 eval ${func_name}
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200403 echo ${commit_id} > ${commit_file}
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800404 # Build all next projects as they might depend on this one.
405 MUST_DO_ALL=true
406 # Disable printing to reduce output
407 set +x
408 else
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200409 echo "${step_name} is up to date (commit ${commit_id})"
410 fi
411 # Exit if last step.
412 if [ ${step_name} = ${LAST_STEP} ]; then
413 exit
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800414 fi
415}
416
417mkdir -p ${BUILD_DIR}
418cd ${BUILD_DIR}
419# In dependency order.
420check_and_do ${PROTOBUF_COMMIT} protobuf do_protobuf protobuf
421check_and_do ${GRPC_COMMIT} grpc do_grpc grpc
Carmelo Cascone4f985cd2018-02-11 17:36:42 -0800422# FIXME: re-enable when gNMI support becomes more stable
423# check_and_do ${LIBYANG_COMMIT} libyang do_libyang libyang
424# check_and_do ${SYSREPO_COMMIT} sysrepo do_sysrepo sysrepo
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800425check_and_do ${BMV2_COMMIT} bmv2 do_pi_bmv2_deps bmv2-deps
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200426check_and_do ${PI_COMMIT} PI do_PI PI
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800427check_and_do ${BMV2_COMMIT} bmv2 do_bmv2 bmv2
428check_and_do ${P4C_COMMIT} p4c do_p4c p4c
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200429check_and_do master scapy-vxlan do_scapy-vxlan scapy-vxlan
430check_and_do master ptf do_ptf ptf
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800431
432echo "Done!"