#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you 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.

# Install the required system tools and libraries and runtime dependencies
# for a minimal Tuscany SCA runtime distribution on Ubuntu Server 12.04.

# Display commands as they are executed
set -x

# First update the system
sudo apt-get update

# Install core dev tools
sudo apt-get -y install curl git-core subversion autoconf pkg-config automake libtool g++ make gdb vim
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Apache HTTP server dependencies
sudo apt-get -y install libssl-dev libpcre3-dev
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Memcached dependencies
sudo apt-get -y install libevent-dev
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the SpiderMonkey dependencies
sudo apt-get -y install zip unzip
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the PostgreSQL dependencies
sudo apt-get -y install libreadline-dev
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Apache Thrift dependencies
sudo apt-get -y install bison flex libboost-dev libboost-filesystem-dev
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Facebook Scribe dependencies
sudo apt-get -y install gawk
if [ "$?" != "0" ]; then
    exit $?
fi

