blob: ece514590859e056b41597e3faa0a6df6f935b44 [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.
macro(set_option_category name)
set(ARROW_OPTION_CATEGORY ${name})
list(APPEND "ARROW_OPTION_CATEGORIES" ${name})
endmacro()
macro(define_option name description default)
option(${name} ${description} ${default})
list(APPEND "ARROW_${ARROW_OPTION_CATEGORY}_OPTION_NAMES" ${name})
set("${name}_OPTION_DESCRIPTION" ${description})
set("${name}_OPTION_DEFAULT" ${default})
set("${name}_OPTION_TYPE" "bool")
endmacro()
function(list_join lst glue out)
if("${${lst}}" STREQUAL "")
set(${out} "" PARENT_SCOPE)
return()
endif()
list(GET ${lst} 0 joined)
list(REMOVE_AT ${lst} 0)
foreach(item ${${lst}})
set(joined "${joined}${glue}${item}")
endforeach()
set(${out} ${joined} PARENT_SCOPE)
endfunction()
macro(define_option_string name description default)
set(${name} ${default} CACHE STRING ${description})
list(APPEND "ARROW_${ARROW_OPTION_CATEGORY}_OPTION_NAMES" ${name})
set("${name}_OPTION_DESCRIPTION" ${description})
set("${name}_OPTION_DEFAULT" "\"${default}\"")
set("${name}_OPTION_TYPE" "string")
set("${name}_OPTION_ENUM" ${ARGN})
list_join("${name}_OPTION_ENUM" "|" "${name}_OPTION_ENUM")
if(NOT ("${${name}_OPTION_ENUM}" STREQUAL ""))
set_property(CACHE ${name} PROPERTY STRINGS ${ARGN})
endif()
endmacro()
# Top level cmake dir
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
#----------------------------------------------------------------------
set_option_category("Compile and link")
define_option_string(ARROW_CXXFLAGS "Compiler flags to append when compiling Arrow" "")
define_option(ARROW_BUILD_STATIC "Build static libraries" ON)
define_option(ARROW_BUILD_SHARED "Build shared libraries" ON)
define_option(ARROW_NO_DEPRECATED_API "Exclude deprecated APIs from build" OFF)
define_option(ARROW_USE_CCACHE "Use ccache when compiling (if available)" ON)
define_option(ARROW_USE_LD_GOLD "Use ld.gold for linking on Linux (if available)" OFF)
# Disable this option to exercise non-SIMD fallbacks
define_option(ARROW_USE_SIMD "Build with SIMD optimizations" ON)
define_option(ARROW_ALTIVEC "Build Arrow with Altivec" ON)
define_option(ARROW_RPATH_ORIGIN "Build Arrow libraries with RATH set to \$ORIGIN" OFF)
define_option(ARROW_INSTALL_NAME_RPATH
"Build Arrow libraries with install_name set to @rpath" ON)
define_option(ARROW_GGDB_DEBUG "Pass -ggdb flag to debug builds" ON)
#----------------------------------------------------------------------
set_option_category("Test and benchmark")
define_option(ARROW_BUILD_EXAMPLES "Build the Arrow examples, default OFF" OFF)
define_option(ARROW_BUILD_TESTS "Build the Arrow googletest unit tests, default OFF"
OFF)
define_option(ARROW_BUILD_INTEGRATION
"Build the Arrow integration test executables, default OFF" OFF)
define_option(ARROW_BUILD_BENCHMARKS "Build the Arrow micro benchmarks, default OFF"
OFF)
# Reference benchmarks are used to compare to naive implementation, or
# discover various hardware limits.
define_option(ARROW_BUILD_BENCHMARKS_REFERENCE
"Build the Arrow micro reference benchmarks, default OFF." OFF)
define_option_string(ARROW_TEST_LINKAGE
"Linkage of Arrow libraries with unit tests executables."
"shared"
"shared"
"static")
define_option(ARROW_FUZZING "Build Arrow Fuzzing executables" OFF)
#----------------------------------------------------------------------
set_option_category("Lint")
define_option(ARROW_ONLY_LINT "Only define the lint and check-format targets" OFF)
define_option(ARROW_VERBOSE_LINT "If off, 'quiet' flags will be passed to linting tools"
OFF)
define_option(ARROW_GENERATE_COVERAGE "Build with C++ code coverage enabled" OFF)
#----------------------------------------------------------------------
set_option_category("Checks")
define_option(ARROW_TEST_MEMCHECK "Run the test suite using valgrind --tool=memcheck"
OFF)
define_option(ARROW_USE_ASAN "Enable Address Sanitizer checks" OFF)
define_option(ARROW_USE_TSAN "Enable Thread Sanitizer checks" OFF)
define_option(ARROW_USE_UBSAN "Enable Undefined Behavior sanitizer checks" OFF)
#----------------------------------------------------------------------
set_option_category("Project component")
define_option(ARROW_COMPUTE "Build the Arrow Compute Modules" ON)
define_option(ARROW_DATASET "Build the Arrow Dataset Modules" ON)
define_option(ARROW_FLIGHT
"Build the Arrow Flight RPC System (requires GRPC, Protocol Buffers)" OFF)
define_option(ARROW_GANDIVA "Build the Gandiva libraries" OFF)
define_option(ARROW_PARQUET "Build the Parquet libraries" OFF)
define_option(ARROW_IPC "Build the Arrow IPC extensions" ON)
define_option(ARROW_BUILD_UTILITIES "Build Arrow commandline utilities" ON)
define_option(ARROW_CUDA "Build the Arrow CUDA extensions (requires CUDA toolkit)" OFF)
define_option(ARROW_ORC "Build the Arrow ORC adapter" OFF)
define_option(ARROW_JNI "Build the Arrow JNI lib" OFF)
define_option(ARROW_TENSORFLOW "Build Arrow with TensorFlow support enabled" OFF)
define_option(ARROW_JEMALLOC "Build the Arrow jemalloc-based allocator" ON)
define_option(ARROW_HDFS "Build the Arrow HDFS bridge" ON)
define_option(ARROW_PYTHON "Build the Arrow CPython extensions" OFF)
define_option(ARROW_HIVESERVER2 "Build the HiveServer2 client and Arrow adapter" OFF)
define_option(ARROW_PLASMA "Build the plasma object store along with Arrow" OFF)
define_option(ARROW_PLASMA_JAVA_CLIENT "Build the plasma object store java client" OFF)
#----------------------------------------------------------------------
set_option_category("Thirdparty toolchain")
# Determine how we will look for dependencies
# * AUTO: Guess which packaging systems we're running in and pull the
# dependencies from there. Build any missing ones through the
# ExternalProject setup. This is the default unless the CONDA_PREFIX
# environment variable is set, in which case the CONDA method is used
# * BUNDLED: Build dependencies through CMake's ExternalProject facility. If
# you wish to build individual dependencies from source instead of using
# one of the other methods, pass -D$NAME_SOURCE=BUNDLED
# * SYSTEM: Use CMake's find_package and find_library without any custom
# paths. If individual packages are on non-default locations, you can pass
# $NAME_ROOT arguments to CMake, or set environment variables for the same
# with CMake 3.11 and higher. If your system packages are in a non-default
# location, or if you are using a non-standard toolchain, you can also pass
# ARROW_PACKAGE_PREFIX to set the *_ROOT variables to look in that
# directory
# * CONDA: Same as system but set all *_ROOT variables to
# ENV{CONDA_PREFIX}. If this is run within an active conda environment,
# then ENV{CONDA_PREFIX} will be used for dependencies unless
# ARROW_DEPENDENCY_SOURCE is set explicitly to one of the other options
# * BREW: Use SYSTEM but search for select packages with brew.
if(NOT "$ENV{CONDA_PREFIX}" STREQUAL "")
set(ARROW_DEPENDENCY_SOURCE_DEFAULT "CONDA")
else()
set(ARROW_DEPENDENCY_SOURCE_DEFAULT "AUTO")
endif()
define_option_string(ARROW_DEPENDENCY_SOURCE
"Method to use for acquiring arrow's build dependencies"
"${ARROW_DEPENDENCY_SOURCE_DEFAULT}"
"AUTO"
"BUNDLED"
"SYSTEM"
"CONDA"
"BREW")
define_option(ARROW_VERBOSE_THIRDPARTY_BUILD
"Show output from ExternalProjects rather than just logging to files" OFF)
define_option(ARROW_BOOST_USE_SHARED "Rely on boost shared libraries where relevant" ON)
define_option(ARROW_BOOST_VENDORED "Use vendored Boost instead of existing Boost. \
Note that this requires linking Boost statically. \
Deprecated. Use BOOST_SOURCE=BUNDLED instead." OFF)
define_option(ARROW_PROTOBUF_USE_SHARED
"Rely on Protocol Buffers shared libraries where relevant" ON)
define_option(ARROW_GFLAGS_USE_SHARED "Rely on GFlags shared libraries where relevant"
ON)
define_option(ARROW_WITH_BACKTRACE "Build with backtrace support" ON)
define_option(ARROW_USE_GLOG "Build libraries with glog support for pluggable logging"
ON)
define_option(ARROW_WITH_BROTLI "Build with Brotli compression" ON)
define_option(ARROW_WITH_BZ2 "Build with BZ2 compression" OFF)
define_option(ARROW_WITH_LZ4 "Build with lz4 compression" ON)
define_option(ARROW_WITH_SNAPPY "Build with Snappy compression" ON)
define_option(ARROW_WITH_ZLIB "Build with zlib compression" ON)
if(CMAKE_VERSION VERSION_LESS 3.7)
set(ARROW_WITH_ZSTD_DEFAULT OFF)
else()
# ExternalProject_Add(SOURCE_SUBDIR) is available since CMake 3.7.
set(ARROW_WITH_ZSTD_DEFAULT ON)
endif()
define_option(ARROW_WITH_ZSTD "Build with zstd compression" ${ARROW_WITH_ZSTD_DEFAULT})
#----------------------------------------------------------------------
if(MSVC)
set_option_category("MSVC")
define_option(MSVC_LINK_VERBOSE
"Pass verbose linking options when linking libraries and executables"
OFF)
define_option(ARROW_USE_CLCACHE "Use clcache if available" ON)
define_option_string(BROTLI_MSVC_STATIC_LIB_SUFFIX
"Brotli static lib suffix used on Windows with MSVC" "-static")
define_option_string(PROTOBUF_MSVC_STATIC_LIB_SUFFIX
"Protobuf static lib suffix used on Windows with MSVC" "")
define_option_string(RE2_MSVC_STATIC_LIB_SUFFIX
"re2 static lib suffix used on Windows with MSVC" "_static")
define_option_string(SNAPPY_MSVC_STATIC_LIB_SUFFIX
"Snappy static lib suffix used on Windows with MSVC" "_static")
define_option_string(LZ4_MSVC_STATIC_LIB_SUFFIX
"Lz4 static lib suffix used on Windows with MSVC" "_static")
define_option_string(ZSTD_MSVC_STATIC_LIB_SUFFIX
"ZStd static lib suffix used on Windows with MSVC" "_static")
define_option(ARROW_USE_STATIC_CRT "Build Arrow with statically linked CRT" OFF)
endif()
#----------------------------------------------------------------------
set_option_category("Parquet")
define_option(PARQUET_MINIMAL_DEPENDENCY
"Depend only on Thirdparty headers to build libparquet. \
Always OFF if building binaries" OFF)
define_option(
PARQUET_BUILD_EXECUTABLES
"Build the Parquet executable CLI tools. Requires static libraries to be built." OFF)
define_option(PARQUET_BUILD_EXAMPLES
"Build the Parquet examples. Requires static libraries to be built." OFF)
define_option(PARQUET_REQUIRE_ENCRYPTION
"Build support for encryption. Fail if OpenSSL is not found" OFF)
#----------------------------------------------------------------------
set_option_category("Gandiva")
define_option(ARROW_GANDIVA_JAVA "Build the Gandiva JNI wrappers" OFF)
# ARROW-3860: Temporary workaround
define_option(
ARROW_GANDIVA_STATIC_LIBSTDCPP
"Include -static-libstdc++ -static-libgcc when linking with Gandiva static libraries"
OFF)
define_option_string(ARROW_GANDIVA_PC_CXX_FLAGS
"Compiler flags to append when pre-compiling Gandiva operations"
"")
#----------------------------------------------------------------------
set_option_category("Advanced developer")
define_option(ARROW_EXTRA_ERROR_CONTEXT
"Compile with extra error context (line numbers, code)" OFF)
define_option(ARROW_OPTIONAL_INSTALL
"If enabled install ONLY targets that have already been built. Please be \
advised that if this is enabled 'install' will fail silently on components \
that have not been built" OFF)
option(ARROW_BUILD_CONFIG_SUMMARY_JSON "Summarize build configuration in a JSON file"
ON)
endif()
macro(config_summary)
message(STATUS "---------------------------------------------------------------------")
message(STATUS "Arrow version: ${ARROW_VERSION}")
message(STATUS)
message(STATUS "Build configuration summary:")
message(STATUS " Generator: ${CMAKE_GENERATOR}")
message(STATUS " Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS " Source directory: ${CMAKE_CURRENT_SOURCE_DIR}")
if(${CMAKE_EXPORT_COMPILE_COMMANDS})
message(
STATUS " Compile commands: ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json")
endif()
if(${ARROW_BUILD_CONFIG_SUMMARY_JSON})
set(summary "${CMAKE_CURRENT_BINARY_DIR}/cmake_summary.json")
message(STATUS " Outputting build configuration summary to ${summary}")
file(WRITE ${summary} "{\n")
endif()
foreach(category ${ARROW_OPTION_CATEGORIES})
message(STATUS)
message(STATUS "${category} options:")
set(option_names ${ARROW_${category}_OPTION_NAMES})
set(max_value_length 0)
foreach(name ${option_names})
string(LENGTH "\"${${name}}\"" value_length)
if(${max_value_length} LESS ${value_length})
set(max_value_length ${value_length})
endif()
endforeach()
foreach(name ${option_names})
if("${${name}_OPTION_TYPE}" STREQUAL "string")
set(value "\"${${name}}\"")
else()
set(value "${${name}}")
endif()
set(default ${${name}_OPTION_DEFAULT})
set(description ${${name}_OPTION_DESCRIPTION})
string(LENGTH ${description} description_length)
if(${description_length} LESS 70)
string(
SUBSTRING
" "
${description_length} -1 description_padding)
else()
set(description_padding "
")
endif()
set(comment "[${name}]")
if("${value}" STREQUAL "${default}")
set(comment "[default] ${comment}")
endif()
if(NOT ("${${name}_OPTION_ENUM}" STREQUAL ""))
set(comment "${comment} [${${name}_OPTION_ENUM}]")
endif()
string(
SUBSTRING "${value} "
0 ${max_value_length} value)
message(STATUS " ${description} ${description_padding} ${value} ${comment}")
endforeach()
if(${ARROW_BUILD_CONFIG_SUMMARY_JSON})
foreach(name ${option_names})
file(APPEND ${summary} "\"${name}\": \"${${name}}\",\n")
endforeach()
endif()
endforeach()
if(${ARROW_BUILD_CONFIG_SUMMARY_JSON})
file(APPEND ${summary} "\"generator\": \"${CMAKE_GENERATOR}\",\n")
file(APPEND ${summary} "\"build_type\": \"${CMAKE_BUILD_TYPE}\",\n")
file(APPEND ${summary} "\"source_dir\": \"${CMAKE_CURRENT_SOURCE_DIR}\",\n")
if(${CMAKE_EXPORT_COMPILE_COMMANDS})
file(APPEND ${summary} "\"compile_commands\": "
"\"${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json\",\n")
endif()
file(APPEND ${summary} "\"arrow_version\": \"${ARROW_VERSION}\"\n")
file(APPEND ${summary} "}\n")
endif()
endmacro()