217 строки
7.6 KiB
Bash
Executable File
217 строки
7.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
usage()
|
|
{
|
|
echo "Usage: build.sh [clean] [arm64|x86_64|universal] [CUSTOM_CMAKE_CXX_FLAGS=x] [noroot] [release] [-h|-?] [-l (static|shared)] [-D CMAKE_OPTION] [-v]"
|
|
echo " "
|
|
echo "options: "
|
|
echo " "
|
|
echo "Positional options (1st three arguments): "
|
|
echo "[clean] - perform clean build "
|
|
echo "[arm64|x86_64|universal] - Apple platform build type. Not applicable to other OS. "
|
|
echo "[CUSTOM_CMAKE_CXX_FLAGS] - custom CXX compiler flags "
|
|
echo "[noroot] - custom CXX compiler flags "
|
|
echo "[release] - build for Release "
|
|
echo " "
|
|
echo "Additional parameters: "
|
|
echo " -h | -? - this help. "
|
|
echo " -l [static|shared] - build static (default) or shared library. "
|
|
echo " -D [CMAKE_OPTION] - additional options to pass to cmake. Could be multiple. "
|
|
echo " -v - increase build verbosity (reserved for future use) "
|
|
echo " "
|
|
echo "Environment variables: "
|
|
echo "CMAKE_OPTS - any additional cmake options. "
|
|
echo "GIT_PULL_TOKEN - authorization token for Microsoft-proprietary modules. "
|
|
echo "MACOSX_DEPLOYMENT_TARGET - optional parameter for setting macosx deployment target "
|
|
echo "Plus any other environment variables respected by CMake build system. "
|
|
exit 0
|
|
}
|
|
|
|
export PATH=/usr/local/bin:$PATH
|
|
|
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
echo "Current directory: $DIR"
|
|
cd $DIR
|
|
|
|
export NOROOT=$NOROOT
|
|
|
|
PARAM1="$1"
|
|
PARAM2="$2"
|
|
PARAM3="$3"
|
|
|
|
if [ "$PARAM1" == "clean" ]; then
|
|
echo "Cleaning previous build artifacts"
|
|
rm -f CMakeCache.txt *.cmake
|
|
rm -rf out
|
|
rm -rf .buildtools
|
|
# make clean
|
|
shift
|
|
fi
|
|
|
|
if [ "$PARAM1" == "noroot" ] || [ "$PARAM2" == "noroot" ] || [ "$PARAM3" == "noroot" ]; then
|
|
export NOROOT=true
|
|
echo "NOROOT = true"
|
|
shift
|
|
fi
|
|
|
|
if [ "$PARAM1" == "release" ] || [ "$PARAM2" == "release" ] || [ "$PARAM3" == "release" ]; then
|
|
BUILD_TYPE="Release"
|
|
echo "BUILD_TYPE = Release"
|
|
shift
|
|
elif [ "$PARAM1" == "debug" ] || [ "$PARAM2" == "debug" ] || [ "$PARAM3" == "debug" ]; then
|
|
BUILD_TYPE="Debug"
|
|
echo "BUILD_TYPE = Debug"
|
|
shift
|
|
else
|
|
BUILD_TYPE="Debug"
|
|
echo "Assuming default BUILD_TYPE = Debug"
|
|
fi
|
|
|
|
if [ "$PARAM1" == "arm64" ] || [ "$PARAM2" == "arm64" ] || [ "$PARAM3" == "arm64" ]; then
|
|
MAC_ARCH="arm64"
|
|
echo "MAC_ARCH = arm64"
|
|
shift
|
|
elif [ "$PARAM1" == "universal" ] || [ "$PARAM2" == "universal" ] || [ "$PARAM3" == "universal" ]; then
|
|
MAC_ARCH="universal"
|
|
echo "MAC_ARCH = universal"
|
|
shift
|
|
elif [ "$PARAM1" == "x86_64" ] || [ "$PARAM2" == "x86_64" ] || [ "$PARAM3" == "x86_64" ]; then
|
|
MAC_ARCH="x86_64"
|
|
echo "MAC_ARCH = x86_64"
|
|
shift
|
|
else
|
|
MAC_ARCH=$(/usr/bin/uname -m)
|
|
echo "Using current machine MAC_ARCH = $MAC_ARCH"
|
|
fi
|
|
|
|
CUSTOM_CMAKE_CXX_FLAG=""
|
|
if [[ $PARAM1 == CUSTOM_BUILD_FLAGS* ]] || [[ $PARAM2 == CUSTOM_BUILD_FLAGS* ]] || [[ $PARAM3 == CUSTOM_BUILD_FLAGS* ]]; then
|
|
if [[ $PARAM1 == CUSTOM_BUILD_FLAGS* ]]; then
|
|
CUSTOM_CMAKE_CXX_FLAG="\"${1:19:999}\""
|
|
elif [[ $PARAM2 == CUSTOM_BUILD_FLAGS* ]]; then
|
|
CUSTOM_CMAKE_CXX_FLAG="\"${2:19:999}\""
|
|
elif [[ $PARAM3 == CUSTOM_BUILD_FLAGS* ]]; then
|
|
CUSTOM_CMAKE_CXX_FLAG="\"${3:19:999}\""
|
|
fi
|
|
shift
|
|
echo "custom build flags = $CUSTOM_CMAKE_CXX_FLAG"
|
|
fi
|
|
|
|
LINK_TYPE=
|
|
CMAKE_OPTS="${CMAKE_OPTS:--DBUILD_SHARED_LIBS=OFF}"
|
|
while getopts "h?vl:D:" opt; do
|
|
case "$opt" in
|
|
h|\?) usage
|
|
;;
|
|
:) echo "Invalid option: $OPTARG requires an argument" 1>&2
|
|
exit 0
|
|
;;
|
|
v) verbose=1
|
|
;;
|
|
D) CMAKE_OPTS="${CMAKE_OPTS} -D${OPTARG}"
|
|
;;
|
|
l) LINK_TYPE=$OPTARG
|
|
;;
|
|
esac
|
|
done
|
|
shift $((OPTIND -1))
|
|
|
|
echo "CMAKE_OPTS from caller: $CMAKE_OPTS"
|
|
|
|
if [ "$LINK_TYPE" == "shared" ]; then
|
|
CMAKE_OPTS="${CMAKE_OPTS} -DBUILD_SHARED_LIBS=ON"
|
|
fi
|
|
|
|
# Set target MacOS minver
|
|
default_mac_os_target=$([ "$MAC_ARCH" == "arm64" ] && echo "11.10" || echo "10.10")
|
|
[ -z $MACOSX_DEPLOYMENT_TARGET ] && export MACOSX_DEPLOYMENT_TARGET=${default_mac_os_target}
|
|
echo "macosx deployment target="$MACOSX_DEPLOYMENT_TARGET
|
|
|
|
# Install build tools and recent sqlite3
|
|
FILE=.buildtools
|
|
OS_NAME=`uname -a`
|
|
|
|
if [ ! -f $FILE ]; then
|
|
case "$OS_NAME" in
|
|
*Darwin*) CMD="tools/setup-buildtools-apple.sh $MAC_ARCH" ;;
|
|
*Linux*) CMD="tools/setup-buildtools.sh" ;;
|
|
*) CMD=""; echo "WARNING: unsupported OS $OS_NAME, skipping build tools installation.." ;;
|
|
esac
|
|
|
|
[[ -n "$CMD" ]] && { [[ -z "$NOROOT" ]] && sudo $CMD || echo "No root: skipping build tools installation."; }
|
|
echo > $FILE
|
|
fi
|
|
|
|
if [ -f /usr/bin/gcc ]; then
|
|
echo "gcc version: `gcc --version`"
|
|
fi
|
|
|
|
if [ -f /usr/bin/clang ]; then
|
|
echo "clang version: `clang --version`"
|
|
fi
|
|
|
|
# Skip Version.hpp changes
|
|
# git update-index --skip-worktree lib/include/public/Version.hpp
|
|
|
|
#rm -rf out
|
|
mkdir -p out
|
|
cd out
|
|
|
|
# .tgz package
|
|
CMAKE_PACKAGE_TYPE=tgz
|
|
|
|
if [ -f /usr/bin/dpkg ]; then
|
|
# .deb package
|
|
export CMAKE_PACKAGE_TYPE=deb
|
|
elif [ -f /usr/bin/rpmbuild ]; then
|
|
# .rpm package
|
|
export CMAKE_PACKAGE_TYPE=rpm
|
|
fi
|
|
|
|
# Fail on error
|
|
set -e
|
|
|
|
# TODO: should this be improved to verify if the platform is Apple? Right now we unconditionally pass -DMAC_ARCH even if building for Windows or Linux.
|
|
cmake_cmd="cmake -DMAC_ARCH=$MAC_ARCH -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_PACKAGE_TYPE=$CMAKE_PACKAGE_TYPE -DCMAKE_CXX_FLAGS="${CUSTOM_CMAKE_CXX_FLAG}" $CMAKE_OPTS .."
|
|
echo $cmake_cmd
|
|
eval $cmake_cmd
|
|
# TODO: strip symbols to minimize (release-only)
|
|
|
|
# Build all
|
|
# TODO: what are the pros and cons of using 'make' vs 'cmake --build' ?
|
|
#make
|
|
cmake --build .
|
|
|
|
# No fail on error
|
|
set +e
|
|
|
|
# Remove old package
|
|
rm -f *.deb *.rpm
|
|
|
|
# Build new package
|
|
make package
|
|
|
|
# Install newly generated package
|
|
if [ -f /usr/bin/dpkg ]; then
|
|
# Ubuntu / Debian / Raspbian
|
|
[[ -z "$NOROOT" ]] && sudo dpkg -i *.deb || echo "No root: skipping package deployment."
|
|
elif [ -f /usr/bin/rpmbuild ]; then
|
|
# Redhat / Centos
|
|
[[ -z "$NOROOT" ]] && sudo rpm -i --force -v *.rpm || echo "No root: skipping package deployment."
|
|
fi
|
|
|
|
# Install SDK headers and lib to /usr/local
|
|
#
|
|
## TODO: [MG] - fix this section for shared library
|
|
## strip --strip-unneeded out/lib/libmat.so
|
|
## strip -S --strip-unneeded --remove-section=.note.gnu.gold-version --remove-section=.comment --remove-section=.note --remove-section=.note.gnu.build-id --remove-section=.note.ABI-tag out/lib/libmat.so
|
|
|
|
if [ "$CMAKE_PACKAGE_TYPE" == "tgz" ]; then
|
|
cd ..
|
|
MATSDK_INSTALL_DIR="${MATSDK_INSTALL_DIR:-/usr/local}"
|
|
echo "+-----------------------------------------------------------------------------------+"
|
|
echo " This step may prompt for your sudo password to deploy SDK to $MATSDK_INSTALL_DIR "
|
|
echo "+-----------------------------------------------------------------------------------+"
|
|
[[ -z "$NOROOT" ]] && sudo ./install.sh $MATSDK_INSTALL_DIR || echo "No root: skipping package deployment."
|
|
fi
|