mariadb/scripts/build/build.sh
2025-03-05 14:12:56 +07:00

327 lines
No EOL
9.2 KiB
Bash
Executable file

#!/bin/bash
################################################################################
# Intended use: Compile and extract software packages
#
# Notes: This script support Linux Bash shell script only
# Install Bash from https://www.gnu.org/software/bash/
#
# Copyright (C) 2015 - 2025, VGISC Dev Team <dev@vgisc.com>
################################################################################
# Source path
export SCRIPT=$(readlink -f "$0")
export SCRIPT_PATH=$(dirname "$SCRIPT")
export SRC_DIR=${SCRIPT_PATH}/../..
export APP_NAME=$(basename $(dirname $(dirname "${SCRIPT_PATH}")))
# Declare input
ARCH_BUILD=$1
INSTALL_DIR=$2
export BUILD_TYPE=release
# *********************************************************************
# Function: print_help
# - Print: Help
# *********************************************************************
print_help ()
{
# Print
echo -e ""
echo -e "Syntax: build.sh <arch> <install_dir>"
echo -e "<arch>: Arch of device hardware. Only support"
echo -e " linux-x86_64 Linux AMD 64 bit general plaform"
echo -e " arm-linux-gnueabi Linux ARM 32 bit for gnueabi general platform"
echo -e " arm-linux-gnueabihf Linux ARM 32 bit for gnueabihf general platform"
echo -e " aarch64-linux-gnu Linux ARM 64 bit for general platform"
echo -e " powerpc-linux-gnu Linux PPC 32 bit for general platform"
echo -e " powerpc64-linux-gnu Linux PPC 64 bit big endian for general platform"
echo -e " powerpc64le-linux-gnu Linux PPC 64 bit little endian for general platform"
echo -e " arm-linux-gnueabihf-xilinx Linux ARM 32 bit for Xilinx platform"
echo -e " aarch64-linux-gnu-xilinx Linux ARM 64 bit for Xilinx platform"
echo -e " powerpc64-fsl-linux Linux PowerPC 64 bit for NXP QorIQ platform"
echo -e " i686-w64-mingw32 Windows AMD 32 bit platform"
echo -e " x86_64-w64-mingw32 Windows AMD 64 bit platform"
echo -e " arm-openwrt-linux Linux for OpenWRT Kirkwood platform"
echo -e "<install_dir>: The target directory contains the built results."
echo -e " The built results will be placed in the directory"
echo -e " <install_dir>/<arch>/opt/vgisc/usr/"
echo -e " If value a is not provided, the default output directory is"
echo -e " /opt/vgisc/6t/workspace/BUILD/"
echo -e ""
echo -e "Example:"
echo -e "- Example: build.sh arm-linux-gnueabihf /opt/vgisc/6t/workspace/BUILD"
echo -e "- Example: build.sh \"linux-x86_64\""
echo -e ""
}
# Validate input
if [[ -z $ARCH_BUILD ]]; then
echo -e "You must enter enough information. Cannot execute the command."
print_help
exit
fi
# Variables
item_exists="0"
names=("linux-x86_64" \
"arm-linux-gnueabi" \
"arm-linux-gnueabihf" \
"aarch64-linux-gnu" \
"powerpc-linux-gnu" \
"powerpc64-linux-gnu" \
"powerpc64le-linux-gnu" \
"arm-linux-gnueabihf-xilinx" \
"aarch64-linux-gnu-xilinx" \
"powerpc64-fsl-linux" \
"i686-w64-mingw32" \
"x86_64-w64-mingw32" \
"arm-openwrt-linux")
for item in ${names[@]}; do
if [[ "${item}" = "${ARCH_BUILD}" ]]; then
item_exists="1"
fi
done
if [[ "$item_exists" == "0" ]]; then
echo -e "The build arch is invalid. Cannot execute the command."
echo -e "Build arch must be in supported list."
print_help
exit
fi
if [[ -z $INSTALL_DIR ]]; then
echo -e "<install_dir> value a is not provided, the default output directory is"
echo -e " /opt/vgisc/6t/workspace/BUILD/"
export INSTALL_DIR="/opt/vgisc/6t/workspace/BUILD"
fi
if [[ ! -d $INSTALL_DIR ]]; then
echo -e "Folder $INSTALL_DIR does not exist, please create this folder first."
print_help
exit
fi
echo ""
echo "==========================================================================="
echo "Build ${APP_NAME} for platform ${ARCH_BUILD}"
echo "Build type: ${BUILD_TYPE}"
echo "=========================================================================="
echo "=> Setting up the build environment for ${ARCH_BUILD}..."
unset LD_LIBRARY_PATH
case "${ARCH_BUILD}" in
linux-x86_64)
export OS=linux
export ARCH=x86_64
;;
arm-linux-gnueabi)
export OS=linux
export ARCH=arm32
;;
arm-linux-gnueabihf)
export OS=linux
export ARCH=arm32
;;
aarch64-linux-gnu)
export OS=linux
export ARCH=arm64
;;
powerpc-linux-gnu)
export OS=linux
export ARCH=ppc32
;;
powerpc64-linux-gnu)
export OS=linux
export ARCH=ppc64
;;
powerpc64le-linux-gnu)
export OS=linux
export ARCH=ppc64
;;
arm-linux-gnueabihf-xilinx)
export PATH="/opt/Xilinx/arm-buildroot-linux-gnueabihf_sdk/bin:$PATH"
export SYS_ROOT=/opt/Xilinx/arm-buildroot-linux-gnueabihf_sdk/usr/arm-buildroot-linux-gnueabihf/sysroot/usr
export OS=linux
export ARCH=arm32
;;
aarch64-linux-gnu-xilinx)
export PATH="/opt/Xilinx/aarch64-buildroot-linux-gnu_sdk/bin:$PATH"
export SYS_ROOT=/opt/Xilinx/aarch64-buildroot-linux-gnu_sdk/usr/aarch64-buildroot-linux-gnu/sysroot/usr
export OS=linux
export ARCH=arm64
;;
powerpc64-fsl-linux)
. /opt/fsl-qoriq/3.0/environment-setup-ppc64e6500-fsl-linux
export SYSROOT_ALT=/opt/fsl-qoriq/3.0/sysroots/ppc64e6500-fsl-linux/usr
export OS=linux
export ARCH=ppc64
;;
arm-openwrt-linux)
export PATH="/opt/openwrt/arm_xscale_gcc-11.2.0_musl_eabi/bin:$PATH"
export SYS_ROOT=/opt/openwrt/arm_xscale_gcc-11.2.0_musl_eabi
export STAGING_DIR=/opt/openwrt/
export OS=linux
export ARCH=arm32
;;
i686-w64-mingw32)
export OS=windows
export ARCH=mingw32
;;
x86_64-w64-mingw32)
export OS=windows
export ARCH=mingw64
;;
*)
echo "The build environment cannot be determined. Exit"
exit
;;
esac
case "${ARCH_BUILD}" in
linux-x86_64)
export CC=gcc
export LD=ld
export RANLIB=ranlib
export AR=ar
export STRIP=strip
gcc_bin="$(which gcc)"
if [[ ! -f "${gcc_bin}" ]]; then
echo -e "GCC compiler for ${ARCH_BUILD} does not exist. Exit."
exit
fi
gpp_bin=$(which g++)
if [[ ! -f "${gpp_bin}" ]]; then
echo -e "G++ compiler for ${ARCH_BUILD} does not exist. Exit."
exit
fi
;;
arm-linux-gnueabihf-xilinx)
export ARM_XILINX=arm-linux-gnueabihf
export TARGET=${ARM_XILINX}
export HOST=${ARM_XILINX}
export CC=${ARM_XILINX}-gcc
export LD=${ARM_XILINX}-ld
export RANLIB=${ARM_XILINX}-ranlib
export AR=${ARM_XILINX}-ar
export STRIP=${ARM_XILINX}-strip
gcc_bin="$(which ${ARM_XILINX}-gcc)"
if [[ ! -f "${gcc_bin}" ]]; then
echo -e "GCC compiler for ${ARM_XILINX} does not exist. Exit."
exit
fi
gpp_bin=$(which ${ARM_XILINX}-g++)
if [[ ! -f "${gpp_bin}" ]]; then
echo -e "G++ compiler for ${ARM_XILINX} does not exist. Exit."
exit
fi
;;
aarch64-linux-gnu-xilinx)
export AARCH64_XILINX=aarch64-linux-gnu
export TARGET=${AARCH64_XILINX}
export HOST=${AARCH64_XILINX}
export CC=${AARCH64_XILINX}-gcc
export LD=${AARCH64_XILINX}-ld
export RANLIB=${AARCH64_XILINX}-ranlib
export AR=${AARCH64_XILINX}-ar
export STRIP=${AARCH64_XILINX}-strip
gcc_bin="$(which ${AARCH64_XILINX}-gcc)"
if [[ ! -f "${gcc_bin}" ]]; then
echo -e "GCC compiler for ${AARCH64_XILINX} does not exist. Exit."
exit
fi
gpp_bin=$(which ${AARCH64_XILINX}-g++)
if [[ ! -f "${gpp_bin}" ]]; then
echo -e "G++ compiler for ${AARCH64_XILINX} does not exist. Exit."
exit
fi
;;
powerpc64-fsl-linux)
export TARGET=powerpc64-fsl-linux
export HOST=powerpc64-fsl-linux
export STRIP=powerpc64-fsl-linux-strip
gcc_bin="$(which ${ARCH_BUILD}-gcc)"
if [[ ! -f "${gcc_bin}" ]]; then
echo -e "GCC compiler for ${ARCH_BUILD} does not exist. Exit."
exit
fi
gpp_bin=$(which ${ARCH_BUILD}-g++)
if [[ ! -f "${gpp_bin}" ]]; then
echo -e "G++ compiler for ${ARCH_BUILD} does not exist. Exit."
exit
fi
;;
*)
export TARGET=${ARCH_BUILD}
export HOST=${ARCH_BUILD}
export CC=${ARCH_BUILD}-gcc
export LD=${ARCH_BUILD}-ld
export RANLIB=${ARCH_BUILD}-ranlib
export AR=${ARCH_BUILD}-ar
export STRIP=${ARCH_BUILD}-strip
gcc_bin="$(which ${ARCH_BUILD}-gcc)"
if [[ ! -f "${gcc_bin}" ]]; then
echo -e "GCC compiler for ${ARCH_BUILD} does not exist. Exit."
exit
fi
gpp_bin=$(which ${ARCH_BUILD}-g++)
if [[ ! -f "${gpp_bin}" ]]; then
echo -e "G++ compiler for ${ARCH_BUILD} does not exist. Exit."
exit
fi
;;
esac
# Output path
export PREFIX=/opt/vgisc/usr
export ETC_DIR=/opt/vgisc/etc
export THIRD_PARTY_PREFIX=/opt/third_party
export OUTPUT_DIR=output/${APP_NAME}-${ARCH_BUILD}-${BUILD_TYPE}
export ZIP_DIR=${INSTALL_DIR}/zip
export RELEASE_DIR=${INSTALL_DIR}/rls/${ARCH_BUILD}/release
export STATIC_DIR=${INSTALL_DIR}/rls/${ARCH_BUILD}/static
export BOOT_DIR=${INSTALL_DIR}/rls/${ARCH_BUILD}/boot
export INSTALLERS_DIR=${INSTALL_DIR}/installers
echo ""
echo "=> Change to source directory: ${SRC_DIR}/"
cd ${SRC_DIR}
echo ""
echo "=> Clean output and old build"
mkdir ${SRC_DIR}/build_${ARCH_BUILD}
rm -rf ${SRC_DIR}/build_${ARCH_BUILD}/*
cd ${SRC_DIR}/build_${ARCH_BUILD}/
echo ""
echo "=> Building in source tree: ${SRC_DIR}/..."
export CROSS_COMPILE=
case "${ARCH_BUILD}" in
linux-x86_64)
cmake .. -DBUILD_CONFIG=mysql_release \
-DCMAKE_INSTALL_PREFIX=${PREFIX}
cmake --build . --parallel 16
make DESTDIR=${RELEASE_DIR} install
;;
*)
cmake .. -DBUILD_CONFIG=mysql_release \
-DCMAKE_INSTALL_PREFIX=${PREFIX}
cmake --build . --parallel 16
make DESTDIR=${RELEASE_DIR} install
;;
esac
echo ""
echo "=> Clean the build"
rm -rf ${SRC_DIR}/build_${ARCH_BUILD}
echo ""
echo "=> Done."
echo ""
################################################################################
# BASH SCRIPT ON LINUX/UNIX - END
################################################################################