Add bitmask 0.9.0alpha10 spec file
[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 ROOT_JSON="$SCRIPT_DIR/root.json"
48
49 # picked from https://github.com/OpenVPN/openvpn/releases
50 OPENVPN_VERSION="v2.3.6"
51
52 BOOST_MINOR="57"  # Minor version
53 BOOST_NAME="boost_1_${BOOST_MINOR}_0"
54
55 mkdir -p $BASE
56
57 # Note: we could use:
58 # ARCH=`uname -i`
59 # but it does not work on a VM (tested in i386 returns unknown)
60 if [[ `getconf LONG_BIT` == "64" ]]; then
61     ARCH='x86_64-linux-gnu'
62 else
63     ARCH='i386-linux-gnu'
64 fi
65
66 install_dependencies() {
67     sudo apt-get update  # update apt, otherwise some packages may not be found
68     sudo apt-get install -y build-essential python-dev cmake git autoconf \
69         libtool liblzo2-dev libqt4-dev libxml2-dev libxslt1-dev qtmobility-dev \
70         libsqlite3-dev libffi-dev python-virtualenv
71 }
72
73 build_boost() {
74     cd $BASE
75
76     wget -c http://ufpr.dl.sourceforge.net/project/boost/boost/1.${BOOST_MINOR}.0/${BOOST_NAME}.tar.bz2
77     tar xjf ${BOOST_NAME}.tar.bz2
78
79     # NOTE: this md5 is the only thing that they provide to verification.
80     # for more information see: https://leap.se/code/issues/6296
81     echo "1be49befbdd9a5ce9def2983ba3e7b76  boost_1_57_0.tar.bz2" | md5sum -c -
82
83     cd $BOOST_NAME/tools/build/
84     ./bootstrap.sh --with-toolset=gcc
85     ./b2 install --prefix=$BASE/boost
86     export PATH=$PATH:$BASE/boost/bin/
87
88     cd $BASE/$BOOST_NAME # boost root
89     b2 cxxflags=-std=c++0x --with-python --with-filesystem --with-system variant=release link=shared
90 }
91
92 build_launcher() {
93     cd $BASE
94     git clone -b develop https://leap.se/git/bitmask_launcher.git
95     cd bitmask_launcher
96
97     mkdir build
98     cd build
99
100     cmake -DBoost_INCLUDE_DIR=$BASE/$BOOST_NAME ..
101     make
102 }
103
104 build_openvpn() {
105     # Build openvpn to support RPATH
106     cd $BASE
107     git clone https://github.com/OpenVPN/openvpn.git --branch $OPENVPN_VERSION
108     cd openvpn
109     autoreconf -i
110     LZO_LIBS="/usr/lib/$ARCH/liblzo2.a" ./configure LDFLAGS="-Wl,-rpath,lib/" --disable-snappy --disable-plugin-auth-pam
111     make -j2
112 }
113
114 build_pyside() {
115     # for more information look at:
116     # https://github.com/PySide/pyside-setup/blob/master/docs/building/linux.rst
117     cd $BASE
118     sudo pip install wheel
119
120     git clone https://github.com/PySide/pyside-setup.git pyside-setup.git
121     cd pyside-setup.git
122     python setup.py bdist_wheel --qmake=/usr/bin/qmake-qt4 --version=1.2.2
123 }
124
125 set_pyside_environment() {
126     arch_bits=`getconf LONG_BIT`  # '32' or '64'
127     # from https://github.com/PySide/BuildScripts/blob/master/environment.sh
128     PYSIDE="$BASE/pyside-setup.git/pyside_install/py2.7-qt4.8.2-${arch_bits}bit-release/"
129     PYTHONXY='python2.7'
130     export PATH=$PYSIDE/bin:$PATH
131     export PYTHONPATH=$PYSIDE/lib/$PYTHONXY/site-packages:$PYSIDE/lib64/$PYTHONXY/site-packages:$PYTHONPATH
132     export LD_LIBRARY_PATH=$PYSIDE/lib:$LD_LIBRARY_PATH
133     export PKG_CONFIG_PATH=$PYSIDE/lib/pkgconfig:$PKG_CONFIG_PATH
134     export DYLD_LIBRARY_PATH=$PYSIDE/lib:$DYLD_LIBRARY_PATH
135 }
136
137 copy_binaries() {
138     cp $ROOT_JSON $BASE
139     cd $BASE
140     $BINARY_COPIER
141 }
142
143 create_bundler_paths() {
144     cd $BASE
145     cat > bundler.paths << EOF
146 $BASE/bitmask_bundler.git/bundler
147 /usr/lib/python2.7
148 /usr/lib/python2.7/plat-linux2
149 /usr/lib/python2.7/lib-tk
150 /usr/lib/python2.7/lib-old
151 /usr/lib/python2.7/lib-dynload
152 /usr/local/lib/python2.7/dist-packages
153 /usr/lib/python2.7/dist-packages
154 /usr/lib/python2.7/dist-packages/gtk-2.0
155 /usr/lib/pymodules/python2.7
156 EOF
157 }
158
159 setup_bundler() {
160     cd $BASE
161
162     git clone https://github.com/leapcode/bitmask_bundler.git bitmask_bundler.git
163     virtualenv bundler.venv && source bundler.venv/bin/activate
164
165     # HACK: install these dependencies manually since they can't be installed normally due not passing some pip checks.
166     pip install --upgrade pip
167     pip install --allow-external u1db --allow-unverified u1db --allow-external dirspec --allow-unverified dirspec u1db dirspec
168     pip install pysqlcipher
169     pip install functools32  # HACK: this dependency is needed by jsonschema and is not automatically gathered
170
171     # HACK: this is needed so tuf can verify the downloaded data, if we add
172     # this to the requirements.pip pycrypto is installed as an egg and the
173     # bundler can't copy its contents (not supported right now)
174     pip install tuf[tools] pycrypto
175
176     git clone https://github.com/chiiph/protobuf-socket-rpc protobuf-socket-rpc.git
177     cd protobuf-socket-rpc.git
178     python setup.py easy_install -Z .
179
180     pip install -r $BASE/bitmask_bundler.git/pkg/requirements.pip
181 }
182
183 clean() {
184     cd $BASE
185     rm -fr bitmask_bundler.git bundler.venv protobuf-socket-rpc.git bundler.output
186 }
187
188 run_bundler() {
189     cd $BASE
190
191     # if the virtualenv is not sourced, then source it!
192     # this is helpful if you want to run only this step
193     [[ -z "$VIRTUAL_ENV"  ]] && source bundler.venv/bin/activate
194
195     set_pyside_environment
196
197     mkdir bundler.output
198
199     # Use a shortcut for the bundler command
200     bundler="python bitmask_bundler.git/bundler/main.py --workon bundler.output --binaries binaries/ --paths-file bundler.paths --versions-file $VERSIONS_FILE"
201
202     $bundler --do gitclone
203     $bundler --do gitcheckout
204     copy_binaries
205
206     # uncomment the following line if you want to do a pause before the python setup in order to do some tweaks on the cloned repos.
207     # read -p "Waiting to 'pythonsetup' ... press <Enter> to continue, <Ctrl>+C to exit. "
208     $bundler --do pythonsetup
209
210     # hack to solve gnupg version problem
211     pip uninstall -y gnupg && pip install gnupg
212
213     $bundler --skip gitclone gitcheckout pythonsetup
214 }
215
216 REUSE_BINARIES=$BASE/reuse-binaries.lock
217
218 if [[ ! -f $BINARY_COPIER ]]; then
219     echo "ERROR: missing $BINARY_COPIER file."
220     exit 1
221 fi
222
223 if [[ ! -f $VERSIONS_FILE ]]; then
224     echo "ERROR: missing $VERSIONS_FILE file."
225     exit 1
226 fi
227
228 if [[ ! -f $ROOT_JSON ]]; then
229     echo "ERROR: missing $ROOT_JSON file."
230     exit 1
231 fi
232
233 if [[ ! -f $REUSE_BINARIES ]]; then
234     install_dependencies
235     build_boost
236     build_launcher
237     build_openvpn
238     build_pyside
239     create_bundler_paths
240 else
241     echo "Reusing existing binaries, cleaning up before creating a new bundle..."
242     clean
243 fi
244
245 setup_bundler
246 run_bundler
247
248 echo 'If you remove this file the createbundle.sh script will rebuild all the binaries.' > $REUSE_BINARIES