e8b7583a912a670c69d38accb3a8d836470dfe66
[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 mkdir -p $BASE
44
45 # Note: we could use:
46 # ARCH=`uname -i`
47 # but it does not work on a VM (tested in i386 returns unknown)
48 if [[ `getconf LONG_BIT` == "64" ]]; then
49     ARCH='x86_64-linux-gnu'
50 else
51     ARCH='i386-linux-gnu'
52 fi
53
54 install_dependencies() {
55     sudo apt-get update  # update apt, otherwise some packages may not be found
56     sudo apt-get install -y build-essential python-dev cmake git autoconf \
57         libtool liblzo2-dev libqt4-dev libxml2-dev libxslt1-dev qtmobility-dev \
58         libsqlite3-dev libffi-dev python-virtualenv
59 }
60
61 build_boost() {
62     cd $BASE
63
64     BOOST_NAME='boost_1_56_0'
65     wget -c http://ufpr.dl.sourceforge.net/project/boost/boost/1.56.0/$BOOST_NAME.tar.bz2
66     tar xjf $BOOST_NAME.tar.bz2
67
68     cd $BOOST_NAME/tools/build/
69     ./bootstrap.sh --with-toolset=gcc
70     ./b2 install --prefix=$BASE/boost
71     export PATH=$PATH:$BASE/boost/bin/
72
73     cd $BASE/$BOOST_NAME # boost root
74     b2 cxxflags=-std=c++0x --with-python --with-filesystem --with-system variant=release link=shared
75 }
76
77 build_launcher() {
78     cd $BASE
79     git clone -b develop https://leap.se/git/bitmask_launcher.git
80     cd bitmask_launcher
81
82     mkdir build
83     cd build
84
85     cmake -DBoost_INCLUDE_DIR=$BASE/$BOOST_NAME ..
86     make
87 }
88
89 build_openvpn() {
90     # Build openvpn to support RPATH
91     cd $BASE
92     git clone https://github.com/OpenVPN/openvpn.git
93     cd openvpn
94     autoreconf -i
95     LZO_LIBS="/usr/lib/$ARCH/liblzo2.a" ./configure LDFLAGS="-Wl,-rpath,lib/" --disable-snappy --disable-plugin-auth-pam
96     make -j2
97 }
98
99 build_pyside() {
100     # for more information look at:
101     # https://github.com/PySide/pyside-setup/blob/master/docs/building/linux.rst
102     cd $BASE
103     sudo pip install wheel
104
105     git clone https://github.com/PySide/pyside-setup.git pyside-setup.git
106     cd pyside-setup.git
107     python setup.py bdist_wheel --qmake=/usr/bin/qmake-qt4 --version=1.2.2
108 }
109
110 set_pyside_environment() {
111     arch_bits=`getconf LONG_BIT`  # '32' or '64'
112     # from https://github.com/PySide/BuildScripts/blob/master/environment.sh
113     PYSIDE="$BASE/pyside-setup.git/pyside_install/py2.7-qt4.8.2-${arch_bits}bit-release/"
114     PYTHONXY='python2.7'
115     export PATH=$PYSIDE/bin:$PATH
116     export PYTHONPATH=$PYSIDE/lib/$PYTHONXY/site-packages:$PYSIDE/lib64/$PYTHONXY/site-packages:$PYTHONPATH
117     export LD_LIBRARY_PATH=$PYSIDE/lib:$LD_LIBRARY_PATH
118     export PKG_CONFIG_PATH=$PYSIDE/lib/pkgconfig:$PKG_CONFIG_PATH
119     export DYLD_LIBRARY_PATH=$PYSIDE/lib:$DYLD_LIBRARY_PATH
120 }
121
122 copy_binaries() {
123     cd $BASE
124     ../copy-binaries.sh
125 }
126
127 create_bundler_paths() {
128     cd $BASE
129     cat > bundler.paths << EOF
130 $BASE/bitmask_bundler.git/bundler
131 /usr/lib/python2.7
132 /usr/lib/python2.7/plat-linux2
133 /usr/lib/python2.7/lib-tk
134 /usr/lib/python2.7/lib-old
135 /usr/lib/python2.7/lib-dynload
136 /usr/local/lib/python2.7/dist-packages
137 /usr/lib/python2.7/dist-packages
138 /usr/lib/python2.7/dist-packages/gtk-2.0
139 /usr/lib/pymodules/python2.7
140 EOF
141 }
142
143 setup_bundler() {
144     cd $BASE
145
146     git clone https://github.com/leapcode/bitmask_bundler.git bitmask_bundler.git
147     virtualenv bundler.venv && source bundler.venv/bin/activate
148
149     git clone https://github.com/chiiph/protobuf-socket-rpc protobuf-socket-rpc.git
150     cd protobuf-socket-rpc.git
151     python setup.py easy_install -Z .
152
153     pip install -r $BASE/bitmask_bundler.git/pkg/requirements.pip
154 }
155
156 clean() {
157     cd $BASE
158     rm -fr bitmask_bundler.git bundler.venv protobuf-socket-rpc.git bundler.output
159 }
160
161 run_bundler() {
162     cd $BASE
163
164     # if the virtualenv is not sourced, then source it!
165     # this is helpful if you want to run only this step
166     [[ -z "$VIRTUAL_ENV"  ]] && source bundler.venv/bin/activate
167
168     set_pyside_environment
169
170     mkdir bundler.output
171
172     # Use a shortcut for the bundler command
173     bundler="python bitmask_bundler.git/bundler/main.py --workon bundler.output --binaries binaries/ --paths-file bundler.paths"
174
175     $bundler --do gitclone
176     $bundler --do gitcheckout --versions-file $BASE/bitmask.json
177
178     $bundler --do pythonsetup
179     $bundler --skip gitclone gitcheckout pythonsetup --versions-file $BASE/bitmask.json
180 }
181
182 [[ "$1" == 'nightly' ]] && VERSION='--nightly'
183
184 REUSE_BINARIES=$BASE/reuse-binaries.lock
185
186 if [[ ! -f $REUSE_BINARIES ]]; then
187     install_dependencies
188     build_boost
189     build_launcher
190     build_openvpn
191     build_pyside
192     copy_binaries
193     create_bundler_paths
194 else
195     echo "Reusing existing binaries, cleaning up before creating a new bundle..."
196     clean
197 fi
198
199 setup_bundler
200 run_bundler
201
202 echo 'If you remove this file the createbundle.sh script will rebuild all the binaries.' > $REUSE_BINARIES