blob: ac60b9b509bb458f573a047079fe263ff4a8aa51 [file] [log] [blame]
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
#
# 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.
script_directory="$(cd "$(dirname "$0")" && pwd)"
CMAKE_GLOBAL_MIN_VERSION_MAJOR=3
CMAKE_GLOBAL_MIN_VERSION_MINOR=7
CMAKE_GLOBAL_MIN_VERSION_REVISION=0
#RED='\033[0;41;30m'
RED='\033[0;101m'
NO_COLOR='\033[0;0;39m'
CORES=1
BUILD="false"
PACKAGE="false"
BUILD_IDENTIFIER=""
TRUE="Enabled"
FALSE="Disabled"
FEATURES_SELECTED="false"
AUTO_REMOVE_EXTENSIONS="true"
export NO_PROMPT="false"
ALL_FEATURES_ENABLED=${FALSE}
BUILD_DIR="build"
DEPLOY="false"
OPTIONS=()
CMAKE_OPTIONS_ENABLED=()
CMAKE_OPTIONS_DISABLED=()
CMAKE_MIN_VERSION=()
DEPLOY_LIMITS=()
USER_DISABLE_TESTS="${FALSE}"
USE_NINJA="false"
DEPENDENCIES=()
. "${script_directory}/bstrp_functions.sh"
SKIP_CMAKE=${FALSE}
MENU="features"
GUIDED_INSTALL=${FALSE}
while :; do
case $1 in
-n|--noprompt)
NO_PROMPT="true"
;;
-s|--skiptests)
USER_DISABLE_TESTS="${TRUE}"
;;
-g|--useninja)
USE_NINJA="${TRUE}"
;;
-e|--enableall)
NO_PROMPT="true"
FEATURES_SELECTED="true"
EnableAllFeatures
;;
-c|--clear)
rm ${script_directory}/bt_state > /dev/null 2>&1
;;
-d|--deploy)
NO_PROMPT="true"
DEPLOY="true"
FEATURES_SELECTED="true"
EnableAllFeatures
;;
"--build_dir="* )
BUILD_DIR="${1#*=}"
;;
-t|--travis)
NO_PROMPT="true"
FEATURES_SELECTED="true"
SKIP_CMAKE="${TRUE}"
;;
-p|--package)
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
BUILD="true"
PACKAGE="true"
;;
-i|--install)
GUIDED_INSTALL="Enabled"
EnableAllFeatures
MENU="main"
ALL_FEATURES_ENABLED=${TRUE}
;;
-b|--build)
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
BUILD="true"
;;
"--build_identifier="* )
BUILD_IDENTIFIER="${1#*=}"
;;
*) break
esac
shift
done
if [ -x "$(command -v hostname)" ]; then
HOSTNAME=`hostname`
PING_RESULT=`ping -c 1 ${HOSTNAME} 2>&1`
if [[ "$PING_RESULT" = *unknown* ]]; then
cntinu="N"
read -p "Cannot resolve your host name -- ${HOSTNAME} -- tests may fail, Continue? [ Y/N ] " cntinu
if [ "$cntinu" = "Y" ] || [ "$cntinu" = "y" ]; then
echo "Continuing..."
else
exit
fi
fi
fi
if [ "$NO_PROMPT" = "true" ]; then
agree="N"
echo "****************************************"
echo "Welcome, this bootstrap script will update your system to install MiNiFi C++"
echo "You have opted to skip prompts. "
fi
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$NAME
VER=$VERSION_ID
elif type lsb_release >/dev/null 2>&1; then
OS=$(lsb_release -si)
VER=$(lsb_release -sr)
elif [ -f /etc/lsb-release ]; then
. /etc/lsb-release
OS=$DISTRIB_ID
VER=$DISTRIB_RELEASE
elif [ -f /etc/debian_version ]; then
OS=Debian
VER=$(cat /etc/debian_version)
elif [ -f /etc/SUSE-brand ]; then
VER=`cat /etc/SUSE-brand | tr '\n' ' ' | sed s/.*=\ //`
OS=`cat /etc/SUSE-brand | tr '\n' ' ' | sed s/VERSION.*//`
elif [ -f /etc/SUSE-release ]; then
VER=`cat /etc/SUSE-release | tr '\n' ' ' | sed s/.*=\ //`
OS=`cat /etc/SUSE-release | tr '\n' ' ' | sed s/VERSION.*//`
elif [ -f /etc/redhat-release ]; then
# Older Red Hat, CentOS, etc.
...
else
OS=$(uname -s)
VER=$(uname -r)
fi
OS_MAJOR=`echo $VER | cut -d. -f1`
OS_MINOR=`echo $VER | cut -d. -f2`
OS_REVISION=`echo $EVR | cut -d. -f3`
### Verify the compiler version
COMPILER_VERSION="0.0.0"
COMPILER_COMMAND=""
if [ -x "$(command -v g++)" ]; then
COMPILER_COMMAND="g++"
COMPILER_VERSION=`${COMPILER_COMMAND} -dumpversion`
fi
COMPILER_MAJOR=`echo $COMPILER_VERSION | cut -d. -f1`
COMPILER_MINOR=`echo $COMPILER_VERSION | cut -d. -f2`
COMPILER_REVISION=`echo $COMPILER_VERSION | cut -d. -f3`
if [[ "$OS" = "Darwin" ]]; then
. "${script_directory}/darwin.sh"
else
. "${script_directory}/linux.sh"
if [[ "$OS" = Deb* ]]; then
. "${script_directory}/debian.sh"
elif [[ "$OS" = Rasp* ]]; then
. "${script_directory}/aptitude.sh"
elif [[ "$OS" = Pop* ]]; then
. "${script_directory}/aptitude.sh"
elif [[ "$OS" = Ubuntu* ]]; then
. "${script_directory}/aptitude.sh"
elif [[ "$OS" = *SUSE* ]]; then
. "${script_directory}/suse.sh"
elif [[ "$OS" = *SLE* ]]; then
if [[ "$VER" = 11* ]]; then
echo "Please install SLES11 manually...exiting"
exit
else
. "${script_directory}/suse.sh"
fi
elif [[ "$OS" = Red* ]]; then
. "${script_directory}/rheldistro.sh"
elif [[ "$OS" = Amazon* ]]; then
. "${script_directory}/centos.sh"
elif [[ "$OS" = CentOS* ]]; then
. "${script_directory}/centos.sh"
elif [[ "$OS" = Fedora* ]]; then
. "${script_directory}/fedora.sh"
fi
fi
### verify the cmake version
CMAKE_COMMAND=""
if [ -x "$(command -v cmake3)" ]; then
CMAKE_COMMAND="cmake3"
elif [ -x "$(command -v cmake)" ]; then
CMAKE_COMMAND="cmake"
fi
if [ -n "${CMAKE_COMMAND}" ]; then
get_cmake_version
fi
if [ -z "${CMAKE_COMMAND}" ] ||
[ "$CMAKE_MAJOR" -lt "$CMAKE_GLOBAL_MIN_VERSION_MAJOR" ] ||
[ "$CMAKE_MINOR" -lt "$CMAKE_GLOBAL_MIN_VERSION_MINOR" ] ||
[ "$CMAKE_REVISION" -lt "$CMAKE_GLOBAL_MIN_VERSION_REVISION" ]; then
echo "CMake is not installed or too old, attempting to install it..."
bootstrap_cmake
if [ -x "$(command -v cmake3)" ]; then
CMAKE_COMMAND="cmake3"
elif [ -x "$(command -v cmake)" ]; then
CMAKE_COMMAND="cmake"
fi
get_cmake_version
fi
if [ "$CMAKE_MAJOR" -lt "$CMAKE_GLOBAL_MIN_VERSION_MAJOR" ] ||
[ "$CMAKE_MINOR" -lt "$CMAKE_GLOBAL_MIN_VERSION_MINOR" ] ||
[ "$CMAKE_REVISION" -lt "$CMAKE_GLOBAL_MIN_VERSION_REVISION" ]; then
echo "Failed to install or update CMake, exiting..."
exit
fi
add_cmake_option PORTABLE_BUILD ${TRUE}
add_cmake_option DEBUG_SYMBOLS ${FALSE}
add_cmake_option BUILD_ROCKSDB ${TRUE}
## uses the source from the third party directory
add_enabled_option ROCKSDB_ENABLED ${TRUE} "DISABLE_ROCKSDB"
## need libcurl installed
add_enabled_option HTTP_CURL_ENABLED ${TRUE} "DISABLE_CURL"
# third party directory
add_enabled_option LIBARCHIVE_ENABLED ${TRUE} "DISABLE_LIBARCHIVE"
add_dependency LIBARCHIVE_ENABLED "libarchive"
add_enabled_option EXECUTE_SCRIPT_ENABLED ${TRUE} "DISABLE_SCRIPTING"
add_dependency EXECUTE_SCRIPT_ENABLED "python"
add_dependency EXECUTE_SCRIPT_ENABLED "lua"
add_enabled_option EXPRESSION_LANGAUGE_ENABLED ${TRUE} "DISABLE_EXPRESSION_LANGUAGE"
add_dependency EXPRESSION_LANGAUGE_ENABLED "bison"
add_dependency EXPRESSION_LANGAUGE_ENABLED "flex"
add_disabled_option PCAP_ENABLED ${FALSE} "ENABLE_PCAP"
add_dependency PCAP_ENABLED "libpcap"
add_disabled_option USB_ENABLED ${FALSE} "ENABLE_USB_CAMERA"
add_dependency USB_ENABLED "libusb"
add_dependency USB_ENABLED "libpng"
add_disabled_option GPS_ENABLED ${FALSE} "ENABLE_GPS"
add_dependency GPS_ENABLED "gpsd"
add_disabled_option AWS_ENABLED ${FALSE} "ENABLE_AWS"
add_disabled_option KAFKA_ENABLED ${FALSE} "ENABLE_LIBRDKAFKA"
add_disabled_option MQTT_ENABLED ${FALSE} "ENABLE_MQTT"
add_disabled_option PYTHON_ENABLED ${FALSE} "ENABLE_PYTHON"
add_dependency PYTHON_ENABLED "python"
add_disabled_option COAP_ENABLED ${TRUE} "ENABLE_COAP"
add_dependency COAP_ENABLED "automake"
add_dependency COAP_ENABLED "autoconf"
add_dependency COAP_ENABLED "libtool"
add_disabled_option JNI_ENABLED ${FALSE} "ENABLE_JNI"
add_dependency JNI_ENABLED "jnibuild"
add_disabled_option OPENCV_ENABLED ${FALSE} "ENABLE_OPENCV"
add_disabled_option OPENCV_ENABLED ${FALSE} "ENABLE_OPENCV"
add_disabled_option SFTP_ENABLED ${FALSE} "ENABLE_SFTP"
add_dependency SFTP_ENABLED "libssh2"
add_disabled_option SQLITE_ENABLED ${FALSE} "ENABLE_SQLITE"
# Since the following extensions have limitations on
add_disabled_option BUSTACHE_ENABLED ${FALSE} "ENABLE_BUSTACHE" "2.6" ${TRUE}
add_dependency BUSTACHE_ENABLED "boost"
## currently need to limit on certain platforms
add_disabled_option TENSORFLOW_ENABLED ${FALSE} "ENABLE_TENSORFLOW" "2.6" ${TRUE}
add_dependency TENSORFLOW_ENABLED "tensorflow"
add_disabled_option OPC_ENABLED ${FALSE} "ENABLE_OPC"
add_dependency OPC_ENABLED "mbedtls"
USE_SHARED_LIBS=${TRUE}
TESTS_DISABLED=${FALSE}
## name, default, values
add_multi_option BUILD_PROFILE "RelWithDebInfo" "RelWithDebInfo" "Debug" "MinSizeRel" "Release"
if [ "$GUIDED_INSTALL" == "${TRUE}" ]; then
EnableAllFeatures
ALL_FEATURES_ENABLED=${TRUE}
fi
BUILD_DIR_D=${BUILD_DIR}
OVERRIDE_BUILD_IDENTIFIER=${BUILD_IDENTIFIER}
load_state
if [ "$USER_DISABLE_TESTS" == "${TRUE}" ]; then
ToggleFeature TESTS_DISABLED
fi
if [ "${OVERRIDE_BUILD_IDENTIFIER}" != "${BUILD_IDENTIFIER}" ]; then
BUILD_IDENTIFIER=${OVERRIDE_BUILD_IDENTIFIER}
fi
if [ "$BUILD_DIR_D" != "build" ] && [ "$BUILD_DIR_D" != "$BUILD_DIR" ]; then
read -p "Build dir will override stored state, $BUILD_DIR. Press any key to continue " overwrite
BUILD_DIR=$BUILD_DIR_D
fi
if [ ! -d "${BUILD_DIR}" ]; then
mkdir ${BUILD_DIR}/
else
overwrite="Y"
if [ "$NO_PROMPT" = "false" ] && [ "$FEATURES_SELECTED" = "false" ]; then
echo "CMAKE Build dir (${BUILD_DIR}) exists, should we overwrite your build directory before we begin?"
read -p "If you have already bootstrapped, bootstrapping again isn't necessary to run make [ Y/N ] " overwrite
fi
if [ "$overwrite" = "N" ] || [ "$overwrite" = "n" ]; then
echo "Exiting ...."
exit
else
rm ${BUILD_DIR}/CMakeCache.txt > /dev/null 2>&1
fi
fi
## change to the directory
pushd ${BUILD_DIR}
while [ ! "$FEATURES_SELECTED" == "true" ]
do
if [ "$MENU" == "main" ]; then
show_main_menu
read_main_menu_options
elif [ "$MENU" == "advanced" ]; then
show_advanced_features_menu
read_advanced_menu_options
else
show_supported_features
read_feature_options
fi
done
### ensure we have all dependencies
save_state
build_deps
## just in case
CMAKE_VERSION=`${CMAKE_COMMAND} --version | head -n 1 | awk '{print $3}'`
CMAKE_MAJOR=`echo $CMAKE_VERSION | cut -d. -f1`
CMAKE_MINOR=`echo $CMAKE_VERSION | cut -d. -f2`
CMAKE_REVISION=`echo $CMAKE_VERSION | cut -d. -f3`
CMAKE_BUILD_COMMAND="${CMAKE_COMMAND} "
if [ "${USE_NINJA}" = "${TRUE}" ]; then
echo "use ninja"
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -GNinja "
fi
build_cmake_command(){
for option in "${OPTIONS[@]}" ; do
option_value="${!option}"
if [ "$option_value" = "${TRUE}" ]; then
# option is enabled
FOUND=""
FOUND_VALUE=""
for cmake_opt in "${CMAKE_OPTIONS_ENABLED[@]}" ; do
KEY=${cmake_opt%%:*}
VALUE=${cmake_opt#*:}
if [ "$KEY" = "$option" ]; then
FOUND="1"
FOUND_VALUE="$VALUE"
fi
done
if [ "$FOUND" = "1" ]; then
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -D${FOUND_VALUE}=ON"
fi
else
FOUND=""
FOUND_VALUE=""
if [ -z "$FOUND" ]; then
for cmake_opt in "${CMAKE_OPTIONS_DISABLED[@]}" ; do
KEY=${cmake_opt%%:*}
VALUE=${cmake_opt#*:}
if [ "$KEY" = "$option" ]; then
FOUND="1"
FOUND_VALUE="$VALUE"
fi
done
fi
if [ "$FOUND" = "1" ]; then
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -D${FOUND_VALUE}=ON"
fi
fi
done
if [ "${DEBUG_SYMBOLS}" = "${TRUE}" ]; then
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DCMAKE_BUILD_TYPE=RelWithDebInfo"
fi
if [ "${TESTS_DISABLED}" = "${TRUE}" ]; then
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DSKIP_TESTS=true "
else
# user may have disabled tests previously, so let's force them to be re-enabled
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DSKIP_TESTS= "
fi
if [ "${USE_SHARED_LIBS}" = "${TRUE}" ]; then
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DUSE_SHARED_LIBS=ON "
else
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DUSE_SHARED_LIBS= "
fi
if [ "${PORTABLE_BUILD}" = "${TRUE}" ]; then
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DPORTABLE=ON "
else
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DPORTABLE=OFF "
fi
if [ "${BUILD_ROCKSDB}" = "${TRUE}" ]; then
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DBUILD_ROCKSDB=ON "
else
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DBUILD_ROCKSDB= "
fi
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DBUILD_IDENTIFIER=${BUILD_IDENTIFIER}"
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DCMAKE_BUILD_TYPE=${BUILD_PROFILE}"
add_os_flags
CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} .."
continue_with_plan="Y"
if [ ! "$NO_PROMPT" = "true" ]; then
read -p "Command will be '${CMAKE_BUILD_COMMAND}', run this? [ Y/N ] " continue_with_plan
fi
if [ "$continue_with_plan" = "N" ] || [ "$continue_with_plan" = "n" ]; then
echo "Exiting ...."
exit
fi
}
build_cmake_command
### run the cmake command
if [ "${SKIP_CMAKE}" = "${TRUE}" ]; then
echo "Not running ${CMAKE_BUILD_COMMAND} "
else
${CMAKE_BUILD_COMMAND}
fi
if [ "$BUILD" = "true" ]; then
make -j${CORES}
fi
if [ "$PACKAGE" = "true" ]; then
make package
fi
popd