OS_VER=$( grep VERSION_ID /etc/os-release | cut -d'=' -f2 | sed 's/[^0-9\.]//gI' ) MEM_MEG=$( free -m | sed -n 2p | tr -s ' ' | cut -d\ -f2 ) CPU_SPEED=$( lscpu | grep "MHz" | tr -s ' ' | cut -d\ -f3 | cut -d'.' -f1 ) CPU_CORE=$( lscpu | grep "^CPU(s)" | tr -s ' ' | cut -d\ -f2 ) MEM_GIG=$(( ((MEM_MEG / 1000) / 2) )) JOBS=$(( MEM_GIG > CPU_CORE ? CPU_CORE : MEM_GIG )) DISK_INSTALL=$( df -h . | tail -1 | tr -s ' ' | cut -d\ -f1 ) DISK_TOTAL_KB=$( df . | tail -1 | awk '{print $2}' ) DISK_AVAIL_KB=$( df . | tail -1 | awk '{print $4}' ) DISK_TOTAL=$(( DISK_TOTAL_KB / 1048576 )) DISK_AVAIL=$(( DISK_AVAIL_KB / 1048576 )) printf "\\n\\tOS name: %s\\n" "${OS_NAME}" printf "\\tOS Version: %s\\n" "${OS_VER}" printf "\\tCPU speed: %sMhz\\n" "${CPU_SPEED}" printf "\\tCPU cores: %s\\n" "${CPU_CORE}" printf "\\tPhysical Memory: %s Mgb\\n" "${MEM_MEG}" printf "\\tDisk install: %s\\n" "${DISK_INSTALL}" printf "\\tDisk space total: %sG\\n" "${DISK_TOTAL%.*}" printf "\\tDisk space available: %sG\\n" "${DISK_AVAIL%.*}" if [ "${MEM_MEG}" -lt 7000 ]; then printf "\\tYour system must have 7 or more Gigabytes of physical memory installed.\\n" printf "\\tExiting now.\\n" exit 1; fi if [ "${OS_VER}" -lt 25 ]; then printf "\\tYou must be running Fedora 25 or higher to install EOSIO.\\n" printf "\\tExiting now.\\n" exit 1; fi if [ "${DISK_AVAIL%.*}" -lt "${DISK_MIN}" ]; then printf "\\tYou must have at least %sGB of available storage to install EOSIO.\\n" "${DISK_MIN}" printf "\\tExiting now.\\n" exit 1; fi printf "\\n\\tChecking Yum installation\\n" YUM=$( command -v yum 2>/dev/null ) if [ -z "${YUM}" ]; then printf "\\n\\tYum must be installed to compile EOS.IO.\\n" printf "\\n\\tExiting now.\\n" exit 1; fi printf "\\tYum installation found at %s.\\n" "${YUM}" printf "\\tUpdating YUM.\\n" if ! sudo yum -y update then printf "\\n\\tYUM update failed with the above errors.\\n" printf "\\n\\tExiting now.\\n" exit 1; fi DEP_ARRAY=( git gcc.x86_64 gcc-c++.x86_64 autoconf automake libtool make cmake.x86_64 \ bzip2.x86_64 bzip2-devel.x86_64 openssl-devel.x86_64 gmp-devel.x86_64 libstdc++-devel.x86_64 \ python2-devel.x86_64 python3-devel.x86_64 mongodb.x86_64 mongodb-server.x86_64 libedit.x86_64 \ graphviz.x86_64 doxygen.x86_64 ) COUNT=1 DISPLAY="" DEP="" printf "\\n\\tChecking YUM for installed dependencies.\\n\\n" for (( i=0; i<${#DEP_ARRAY[@]}; i++ )); do pkg=$( sudo "${YUM}" info "${DEP_ARRAY[$i]}" 2>/dev/null | grep Repo | tr -s ' ' | cut -d: -f2 | sed 's/ //g' ) if [ "$pkg" != "@System" ]; then DEP=$DEP" ${DEP_ARRAY[$i]} " DISPLAY="${DISPLAY}${COUNT}. ${DEP_ARRAY[$i]}\\n\\t" printf "\\tPackage %s ${bldred} NOT ${txtrst} found.\\n" "${DEP_ARRAY[$i]}" (( COUNT++ )) else printf "\\tPackage %s found.\\n" "${DEP_ARRAY[$i]}" continue fi done if [ ${COUNT} -gt 1 ]; then printf "\\n\\tThe following dependencies are required to install EOSIO.\\n" printf "\\n\\t${DISPLAY}\\n\\n" printf "\\tDo you wish to install these dependencies?\\n" select yn in "Yes" "No"; do case $yn in [Yy]* ) printf "\\n\\n\\tInstalling dependencies\\n\\n" if ! sudo yum -y install ${DEP} then printf "\\n\\tYUM dependency installation failed.\\n" printf "\\n\\tExiting now.\\n" exit 1; else printf "\\n\\tYUM dependencies installed successfully.\\n" fi break;; [Nn]* ) echo "User aborting installation of required dependencies, Exiting now."; exit;; * ) echo "Please type 1 for yes or 2 for no.";; esac done else printf "\\n\\tNo required YUM dependencies to install.\\n" fi if [ "${ENABLE_COVERAGE_TESTING}" = true ]; then printf "\\n\\tCode coverage build requested." printf "\\n\\tChecking perl installation.\\n" perl_bin=$( command -v perl 2>/dev/null ) if [ -z "${perl_bin}" ]; then printf "\\n\\tInstalling perl.\\n" if ! sudo "${YUM}" -y install perl then printf "\\n\\tUnable to install perl at this time.\\n" printf "\\n\\tExiting now.\\n\\n" exit 1; fi else printf "\\tPerl installation found at %s.\\n" "${perl_bin}" fi printf "\\n\\tChecking LCOV installation." if [ ! -e "/usr/local/bin/lcov" ]; then printf "\\n\\tLCOV installation not found.\\n" printf "\\tInstalling LCOV.\\n" if ! cd "${TEMP_DIR}" then printf "\\n\\tUnable to enter %s. Exiting now.\\n" "${TEMP_DIR}" exit 1; fi if ! git clone "https://github.com/linux-test-project/lcov.git" then printf "\\n\\tUnable to clone LCOV at this time.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! cd "${TEMP_DIR}/lcov" then printf "\\n\\tUnable to enter %s/lcov. Exiting now.\\n" "${TEMP_DIR}" exit 1; fi if ! sudo make install then printf "\\n\\tUnable to install LCOV at this time.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi rm -rf "${TEMP_DIR}/lcov" printf "\\n\\tSuccessfully installed LCOV.\\n\\n" else printf "\\n\\tLCOV installation found @ /usr/local/bin.\\n" fi fi if [ -d "${HOME}/opt/boost_1_67_0" ]; then if ! mv "${HOME}/opt/boost_1_67_0" "$BOOST_ROOT" then printf "\\n\\tUnable to move directory %s/opt/boost_1_67_0 to %s.\\n" "${HOME}" "${BOOST_ROOT}" printf "\\n\\tExiting now.\\n" exit 1 fi if [ -d "$BUILD_DIR" ]; then if ! rm -rf "$BUILD_DIR" then printf "\\tUnable to remove directory %s. Please remove this directory and run this script %s again. 0\\n" "$BUILD_DIR" "${BASH_SOURCE[0]}" printf "\\tExiting now.\\n\\n" exit 1; fi fi fi printf "\\n\\tChecking boost library installation.\\n" BVERSION=$( grep "BOOST_LIB_VERSION" "${BOOST_ROOT}/include/boost/version.hpp" 2>/dev/null \ | tail -1 | tr -s ' ' | cut -d\ -f3 | sed 's/[^0-9\._]//gI' ) if [ "${BVERSION}" != "1_67" ]; then printf "\\tRemoving existing boost libraries in %s/opt/boost* .\\n" "${HOME}" if ! rm -rf "${HOME}"/opt/boost* then printf "\\n\\tUnable to remove deprecated boost libraries at this time.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi printf "\\tInstalling boost libraries.\\n" if ! cd "${TEMP_DIR}" then printf "\\n\\tUnable to enter directory %s.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi STATUS=$( curl -LO -w '%{http_code}' --connect-timeout 30 https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.tar.bz2 ) if [ "${STATUS}" -ne 200 ]; then printf "\\tUnable to download Boost libraries at this time.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! tar xf "${TEMP_DIR}/boost_1_67_0.tar.bz2" then printf "\\n\\tUnable to unarchive file %s/boost_1_67_0.tar.bz2.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi if ! rm -f "${TEMP_DIR}/boost_1_67_0.tar.bz2" then printf "\\n\\tUnable to remove file %s/boost_1_67_0.tar.bz2.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi if ! cd "${TEMP_DIR}/boost_1_67_0/" then printf "\\n\\tUnable to enter directory %s/boost_1_67_0.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi if ! "${TEMP_DIR}"/boost_1_67_0/bootstrap.sh "--prefix=${BOOST_ROOT}" then printf "\\n\\tInstallation of boost libraries failed. 0\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! "${TEMP_DIR}"/boost_1_67_0/b2 install then printf "\\n\\tInstallation of boost libraries failed. 1\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! rm -rf "${TEMP_DIR}/boost_1_67_0" then printf "\\n\\tUnable to remove directory %s/boost_1_67_0. 1\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi if [ -d "$BUILD_DIR" ]; then if ! rm -rf "$BUILD_DIR" then printf "\\tUnable to remove directory %s. Please remove this directory and run this script %s again. 0\\n" "$BUILD_DIR" "${BASH_SOURCE[0]}" printf "\\tExiting now.\\n\\n" exit 1; fi fi printf "\\n\\tBoost 1.67.0 successfully installed at %s/opt/boost_1_67_0.\\n\\n" "${HOME}" else printf "\\tBoost 1.67.0 found at %s/opt/boost_1_67_0.\\n" "${HOME}" fi printf "\\n\\tChecking MongoDB C++ driver installation.\\n" if [ ! -e "/usr/local/lib/libmongocxx-static.a" ]; then printf "\\n\\tInstalling MongoDB C & C++ drivers.\\n" if ! cd "${TEMP_DIR}" then printf "\\tUnable to enter directory %s.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi STATUS=$(curl -LO -w '%{http_code}' --connect-timeout 30 https://github.com/mongodb/mongo-c-driver/releases/download/1.9.3/mongo-c-driver-1.9.3.tar.gz) if [ "${STATUS}" -ne 200 ]; then rm -f "${TEMP_DIR}/mongo-c-driver-1.9.3.tar.gz" 2>/dev/null printf "\\tUnable to download MongoDB C driver at this time.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! tar xf "${TEMP_DIR}/mongo-c-driver-1.9.3.tar.gz" then printf "\\tUnable to unarchive file %s/mongo-c-driver-1.9.3.tar.gz.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi if ! rm -f "${TEMP_DIR}/mongo-c-driver-1.9.3.tar.gz" then printf "\\tUnable to remove file %s/mongo-c-driver-1.9.3.tar.gz.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi if ! cd "${TEMP_DIR}/mongo-c-driver-1.9.3" then printf "\\tUnable to enter directory %s/mongo-c-driver-1.9.3.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi if ! ./configure --enable-static --with-libbson=bundled --enable-ssl=openssl --disable-automatic-init-and-cleanup --prefix=/usr/local then printf "\\tConfiguring MongoDB C driver has exited with the errors above.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! make -j"${JOBS}" then printf "\\tMakecompiling MongoDB C driver has exited with the above error.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! sudo make install then printf "\\tInstalling MongoDB C driver has exited with the above error.\\nMake sure you have sudo privileges.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! cd "${TEMP_DIR}" then printf "\\tUnable to enter directory %s.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi if ! rm -rf "${TEMP_DIR}/mongo-c-driver-1.9.3" then printf "\\tUnable to remove directory %s/mongo-c-driver-1.9.3.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi if ! git clone https://github.com/mongodb/mongo-cxx-driver.git --branch releases/v3.2 --depth 1 then printf "\\tUnable to clone MongoDB C++ driver at this time.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! cd "${TEMP_DIR}/mongo-cxx-driver/build" then printf "\\tUnable to enter directory %s/mongo-cxx-driver/build.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi if ! cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local .. then printf "\\tCmake has encountered the above errors building the MongoDB C++ driver.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! sudo make -j"${JOBS}" then printf "\\tMaking MongoDB C++ driver has exited with the above errors.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! sudo make install then printf "\\tError installing MongoDB C++ driver.\\nMake sure you have sudo privileges.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! cd "${CWD}" then printf "\\tUnable to enter directory %s.\\n" "${CWD}" printf "\\tExiting now.\\n\\n" exit 1; fi if ! sudo rm -rf "${TEMP_DIR}/mongo-cxx-driver" then printf "\\tUnable to remove directory %s/mongo-cxx-driver.\\n" "${TEMP_DIR}" printf "\\tExiting now.\\n\\n" exit 1; fi printf "\\n\\tMongo C++ driver successfully installed @ /usr/local/lib.\\n\\n" else printf "\\tMongo C++ driver found /usr/local/lib.\\n" fi printf "\\n\\tChecking secp256k1-zkp installation.\\n" # install secp256k1-zkp (Cryptonomex branch) if [ ! -e "/usr/local/lib/libsecp256k1.a" ]; then printf "\\tInstalling secp256k1-zkp (Cryptonomex branch).\\n" if ! cd "${TEMP_DIR}" then printf "\\n\\tUnable to cd into directory %s.\\n" "${TEMP_DIR}" printf "\\n\\tExiting now.\\n" exit 1; fi if ! git clone https://github.com/cryptonomex/secp256k1-zkp.git then printf "\\tUnable to clone repo secp256k1-zkp @ https://github.com/cryptonomex/secp256k1-zkp.git.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! cd "${TEMP_DIR}/secp256k1-zkp" then printf "\\n\\tUnable to cd into directory %s.\\n" "${TEMP_DIR}/secp256k1-zkp" printf "\\n\\tExiting now.\\n" exit 1; fi if ! ./autogen.sh then printf "\\tError running autogen for secp256k1-zkp.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! ./configure then printf "\\tError running configure for secp256k1-zkp.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! make -j"${JOBS}" then printf "\\tError compiling secp256k1-zkp.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! sudo make install then printf "\\tError installing secp256k1-zkp.\\n" printf "\\tExiting now.\\n\\n" exit 1; fi if ! rm -rf "${TEMP_DIR}/secp256k1-zkp" then printf "\\tError removing directory %s.\\n" "${TEMP_DIR}/secp256k1-zkp" printf "\\tExiting now.\\n\\n" exit 1; fi printf "\\n\\tsecp256k1 successfully installed @ /usr/local/lib.\\n\\n" else printf "\\tsecp256k1 found @ /usr/local/lib.\\n" fi printf "\\n\\tChecking LLVM with WASM support installation.\\n" if [ ! -d "${HOME}/opt/wasm/bin" ]; then printf "\\tInstalling LLVM & WASM\\n" if ! cd "${TEMP_DIR}" then printf "\\n\\tUnable to cd into directory %s.\\n" "${TEMP_DIR}" printf "\\n\\tExiting now.\\n" exit 1; fi if ! mkdir "${TEMP_DIR}/llvm-compiler" 2>/dev/null then printf "\\n\\tUnable to create directory %s/llvm-compiler.\\n" "${TEMP_DIR}" printf "\\n\\tExiting now.\\n" exit 1; fi if ! cd "${TEMP_DIR}/llvm-compiler" then printf "\\n\\tUnable to enter directory %s/llvm-compiler.\\n" "${TEMP_DIR}" printf "\\n\\tExiting now.\\n" exit 1; fi if ! git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/llvm.git then printf "\\tUnable to clone llvm repo @ https://github.com/llvm-mirror/llvm.git.\\n" printf "\\n\\tExiting now.\\n" exit 1; fi if ! cd "${TEMP_DIR}/llvm-compiler/llvm/tools" then printf "\\n\\tUnable to enter directory %s/llvm-compiler/llvm/tools.\\n" "${TEMP_DIR}" printf "\\n\\tExiting now.\\n" exit 1; fi if ! git clone --depth 1 --single-branch --branch release_40 https://github.com/llvm-mirror/clang.git then printf "\\tUnable to clone clang repo @ https://github.com/llvm-mirror/clang.git.\\n" printf "\\n\\tExiting now.\\n" exit 1; fi if ! cd "${TEMP_DIR}/llvm-compiler/llvm" then printf "\\n\\tUnable to enter directory %s/llvm-compiler/llvm.\\n" "${TEMP_DIR}" printf "\\n\\tExiting now.\\n" exit 1; fi if ! mkdir "${TEMP_DIR}/llvm-compiler/llvm/build" then printf "\\n\\tUnable to create directory %s/llvm-compiler/llvm/build.\\n" "${TEMP_DIR}" printf "\\n\\tExiting now.\\n" exit 1; fi if ! cd "${TEMP_DIR}/llvm-compiler/llvm/build" then printf "\\n\\tUnable to enter directory %s/llvm-compiler/llvm/build.\\n" "${TEMP_DIR}" printf "\\n\\tExiting now.\\n" exit 1; fi if ! cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="${HOME}/opt/wasm" -DLLVM_ENABLE_RTTI=1 \ -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly -DCMAKE_BUILD_TYPE=Release ../ then printf "\\tCmake compiling LLVM/Clang with WASM support has exited with the above errors.\\n" printf "\\n\\tExiting now.\\n" exit 1; fi if ! make -j"${JOBS}" then printf "\\tMake compiling LLVM/Clang with WASM support has exited with the above errors.\\n" printf "\\n\\tExiting now.\\n" exit 1; fi if ! make install then printf "\\tMake installing LLVM/Clang with WASM support has exited with the above errors.\\n" printf "\\n\\tExiting now.\\n" exit 1; fi if ! rm -rf "${TEMP_DIR}/llvm-compiler" 2>/dev/null then printf "\\n\\tUnable to remove directory %s/llvm-compiler.\\n" "${TEMP_DIR}" printf "\\n\\tExiting now.\\n" exit 1; fi printf "\\n\\tWASM successfully installed at %s/opt/wasm\\n\\n" "${HOME}" else printf "\\n\\tWASM found @ %s/opt/wasm\\n\\n" "${HOME}" fi function print_instructions() { printf "\\n\\t%s -f %s &\\n" "$( command -v mongod )" "${MONGOD_CONF}" printf "\\tcd %s; make test\\n\\n" "${BUILD_DIR}" return 0; }