summaryrefslogtreecommitdiffstats
path: root/build/build_quagga.sh
diff options
context:
space:
mode:
Diffstat (limited to 'build/build_quagga.sh')
-rwxr-xr-xbuild/build_quagga.sh250
1 files changed, 250 insertions, 0 deletions
diff --git a/build/build_quagga.sh b/build/build_quagga.sh
new file mode 100755
index 00000000..7d298e57
--- /dev/null
+++ b/build/build_quagga.sh
@@ -0,0 +1,250 @@
+#!/usr/bin/env bash
+##############################################################################
+# Copyright (c) 2017 Tim Rozet (Red Hat) and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+set -xe
+
+ARTIFACT=None
+
+# Builds Quagga, Zebra and other dependency RPMs for CentOS 7
+# Install package dependencies
+install_quagga_build_deps() {
+ sudo yum -y install automake bison flex libtool make readline-devel \
+ texinfo texi2html rpm-build libcap-devel groff net-snmp-devel pam-devel glib2 glib2-devel epel-release spectool \
+ wget git gcc-c++ openssl-devel boost-devel boost-static gtest zeromq-4.1.4 zeromq-devel-4.1.4 \
+ capnproto-devel capnproto-libs capnproto
+ sudo yum -y groupinstall "Development Tools"
+}
+
+display_usage ()
+{
+cat << EOF
+$0 Builds Quagga/ZRPC and Dependency RPMs
+
+usage: $0 [ [-a | --artifact] artifact ]
+
+OPTIONS:
+ -a artifact to build (thrift, capnproto, quagga, zrpc). Default: All artifacts.
+ -c clean all build directories
+ -h help, prints this help text
+
+Example:
+build_quagga.sh -a thrift
+EOF
+}
+
+parse_cmdline() {
+ while [ "${1:0:1}" = "-" ]
+ do
+ case "$1" in
+ -h|--help)
+ display_usage
+ exit 0
+ ;;
+ -a|--artifact)
+ ARTIFACT=${2}
+ shift 2
+ ;;
+ -c|--clean)
+ CLEAN="True"
+ shift 1
+ ;;
+ *)
+ display_usage
+ exit 1
+ ;;
+ esac
+ done
+
+}
+
+# Removes build directory folder and re-creates RPM DIRs to use
+function quagga_clean(){
+ rm -rf ${QUAGGA_BUILD_DIR}
+ sudo yum remove -y zrpc* quagga* thrift* c-capnproto*
+}
+
+# Build Thrift RPM
+function build_thrift(){
+ rm -rf thrift
+ git clone https://git-wip-us.apache.org/repos/asf/thrift.git
+ pushd thrift
+ git checkout 0.10.0
+ wget https://issues.apache.org/jira/secure/attachment/12840511/0002-THRIFT-3986-using-autoreconf-i-fails-because-of-miss.patch
+ wget https://issues.apache.org/jira/secure/attachment/12840512/0001-THRIFT-3987-externalise-declaration-of-thrift-server.patch
+ patch -p1 < 0002-THRIFT-3986-using-autoreconf-i-fails-because-of-miss.patch
+ patch -p1 < 0001-THRIFT-3987-externalise-declaration-of-thrift-server.patch
+ autoreconf -i
+ ./configure --without-qt4 --without-qt5 --without-csharp --without-java \
+ --without-erlang --without-nodejs --without-perl --without-python \
+ --without-php --without-php_extension --without-dart --without-ruby \
+ --without-haskell --without-go --without-haxe --without-d
+ # Hack somehow the testing file of php is not there
+ # We will disable php anyhow later on.
+ touch lib/php/src/ext/thrift_protocol/run-tests.php
+ make dist
+ pushd contrib/
+ spectool -g -R thrift.spec
+ mv ../thrift-*.tar.gz $rpmbuild/SOURCES/
+ rpmbuild --define "_topdir $rpmbuild" -ba thrift.spec --define "without_ruby 1" --define "without-php 1"
+ popd > /dev/null
+ popd > /dev/null
+}
+
+# c-capnproto RPM
+# This is a library for capnproto in C. Not to be confused with
+# the capnproto provided by the repos
+function build_capnproto(){
+ rm -rf c-capnproto
+ git clone https://github.com/opensourcerouting/c-capnproto
+ pushd c-capnproto
+ git checkout 332076e52257
+ autoreconf -i
+ ./configure --without-gtest
+ make dist
+
+ cp ${BUILD_ROOT}/rpm_specs/c_capnproto.spec $rpmbuild/SPECS/
+ cp c-capnproto-*.tar.gz $rpmbuild/SOURCES/
+ rpmbuild --define "_topdir $rpmbuild" -ba $rpmbuild/SPECS/c_capnproto.spec
+ popd > /dev/null
+}
+
+build_quagga(){
+ # Build Quagga
+ rm -rf quagga
+ sudo yum -y install $rpmbuild/RPMS/x86_64/*.rpm
+ git clone https://github.com/6WIND/quagga.git
+ pushd quagga > /dev/null
+ # checkout the parent of the bellow patch.
+ # Once the issue addressed by the patch is fixed
+ # these two lines can be removed.
+ git checkout 95bb0f4a
+ patch -p1 < ${PATCHES_DIR}/fix_quagga_make_dist.patch
+ autoreconf -i
+ ./configure --with-zeromq --with-ccapnproto --enable-user=quagga \
+ --enable-group=quagga --enable-vty-group=quagga \
+ --disable-doc --enable-multipath=64
+
+ # Quagga RPM
+ make dist
+ cp ${BUILD_ROOT}/rpm_specs/quagga.spec $rpmbuild/SPECS/
+ cp quagga*.tar.gz $rpmbuild/SOURCES/
+ cat > $rpmbuild/SOURCES/bgpd.conf <<EOF
+hostname bgpd
+password sdncbgpc
+service advanced-vty
+log stdout
+line vty
+ exec-timeout 0 0
+debug bgp
+debug bgp updates
+debug bgp events
+debug bgp fsm
+EOF
+ rpmbuild --define "_topdir $rpmbuild" -ba $rpmbuild/SPECS/quagga.spec
+ popd > /dev/null
+}
+
+# Build ZPRC
+build_zrpc(){
+ sudo yum -y install $rpmbuild/RPMS/x86_64/*.rpm
+ rm -rf zrpcd
+ git clone https://github.com/6WIND/zrpcd.git
+ pushd zrpcd > /dev/null
+ touch NEWS README
+ export QUAGGA_CFLAGS='-I/usr/include/quagga/'
+ # checkout the parent of the bellow patch.
+ # Once the issue addressed by the patch is fixed
+ # these two lines can be removed.
+ git checkout 9bd1ee8e
+ patch -p1 < ${PATCHES_DIR}/fix_zrpcd_make_dist.patch
+ patch -p1 < ${PATCHES_DIR}/zrpcd_hardcoded_paths.patch
+ autoreconf -i
+
+ # ZRPC RPM
+ ./configure --enable-zrpcd \
+ --enable-user=quagga --enable-group=quagga \
+ --enable-vty-group=quagga
+ make dist
+
+ cat > $rpmbuild/SOURCES/zrpcd.service <<EOF
+[Unit]
+Description=ZRPC daemon for quagga
+After=network.service
+
+[Service]
+ExecStart=/usr/sbin/zrpcd
+Type=forking
+PIDFile=/var/run/zrpcd.pid
+Restart=on-failure
+
+[Install]
+WantedBy=default.target
+EOF
+ cp zrpcd-*.tar.gz $rpmbuild/SOURCES/
+ cp ${BUILD_ROOT}/rpm_specs/zrpc.spec $rpmbuild/SPECS/
+ rpmbuild --define "_topdir $rpmbuild" -ba $rpmbuild/SPECS/zrpc.spec
+}
+
+# Main
+parse_cmdline "$@"
+
+# Check env vars
+if [ -z "$QUAGGA_BUILD_DIR" ]; then
+ echo "ERROR: You must set QUAGGA_BUILD_DIR env variable as the location to build!"
+ exit 1
+elif [ -z "$QUAGGA_RPMS_DIR" ]; then
+ echo "WARN: QUAGGA_RPMS_DIR env var is not set, will default to QUAGGA_BUILD_DIR/rpmbuild"
+ rpmbuild=${QUAGGA_BUILD_DIR}/rpmbuild
+else
+ rpmbuild=${QUAGGA_RPMS_DIR}
+fi
+
+if [ -z "$BUILD_ROOT" ]; then
+ echo "WARN: BUILD_ROOT env var not set, will default to $(pwd)"
+ BUILD_ROOT=$(pwd)
+fi
+
+if [ -z "$PATCHES_DIR" ]; then
+ echo "WARN: PATCHES_DIR env var not set, will default to ${BUILD_ROOT}/patches"
+ PATCHES_DIR=${BUILD_ROOT}/patches
+fi
+
+if [ -n "$CLEAN" ]; then
+ quagga_clean
+fi
+
+install_quagga_build_deps
+
+mkdir -p ${QUAGGA_BUILD_DIR}
+mkdir -p $rpmbuild $rpmbuild/SOURCES $rpmbuild/SPECS $rpmbuild/RPMS
+pushd $QUAGGA_BUILD_DIR > /dev/null
+
+case "$ARTIFACT" in
+ thrift)
+ build_thrift
+ ;;
+ capnproto)
+ build_capnproto
+ ;;
+ quagga)
+ build_quagga
+ ;;
+ zrpc)
+ build_zrpc
+ ;;
+ *)
+ build_thrift
+ build_capnproto
+ build_quagga
+ build_zprc
+ ;;
+esac
+
+popd > /dev/null