blob: 3abbb4a68f328ca5b784dd960b66ac3b95bf1f91 [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 Casconeb0f45fe2018-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 Casconeb0f45fe2018-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 \
Carmelo Casconeb0c66652018-11-25 02:26:32 -080053 graphviz \
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080054 libavl-dev \
55 libboost-dev \
Carmelo Casconeb0c66652018-11-25 02:26:32 -080056 libboost-graph-dev \
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080057 libboost-program-options-dev \
58 libboost-system-dev \
59 libboost-filesystem-dev \
60 libboost-thread-dev \
61 libboost-filesystem-dev \
62 libboost-program-options-dev \
63 libboost-system-dev \
64 libboost-test-dev \
65 libboost-thread-dev \
66 libc6-dev \
67 libev-dev \
68 libevent-dev \
69 libffi-dev \
70 libfl-dev \
71 libgc-dev \
72 libgc1c2 \
73 libgflags-dev \
74 libgmp-dev \
75 libgmp10 \
76 libgmpxx4ldbl \
77 libjudy-dev \
78 libpcap-dev \
79 libpcre3-dev \
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080080 libreadline6 \
81 libreadline6-dev \
82 libssl-dev \
83 libtool \
84 make \
85 mktemp \
86 pkg-config \
87 protobuf-c-compiler \
Carmelo Cascone57defd32018-05-11 14:34:01 -070088 python2.7 \
89 python2.7-dev \
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080090 tcpdump \
91 wget \
92 unzip
93
Charles Chan87dc82e2018-08-05 16:27:10 -070094 sudo -H pip install setuptools cffi ipaddr ipaddress pypcap
Carmelo Casconeb7e618d2018-01-12 18:31:33 -080095}
96
97function do_requirements_1404 {
98 sudo apt install -y python-software-properties software-properties-common
99 sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
100 sudo add-apt-repository -y ppa:george-edison55/cmake-3.x
101 sudo apt update
102 sudo apt install -y \
103 dpkg-dev \
104 g++-4.9 \
105 gcc-4.9 \
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800106 cmake \
107 libbz2-dev
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800108
109 # Needed for p4c.
110 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 50
111 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 50
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800112
113 if [ -z "$(ldconfig -p | grep libboost_iostreams.so.1.58.0)" ]; then
114 do_boost
115 fi
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800116}
117
118function do_requirements_1604 {
119 sudo apt-get update
120 sudo apt-get install -y --no-install-recommends \
121 ca-certificates \
122 g++ \
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800123 libboost-iostreams1.58-dev \
124 libprotobuf-c-dev
125}
126
127function do_boost {
128 cd ${BUILD_DIR}
129 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
130 tar --bzip2 -xf boost_1_58_0.tar.bz2
131 cd boost_1_58_0
132
133 ./bootstrap.sh --with-libraries=iostreams
134 sudo ./b2 install
135 sudo ldconfig
136
137 cd ..
138 sudo rm -rf boost_1_58_0
139}
140
141function do_protobuf-c {
142 cd ${BUILD_DIR}
143 git clone https://github.com/protobuf-c/protobuf-c.git
144 cd protobuf-c
145
146 ./autogen.sh
147 ./configure --prefix=/usr
148 make -j${NUM_CORES}
149 sudo make install
150 sudo ldconfig
151
152 cd ..
153 sudo rm -rf protobuf-c
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800154}
155
156function do_protobuf {
157 cd ${BUILD_DIR}
158 if [ ! -d protobuf ]; then
159 git clone https://github.com/google/protobuf.git
160 fi
161 cd protobuf
162 git fetch
163 git checkout ${PROTOBUF_COMMIT}
164
165 export CFLAGS="-Os"
166 export CXXFLAGS="-Os"
167 export LDFLAGS="-Wl,-s"
168 ./autogen.sh
169 ./configure --prefix=/usr
170 make -j${NUM_CORES}
171 sudo make install
172 sudo ldconfig
173 unset CFLAGS CXXFLAGS LDFLAGS
Carmelo Casconef645e842018-07-16 18:31:52 +0200174
175 cd python
176 sudo python setup.py install --cpp_implementation
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800177}
178
179function do_grpc {
180 cd ${BUILD_DIR}
181 if [ ! -d grpc ]; then
182 git clone https://github.com/grpc/grpc.git
183 fi
184 cd grpc
185 git fetch
186 git checkout ${GRPC_COMMIT}
187 git submodule update --init
188
189 export LDFLAGS="-Wl,-s"
190 make -j${NUM_CORES}
191 sudo make install
192 sudo ldconfig
193 unset LDFLAGS
Carmelo Casconef645e842018-07-16 18:31:52 +0200194
195 sudo pip install -r requirements.txt
196 sudo pip install .
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800197}
198
199function do_libyang {
200 cd ${BUILD_DIR}
201 if [ ! -d libyang ]; then
202 git clone https://github.com/CESNET/libyang.git
203 fi
204 cd libyang
205 git fetch
206 git checkout ${LIBYANG_COMMIT}
207
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800208 mkdir -p build
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800209 cd build
210 cmake ..
211 make -j${NUM_CORES}
212 sudo make install
213 sudo ldconfig
214}
215
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800216function do_sysrepo_deps {
217 RELEASE=`lsb_release -rs`
218 if version_ge $RELEASE 14.04 && [ -z "$(ldconfig -p | grep libprotobuf-c)" ]; then
219 do_protobuf-c
220 fi
221}
222
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800223function do_sysrepo {
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800224 do_sysrepo_deps
225
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800226 cd ${BUILD_DIR}
227 if [ ! -d sysrepo ]; then
228 git clone https://github.com/sysrepo/sysrepo.git
229 fi
230 cd sysrepo
231 git fetch
232 git checkout ${SYSREPO_COMMIT}
233
Kevin Chuang53a9d5b2018-01-17 15:55:32 +0800234 mkdir -p build
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800235 cd build
236 cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=Off \
237 -DCALL_TARGET_BINS_DIRECTLY=Off ..
238 make -j${NUM_CORES}
239 sudo make install
240 sudo ldconfig
241}
242
243function checkout_bmv2 {
244 cd ${BUILD_DIR}
245 if [ ! -d bmv2 ]; then
246 git clone https://github.com/p4lang/behavioral-model.git bmv2
247 fi
248 cd bmv2
249 git fetch
250 git checkout ${BMV2_COMMIT}
251}
252
253function do_pi_bmv2_deps {
254 checkout_bmv2
255 # From bmv2's install_deps.sh.
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200256 # Nanomsg is required also by PI.
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800257 tmpdir=`mktemp -d -p .`
258 cd ${tmpdir}
259 bash ../travis/install-thrift.sh
260 bash ../travis/install-nanomsg.sh
261 sudo ldconfig
262 bash ../travis/install-nnpy.sh
263 cd ..
264 sudo rm -rf $tmpdir
265}
266
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200267function do_PI {
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800268 cd ${BUILD_DIR}
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200269 if [ ! -d PI ]; then
270 git clone https://github.com/p4lang/PI.git
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800271 fi
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200272 cd PI
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800273 git fetch
274 git checkout ${PI_COMMIT}
275 git submodule update --init --recursive
276
277 ./autogen.sh
Carmelo Cascone4f985cd2018-02-11 17:36:42 -0800278 # FIXME: re-enable --with-sysrepo when gNMI support becomes more stable
Carmelo Casconeb0f45fe2018-10-11 08:31:59 -0700279 # ./configure --with-proto --with-sysrepo
280 ./configure --with-proto --without-internal-rpc --without-cli
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800281 make -j${NUM_CORES}
282 sudo make install
283 sudo ldconfig
284
Carmelo Cascone4f985cd2018-02-11 17:36:42 -0800285 # FIXME: re-enable when gNMI support becomes more stable
286 # sudo proto/sysrepo/install_yangs.sh
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800287}
288
289function do_bmv2 {
290 checkout_bmv2
291
292 ./autogen.sh
Carmelo Casconef02872d2018-06-20 08:49:02 +0200293 if [ "${DEBUG_FLAGS}" = true ] ; then
Carmelo Casconeb0f45fe2018-10-11 08:31:59 -0700294 ./configure --with-pi --disable-elogger --without-nanomsg
Carmelo Casconef02872d2018-06-20 08:49:02 +0200295 else
Carmelo Casconeb0f45fe2018-10-11 08:31:59 -0700296 ./configure --with-pi --disable-elogger --without-nanomsg --disable-logging-macros
Carmelo Casconef02872d2018-06-20 08:49:02 +0200297 fi
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800298 make -j${NUM_CORES}
299 sudo make install
300 sudo ldconfig
301
302 # Simple_switch_grpc target
303 cd targets/simple_switch_grpc
304 ./autogen.sh
Carmelo Casconeb0f45fe2018-10-11 08:31:59 -0700305 ./configure --with-thrift
Carmelo Cascone4f985cd2018-02-11 17:36:42 -0800306 # FIXME: re-enable --with-sysrepo when gNMI support becomes more stable
Carmelo Casconeb0f45fe2018-10-11 08:31:59 -0700307 # ./configure --with-sysrepo --with-thrift
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800308 make -j${NUM_CORES}
309 sudo make install
310 sudo ldconfig
311}
312
313function do_p4c {
314 cd ${BUILD_DIR}
315 if [ ! -d p4c ]; then
316 git clone https://github.com/p4lang/p4c.git
317 fi
318 cd p4c
319 git fetch
320 git checkout ${P4C_COMMIT}
321 git submodule update --init --recursive
322
323 mkdir -p build
324 cd build
Carmelo Casconeb0f45fe2018-10-11 08:31:59 -0700325 cmake .. -DENABLE_EBPF=OFF
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800326 make -j${NUM_CORES}
327 sudo make install
328 sudo ldconfig
329}
330
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200331function do_scapy-vxlan {
Carmelo Cascone76b3ee62018-01-30 15:45:27 -0800332 cd ${BUILD_DIR}
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200333 if [ ! -d scapy-vxlan ]; then
334 git clone https://github.com/p4lang/scapy-vxlan.git
Carmelo Cascone76b3ee62018-01-30 15:45:27 -0800335 fi
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200336 cd scapy-vxlan
337
Carmelo Cascone76b3ee62018-01-30 15:45:27 -0800338 git pull origin master
339
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200340 sudo python setup.py install
341}
342
343function do_ptf {
344 cd ${BUILD_DIR}
345 if [ ! -d ptf ]; then
346 git clone https://github.com/p4lang/ptf.git
347 fi
348 cd ptf
349 git pull origin master
350
351 sudo python setup.py install
Carmelo Cascone76b3ee62018-01-30 15:45:27 -0800352}
353
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800354function check_commit {
355 if [ ! -e $2 ]; then
356 return 0 # true
357 fi
358 if [[ $(< $2) != "$1" ]]; then
359 return 0 # true
360 fi
361 return 1 # false
362}
363
364# The following is borrowed from Mininet's util/install.sh
365function version_ge {
366 # sort -V sorts by *version number*
367 latest=`printf "$1\n$2" | sort -V | tail -1`
368 # If $1 is latest version, then $1 >= $2
369 [ "$1" == "$latest" ]
370}
371
372MUST_DO_ALL=false
373DID_REQUIREMENTS=false
374function check_and_do {
375 # Check if the latest built commit is the same we are trying to build now,
376 # or if all projects must be built. If true builds this project.
377 commit_id="$1"
378 proj_dir="$2"
379 func_name="$3"
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200380 step_name="$4"
381 commit_file=${BUILD_DIR}/${proj_dir}/.last_built_commit_${step_name}
Carmelo Cascone05354672018-04-10 13:24:03 -0700382 if [ ${MUST_DO_ALL} = true ] \
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200383 || check_commit ${commit_id} ${commit_file}; then
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800384 echo "#"
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200385 echo "# Building ${step_name} (${commit_id})"
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800386 echo "#"
387 # Print commands used to install to aid debugging
388 set -x
389 if ! ${DID_REQUIREMENTS} = true; then
390 do_requirements
391 # TODO consider other Linux distros; presently this script assumes
392 # that it is running on Ubuntu.
393 RELEASE=`lsb_release -rs`
394 if version_ge $RELEASE 16.04; then
395 do_requirements_1604
396 elif version_ge $RELEASE 14.04; then
397 do_requirements_1404
398 else
399 echo "Ubuntu version $RELEASE is not supported"
400 exit 1
401 fi
402 DID_REQUIREMENTS=true
403 fi
404 eval ${func_name}
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200405 echo ${commit_id} > ${commit_file}
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800406 # Build all next projects as they might depend on this one.
407 MUST_DO_ALL=true
408 # Disable printing to reduce output
409 set +x
410 else
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200411 echo "${step_name} is up to date (commit ${commit_id})"
412 fi
413 # Exit if last step.
414 if [ ${step_name} = ${LAST_STEP} ]; then
415 exit
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800416 fi
417}
418
419mkdir -p ${BUILD_DIR}
420cd ${BUILD_DIR}
421# In dependency order.
422check_and_do ${PROTOBUF_COMMIT} protobuf do_protobuf protobuf
423check_and_do ${GRPC_COMMIT} grpc do_grpc grpc
Carmelo Cascone4f985cd2018-02-11 17:36:42 -0800424# FIXME: re-enable when gNMI support becomes more stable
425# check_and_do ${LIBYANG_COMMIT} libyang do_libyang libyang
426# check_and_do ${SYSREPO_COMMIT} sysrepo do_sysrepo sysrepo
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800427check_and_do ${BMV2_COMMIT} bmv2 do_pi_bmv2_deps bmv2-deps
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200428check_and_do ${PI_COMMIT} PI do_PI PI
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800429check_and_do ${BMV2_COMMIT} bmv2 do_bmv2 bmv2
430check_and_do ${P4C_COMMIT} p4c do_p4c p4c
Carmelo Cascone95e5afd2018-07-17 14:45:23 +0200431check_and_do master scapy-vxlan do_scapy-vxlan scapy-vxlan
432check_and_do master ptf do_ptf ptf
Carmelo Casconeb7e618d2018-01-12 18:31:33 -0800433
434echo "Done!"