Add bitmask 0.9.0 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     pip install service_identity  # see https://leap.se/code/issues/7136
171
172     # HACK: this is needed so tuf can verify the downloaded data, if we add
173     # this to the requirements.pip pycrypto is installed as an egg and the
174     # bundler can't copy its contents (not supported right now)
175     pip install tuf[tools] pycrypto
176
177     git clone https://github.com/chiiph/protobuf-socket-rpc protobuf-socket-rpc.git
178     cd protobuf-socket-rpc.git
179     python setup.py easy_install -Z .
180
181     pip install -r $BASE/bitmask_bundler.git/pkg/requirements.pip
182 }
183
184 clean() {
185     cd $BASE
186     rm -fr bitmask_bundler.git bundler.venv protobuf-socket-rpc.git bundler.output
187 }
188
189 run_bundler() {
190     cd $BASE
191
192     # if the virtualenv is not sourced, then source it!
193     # this is helpful if you want to run only this step
194     [[ -z "$VIRTUAL_ENV"  ]] && source bundler.venv/bin/activate
195
196     set_pyside_environment
197
198     mkdir bundler.output
199
200     # Use a shortcut for the bundler command
201     bundler="python bitmask_bundler.git/bundler/main.py --workon bundler.output --binaries binaries/ --paths-file bundler.paths --versions-file $VERSIONS_FILE"
202
203     $bundler --do gitclone
204     $bundler --do gitcheckout
205     copy_binaries
206
207     # 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.
208     # read -p "Waiting to 'pythonsetup' ... press <Enter> to continue, <Ctrl>+C to exit. "
209     $bundler --do pythonsetup
210
211     # hack to solve gnupg version problem
212     pip uninstall -y gnupg && pip install gnupg
213
214     $bundler --skip gitclone gitcheckout pythonsetup
215 }
216
217 REUSE_BINARIES=$BASE/reuse-binaries.lock
218
219 if [[ ! -f $BINARY_COPIER ]]; then
220     echo "ERROR: missing $BINARY_COPIER file."
221     exit 1
222 fi
223
224 if [[ ! -f $VERSIONS_FILE ]]; then
225     echo "ERROR: missing $VERSIONS_FILE file."
226     exit 1
227 fi
228
229 if [[ ! -f $ROOT_JSON ]]; then
230     echo "ERROR: missing $ROOT_JSON file."
231     exit 1
232 fi
233
234 if [[ ! -f $REUSE_BINARIES ]]; then
235     install_dependencies
236     build_boost
237     build_launcher
238     build_openvpn
239     build_pyside
240     create_bundler_paths
241 else
242     echo "Reusing existing binaries, cleaning up before creating a new bundle..."
243     clean
244 fi
245
246 setup_bundler
247 run_bundler
248
249 echo 'If you remove this file the createbundle.sh script will rebuild all the binaries.' > $REUSE_BINARIES