blob: f1bf796160b0540ef7266ae058078ff06ce52633 [file] [log] [blame]
# 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.
# where to put generated libraries
set(LIBRARY_OUTPUT_PATH "${BUILD_OUTPUT_ROOT_DIRECTORY}/exec/paimon")
# where to put generated binaries
set(EXECUTABLE_OUTPUT_PATH "${BUILD_OUTPUT_ROOT_DIRECTORY}/exec/paimon")
add_library(ExecPaimon
paimon-jni-row-reader.cc
paimon-jni-scan-node.cc
paimon-jni-scanner.cc
paimon-scan-plan-node.cc
)
# Below is a work-around to fix clang compile issue. For the normal build option,
# the compile will be successful. The issue will occur if CMAKE_BUILD_TYPE has
# following types: ADDRESS_SANITIZER, TIDY, UBSAN,UBSAN_FULL, TSAN, TSAN_FULL.
# For the normal build option, will invoke g++, however for the above build type,
# build script will use clang++ instead of g++ to compile, in this case, following
# error will occur:
# The detailed errors are:
# error: cannot cast private base class 'std::__detail::__variant::_Variant_storage
# <false, arrow::FieldPath, std::__cxx11::basic_string<char>,
# std::vector<arrow::FieldRef, std::allocator<arrow::FieldRef> > >' to
# 'std::variant<arrow::FieldPath, std::__cxx11::basic_string<char>,
# std::vector<arrow::FieldRef, std::allocator<arrow::FieldRef> > >'
# return static_cast<variant<_Types...>&>(__rhs);
#
#
# looks like it hit bug: https://bugs.llvm.org/show_bug.cgi?id=31852
# and the following patch is already applied:
# https://gcc.gnu.org/cgit/gcc/commit/?id=aafaa3254ec6fc3d5e3a15a40185950d3af04432
# in the libc++ header of our toolchain.
# but looks like the patch above is only fixes the method get
# it doesn't fix the method static_cast.
# here we use the same work-ground for method static_cast.
# NOTE: the fix below only applies to current version of toolchain.
# need to adapt if toolchain is upgraded.
set(PAIMON_PATCH_GCC_HEADER_DIR
gcc-$ENV{IMPALA_GCC_VERSION}/include/c++/$ENV{IMPALA_GCC_VERSION})
set(PAIMON_PATCH_WORK_DIR
$ENV{IMPALA_TOOLCHAIN_PACKAGES_HOME}/${PAIMON_PATCH_GCC_HEADER_DIR})
set(PAIMON_PATCH_TARGET_FILE
${PAIMON_PATCH_WORK_DIR}/variant)
# change this if upgraded toolchain still haven't fix the issue.
set(PAIMON_PATCH_TARGET_FILE_CHECKSUM_ORIG
4daf8153a09ee07bab2ac339e21b9725e17a40854a42284c85b3d2ba3c0862e3)
set(PAIMON_PATCH_SENTINEL_FILE
${PAIMON_PATCH_WORK_DIR}/variant_patched)
file(SHA256 ${PAIMON_PATCH_TARGET_FILE}
PAIMON_PATCH_TARGET_FILE_CHECKSUM_CURR)
message("Current Hash Is: "
${PAIMON_PATCH_TARGET_FILE_CHECKSUM_CURR})
message("Original Hash Is: "
${PAIMON_PATCH_TARGET_FILE_CHECKSUM_ORIG})
if(PAIMON_PATCH_TARGET_FILE_CHECKSUM_ORIG STREQUAL PAIMON_PATCH_TARGET_FILE_CHECKSUM_CURR
)
message(STATUS "apply variant patch to fix clang++ static_cast issue.")
# To fix the compile error, the following tiny patch should be applied to
# toolchain-packages-gcc10.4.0/gcc-10.4.0/include/c++/10.4.0/variant
file(WRITE /tmp/variant.patch
"1296a1297,1299
> #if defined(__clang__) && __clang_major__ <= 7
> : public __detail::__variant::_Variant_base<_Types...>,
> #else
1297a1301
> #endif
")
add_custom_command(
OUTPUT ${PAIMON_PATCH_SENTINEL_FILE}
COMMAND cd ${PAIMON_PATCH_WORK_DIR} &&
patch -b -i /tmp/variant.patch ${PAIMON_PATCH_TARGET_FILE} &&
touch ${PAIMON_PATCH_SENTINEL_FILE}
DEPENDS ${PAIMON_PATCH_TARGET_FILE}
COMMENT "Patching variant file in GCC include directory to fix static_cast issue."
VERBATIM
)
add_custom_target(patch_variant
DEPENDS ${PAIMON_PATCH_SENTINEL_FILE}
COMMENT "Variant patch applied."
)
add_dependencies(ExecPaimon patch_variant gen-deps)
else()
message(STATUS "skip apply patch since hash is changed.")
add_dependencies(ExecPaimon gen-deps)
endif()