build_helper 13.5 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#/*
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
# * contributor license agreements.  See the NOTICE file distributed with
# * this work for additional information regarding copyright ownership.
# * The OpenAirInterface Software Alliance licenses this file to You under
# * the OAI Public License, Version 1.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.openairinterface.org/?page_id=698
# *
# * 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.
# *-------------------------------------------------------------------------------
# * For more information about the OpenAirInterface (OAI) Software Alliance:
# *      contact@openairinterface.org
# */

22
# file build_helper
thomasl's avatar
thomasl committed
23
# brief
24
# authors Laurent Thomas, Lionel GAUTHIER
thomasl's avatar
thomasl committed
25
26
#
#######################################
27
SUDO='sudo -E'
thomasl's avatar
thomasl committed
28

29
30
31
32
33
34
35
###############################
## echo and  family
###############################
black='\E[30m'
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
36
blue='\E[1;34m'
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
magenta='\E[35m'
cyan='\E[36m'
white='\E[37m'
reset_color='\E[00m'
COLORIZE=1

cecho()  {  
    # Color-echo
    # arg1 = message
    # arg2 = color
    local default_msg="No Message."
    message=${1:-$default_msg}
    color=${2:-$green}
    [ "$COLORIZE" = "1" ] && message="$color$message$reset_color"
    echo -e "$message"
    return
}

echo_error()   { cecho "$*" $red          ;}
echo_fatal()   { cecho "$*" $red; exit -1 ;}
echo_warning() { cecho "$*" $yellow       ;}
echo_success() { cecho "$*" $green        ;}
echo_info()    { cecho "$*" $blue         ;}

61
62
63
########################
# distribution helpers #
########################
64

65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# This function return a string to identify the distribution we are running
# If we can't check the distribution, it returns "Unknown"
# This function return always true as exit code by design
# Examples:
#   Ubuntu16.04
#   Debian8.5
get_distribution_release() {
    local distributor
    if distributor=$(lsb_release -si 2>/dev/null) ; then
        echo $distributor$(lsb_release -sr)
    else
        echo Unknown
    fi
}

check_supported_distribution() {
    local distribution=$(get_distribution_release)
    case "$distribution" in
        "Ubuntu16.04") return 0 ;;
        "Ubuntu14.04") return 0 ;;
    esac
    return 1
}
88

89
90
91
92
93
94
95
96
97
98
99
100
##################
# Error handlers #
##################

handler_EXIT() {
	local exit_code=$?
    [ "$exit_code" -eq 0 ] || echo_error "build have failed"
	exit $exit_code
}

trap handler_EXIT EXIT

101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
###########################
# Cleaners
###########################

clean_kernel() {
    $SUDO modprobe ip_tables
    $SUDO modprobe x_tables
    $SUDO iptables -P INPUT ACCEPT
    $SUDO iptables -F INPUT
    $SUDO iptables -P OUTPUT ACCEPT
    $SUDO iptables -F OUTPUT
    $SUDO iptables -P FORWARD ACCEPT
    $SUDO iptables -F FORWARD
    $SUDO iptables -t nat -F
    $SUDO iptables -t mangle -F
    $SUDO iptables -t filter -F
    $SUDO iptables -t raw -F
    echo_info "Flushed iptables"
    $SUDO rmmod nasmesh > /dev/null 2>&1
    $SUDO rmmod oai_nw_drv  > /dev/null 2>&1
    $SUDO rmmod openair_rf > /dev/null 2>&1
    $SUDO rmmod ue_ip > /dev/null 2>&1
    echo_info "removed drivers from kernel"
}

