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

# 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 /mnt/tuscany
sudo chown $u /mnt/tuscany
sudo chgrp $g /mnt/tuscany
cd /mnt/tuscany

# Install core dev tools
sudo apt-get -y install curl git-core subversion autoconf pkg-config automake libtool g++ make
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by Apache HTTP server
sudo apt-get -y install libssl-dev libpcre3-dev
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by Memcached
sudo apt-get -y install libevent-dev
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by SpiderMonkey
sudo apt-get -y install zip unzip
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by HTML Tidy
sudo apt-get -y install cvs
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by Apache Thrift
sudo apt-get -y install bison flex python-dev libboost-dev libboost-filesystem-dev
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by Facebook Scribe
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

