#!/bin/bash ################################################################################ # # Copyright (c) 2015, EURECOM (www.eurecom.fr) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # The views and conclusions contained in the software and documentation are those # of the authors and should not be interpreted as representing official policies, # either expressed or implied, of the FreeBSD Project. # ################################################################################ # file build_oai # brief OAI automated build tool that can be used to install, compile, run OAI. # author Navid Nikaein, Lionel GAUTHIER, Laurent Thomas ################################ # include helper functions ################################ ORIGIN_PATH=$PWD THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) source $THIS_SCRIPT_PATH/tools/build_helper MSC_GEN="False" XFORMS="False" PRINT_STATS="False" VCD_TIMING="False" REL="Rel10" HW="EXMIMO" NOS1=0 EPC=0 VERBOSE_COMPILE=0 CFLAGS_PROCESSOR_USER="" function print_help() { echo_info ' This program installs OpenAirInterface Software You should have ubuntu 14.xx, updated, and the Linux kernel >= 3.14 Options -h This help -c | --clean Erase all files to make a rebuild from start" -C | --clean-all Erase all files made by previous compilations, installations" --clean-kernel Erase previously installed features in kernel: iptables, drivers, ... -I | --install-external-packages Installs required packages such as LibXML, asn1.1 compiler, freediameter, ... This option will require root password --install-optional-packages Install useful but not mandatory packages such as valgrind -g | --run-with-gdb Add debugging symbols to compilation directives -h | --help Print this help --eNB Makes the LTE softmodem --UE Makes the UE specific parts (ue_ip, usim, nvram) --EPC Makes the EPC (MME-SPGW, HSS) --RRH Makes the RRH -r | --3gpp-release default is Rel10, Rel8 limits the implementation to 3GPP Release 8 version -w | --hardware EXMIMO (Default), USRP, BLADERF, ETHERNET, None Adds this RF board support (in external packages installation and in compilation) --oaisim Makes the oaisim simulator. Hardware will be defaulted to "NONE". --phy_simulators Makes the unitary tests Layer 1 simulators --core_simulators Makes the core security features unitary simulators -s | --check runs a set of auto-tests based on simulators and several compilation tests -V | --vcd Adds a debgging facility to the binary files: GUI with major internal synchronization events -x | --xforms Adds a software oscilloscope feature to the produced binaries. If oaisim, then enable PRINT_STATS. --install-system-files Install OpenArInterface required files in Linux system (will ask root password) --noS1 Compiles oaisim or lte-softmodem without S1 interface, using direct link to IP instead --verbose-compile Shows detailed compilation instructions in makefile --cflags_processor Manually Add CFLAGS of processor if they are not detected correctly by script. Only add these flags if you know your processor supports them. Example flags: -msse3 -msse4.1 -msse4.2 -mavx2 Usage (first build): oaisim (eNB + UE): ./build_oai -I -g --oaisim -x --install-system-files Eurecom EXMIMO + COTS UE : ./build_oai -I -g --eNB --EPC -x --install-system-files NI/ETTUS B201 + COTS UE : ./build_oai -I -g --eNB --EPC -x --install-system-files -w USRP Usage (Regular): oaisim : ./build_oai --oaisim -x Eurecom EXMIMO + OAI ENB : ./build_oai --eNB -x NI/ETTUS B201 + OAI ENB : ./build_oai --eNB -x -w USRP' } function main() { until [ -z "$1" ] do case "$1" in -c | --clean) CLEAN=1 shift;; -C | --clean-all) CLEAN_ALL=1 shift;; --clean-kernel) clean_kernel echo_info "Erased iptables config and removed modules from kernel" shift;; -I | --install-external-packages) INSTALL_EXTERNAL=1 echo_info "Will install external packages" shift;; --install-optional-packages) INSTALL_OPTIONAL=1 echo_info "Will install optional packages" shift;; -g | --run-with-gdb) GDB=1 echo_info "Will Compile with gdb symbols" shift;; --eNB) eNB=1 echo_info "Will compile eNB" shift;; --UE) UE=1 echo_info "Will compile UE" shift;; --EPC) EPC=1 echo_info "Will compile EPC" shift;; --RRH) RRH=1 echo_info "Will compile RRH" shift;; -r | --3gpp-release) REL=$2 echo_info "setting release to: $REL" shift 2;; -w | --hardware) HW="$2" #"${i#*=}" # Use OAI_USRP as the key word USRP is used inside UHD driver if [ "$HW" == "USRP" ] ; then HW="OAI_USRP" fi if [ "$HW" == "BLADERF" ] ; then HW="OAI_BLADERF" fi echo_info "setting hardware to: $HW" shift 2;; --oaisim) oaisim=1 echo_info "Will compile oaisim and drivers nasmesh, ..." shift;; --phy_simulators) SIMUS_PHY=1 echo_info "Will compile dlsim, ulsim, ..." shift;; --core_simulators) SIMUS_CORE=1 echo_info "Will compile security unitary tests" shift;; -s | --check) OAI_TEST=1 echo_info "Will run auto-tests" shift;; -V | --vcd) echo_info "setting gtk-wave output" VCD_TIMING=1 EXE_ARGUMENTS="$EXE_ARGUMENTS -V" shift;; -x | --xforms) XFORMS="True" EXE_ARGUMENTS="$EXE_ARGUMENTS -d" echo_info "Will generate the software oscilloscope features" shift;; --install-system-files) INSTALL_SYSTEM_FILES=1 echo_info "Will copy OpenAirInterface files in Linux directories" shift;; --noS1) NOS1=1 echo_info "Will compile without S1 interface" shift;; --verbose-compile) VERBOSE_COMPILE=1 echo_info "Will compile with verbose instructions" shift;; --cflags_processor) CFLAGS_PROCESSOR_USER=$2 echo_info "setting CPU FLAGS from USER to: $CFLAGS_PROCESSOR_USER" shift 2;; -h | --help) print_help exit 1;; *) print_help echo_fatal "Unknown option $1" break;; esac done ############################################ # setting and printing OAI envs, we should check here ############################################ echo_info "2. Setting the OAI PATHS ..." set_openair_env cecho "OPENAIR_DIR = $OPENAIR_DIR" $green # for conf files copy in this bash script if [ -d /usr/lib/freeDiameter ]; then export FREEDIAMETER_PREFIX=/usr else if [ -d /usr/local/lib/freeDiameter ]; then export FREEDIAMETER_PREFIX=/usr/local else echo_warning "FreeDiameter prefix not found, install freeDiameter if EPC, HSS" fi fi if [ "$CLEAN_ALL" = "1" ] ; then clean_all_files echo_info "Erased all previously producted files" fi dbin=$OPENAIR_DIR/targets/bin dlog=$OPENAIR_DIR/cmake_targets/log mkdir -p $dbin $dlog if [ "$INSTALL_EXTERNAL" = "1" ] ; then echo_info "Installing packages" check_install_oai_software echo_info "installing packages for USRP support" check_install_usrp_uhd_driver echo_info "installing packages for BALDERF support" check_install_bladerf_driver fi if [ "$INSTALL_OPTIONAL" = "1" ] ; then echo_info "Installing optional packages" check_install_additional_tools fi if [ "$oaisim" = "1" ] ; then if [ "$HW" != "ETHERNET" ] ; then HW="NONE" fi if [ "$XFORMS" == "True" ] ; then PRINT_STATS="True" fi fi echo_info "3. building the compilation directives ..." DIR=$OPENAIR_DIR/cmake_targets if [ "$NOS1" = "1" ] ; then lte_build_dir=lte_noS1_build_oai lte_exec=lte-softmodem-nos1 else lte_build_dir=lte_build_oai lte_exec=lte-softmodem fi # first generate the CMakefile in the right directory if [ "$eNB" = "1" -o "$UE" = "1" -o "$HW" = "EXMIMO" ] ; then # LTE softmodem compilation [ "$CLEAN" = "1" ] && rm -rf $DIR/$lte_build_dir/build mkdir -p $DIR/$lte_build_dir/build cmake_file=$DIR/$lte_build_dir/CMakeLists.txt echo "cmake_minimum_required(VERSION 2.8)" > $cmake_file if [ "$NOS1" = "1" ] ; then cat $DIR/$lte_build_dir/CMakeLists.template >> $cmake_file fi echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file echo "set ( XFORMS $XFORMS )" >> $cmake_file echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file echo "set(PACKAGE_NAME \"${lte_exec}\")" >> $cmake_file echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file cd $DIR/$lte_build_dir/build cmake .. fi if [ "$eNB" = "1" -o "$UE" = "1" ] ; then echo_info "Compiling $lte_exec" compilations \ $lte_build_dir $lte_exec \ $lte_exec $dbin/$lte_exec.$REL if [ "$NOS1" = "1" ] ; then compilations \ $lte_build_dir nasmesh \ CMakeFiles/nasmesh/nasmesh.ko $dbin/nasmesh.ko compilations \ $lte_build_dir rb_tool \ rb_tool $dbin/rb_tool cp $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $dbin fi fi if [ "$UE" = 1 -a "$NOS1" = "0" ] ; then # ue_ip driver compilation echo_info "Compiling UE specific part" compilations \ $lte_build_dir ue_ip \ CMakeFiles/ue_ip/ue_ip.ko $dbin/ue_ip.ko # mkdir -p $DIR/at_commands/build # cd $DIR/at_commands/build # cmake .. # compilations \ # at_commands at_nas_ue \ # at_nas_ue $dbin/at_nas_ue [ "$CLEAN" = "1" ] && rm -rf $DIR/nas_sim_tools/build mkdir -p $DIR/nas_sim_tools/build cd $DIR/nas_sim_tools/build cmake .. compilations \ nas_sim_tools usim \ usim $dbin/usim compilations \ nas_sim_tools nvram \ nvram $dbin/nvram # generate USIM data if [ -f $dbin/nvram ]; then install_nas_tools $dbin $dconf else echo_warning "not generated UE NAS files: binaries not found" fi fi if [ "$SIMUS_PHY" = "1" -o "$SIMUS_CORE" = "1" ] ; then cd $OPENAIR_DIR/cmake_targets/lte-simulators [ "$CLEAN" = "1" ] && rm -rf build mkdir -p build cd build rm -f *sim cmake .. fi if [ "$SIMUS_PHY" = "1" ] ; then # lte unitary simulators compilation echo_info "Compiling unitary tests simulators" simlist="dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim" for f in $simlist ; do compilations \ lte-simulators $f \ $f $dbin/$f.$REL done fi # Core simulators ############# if [ "$SIMUS_CORE" = "1" ] ; then # lte unitary simulators compilation echo_info "Compiling unitary tests simulators" simlist="secu_knas_encrypt_eia1 secu_kenb aes128_ctr_encrypt aes128_ctr_decrypt secu_knas_encrypt_eea2 secu_knas secu_knas_encrypt_eea1 kdf aes128_cmac_encrypt secu_knas_encrypt_eia2" for f in $simlist ; do compilations \ lte-simulators test_$f \ test_$f $dbin/test_$f.$REL done fi # EXMIMO drivers & firmware loader ############### if [ "$HW" = "EXMIMO" -a "$EPC" = "0" ] ; then echo_info "Compiling Express MIMO 2 board drivers" compilations \ $lte_build_dir openair_rf \ CMakeFiles/openair_rf/openair_rf.ko $dbin/openair_rf.ko compilations \ $lte_build_dir updatefw \ updatefw $dbin/updatefw make -C $OPENAIR_DIR/cmake_targets/$lte_build_dir/build oarf > $dlog/oarf.txt 2>&1 cp $OPENAIR_DIR/cmake_targets/$lte_build_dir/build/*.oct $dbin if [ -s $dbin/oarf_config_exmimo.oct ] ; then echo_success "oarf tools compiled" else echo_error "oarf tools compilation failed" fi cp $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 $dbin fi if [ "$oaisim" = "1" ] ; then dconf=$OPENAIR_DIR/targets/bin if [ "$NOS1" = "1" ] ; then oaisim_build_dir=oaisim_noS1_build_oai oaisim_exec=oaisim_nos1 else oaisim_build_dir=oaisim_build_oai oaisim_exec=oaisim fi echo_info "Compiling $oaisim_exec ($oaisim_build_dir)" cmake_file=$DIR/$oaisim_build_dir/CMakeLists.txt cp $DIR/$oaisim_build_dir/CMakeLists.template $cmake_file echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file echo "set ( XFORMS $XFORMS )" >> $cmake_file echo "set ( PRINT_STATS $PRINT_STATS )" >> $cmake_file echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file [ "$CLEAN" = "1" ] && rm -rf $DIR/$oaisim_build_dir/build mkdir -p $DIR/$oaisim_build_dir/build cd $DIR/$oaisim_build_dir/build cmake .. compilations \ $oaisim_build_dir $oaisim_exec \ $oaisim_exec $dbin/$oaisim_exec.$REL if [ "$NOS1" != "1" ] ; then [ "$CLEAN" = "1" ] && rm -rf $DIR/at_commands/build echo_info "Compiling at_nas_ue" mkdir -p $DIR/at_commands/build cd $DIR/at_commands/build cmake .. compilations \ at_commands at_nas_ue \ at_nas_ue $dbin/at_nas_ue # ue_ip driver compilation echo_info "Compiling UE specific part (ue_ip driver and usim tools)" compilations \ oaisim_build_oai ue_ip \ CMakeFiles/ue_ip/ue_ip.ko $dbin/ue_ip.ko [ "$CLEAN" = "1" ] && rm -rf $DIR/nas_sim_tools/build mkdir -p $DIR/nas_sim_tools/build cd $DIR/nas_sim_tools/build cmake .. compilations \ nas_sim_tools usim \ usim $dbin/usim compilations \ nas_sim_tools nvram \ nvram $dbin/nvram # generate USIM data if [ -f $dbin/nvram ]; then install_nas_tools $dbin $dconf else echo_warning "not generated UE NAS files: binaries not found" fi else compilations \ $oaisim_build_dir rb_tool \ rb_tool $dbin/rb_tool # nasmesh driver compilation compilations \ $oaisim_build_dir nasmesh \ CMakeFiles/nasmesh/nasmesh.ko $dbin/nasmesh.ko #oai_nw_drv compilations \ $oaisim_build_dir oai_nw_drv \ CMakeFiles/oai_nw_drv/oai_nw_drv.ko $dbin/oai_nw_drv.ko fi cmake_file=$DIR/oaisim_mme_build_oai/CMakeLists.txt cp $DIR/oaisim_mme_build_oai/CMakeLists.template $cmake_file echo "set(XFORMS $XFORMS )" >> $cmake_file echo "set(RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file echo "set(ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file #[ "$CLEAN" = "1" ] && rm -rf $DIR/oaisim_mme_build_oai/build #mkdir -p $DIR/oaisim_mme_build_oai/build #cd $DIR/oaisim_mme_build_oai/build #cmake .. #compilations \ # oaisim_mme_build_oai oaisim_mme \ # oaisim_mme $dbin/oaisim_mme.$REL fi # RRH compilation ################## if [ "$RRH" = "1" ] ; then echo_info "Compiling RRH" if [ $HW == "ETHERNET" ] ; then echo_info "RF frontend for RRH is not defined. This mode is used for testing (loopback)." elif [ $HW != "EXMIMO" -a $HW != "OAI_USRP" -a $HW != "OAI_BLADERF" ] ; then echo_fatal "Hardware not defined ($HW)" fi cmake_file=$DIR/rrh_gw/CMakeLists.txt echo "cmake_minimum_required(VERSION 2.8)" > $cmake_file echo "set(ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file echo "set(ENABLE_ITTI False )" >> $cmake_file echo "set(RF_BOARD \"${HW}\")" >> $cmake_file echo 'set(PACKAGE_NAME "\"rrh_gw\"")' >> $cmake_file echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file [ "$CLEAN" = "1" ] && rm -rf $DIR/rrh_gw/build mkdir -p $DIR/rrh_gw/build cd $DIR/rrh_gw/build cmake .. compilations \ rrh_gw rrh_gw \ rrh_gw $dbin/rrh_gw fi # EPC compilation ################## if [ "$EPC" = "1" ] ; then echo_info "Compiling EPC" # Example HSS and EPC run on the same host if [ "$CLEAN" = "1" ]; then $OPENAIR_DIR/cmake_targets/tools/build_epc --clean --debug --transport-tcp-only --transport-prefer-tcp --s6a-server $OPENAIR_DIR/cmake_targets/tools/build_hss --clean --debug --transport-tcp-only --transport-prefer-tcp --fqdn `hostname --fqdn` --connect-to-mme `hostname --fqdn` else $OPENAIR_DIR/cmake_targets/tools/build_epc --debug --transport-tcp-only --transport-prefer-tcp --s6a-server $OPENAIR_DIR/cmake_targets/tools/build_hss --debug --transport-tcp-only --transport-prefer-tcp --fqdn `hostname --fqdn` --connect-to-mme `hostname --fqdn` fi # if [ "$INSTALL_SYSTEM_FILES" = "1" ] ;then # if [ -f $dbin/hss.conf ] ; then # sed -e 's/ *= */=/' $dbin/hss.conf > $dconf/hss.conf.nospace # source $dconf/hss.conf.nospace # rm -f $dconf/hss.conf.nospace # create_hss_database root linux "$MYSQL_user" "$MYSQL_pass" "$MYSQL_db" # else # echo_warning "not created HSS database: config not found" # fi # fi fi # Auto-tests ##################### if [ "$OAI_TEST" = "1" ]; then echo_info "10. Running OAI pre commit tests (pre-ci) ..." rm -fr $OPENAIR_DIR/cmake_targets/autotests/log mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log $OPENAIR_DIR/cmake_targets/autotests/run_compilation_autotests.bash $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash else echo_info "10. Bypassing the Tests ..." fi } main "$@"