#  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 complete 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 Apache Qpid/C++ dependencies
sudo apt-get -y install libboost-dev libboost-program-options-dev libboost-filesystem-dev uuid-dev
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Apache Vysper dependencies
sudo apt-get -y install openjdk-6-jdk
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the HTML Tidy dependencies
sudo apt-get -y install cvs
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
if [ "$?" != "0" ]; then
    exit $?
fi

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

