blob: fcdaf97d526abdf0dc4de8b418ec82c6fe8bfecf [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.
set(GANDIVA_VERSION "${ARROW_VERSION}")
# For "make gandiva" to build everything Gandiva-related
add_custom_target(gandiva-all)
add_custom_target(gandiva)
add_custom_target(gandiva-tests)
add_custom_target(gandiva-benchmarks)
add_dependencies(gandiva-all gandiva gandiva-tests gandiva-benchmarks)
find_package(LLVMAlt REQUIRED)
if(LLVM_VERSION_MAJOR LESS "10")
set(GANDIVA_CXX_STANDARD ${CMAKE_CXX_STANDARD})
else()
# LLVM 10 or later requires C++ 14
if(CMAKE_CXX_STANDARD LESS 14)
set(GANDIVA_CXX_STANDARD 14)
else()
set(GANDIVA_CXX_STANDARD ${CMAKE_CXX_STANDARD})
endif()
endif()
add_definitions(-DGANDIVA_LLVM_VERSION=${LLVM_VERSION_MAJOR})
find_package(OpenSSLAlt REQUIRED)
# Set the path where the bitcode file generated, see precompiled/CMakeLists.txt
set(GANDIVA_PRECOMPILED_BC_PATH "${CMAKE_CURRENT_BINARY_DIR}/irhelpers.bc")
set(GANDIVA_PRECOMPILED_CC_PATH "${CMAKE_CURRENT_BINARY_DIR}/precompiled_bitcode.cc")
set(GANDIVA_PRECOMPILED_CC_IN_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/precompiled_bitcode.cc.in")
# add_arrow_lib will look for this not yet existing file, so flag as generated
set_source_files_properties(${GANDIVA_PRECOMPILED_CC_PATH} PROPERTIES GENERATED TRUE)
set(SRC_FILES
annotator.cc
bitmap_accumulator.cc
cache.cc
cast_time.cc
configuration.cc
context_helper.cc
decimal_ir.cc
decimal_type_util.cc
decimal_xlarge.cc
engine.cc
date_utils.cc
expr_decomposer.cc
expr_validator.cc
expression.cc
expression_registry.cc
exported_funcs_registry.cc
filter.cc
function_ir_builder.cc
function_registry.cc
function_registry_arithmetic.cc
function_registry_datetime.cc
function_registry_hash.cc
function_registry_math_ops.cc
function_registry_string.cc
function_registry_timestamp_arithmetic.cc
function_signature.cc
gdv_function_stubs.cc
hash_utils.cc
llvm_generator.cc
llvm_types.cc
like_holder.cc
literal_holder.cc
projector.cc
regex_util.cc
selection_vector.cc
tree_expr_builder.cc
to_date_holder.cc
random_generator_holder.cc
${GANDIVA_PRECOMPILED_CC_PATH})
set(GANDIVA_SHARED_PRIVATE_LINK_LIBS arrow_shared LLVM::LLVM_INTERFACE
${GANDIVA_OPENSSL_LIBS})
set(GANDIVA_STATIC_LINK_LIBS arrow_static LLVM::LLVM_INTERFACE ${GANDIVA_OPENSSL_LIBS})
if(ARROW_GANDIVA_STATIC_LIBSTDCPP
AND (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX))
set(GANDIVA_STATIC_LINK_LIBS ${GANDIVA_STATIC_LINK_LIBS} -static-libstdc++
-static-libgcc)
endif()
# if (MSVC)
# # Symbols that need to be made public in gandiva.dll for LLVM IR
# # compilation
# set(MSVC_SYMBOL_EXPORTS _Init_thread_header)
# foreach(SYMBOL ${MSVC_SYMBOL_EXPORTS})
# set(GANDIVA_SHARED_LINK_FLAGS "${GANDIVA_SHARED_LINK_FLAGS} /EXPORT:${SYMBOL}")
# endforeach()
# endif()
if(NOT APPLE AND NOT MSVC_TOOLCHAIN)
# Localize thirdparty symbols using a linker version script. This hides them
# from the client application. The OS X linker does not support the
# version-script option.
set(GANDIVA_VERSION_SCRIPT_FLAGS
"-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/symbols.map")
set(GANDIVA_SHARED_LINK_FLAGS
"${GANDIVA_SHARED_LINK_FLAGS} ${GANDIVA_VERSION_SCRIPT_FLAGS}")
endif()
add_arrow_lib(gandiva
CMAKE_PACKAGE_NAME
Gandiva
PKG_CONFIG_NAME
gandiva
SOURCES
${SRC_FILES}
PRECOMPILED_HEADERS
"$<$<COMPILE_LANGUAGE:CXX>:gandiva/pch.h>"
OUTPUTS
GANDIVA_LIBRARIES
DEPENDENCIES
arrow_dependencies
precompiled
EXTRA_INCLUDES
$<TARGET_PROPERTY:LLVM::LLVM_INTERFACE,INTERFACE_INCLUDE_DIRECTORIES>
${GANDIVA_OPENSSL_INCLUDE_DIR}
SHARED_LINK_FLAGS
${GANDIVA_SHARED_LINK_FLAGS}
SHARED_LINK_LIBS
arrow_shared
SHARED_PRIVATE_LINK_LIBS
${GANDIVA_SHARED_PRIVATE_LINK_LIBS}
STATIC_LINK_LIBS
${GANDIVA_STATIC_LINK_LIBS})
foreach(LIB_TARGET ${GANDIVA_LIBRARIES})
target_compile_definitions(${LIB_TARGET} PRIVATE GANDIVA_EXPORTING)
set_target_properties(${LIB_TARGET} PROPERTIES CXX_STANDARD ${GANDIVA_CXX_STANDARD})
endforeach()
if(ARROW_BUILD_STATIC AND WIN32)
target_compile_definitions(gandiva_static PUBLIC GANDIVA_STATIC)
endif()
add_dependencies(gandiva ${GANDIVA_LIBRARIES})
arrow_install_all_headers("gandiva")
set(GANDIVA_STATIC_TEST_LINK_LIBS gandiva_static ${ARROW_TEST_LINK_LIBS})
set(GANDIVA_SHARED_TEST_LINK_LIBS gandiva_shared ${ARROW_TEST_LINK_LIBS})
function(ADD_GANDIVA_TEST REL_TEST_NAME)
set(options USE_STATIC_LINKING)
set(one_value_args)
set(multi_value_args)
cmake_parse_arguments(ARG
"${options}"
"${one_value_args}"
"${multi_value_args}"
${ARGN})
if(NO_TESTS)
return()
endif()
set(TEST_ARGUMENTS
ENABLED
PREFIX
"gandiva"
LABELS
"gandiva-tests"
${ARG_UNPARSED_ARGUMENTS})
# and uses less disk space, but in some cases we need to force static
# linking (see rationale below).
if(ARG_USE_STATIC_LINKING OR ARROW_TEST_LINKAGE STREQUAL "static")
add_test_case(${REL_TEST_NAME}
${TEST_ARGUMENTS}
STATIC_LINK_LIBS
${GANDIVA_STATIC_TEST_LINK_LIBS}
${ARG_UNPARSED_ARGUMENTS})
else()
add_test_case(${REL_TEST_NAME}
${TEST_ARGUMENTS}
STATIC_LINK_LIBS
${GANDIVA_SHARED_TEST_LINK_LIBS}
${ARG_UNPARSED_ARGUMENTS})
endif()
set(TEST_NAME gandiva-${REL_TEST_NAME})
string(REPLACE "_" "-" TEST_NAME ${TEST_NAME})
set_target_properties(${TEST_NAME} PROPERTIES CXX_STANDARD ${GANDIVA_CXX_STANDARD})
endfunction()
set(GANDIVA_INTERNALS_TEST_ARGUMENTS)
if(WIN32)
list(APPEND GANDIVA_INTERNALS_TEST_ARGUMENTS EXTRA_LINK_LIBS LLVM::LLVM_INTERFACE
${GANDIVA_OPENSSL_LIBS})
endif()
add_gandiva_test(internals-test
SOURCES
bitmap_accumulator_test.cc
engine_llvm_test.cc
function_registry_test.cc
function_signature_test.cc
llvm_types_test.cc
llvm_generator_test.cc
annotator_test.cc
tree_expr_test.cc
expr_decomposer_test.cc
expression_registry_test.cc
selection_vector_test.cc
lru_cache_test.cc
to_date_holder_test.cc
simple_arena_test.cc
like_holder_test.cc
decimal_type_util_test.cc
random_generator_holder_test.cc
hash_utils_test.cc
gdv_function_stubs_test.cc
EXTRA_DEPENDENCIES
LLVM::LLVM_INTERFACE
${GANDIVA_OPENSSL_LIBS}
EXTRA_INCLUDES
$<TARGET_PROPERTY:LLVM::LLVM_INTERFACE,INTERFACE_INCLUDE_DIRECTORIES>
${GANDIVA_INTERNALS_TEST_ARGUMENTS}
${GANDIVA_OPENSSL_INCLUDE_DIR})
if(ARROW_GANDIVA_JAVA)
add_subdirectory(jni)
endif()
add_subdirectory(precompiled)
add_subdirectory(tests)