# Proposed changes This PR fixed lots of issues when building from source on macOS with Apple M1 chip. ## ATTENTION The job for supporting macOS with Apple M1 chip is too big and there are lots of unresolved issues during runtime: 1. Some errors with memory tracker occur when BE (RELEASE) starts. 2. Some UT cases fail. ... Temporarily, the following changes are made on macOS to start BE successfully. 1. Disable memory tracker. 2. Use tcmalloc instead of jemalloc. This PR kicks off the job. Guys who are interested in this job can continue to fix these runtime issues. ## Use case ```shell ./build.sh -j 8 --be --clean cd output/be/bin ulimit -n 60000 ./start_be.sh --daemon ``` ## Something else It takes around _**10+**_ minutes to build BE (with prebuilt third-parties) on macOS with M1 chip. We will improve the development experience on macOS greatly when we finish the adaptation job.
200 lines
6.2 KiB
Bash
Executable File
200 lines
6.2 KiB
Bash
Executable File
#!/usr/bin/env 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.
|
|
|
|
# check DORIS_HOME
|
|
export LC_ALL=C
|
|
|
|
if [[ -z "${DORIS_HOME}" ]]; then
|
|
echo "Error: DORIS_HOME is not set"
|
|
exit 1
|
|
fi
|
|
|
|
# check OS type
|
|
if [[ -n "${OSTYPE}" ]]; then
|
|
if [[ "${OSTYPE}" != "linux-gnu" ]] && [[ "${OSTYPE:0:6}" != "darwin" ]]; then
|
|
echo "Error: Unsupported OS type: ${OSTYPE}"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# include custom environment variables
|
|
if [[ -f "${DORIS_HOME}/custom_env.sh" ]]; then
|
|
# shellcheck disable=1091
|
|
. "${DORIS_HOME}/custom_env.sh"
|
|
fi
|
|
|
|
# set DORIS_THIRDPARTY
|
|
if [[ -z "${DORIS_THIRDPARTY}" ]]; then
|
|
export DORIS_THIRDPARTY="${DORIS_HOME}/thirdparty"
|
|
fi
|
|
|
|
# check python
|
|
if [[ -z "${DORIS_BUILD_PYTHON_VERSION}" ]]; then
|
|
DORIS_BUILD_PYTHON_VERSION="python"
|
|
fi
|
|
|
|
export PYTHON="${DORIS_BUILD_PYTHON_VERSION}"
|
|
|
|
if ! ${PYTHON} --version; then
|
|
echo "Error: ${PYTHON} is not found, maybe you should set DORIS_BUILD_PYTHON_VERSION."
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "${DORIS_TOOLCHAIN}" ]]; then
|
|
if [[ "$(uname -s)" == 'Darwin' ]]; then
|
|
DORIS_TOOLCHAIN=clang
|
|
else
|
|
DORIS_TOOLCHAIN=gcc
|
|
fi
|
|
fi
|
|
|
|
if [[ "${DORIS_TOOLCHAIN}" == "gcc" ]]; then
|
|
# set GCC HOME
|
|
if [[ -z "${DORIS_GCC_HOME}" ]]; then
|
|
DORIS_GCC_HOME="$(dirname "$(which gcc)")"/..
|
|
export DORIS_GCC_HOME
|
|
fi
|
|
|
|
gcc_ver="$("${DORIS_GCC_HOME}/bin/gcc" -dumpfullversion -dumpversion)"
|
|
required_ver="7.3.0"
|
|
if [[ ! "$(printf '%s\n' "${required_ver}" "${gcc_ver}" | sort -V | head -n1)" = "${required_ver}" ]]; then
|
|
echo "Error: GCC version (${gcc_ver}) must be greater than or equal to ${required_ver}"
|
|
exit 1
|
|
fi
|
|
export CC="${DORIS_GCC_HOME}/bin/gcc"
|
|
export CXX="${DORIS_GCC_HOME}/bin/g++"
|
|
if test -x "${DORIS_GCC_HOME}/bin/ld"; then
|
|
export DORIS_BIN_UTILS="${DORIS_GCC_HOME}/bin/"
|
|
fi
|
|
elif [[ "${DORIS_TOOLCHAIN}" == "clang" ]]; then
|
|
# set CLANG HOME
|
|
if [[ -z "${DORIS_CLANG_HOME}" ]]; then
|
|
DORIS_CLANG_HOME="$(dirname "$(which clang)")"/..
|
|
export DORIS_CLANG_HOME
|
|
fi
|
|
|
|
clang_ver="$("${DORIS_CLANG_HOME}/bin/clang" -dumpfullversion -dumpversion)"
|
|
required_ver="13.0.0"
|
|
if [[ ! "$(printf '%s\n' "${required_ver}" "${clang_ver}" | sort -V | head -n1)" = "${required_ver}" ]]; then
|
|
echo "Error: CLANG version (${clang_ver}) must be greater than or equal to ${required_ver}"
|
|
exit 1
|
|
fi
|
|
export CC="${DORIS_CLANG_HOME}/bin/clang"
|
|
export CXX="${DORIS_CLANG_HOME}/bin/clang++"
|
|
if test -x "${DORIS_CLANG_HOME}/bin/ld.lld"; then
|
|
export DORIS_BIN_UTILS="${DORIS_CLANG_HOME}/bin/"
|
|
fi
|
|
if [[ -f "${DORIS_CLANG_HOME}/bin/llvm-symbolizer" ]]; then
|
|
export ASAN_SYMBOLIZER_PATH="${DORIS_CLANG_HOME}/bin/llvm-symbolizer"
|
|
fi
|
|
else
|
|
echo "Error: unknown DORIS_TOOLCHAIN=${DORIS_TOOLCHAIN}, currently only 'gcc' and 'clang' are supported"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "${DORIS_BIN_UTILS}" ]]; then
|
|
export DORIS_BIN_UTILS='/usr/bin/'
|
|
fi
|
|
|
|
# export CLANG COMPATIBLE FLAGS
|
|
CLANG_COMPATIBLE_FLAGS="$(echo | "${DORIS_GCC_HOME:-"$(dirname "$(which gcc)")/.."}/bin/gcc" -Wp,-v -xc++ - -fsyntax-only 2>&1 |
|
|
grep -E '^\s+/' | awk '{print "-I" $1}' | tr '\n' ' ')"
|
|
export CLANG_COMPATIBLE_FLAGS
|
|
|
|
# if is called from build-thirdparty.sh, no need to check these tools
|
|
if test -z "${BUILD_THIRDPARTY_WIP:-}"; then
|
|
# register keyword is forbidden to use in C++17
|
|
# the C++ code generated by flex that remove register keyword after version 2.6.0
|
|
# so we need check flex version here to avoid compilation failed
|
|
flex_ver="$(flex --version | awk '{print $2}')"
|
|
required_ver="2.6.0"
|
|
if [[ ! "$(printf '%s\n' "${required_ver}" "${flex_ver}" | sort -V | head -n1)" = "${required_ver}" ]]; then
|
|
echo "Error: flex version (${flex_ver}) must be greater than or equal to ${required_ver}"
|
|
exit 1
|
|
fi
|
|
|
|
# check java home
|
|
if [[ -z "${JAVA_HOME}" ]]; then
|
|
JAVA="$(which java)"
|
|
JAVAP="$(which javap)"
|
|
else
|
|
JAVA="${JAVA_HOME}/bin/java"
|
|
JAVAP="${JAVA_HOME}/bin/javap"
|
|
fi
|
|
export JAVA
|
|
|
|
if [[ ! -x "${JAVA}" ]]; then
|
|
echo "The JAVA_HOME environment variable is not defined correctly"
|
|
echo "This environment variable is needed to run this program"
|
|
echo "NB: JAVA_HOME should point to a JDK not a JRE"
|
|
exit 1
|
|
fi
|
|
|
|
JAVA_VER="$("${JAVAP}" -verbose java.lang.String | grep "major version" | cut -d " " -f5)"
|
|
if [[ "${JAVA_VER}" -lt 52 ]]; then
|
|
echo "Error: require JAVA with JDK version at least 1.8"
|
|
exit 1
|
|
fi
|
|
|
|
# check maven
|
|
MVN_CMD='mvn'
|
|
if [[ -n "${CUSTOM_MVN}" ]]; then
|
|
MVN_CMD="${CUSTOM_MVN}"
|
|
fi
|
|
if ! "${MVN_CMD}" --version; then
|
|
echo "Error: mvn is not found"
|
|
exit 1
|
|
fi
|
|
export MVN_CMD
|
|
fi
|
|
|
|
if [[ "$(uname -s)" == 'Darwin' ]]; then
|
|
if ! command -v libtoolize &>/dev/null && command -v glibtoolize &>/dev/null; then
|
|
shopt -s expand_aliases
|
|
alias libtoolize='glibtoolize'
|
|
fi
|
|
fi
|
|
|
|
CMAKE_CMD='cmake'
|
|
if [[ -n "${CUSTOM_CMAKE}" ]]; then
|
|
CMAKE_CMD="${CUSTOM_CMAKE}"
|
|
fi
|
|
if ! "${CMAKE_CMD}" --version; then
|
|
echo "Error: cmake is not found"
|
|
exit 1
|
|
fi
|
|
export CMAKE_CMD
|
|
|
|
GENERATOR="Unix Makefiles"
|
|
BUILD_SYSTEM="make"
|
|
if ninja --version 2>/dev/null; then
|
|
GENERATOR="Ninja"
|
|
BUILD_SYSTEM="ninja"
|
|
fi
|
|
|
|
if ccache --version >/dev/null; then
|
|
# shellcheck disable=2034
|
|
CMAKE_USE_CCACHE="-DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
|
|
fi
|
|
|
|
export GENERATOR
|
|
export BUILD_SYSTEM
|
|
|
|
export PKG_CONFIG_PATH="${DORIS_HOME}/thirdparty/installed/lib64/pkgconfig:${PKG_CONFIG_PATH}"
|