#  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 a minimal distribution, the required system tools and libraries,
# runtime dependencies and the Tuscany SCA runtime on Ubuntu Server 12.04.

# Display commands as they are executed
set -x

# First update the system
sudo apt-get update

# Create install directory
u=`id -un`
g=`id -gn`
sudo mkdir -p /opt/tuscany
sudo chown $u /opt/tuscany
sudo chgrp $g /opt/tuscany
cd /opt/tuscany

# 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

# Download and install the Tuscany runtime
curl -OL http://people.apache.org/~jsdelfino/tuscany/test/tuscany-sca-cpp-1.0.tar.gz
tar xzf tuscany-sca-cpp-1.0.tar.gz

