#!/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 if [[ "$(uname -s)" == 'Darwin' ]]; then if ! command -v brew &>/dev/null; then echo "Error: Homebrew is missing. Please install it first due to we use Homebrew to manage the tools which are needed to build the project." exit 1 fi cat >"${DORIS_HOME}/custom_env_mac.sh" </dev/null; then echo "${SOURCE_MAC_ENV_CONTENT}" >>"${DORIS_HOME}/custom_env.sh" 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=clang fi fi if [[ "${DORIS_TOOLCHAIN}" == "gcc" ]]; then # set GCC HOME if [[ -z "${DORIS_GCC_HOME}" ]]; then DORIS_GCC_HOME="$(dirname "$(command -v gcc)")"/.. export DORIS_GCC_HOME fi gcc_ver="$("${DORIS_GCC_HOME}/bin/gcc" -dumpfullversion -dumpversion)" required_ver="11.0.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 ENABLE_PCH='OFF' elif [[ "${DORIS_TOOLCHAIN}" == "clang" ]]; then # set CLANG HOME if [[ -z "${DORIS_CLANG_HOME}" ]]; then DORIS_CLANG_HOME="$(dirname "$(command -v clang)")"/.. export DORIS_CLANG_HOME fi clang_ver="$("${DORIS_CLANG_HOME}/bin/clang" -dumpfullversion -dumpversion)" required_ver="16.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 if [[ -z "${ENABLE_PCH}" ]]; then ENABLE_PCH='ON' fi else echo "Error: unknown DORIS_TOOLCHAIN=${DORIS_TOOLCHAIN}, currently only 'gcc' and 'clang' are supported" exit 1 fi if [[ "${ENABLE_PCH}" == "ON" ]]; then export CCACHE_PCH_EXTSUM=true export CCACHE_SLOPPINESS="pch_defines,time_macros" else export CCACHE_NOPCH_EXTSUM=true export CCACHE_SLOPPINESS="default" fi if [[ -z "${DORIS_BIN_UTILS}" ]]; then export DORIS_BIN_UTILS='/usr/bin/' fi if [[ -z "${DORIS_GCC_HOME}" ]]; then DORIS_GCC_HOME="$(dirname "$(command -v gcc)")/.." export DORIS_GCC_HOME fi if [[ ! -f "${DORIS_GCC_HOME}/bin/gcc" ]]; then echo "Error: wrong directory DORIS_GCC_HOME=${DORIS_GCC_HOME}" exit 1 fi # export CLANG COMPATIBLE FLAGS CLANG_COMPATIBLE_FLAGS="$(echo | "${DORIS_GCC_HOME}/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="$(command -v java)" JAVAP="$(command -v 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="$(ninja --version 2>/dev/null)"; then echo "ninja ${NINJA_VERSION}" GENERATOR="Ninja" BUILD_SYSTEM="ninja" fi if CCACHE_VERSION="$(ccache --version 2>/dev/null)"; then echo "${CCACHE_VERSION}" | head -n 1 # 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}"