Add code to specify tuf stable/unstable.
[bitmask_bundler.git] / createbundle.sh
1 #!/bin/bash
2 ######################################################################
3 # Copyright (C) 2013 LEAP
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 ######################################################################
18
19 # This script is meant to be used as a bootstrapper for the environment to
20 # create a Bitmask bundle for Linux.
21
22 # This is tested to work on Debian 7.1 32 and 64 bits Virtual Machines
23
24 # This script uses `sudo` which is installed by default on debian, but you need
25 # to configure your non-root user to be able to use `sudo`.
26
27 # Edit the /etc/sudoers file and add this line at the bottom:
28 # leap ALL=NOPASSWD: ALL
29
30 # WARNING: That line allows the user 'leap' to use `sudo` without being asked
31 # for a password, that makes the script easier to use but it would be a
32 # security problem. If you use this script in a VM and only for bundling
33 # purposes then it shouldn't be a problem.
34
35 # You'll need an internet connection, approximately 1.3Gb of disk space and
36 # some patience.
37
38 ################################################################################
39
40 set -e  # Exit immediately if a command exits with a non-zero status.
41
42 BASE='/home/leap/bitmask.bundle'
43
44 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}"  )" && pwd  )"
45 VERSIONS_FILE="$SCRIPT_DIR/bitmask.json"
46 BINARY_COPIER="$SCRIPT_DIR/copy-binaries.sh"
47
48 mkdir -p $BASE
49
50 # Note: we could use:
51 # ARCH=`uname -i`
52 # but it does not work on a VM (tested in i386 returns unknown)
53 if [[ `getconf LONG_BIT` == "64" ]]; then
54     ARCH='x86_64-linux-gnu'
55 else
56     ARCH='i386-linux-gnu'
57 fi
58
59 install_dependencies() {
60     sudo apt-get update  # update apt, otherwise some packages may not be found
61     sudo apt-get install -y build-essential python-dev cmake git autoconf \
62         libtool liblzo2-dev libqt4-dev libxml2-dev libxslt1-dev qtmobility-dev \
63         libsqlite3-dev libffi-dev python-virtualenv
64 }
65
66 build_boost() {
67     cd $BASE
68
69     BOOST_NAME='boost_1_56_0'
70     wget -c http://ufpr.dl.sourceforge.net/project/boost/boost/1.56.0/$BOOST_NAME.tar.bz2
71     tar xjf $BOOST_NAME.tar.bz2
72
73     cd $BOOST_NAME/tools/build/
74     ./bootstrap.sh --with-toolset=gcc
75     ./b2 install --prefix=$BASE/boost
76     export PATH=$PATH:$BASE/boost/bin/
77
78     cd $BASE/$BOOST_NAME # boost root
79     b2 cxxflags=-std=c++0x --with-python --with-filesystem --with-system variant=release link=shared
80 }
81
82 build_launcher() {
83     cd $BASE
84     git clone -b develop https://leap.se/git/bitmask_launcher.git
85     cd bitmask_launcher
86
87     mkdir build
88     cd build
89
90     cmake -DBoost_INCLUDE_DIR=$BASE/$BOOST_NAME ..
91     make
92 }
93
94 build_openvpn() {
95     # Build openvpn to support RPATH
96     cd $BASE
97     git clone https://github.com/OpenVPN/openvpn.git
98     cd openvpn
99     autoreconf -i
100     LZO_LIBS="/usr/lib/$ARCH/liblzo2.a" ./configure LDFLAGS="-Wl,-rpath,lib/" --disable-snappy --disable-plugin-auth-pam
101     make -j2
102 }
103
104 build_pyside() {
105     # for more information look at:
106     # https://github.com/PySide/pyside-setup/blob/master/docs/building/linux.rst
107     cd $BASE
108     sudo pip install wheel
109
110     git clone https://github.com/PySide/pyside-setup.git pyside-setup.git
111     cd pyside-setup.git
112     python setup.py bdist_wheel --qmake=/usr/bin/qmake-qt4 --version=1.2.2
113 }
114
115 set_pyside_environment() {
116     arch_bits=`getconf LONG_BIT`  # '32' or '64'
117     # from https://github.com/PySide/BuildScripts/blob/master/environment.sh
118     PYSIDE="$BASE/pyside-setup.git/pyside_install/py2.7-qt4.8.2-${arch_bits}bit-release/"
119     PYTHONXY='python2.7'
120     export PATH=$PYSIDE/bin:$PATH
121     export PYTHONPATH=$PYSIDE/lib/$PYTHONXY/site-packages:$PYSIDE/lib64/$PYTHONXY/site-packages:$PYTHONPATH
122     export LD_LIBRARY_PATH=$PYSIDE/lib:$LD_LIBRARY_PATH
123     export PKG_CONFIG_PATH=$PYSIDE/lib/pkgconfig:$PKG_CONFIG_PATH
124     export DYLD_LIBRARY_PATH=$PYSIDE/lib:$DYLD_LIBRARY_PATH
125 }
126
127 copy_binaries() {
128     cd $BASE
129     $BINARY_COPIER
130 }
131
132 create_bundler_paths() {
133     cd $BASE
134     cat > bundler.paths << EOF
135 $BASE/bitmask_bundler.git/bundler
136 /usr/lib/python2.7
137 /usr/lib/python2.7/plat-linux2
138 /usr/lib/python2.7/lib-tk
139 /usr/lib/python2.7/lib-old
140 /usr/lib/python2.7/lib-dynload
141 /usr/local/lib/python2.7/dist-packages
142 /usr/lib/python2.7/dist-packages
143 /usr/lib/python2.7/dist-packages/gtk-2.0
144 /usr/lib/pymodules/python2.7
145 EOF
146 }
147
148 setup_bundler() {
149     cd $BASE
150
151     git clone https://github.com/leapcode/bitmask_bundler.git bitmask_bundler.git
152     virtualenv bundler.venv && source bundler.venv/bin/activate
153
154     # HACK: install these dependencies manually since they can't be installed normally due not passing some pip checks.
155     pip install --upgrade pip
156     pip install --allow-external u1db --allow-unverified u1db --allow-external dirspec --allow-unverified dirspec u1db dirspec
157
158     git clone https://github.com/chiiph/protobuf-socket-rpc protobuf-socket-rpc.git
159     cd protobuf-socket-rpc.git
160     python setup.py easy_install -Z .
161
162     pip install -r $BASE/bitmask_bundler.git/pkg/requirements.pip
163 }
164
165 clean() {
166     cd $BASE
167     rm -fr bitmask_bundler.git bundler.venv protobuf-socket-rpc.git bundler.output
168 }
169
170 run_bundler() {
171     cd $BASE
172
173     # if the virtualenv is not sourced, then source it!
174     # this is helpful if you want to run only this step
175     [[ -z "$VIRTUAL_ENV"  ]] && source bundler.venv/bin/activate
176
177     set_pyside_environment
178
179     mkdir bundler.output
180
181     # Use a shortcut for the bundler command
182     bundler="python bitmask_bundler.git/bundler/main.py --workon bundler.output --binaries binaries/ --paths-file bundler.paths --versions-file $VERSIONS_FILE"
183
184     $bundler --do gitclone
185     $bundler --do gitcheckout
186
187     $bundler --do pythonsetup
188     $bundler --skip gitclone gitcheckout pythonsetup
189 }
190
191 REUSE_BINARIES=$BASE/reuse-binaries.lock
192
193 if [[ ! -f $BINARY_COPIER ]]; then
194     echo "ERROR: missing $BINARY_COPIER file."
195     exit 1
196 fi
197
198 if [[ ! -f $VERSIONS_FILE ]]; then
199     echo "ERROR: missing $VERSIONS_FILE file."
200     exit 1
201 fi
202
203 if [[ ! -f $REUSE_BINARIES ]]; then
204     install_dependencies
205     build_boost
206     build_launcher
207     build_openvpn
208     build_pyside
209     copy_binaries
210     create_bundler_paths
211 else
212     echo "Reusing existing binaries, cleaning up before creating a new bundle..."
213     clean
214 fi
215
216 setup_bundler
217 run_bundler
218
219 echo 'If you remove this file the createbundle.sh script will rebuild all the binaries.' > $REUSE_BINARIES