blob: 0eed145f0e88838589412da12e81eb09bcf8bead [file] [log] [blame]
#!/bin/bash
#*******************************************************************************************
# Copyright (c) 2020 fortiss GmbH
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# http://www.eclipse.org/legal/epl-2.0.
#
# SPDX-License-Identifier: EPL-2.0
#
# Contributors:
# Jose Cabral
# - initial implementation
# ******************************************************************************************
# exit when any command fails
set -e
# store the the last executed command
trap 'lastCommand=$currentCommand; currentCommand=$BASH_COMMAND' DEBUG
# echo an error message before exiting
trap 'if [ $? -eq 0 ]; then echo \"The script exited without errors\"; else echo "\"${lastCommand}\" command failed with exit code $?."; fi' EXIT
BASH_SCRIPT_PATH="$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source ${BASH_SCRIPT_PATH}/commonFunctions.sh "$@"
####################################################################
##################### Variables ###################################
####################################################################
# The following variables are used in the script and can be set before
# calling the script:
# - TOOLS_DIR: absolut path where the needed tools will be installed. Default /usr/tools/
# - ARM_TOOLS_NAME: folder name inside the TOOLS_DIR where the arm-bcm2708 folder is installed. Default armTools
# - REPOS_DIR: absolut path to the folder containing all repostories. Default /usr/repos/
# - MBEDTLS_FOLDER_NAME: name of the folder containing the mbetdls repository. Default mbedtls
# - OPCUA_FOLDER_NAME: name of the folder containing the open62541 repository. Default open62541
# - MQTT_FOLDER_NAME: name of the folder containing the paho mqtt repository. Default paho.mqtt.c
# - LUA_FOLDER_NAME: name of the folder containing the luajit repository. Default luajit-2.0
# - LINUX32_ARCH: name for the build folder when compiling for linux32 architecture. Default linux32
# - ARM_ARCH: name for the build folder when compiling for arm architecture. Default arm
# - CLEAN_ALL: if set to 1, it will compile even if the libraries are found. Default 0
if [ -z "$TOOLS_DIR" ]; then
TOOLS_DIR=/usr/tools/
fi
if [ -z "$REPOS_DIR" ]; then
REPOS_DIR=/usr/repos/
fi
if [ -z "$ARM_TOOLS_NAME" ]; then
ARM_TOOLS_NAME=armTools
fi
if [ -z "$MBEDTLS_FOLDER_NAME" ]; then
MBEDTLS_FOLDER_NAME=mbedtls
fi
if [ -z "$OPCUA_FOLDER_NAME" ]; then
OPCUA_FOLDER_NAME=open62541
fi
if [ -z "$MQTT_FOLDER_NAME" ]; then
MQTT_FOLDER_NAME=paho.mqtt.c
fi
if [ -z "$LUA_FOLDER_NAME" ]; then
LUA_FOLDER_NAME=luajit-2.0
fi
if [ -z "$LINUX32_ARCH" ]; then
LINUX32_ARCH=linux32
fi
if [ -z "$ARM_ARCH" ]; then
ARM_ARCH=arm
fi
ARM_BIN="${TOOLS_DIR}${ARM_TOOLS_NAME}/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin"
ARM_ROOT="${TOOLS_DIR}${ARM_TOOLS_NAME}/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf"
CLEAN_ALL=0
LUA_EXTRA_FLAGS=""
CMAKE_EXTRA_FLAGS=""
####################################################################
##################### FUNCTIONS ###################################
####################################################################
#################################
# Compile mbedtls #
# - $1: architecture to build #
#################################
function compileMbetls(){
if [ ${CLEAN_ALL} -eq "1" ] || ! [ -f "${REPOS_DIR}${MBEDTLS_FOLDER_NAME}/bin/${1}/library/libmbedcrypto.a" ]; then
printMessage "Compiling mbedtls for ${1}"
cleanFolderAndGoThere "${REPOS_DIR}${MBEDTLS_FOLDER_NAME}/bin/${1}"
cmake -DENABLE_TESTING=Off \
${CMAKE_EXTRA_FLAGS} \
"${REPOS_DIR}${MBEDTLS_FOLDER_NAME}" && \
make -j8
else
printMessage "Library for mbedtls for $1 already found and won't be recompiled"
fi
}
#################################
# Compile open62541 #
# - $1: architecture to build #
#################################
function compileOpen62541(){
if [ ${CLEAN_ALL} -eq "1" ] || ! [ -f "${REPOS_DIR}${OPCUA_FOLDER_NAME}/bin/${1}/bin/libopen62541.a" ]; then
printMessage "Compiling open62541 for ${1}"
cleanFolderAndGoThere "${REPOS_DIR}${OPCUA_FOLDER_NAME}/bin/${1}"
cmake -DBUILD_SHARED_LIBS=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DUA_ENABLE_AMALGAMATION=ON \
-DUA_ENABLE_ENCRYPTION=ON \
-DMBEDCRYPTO_LIBRARY="${REPOS_DIR}${MBEDTLS_FOLDER_NAME}/bin/${1}/library/libmbedcrypto.a" \
-DMBEDTLS_LIBRARY="${REPOS_DIR}${MBEDTLS_FOLDER_NAME}/bin/${1}/library/libmbedtls.a" \
-DMBEDX509_LIBRARY="${REPOS_DIR}${MBEDTLS_FOLDER_NAME}/bin/${1}/library/libmbedx509.a" \
-DMBEDTLS_INCLUDE_DIRS="${REPOS_DIR}${MBEDTLS_FOLDER_NAME}/include" \
${CMAKE_EXTRA_FLAGS} \
${REPOS_DIR}${OPCUA_FOLDER_NAME} && \
make -j8
else
printMessage "Library for open62541 for $1 already found and won't be recompiled"
fi
}
#################################
# Compile luajit #
# - $1: architecture to build #
#################################
function compileLuajit(){
if [ ${CLEAN_ALL} -eq "1" ] || ! [ -f "${REPOS_DIR}${LUA_FOLDER_NAME}_bin/${1}/lib/libluajit-5.1.so" ]; then
#We create a new folder in the repos folder to copy all files to compile.
#We don't create inside the luajit repo since it might create problems
#copying recursive itself
CURRENT_FOLDER="${REPOS_DIR}${LUA_FOLDER_NAME}_bin/${1}"
printMessage "Compiling luajit for ${1}"
cleanFolderAndGoThere "${CURRENT_FOLDER}"
#The later eval LUA_COMMAND helps avoid expansion problems of LUA_EXTRA_FLAGS related to the debugging information which adds single quoutes
LUA_COMMAND="make ${LUA_EXTRA_FLAGS:+"$LUA_EXTRA_FLAGS"} PREFIX=${CURRENT_FOLDER} -j8"
cp -R ${REPOS_DIR}${LUA_FOLDER_NAME}/* ./ && \
eval "$LUA_COMMAND" && \
make install PREFIX="${CURRENT_FOLDER}" -j8
else
printMessage "Library for luajit for $1 already found and won't be recompiled"
fi
}
#################################
# Compile paho mqtt #
# - $1: architecture to build #
#################################
function compileMqtt(){
if [ ${CLEAN_ALL} -eq "1" ] || ! [ -f "${REPOS_DIR}${MQTT_FOLDER_NAME}/bin/${1}/src/libpaho-mqtt3a-static.a" ]; then
printMessage "Compiling paho mqtt for ${1}"
cleanFolderAndGoThere "${REPOS_DIR}${MQTT_FOLDER_NAME}/bin/${1}"
cmake -DPAHO_ENABLE_TESTING=OFF \
-DPAHO_BUILD_STATIC=ON \
${CMAKE_EXTRA_FLAGS} \
${REPOS_DIR}${MQTT_FOLDER_NAME} && \
make -j8
else
printMessage "Library for mqtt for $1 already found and won't be recompiled"
fi
}
#################################
# Compile all #
# - $1: architecture to build #
#################################
function compileAll(){
if [ "${OPCUA_ENABLED}" -eq "1" ]; then
compileMbetls "${1}"
compileOpen62541 "${1}"
fi
if [ "${LUA_ENABLED}" -eq "1" ]; then
compileLuajit "${1}"
fi
if [ "${MQTT_ENABLED}" -eq "1" ]; then
compileMqtt "${1}"
fi
}
################################################################
##################### TOOLS ###################################
################################################################
if [ "${ARM_ENABLED}" -eq "1" ]; then
#####################################
# Get ARM Compiler from repositorty #
#####################################
if ! [ -d "${TOOLS_DIR}${ARM_TOOLS_NAME}/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin" ]
then
printMessage "Getting compiler for ARM"
mkdir -p ${TOOLS_DIR}${ARM_TOOLS_NAME}_temp/ && \
mkdir -p ${TOOLS_DIR}${ARM_TOOLS_NAME}/arm-bcm2708/ && \
git clone https://github.com/raspberrypi/tools ${TOOLS_DIR}${ARM_TOOLS_NAME}_temp/ && \
mv ${TOOLS_DIR}${ARM_TOOLS_NAME}_temp/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/ ${TOOLS_DIR}${ARM_TOOLS_NAME}/arm-bcm2708/ && \
rm -r ${TOOLS_DIR}${ARM_TOOLS_NAME}_temp/
fi
fi
####################################################################
##################### REPOS ######################################
####################################################################
########################
# Prepare repos folder #
########################
CURRENT_FOLDER="${REPOS_DIR}"
if ! [ -d "${CURRENT_FOLDER}" ]
then
printMessage "Creating folder to hold repositories"
mkdir -p ${CURRENT_FOLDER}
fi
if [ "${OPCUA_ENABLED}" -eq "1" ]; then
###################
# Prepare mbedtls #
###################
CURRENT_FOLDER="${REPOS_DIR}${MBEDTLS_FOLDER_NAME}"
if ! [ -d "${CURRENT_FOLDER}" ]
then
printMessage "Creating folder for mbetdls repository"
mkdir -p "${CURRENT_FOLDER}" && \
git clone https://github.com/ARMmbed/mbedtls "${CURRENT_FOLDER}"
fi
cd "${CURRENT_FOLDER}" && \
git checkout mbedtls-2.7.1
#####################
# Prepare open62541 #
#####################
CURRENT_FOLDER="${REPOS_DIR}${OPCUA_FOLDER_NAME}"
if ! [ -d "${CURRENT_FOLDER}" ]
then
printMessage "Creating folder for opcua repository"
mkdir -p "${CURRENT_FOLDER}" && \
git clone https://github.com/open62541/open62541.git "${CURRENT_FOLDER}"
fi
cd "${CURRENT_FOLDER}" && \
git checkout v1.0 && \
git submodule update --recursive --init
fi
if [ "${LUA_ENABLED}" -eq "1" ]; then
##################
# Prepare luajit #
##################
CURRENT_FOLDER="${REPOS_DIR}${LUA_FOLDER_NAME}"
if ! [ -d "${CURRENT_FOLDER}" ]
then
printMessage "Creating folder for lua repository"
mkdir -p "${CURRENT_FOLDER}" && \
git clone http://luajit.org/git/luajit-2.0.git "${CURRENT_FOLDER}"
fi
cd "${CURRENT_FOLDER}" && \
git checkout v2.0
fi
if [ "${MQTT_ENABLED}" -eq "1" ]; then
#####################
# Prepare paho mqtt #
#####################
CURRENT_FOLDER="${REPOS_DIR}${MQTT_FOLDER_NAME}"
if ! [ -d "${CURRENT_FOLDER}" ]
then
printMessage "Creating folder for mqtt repository"
mkdir -p "${CURRENT_FOLDER}" && \
git clone https://github.com/eclipse/paho.mqtt.c.git "${CURRENT_FOLDER}"
fi
cd "${CURRENT_FOLDER}" && \
git checkout v1.2.1
fi
###################################################################
############# COMPILE FOR LINUX32 #################################
###################################################################
if [ "${LINUX32_ENABLED}" -eq "1" ]; then
LUA_EXTRA_FLAGS=""
CMAKE_EXTRA_FLAGS=""
compileAll "${LINUX32_ARCH}"
fi
###################################################################
################# COMPILE FOR ARM #################################
###################################################################
if [ "${ARM_ENABLED}" -eq "1" ]; then
LUA_EXTRA_FLAGS="HOST_CC='gcc -m32' CROSS=${ARM_BIN}/arm-linux-gnueabihf-"
CMAKE_EXTRA_FLAGS="-DCMAKE_C_COMPILER=${ARM_BIN}/arm-linux-gnueabihf-gcc -DCMAKE_CXX_COMPILER=${ARM_BIN}/arm-linux-gnueabihf-g++ -DCMAKE_FIND_ROOT_PATH=${ARM_ROOT}"
export LDFLAGS=-lrt #This flag is needed for mqtt. If can be added to te regular flags, it will be nicer
compileAll "${ARM_ARCH}"
unset LDFLAGS
fi