clean_all_files() {
127
 set_openair_env
thomasl's avatar
thomasl committed
128
 dir=$OPENAIR_DIR/cmake_targets
129
 rm -rf $dir/log $OPENAIR_DIR/targets/bin/* 
thomasl's avatar
thomasl committed
130
131
132
 rm -rf $dir/lte_build_oai $dir/lte-simulators/build
 rm -rf $dir/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt
 rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build 
133
134
135
136
137
138
}

###################################
# Compilers
###################################

thomasl's avatar
thomasl committed
139
compilations() {
thomasl's avatar
thomasl committed
140
  cd $OPENAIR_DIR/cmake_targets/$1/build
141
  set +e
thomasl's avatar
thomasl committed
142
143
  {
    rm -f $3
144
145
146
147
148
149
    if [ "$VERBOSE_COMPILE" == "1" ]; then
       make -j`nproc` $2 VERBOSE=$VERBOSE_COMPILE
    else
       make -j`nproc` $2
    fi

thomasl's avatar
thomasl committed
150
  } > $dlog/$2.$REL.txt 2>&1
151
  set -e
152
  echo_info "Log file for compilation has been written to: $dlog/$2.$REL.txt"
thomasl's avatar
thomasl committed
153
  if [ -s $3 ] ; then
154
     cp $3 $4
thomasl's avatar
thomasl committed
155
     echo_success "$2 compiled"
thomasl's avatar
thomasl committed
156
  else
thomasl's avatar
thomasl committed
157
     echo_error "$2 compilation failed"
158
     exit 1
thomasl's avatar
thomasl committed
159
160
161
  fi
}

162
163
164
165
############################################
# External packages installers
############################################

thomasl's avatar
thomasl committed
166
check_install_usrp_uhd_driver(){
167
        #first we remove old installation
168
169
        $SUDO apt-get remove -y uhd || true
        $SUDO apt-get remove libuhd-dev libuhd003 uhd-host -y
thomasl's avatar
thomasl committed
170
        v=$(lsb_release -cs)
171
172
173
        $SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
        #The new USRP repository
        $SUDO add-apt-repository ppa:ettusresearch/uhd -y
thomasl's avatar
thomasl committed
174
        $SUDO apt-get update
thomasl's avatar
thomasl committed
175
        $SUDO apt-get -y install  python python-tk libboost-all-dev libusb-1.0-0-dev
176
        $SUDO apt-get -y install libuhd-dev libuhd003 uhd-host
177
178
179
180
181
182
}

install_usrp_uhd_driver() {
        # We move uhd-host apart because it depends on linux kernel version
        # On newer kernels, it fails to install
        $SUDO apt-get -y install uhd-host
183
        $SUDO uhd_images_downloader 
thomasl's avatar
thomasl committed
184
}
185

186
check_install_bladerf_driver(){
187
188
189
190
	if [ "$(get_distribution_release)" == "Ubuntu14.04" ] ; then
		$SUDO add-apt-repository -y ppa:bladerf/bladerf
		$SUDO apt-get update
	fi
191
	$SUDO apt-get install -y bladerf libbladerf-dev
192
193
	$SUDO apt-get install -y bladerf-firmware-fx3
	$SUDO apt-get install -y bladerf-fpga-hostedx40	
194
195
196
197
}

flash_firmware_bladerf() {
	$SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img
198
}
thomasl's avatar
thomasl committed
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218

check_install_additional_tools (){
    $SUDO apt-get update
    $SUDO apt-get install -y \
	check \
	dialog \
	dkms \
	gawk \
	libboost-all-dev \
	libpthread-stubs0-dev \
	openvpn \
	pkg-config \
	python-dev  \
	python-pexpect \
	sshfs \
	swig  \
	tshark \
	uml-utilities \
	unzip  \
	valgrind  \
219
	vlan	  \
220
	ctags \
221
222
        ntpdate \
        iperf3 \
Rohit Gupta's avatar
Rohit Gupta committed
223
224
225
        android-tools-adb \
	wvdial \
        python-numpy \
226
227
228
229
230
231
        sshpass \
        nscd \
        bc \
        ntp \
        python-scipy \
        python-matplotlib
232
233

    $SUDO pip install paramiko
234
    $SUDO pip install pyroute2 colorama
235
    $SUDO rm -fr /opt/ssh
236
    $SUDO GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/ssh.git /opt/ssh
237
238
239
240
    
    log_netiface=$OPENAIR_DIR/cmake_targets/log/netiface_install_log.txt
    echo_info "Installing Netinterfaces package. The logfile for installation is in $log_netiface"
    (
241
242
243
244
245
246
    $SUDO rm -fr /tmp/netifaces-0.10.4.tar.gz /tmp/netifaces
    wget -P /tmp  https://pypi.python.org/packages/18/fa/dd13d4910aea339c0bb87d2b3838d8fd923c11869b1f6e741dbd0ff3bc00/netifaces-0.10.4.tar.gz
    tar -xzvf /tmp/netifaces-0.10.4.tar.gz -C /tmp
    cd /tmp/netifaces-0.10.4
    $SUDO python setup.py install
    cd -
247
    ) >& $log_netiface
thomasl's avatar
thomasl committed
248
249
250
}

check_install_oai_software() {
251
    local specific_packages=""
252
253
254
255
    if ! check_supported_distribution; then
        echo_error "Your distribution $(get_distribution_release) is not supported by oai !"
        exit 1
    fi
thomasl's avatar
thomasl committed
256
    $SUDO apt-get update
257
    $SUDO apt install -y software-properties-common
258
259
    case "$(get_distribution_release)" in
        "Ubuntu14.04")
260
            specific_packages="libtasn1-3-dev"
261
262
263
            # For iperf3
            $SUDO add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty-backports universe"
            $SUDO apt-get update
264
265
266
267
            ;;
        "Ubuntu16.04")
            specific_packages="libtasn1-6-dev"
            ;;
268
    esac
269
    $SUDO apt-get install -y \
270
    $specific_packages \
271
	autoconf  \
thomasl's avatar
thomasl committed
272
273
274
275
276
277
	automake  \
	bison  \
	build-essential \
	cmake \
	cmake-curses-gui  \
	doxygen \
278
279
	doxygen-gui \
	texlive-latex-base \
thomasl's avatar
thomasl committed
280
281
	ethtool \
	flex  \
282
283
284
	gccxml \
	gdb  \
	git \
thomasl's avatar
thomasl committed
285
286
287
288
289
290
291
292
293
294
295
	graphviz \
	gtkwave \
	guile-2.0-dev  \
	iperf \
	iproute \
	iptables \
	iptables-dev \
	libatlas-base-dev \
	libatlas-dev \
	libblas-dev \
	libconfig8-dev \
296
	libffi-dev \
thomasl's avatar
thomasl committed
297
298
299
300
301
302
	libforms-bin \
	libforms-dev \
	libgcrypt11-dev \
	libgmp-dev \
	libgtk-3-dev \
	libidn2-0-dev  \
303
	libidn11-dev \
thomasl's avatar
thomasl committed
304
	libmysqlclient-dev  \
305
	liboctave-dev \
thomasl's avatar
thomasl committed
306
	libpgm-dev \
307
	libpython2.7-dev \
thomasl's avatar
thomasl committed
308
309
310
311
312
313
314
	libsctp1  \
	libsctp-dev  \
	libssl-dev  \
	libtool  \
	libusb-1.0-0-dev \
	libxml2 \
	libxml2-dev  \
315
	libxslt1-dev \
316
317
318
	mscgen  \
	octave \
	octave-signal \
thomasl's avatar
thomasl committed
319
320
321
322
	openssh-client \
	openssh-server \
	openssl \
	python  \
Rohit Gupta's avatar
Rohit Gupta committed
323
	subversion \
324
325
326
	xmlstarlet \
	python-pip \
	pydb \
Rohit Gupta's avatar
Rohit Gupta committed
327
	wget
Rohit Gupta's avatar
Rohit Gupta committed
328

329
    $SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
330
331
332
333
334
335
336
337
    
    #Remove old gnutls/nettle installation that was done from sources
    remove_nettle_from_source
    
    $SUDO apt-get install -y nettle-dev nettle-bin
    remove_gnutls_from_source

    $SUDO apt-get install -y libgnutls-dev
338
    
thomasl's avatar
thomasl committed
339
    install_asn1c_from_source
thomasl's avatar
thomasl committed
340
341
}

342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
### Remove Nettle installation which was done from sources
remove_nettle_from_source() {
    nettle_uninstall_log=$OPENAIR_DIR/cmake_targets/log/nettle_uninstall_log.txt
    echo_info "\nUn-Installing Nettle from sources. The log file for nettle un-installation is here: $nettle_uninstall_log "
    (
    $SUDO apt-get remove -y nettle-dev nettle-bin 
    cd /tmp
    echo "Downloading nettle archive"
    $SUDO rm -rf /tmp/nettle-2.5.tar.gz* /tmp/nettle-2.5
    wget https://ftp.gnu.org/gnu/nettle/nettle-2.5.tar.gz
    if [ $? -ne 0 ]; then
      wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz
    fi
    if [ ! -f nettle-2.5.tar.gz ]; then
      echo_error "Could not download nettle source files"
      cd -
      return
    fi
    tar -xzf nettle-2.5.tar.gz
    cd nettle-2.5/
    ./configure --disable-openssl --enable-shared --prefix=/usr 
    $SUDO make uninstall || true 
    ) >& $nettle_uninstall_log
}

### Remove Gnutls from source
remove_gnutls_from_source(){
    gnutls_uninstall_log=$OPENAIR_DIR/cmake_targets/log/gnutls_uninstall_log.txt
    echo_info "\nUn-Installing Gnutls. The log file for Gnutls un-installation is here: $gnutls_uninstall_log "
    (
    $SUDO apt-get remove -y libgnutls-dev
    cd /tmp 
    echo "Downloading gnutls archive"
    $SUDO rm -rf /tmp/gnutls-3.1.23.tar.xz* /tmp/gnutls-3.1.23
    wget http://mirrors.dotsrc.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz || \
      wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz
    if [ ! -f gnutls-3.1.23.tar.xz ]; then
      echo_error "Could not download gnutls source files"
      cd -
      return
    fi
    tar -xJf gnutls-3.1.23.tar.xz
    cd gnutls-3.1.23/
    ./configure --prefix=/usr
    $SUDO make uninstall || true
    )>& $gnutls_uninstall_log
}

thomasl's avatar
thomasl committed
390
install_asn1c_from_source(){
391
392
    asn1_install_log=$OPENAIR_DIR/cmake_targets/log/asn1c_install_log.txt
    echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log "
393
    (
Cedric Roux's avatar
Cedric Roux committed
394
    $SUDO rm -rf /tmp/asn1c
395
    GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c
Cedric Roux's avatar
Cedric Roux committed
396
    cd /tmp/asn1c
thomasl's avatar
thomasl committed
397
    ./configure
398
    make -j`nproc`
399
    $SUDO make install
Rohit Gupta's avatar
Rohit Gupta committed
400
    cd -
401
    ) > $asn1_install_log 2>&1
thomasl's avatar
thomasl committed
402
403
404
405
406
}

#################################################
# 2. compile 
################################################
thomasl's avatar
thomasl committed
407

thomasl's avatar
thomasl committed
408
install_nas_tools() {
gauthier's avatar
gauthier committed
409
410
411
412
413
  cd $1
  if [ ! -f .ue.nvram ]; then
    echo_success "generate .ue_emm.nvram .ue.nvram"
    ./nvram --gen
  else
gauthier's avatar
syntax    
gauthier committed
414
    [ ./nvram -nt .ue.nvram  -o ./nvram -nt .ue_emm.nvram ] && ./nvram --gen
gauthier's avatar
gauthier committed
415
  fi
thomasl's avatar
thomasl committed
416

gauthier's avatar
gauthier committed
417
418
419
420
421
422
  if [ ! -f .usim.nvram ]; then
    echo_success "generate .usim.nvram"
    ./usim --gen
  else
    [ ./usim -nt .usim.nvram ] && ./usim --gen
  fi
thomasl's avatar
thomasl committed
423
424

}
425

thomasl's avatar
thomasl committed
426
427
428
429
430
431
432
433
434

################################
# set_openair_env
###############################
set_openair_env(){
    fullpath=`readlink -f $BASH_SOURCE`
    [ -f "/.$fullpath" ] || fullpath=`readlink -f $PWD/$fullpath`
    openair_path=${fullpath%/cmake_targets/*}
    openair_path=${openair_path%/targets/*}
thomasl's avatar
thomasl committed
435
    openair_path=${openair_path%/openair[123]/*}    
thomasl's avatar
thomasl committed
436
437
438
439
440
441
442
    export OPENAIR_DIR=$openair_path
    export OPENAIR1_DIR=$openair_path/openair1
    export OPENAIR2_DIR=$openair_path/openair2
    export OPENAIR3_DIR=$openair_path/openair3
    export OPENAIR_TARGETS=$openair_path/targets
}

443
444
445
446
447
448
449
450
################################
# Function to killall the subprocesses when Ctrl-C Key is hit
###############################
function handle_ctrl_c(){
CURPID=$$
ppid=$$
arraycounter=1
echo_info "** Trapped CTRL-C. Killing all subprocesses now..."
451
452
echo_info "** Calling sync now..."
sync 
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
while true
do
        FORLOOP=FALSE
        # Get all the child process id
        for i in `ps -ef| awk '$3 == '$ppid' { print $2 }'`
        do
                if [ $i -ne $CURPID ] ; then
                        procid[$arraycounter]=$i
                        arraycounter=`expr $arraycounter + 1`
                        ppid=$i
                        FORLOOP=TRUE
                fi
        done
        if [ "$FORLOOP" = "FALSE" ] ; then
           arraycounter=`expr $arraycounter - 1`
           ## We want to kill child process id first and then parent id's
           while [ $arraycounter -ne 0 ]
470
471
472
473
474
           do  
             echo "first we send ctrl-c to program"
             $SUDO kill -INT "${procid[$arraycounter]}"
             sleep 5
             echo "Now we force kill if that didn't work"
475
476
477
478
479
480
481
482
483
             $SUDO kill -9 "${procid[$arraycounter]}" >/dev/null
             arraycounter=`expr $arraycounter - 1`
           done
         exit
        fi
done
}


484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
# get from http://www.linuxjournal.com/content/validating-ip-address-bash-script
validate_ip() {

local  ip=$1
local  stat=1

if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
    OIFS=$IFS
    IFS='.'
    ip=($ip)
    IFS=$OIFS
    [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
        && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
    stat=$?
fi

return $stat
Rohit Gupta's avatar
Rohit Gupta committed
501
}