|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
include(CheckCXXCompilerFlag) |
|
include(CheckCXXSourceCompiles) |
|
|
|
|
|
message(STATUS "System processor: ${CMAKE_SYSTEM_PROCESSOR}") |
|
|
|
if(NOT DEFINED ARROW_CPU_FLAG) |
|
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") |
|
set(ARROW_CPU_FLAG "emscripten") |
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64|amd64|X86|x86|i[3456]86|x64") |
|
set(ARROW_CPU_FLAG "x86") |
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|ARM64|arm64") |
|
set(ARROW_CPU_FLAG "aarch64") |
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm$|armv[4-7]") |
|
set(ARROW_CPU_FLAG "aarch32") |
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "powerpc|ppc") |
|
set(ARROW_CPU_FLAG "ppc") |
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "s390x") |
|
set(ARROW_CPU_FLAG "s390x") |
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64") |
|
set(ARROW_CPU_FLAG "riscv64") |
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "loongarch64") |
|
set(ARROW_CPU_FLAG "loongarch64") |
|
else() |
|
message(FATAL_ERROR "Unknown system processor") |
|
endif() |
|
endif() |
|
|
|
|
|
if(ARROW_CPU_FLAG STREQUAL "x86") |
|
|
|
if(MSVC) |
|
set(ARROW_SSE4_2_FLAG "") |
|
set(ARROW_AVX2_FLAG "/arch:AVX2") |
|
|
|
set(ARROW_BMI2_FLAG "/arch:AVX2") |
|
set(ARROW_AVX512_FLAG "/arch:AVX512") |
|
set(CXX_SUPPORTS_SSE4_2 TRUE) |
|
else() |
|
set(ARROW_SSE4_2_FLAG "-msse4.2") |
|
set(ARROW_AVX2_FLAG "-march=haswell") |
|
set(ARROW_BMI2_FLAG "-mbmi2") |
|
|
|
set(ARROW_AVX512_FLAG "-march=skylake-avx512") |
|
|
|
set(ARROW_AVX2_FLAG "${ARROW_AVX2_FLAG} -mavx2") |
|
set(ARROW_AVX512_FLAG |
|
"${ARROW_AVX512_FLAG} -mavx512f -mavx512cd -mavx512vl -mavx512dq -mavx512bw") |
|
check_cxx_compiler_flag(${ARROW_SSE4_2_FLAG} CXX_SUPPORTS_SSE4_2) |
|
endif() |
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8) |
|
|
|
check_cxx_compiler_flag(${ARROW_AVX2_FLAG} CXX_SUPPORTS_AVX2) |
|
if(MINGW) |
|
|
|
message(STATUS "Disable AVX512 support on MINGW for now") |
|
else() |
|
|
|
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) |
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${ARROW_AVX512_FLAG}") |
|
check_cxx_source_compiles(" |
|
#ifdef _MSC_VER |
|
#include <intrin.h> |
|
#else |
|
#include <immintrin.h> |
|
#endif |
|
|
|
int main() { |
|
__m512i mask = _mm512_set1_epi32(0x1); |
|
char out[32]; |
|
_mm512_storeu_si512(out, mask); |
|
return 0; |
|
}" |
|
CXX_SUPPORTS_AVX512) |
|
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) |
|
endif() |
|
endif() |
|
|
|
if(CXX_SUPPORTS_SSE4_2 AND ARROW_RUNTIME_SIMD_LEVEL MATCHES |
|
"^(SSE4_2|AVX2|AVX512|MAX)$") |
|
set(ARROW_HAVE_RUNTIME_SSE4_2 ON) |
|
add_definitions(-DARROW_HAVE_RUNTIME_SSE4_2) |
|
endif() |
|
|
|
|
|
if(CXX_SUPPORTS_AVX2 AND ARROW_RUNTIME_SIMD_LEVEL MATCHES "^(AVX2|AVX512|MAX)$") |
|
set(ARROW_HAVE_RUNTIME_AVX2 ON) |
|
set(ARROW_HAVE_RUNTIME_BMI2 ON) |
|
add_definitions(-DARROW_HAVE_RUNTIME_AVX2 -DARROW_HAVE_RUNTIME_BMI2) |
|
endif() |
|
if(CXX_SUPPORTS_AVX512 AND ARROW_RUNTIME_SIMD_LEVEL MATCHES "^(AVX512|MAX)$") |
|
set(ARROW_HAVE_RUNTIME_AVX512 ON) |
|
add_definitions(-DARROW_HAVE_RUNTIME_AVX512) |
|
endif() |
|
if(ARROW_SIMD_LEVEL STREQUAL "DEFAULT") |
|
set(ARROW_SIMD_LEVEL "SSE4_2") |
|
endif() |
|
elseif(ARROW_CPU_FLAG STREQUAL "ppc") |
|
|
|
set(ARROW_ALTIVEC_FLAG "-maltivec") |
|
check_cxx_compiler_flag(${ARROW_ALTIVEC_FLAG} CXX_SUPPORTS_ALTIVEC) |
|
if(ARROW_SIMD_LEVEL STREQUAL "DEFAULT") |
|
set(ARROW_SIMD_LEVEL "NONE") |
|
endif() |
|
elseif(ARROW_CPU_FLAG STREQUAL "aarch64") |
|
|
|
set(ARROW_ARMV8_MARCH "armv8-a") |
|
check_cxx_compiler_flag("-march=${ARROW_ARMV8_MARCH}+sve" CXX_SUPPORTS_SVE) |
|
if(ARROW_SIMD_LEVEL STREQUAL "DEFAULT") |
|
set(ARROW_SIMD_LEVEL "NEON") |
|
endif() |
|
endif() |
|
|
|
|
|
if(NOT DEFINED CMAKE_C_STANDARD) |
|
set(CMAKE_C_STANDARD 11) |
|
endif() |
|
|
|
|
|
if(NOT DEFINED CMAKE_CXX_STANDARD) |
|
set(CMAKE_CXX_STANDARD 17) |
|
elseif(${CMAKE_CXX_STANDARD} VERSION_LESS 17) |
|
message(FATAL_ERROR "Cannot set a CMAKE_CXX_STANDARD smaller than 17") |
|
endif() |
|
|
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON) |
|
|
|
|
|
set(CMAKE_CXX_EXTENSIONS OFF) |
|
|
|
|
|
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ${ARROW_POSITION_INDEPENDENT_CODE}) |
|
|
|
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) |
|
|
|
set(UNKNOWN_COMPILER_MESSAGE |
|
"Unknown compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}") |
|
|
|
|
|
if(WIN32) |
|
|
|
|
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE) |
|
|
|
if(MSVC) |
|
|
|
|
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING") |
|
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") |
|
|
|
set(CXX_COMMON_FLAGS "-EHsc") |
|
else() |
|
|
|
string(REPLACE "/W3" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") |
|
|
|
|
|
|
|
|
|
set(CXX_COMMON_FLAGS "/W3 /EHsc") |
|
endif() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd5105") |
|
|
|
if(ARROW_USE_CCACHE) |
|
foreach(c_flag |
|
CMAKE_CXX_FLAGS |
|
CMAKE_CXX_FLAGS_RELEASE |
|
CMAKE_CXX_FLAGS_DEBUG |
|
CMAKE_CXX_FLAGS_MINSIZEREL |
|
CMAKE_CXX_FLAGS_RELWITHDEBINFO |
|
CMAKE_C_FLAGS |
|
CMAKE_C_FLAGS_RELEASE |
|
CMAKE_C_FLAGS_DEBUG |
|
CMAKE_C_FLAGS_MINSIZEREL |
|
CMAKE_C_FLAGS_RELWITHDEBINFO) |
|
|
|
|
|
string(REPLACE "/Zi" "/Z7" ${c_flag} "${${c_flag}}") |
|
endforeach() |
|
endif() |
|
|
|
if(ARROW_USE_STATIC_CRT) |
|
foreach(c_flag |
|
CMAKE_CXX_FLAGS |
|
CMAKE_CXX_FLAGS_RELEASE |
|
CMAKE_CXX_FLAGS_DEBUG |
|
CMAKE_CXX_FLAGS_MINSIZEREL |
|
CMAKE_CXX_FLAGS_RELWITHDEBINFO |
|
CMAKE_C_FLAGS |
|
CMAKE_C_FLAGS_RELEASE |
|
CMAKE_C_FLAGS_DEBUG |
|
CMAKE_C_FLAGS_MINSIZEREL |
|
CMAKE_C_FLAGS_RELWITHDEBINFO) |
|
string(REPLACE "/MD" "/MT" ${c_flag} "${${c_flag}}") |
|
endforeach() |
|
endif() |
|
|
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /bigobj") |
|
|
|
|
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /utf-8") |
|
else() |
|
|
|
check_cxx_compiler_flag(-Wa,-mbig-obj CXX_SUPPORTS_BIG_OBJ) |
|
if(CXX_SUPPORTS_BIG_OBJ) |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wa,-mbig-obj") |
|
endif() |
|
endif(MSVC) |
|
else() |
|
|
|
set(CXX_COMMON_FLAGS "") |
|
endif() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(NOT BUILD_WARNING_LEVEL) |
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE") |
|
set(BUILD_WARNING_LEVEL PRODUCTION) |
|
else() |
|
set(BUILD_WARNING_LEVEL CHECKIN) |
|
endif() |
|
endif(NOT BUILD_WARNING_LEVEL) |
|
string(TOUPPER ${BUILD_WARNING_LEVEL} BUILD_WARNING_LEVEL) |
|
|
|
message(STATUS "Arrow build warning level: ${BUILD_WARNING_LEVEL}") |
|
|
|
macro(arrow_add_werror_if_debug) |
|
|
|
if(MSVC) |
|
string(APPEND CMAKE_C_FLAGS_DEBUG " /WX") |
|
string(APPEND CMAKE_CXX_FLAGS_DEBUG " /WX") |
|
else() |
|
string(APPEND CMAKE_C_FLAGS_DEBUG " -Werror") |
|
string(APPEND CMAKE_CXX_FLAGS_DEBUG " -Werror") |
|
endif() |
|
endmacro() |
|
|
|
if("${BUILD_WARNING_LEVEL}" STREQUAL "CHECKIN") |
|
|
|
if(MSVC) |
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /W3") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4365") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4267") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4838") |
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL |
|
"Clang") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wextra") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wdocumentation") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -DARROW_WARN_DOCUMENTATION") |
|
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") |
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-shorten-64-to-32") |
|
else() |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wshorten-64-to-32") |
|
endif() |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-missing-braces") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-unused-parameter") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-constant-logical-operand") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-return-stack-address") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wdate-time") |
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-conversion") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-sign-conversion") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wdate-time") |
|
string(APPEND CXX_ONLY_FLAGS " -Wredundant-move") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wunused-result") |
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel" OR CMAKE_CXX_COMPILER_ID STREQUAL |
|
"IntelLLVM") |
|
if(WIN32) |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /Wall") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /Wno-deprecated") |
|
else() |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-deprecated") |
|
endif() |
|
else() |
|
message(FATAL_ERROR "${UNKNOWN_COMPILER_MESSAGE}") |
|
endif() |
|
arrow_add_werror_if_debug() |
|
|
|
elseif("${BUILD_WARNING_LEVEL}" STREQUAL "EVERYTHING") |
|
|
|
if(MSVC) |
|
string(REPLACE "/W3" "" CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS}") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /Wall") |
|
|
|
|
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL |
|
"Clang") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Weverything") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-c++98-compat") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-c++98-compat-pedantic") |
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wpedantic") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wextra") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-unused-parameter") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wunused-result") |
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel" OR CMAKE_CXX_COMPILER_ID STREQUAL |
|
"IntelLLVM") |
|
if(WIN32) |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /Wall") |
|
else() |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall") |
|
endif() |
|
else() |
|
message(FATAL_ERROR "${UNKNOWN_COMPILER_MESSAGE}") |
|
endif() |
|
arrow_add_werror_if_debug() |
|
|
|
else() |
|
|
|
if(MSVC) |
|
|
|
|
|
|
|
string(REPLACE "/W3" "" CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS}") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /W3") |
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" |
|
OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" |
|
OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall") |
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel" OR CMAKE_CXX_COMPILER_ID STREQUAL |
|
"IntelLLVM") |
|
if(WIN32) |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /Wall") |
|
else() |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wall") |
|
endif() |
|
else() |
|
message(FATAL_ERROR "${UNKNOWN_COMPILER_MESSAGE}") |
|
endif() |
|
|
|
endif() |
|
|
|
if(MSVC) |
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4800") |
|
|
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4996") |
|
|
|
|
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} /wd4065") |
|
|
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "7.0" OR CMAKE_CXX_COMPILER_VERSION |
|
VERSION_GREATER "7.0") |
|
|
|
set(CXX_ONLY_FLAGS "${CXX_ONLY_FLAGS} -Wno-noexcept-type") |
|
endif() |
|
|
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "13.0" OR CMAKE_CXX_COMPILER_VERSION |
|
VERSION_GREATER "13.0") |
|
|
|
|
|
set(CXX_ONLY_FLAGS "${CXX_ONLY_FLAGS} -Wno-self-move") |
|
endif() |
|
|
|
|
|
|
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -fno-semantic-interposition") |
|
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always") |
|
|
|
if(CMAKE_UNITY_BUILD) |
|
|
|
set(CXX_ONLY_FLAGS "${CXX_ONLY_FLAGS} -Wno-subobject-linkage") |
|
endif() |
|
|
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL |
|
"Clang") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Qunused-arguments") |
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments") |
|
|
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-unknown-warning-option") |
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcolor-diagnostics") |
|
|
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-pass-failed") |
|
|
|
if(APPLE) |
|
|
|
|
|
|
|
string(APPEND CXX_ONLY_FLAGS " -fno-aligned-new") |
|
|
|
if(CMAKE_HOST_SYSTEM_VERSION VERSION_LESS 20) |
|
|
|
|
|
|
|
string(APPEND CXX_ONLY_FLAGS " -D_LIBCPP_DISABLE_AVAILABILITY") |
|
endif() |
|
endif() |
|
endif() |
|
|
|
|
|
if(BUILD_WARNING_FLAGS) |
|
|
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} ${BUILD_WARNING_FLAGS}") |
|
endif(BUILD_WARNING_FLAGS) |
|
|
|
|
|
if(ARROW_CPU_FLAG STREQUAL "x86") |
|
if(MINGW) |
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -mxsave") |
|
endif() |
|
if(ARROW_SIMD_LEVEL STREQUAL "AVX512") |
|
if(NOT CXX_SUPPORTS_AVX512) |
|
message(FATAL_ERROR "AVX512 required but compiler doesn't support it.") |
|
endif() |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} ${ARROW_AVX512_FLAG}") |
|
add_definitions(-DARROW_HAVE_AVX512 -DARROW_HAVE_AVX2 -DARROW_HAVE_BMI2 |
|
-DARROW_HAVE_SSE4_2) |
|
elseif(ARROW_SIMD_LEVEL STREQUAL "AVX2") |
|
if(NOT CXX_SUPPORTS_AVX2) |
|
message(FATAL_ERROR "AVX2 required but compiler doesn't support it.") |
|
endif() |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} ${ARROW_AVX2_FLAG}") |
|
add_definitions(-DARROW_HAVE_AVX2 -DARROW_HAVE_BMI2 -DARROW_HAVE_SSE4_2) |
|
elseif(ARROW_SIMD_LEVEL STREQUAL "SSE4_2") |
|
if(NOT CXX_SUPPORTS_SSE4_2) |
|
message(FATAL_ERROR "SSE4.2 required but compiler doesn't support it.") |
|
endif() |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} ${ARROW_SSE4_2_FLAG}") |
|
add_definitions(-DARROW_HAVE_SSE4_2) |
|
elseif(NOT ARROW_SIMD_LEVEL STREQUAL "NONE") |
|
message(WARNING "ARROW_SIMD_LEVEL=${ARROW_SIMD_LEVEL} not supported by x86.") |
|
endif() |
|
endif() |
|
|
|
if(ARROW_CPU_FLAG STREQUAL "ppc") |
|
if(CXX_SUPPORTS_ALTIVEC AND ARROW_ALTIVEC) |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} ${ARROW_ALTIVEC_FLAG}") |
|
endif() |
|
endif() |
|
|
|
if(ARROW_CPU_FLAG STREQUAL "aarch64") |
|
if(ARROW_SIMD_LEVEL MATCHES "NEON|SVE[0-9]*") |
|
set(ARROW_HAVE_NEON ON) |
|
add_definitions(-DARROW_HAVE_NEON) |
|
if(ARROW_SIMD_LEVEL MATCHES "SVE[0-9]*") |
|
if(NOT CXX_SUPPORTS_SVE) |
|
message(FATAL_ERROR "SVE required but compiler doesn't support it.") |
|
endif() |
|
|
|
set(ARROW_ARMV8_MARCH "${ARROW_ARMV8_MARCH}+sve") |
|
string(REGEX MATCH "[0-9]+" SVE_VECTOR_BITS ${ARROW_SIMD_LEVEL}) |
|
if(SVE_VECTOR_BITS) |
|
set(ARROW_HAVE_SVE${SVE_VECTOR_BITS} ON) |
|
add_definitions(-DARROW_HAVE_SVE${SVE_VECTOR_BITS}) |
|
|
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -msve-vector-bits=${SVE_VECTOR_BITS}") |
|
else() |
|
set(ARROW_HAVE_SVE_SIZELESS ON) |
|
add_definitions(-DARROW_HAVE_SVE_SIZELESS) |
|
endif() |
|
endif() |
|
set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -march=${ARROW_ARMV8_MARCH}") |
|
elseif(NOT ARROW_SIMD_LEVEL STREQUAL "NONE") |
|
message(WARNING "ARROW_SIMD_LEVEL=${ARROW_SIMD_LEVEL} not supported by Arm.") |
|
endif() |
|
endif() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function(GET_GOLD_VERSION) |
|
|
|
execute_process(COMMAND ${CMAKE_CXX_COMPILER} "-Wl,--version" ${ARGN} |
|
ERROR_QUIET |
|
OUTPUT_VARIABLE LINKER_OUTPUT) |
|
|
|
|
|
|
|
if(LINKER_OUTPUT MATCHES "GNU gold") |
|
string(REGEX MATCH "GNU gold \\([^\\)]*\\) (([0-9]+\\.?)+)" _ "${LINKER_OUTPUT}") |
|
if(NOT CMAKE_MATCH_1) |
|
message(SEND_ERROR "Could not extract GNU gold version. " |
|
"Linker version output: ${LINKER_OUTPUT}") |
|
endif() |
|
set(GOLD_VERSION |
|
"${CMAKE_MATCH_1}" |
|
PARENT_SCOPE) |
|
endif() |
|
endfunction() |
|
|
|
|
|
if(NOT WIN32 AND NOT APPLE) |
|
get_gold_version() |
|
if(GOLD_VERSION) |
|
set(MUST_USE_GOLD 1) |
|
elseif(ARROW_USE_LD_GOLD) |
|
|
|
get_gold_version("-fuse-ld=gold") |
|
|
|
|
|
|
|
|
|
execute_process(COMMAND which ld.gold |
|
OUTPUT_VARIABLE GOLD_LOCATION |
|
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) |
|
if("${GOLD_LOCATION}" MATCHES "^/opt/rh/devtoolset") |
|
message(STATUS "Skipping optional gold linker (version ${GOLD_VERSION}) because " |
|
"it's in devtoolset") |
|
set(GOLD_VERSION) |
|
endif() |
|
endif() |
|
|
|
if(GOLD_VERSION) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if("${GOLD_VERSION}" VERSION_LESS "1.12") |
|
set(ARROW_BUGGY_GOLD 1) |
|
endif() |
|
if(MUST_USE_GOLD) |
|
message(STATUS "Using hard-wired gold linker (version ${GOLD_VERSION})") |
|
if(ARROW_BUGGY_GOLD) |
|
if("${ARROW_LINK}" STREQUAL "d" AND "${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE") |
|
message(SEND_ERROR "Configured to use buggy gold with dynamic linking " |
|
"in a RELEASE build") |
|
endif() |
|
endif() |
|
elseif(NOT ARROW_BUGGY_GOLD) |
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=gold") |
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=gold") |
|
message(STATUS "Using optional gold linker (version ${GOLD_VERSION})") |
|
else() |
|
message(STATUS "Optional gold linker is buggy, using ld linker instead") |
|
endif() |
|
else() |
|
message(STATUS "Using ld linker") |
|
endif() |
|
endif() |
|
|
|
if(NOT WIN32 AND NOT APPLE) |
|
if(ARROW_USE_MOLD) |
|
find_program(LD_MOLD ld.mold) |
|
if(LD_MOLD) |
|
unset(MOLD_LINKER_FLAGS) |
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1.0") |
|
set(MOLD_LINKER_FLAGS "-fuse-ld=mold") |
|
else() |
|
message(STATUS "Need GCC 12.1.0 or later to use mold linker: ${CMAKE_CXX_COMPILER_VERSION}" |
|
) |
|
endif() |
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") |
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.0.0") |
|
set(MOLD_LINKER_FLAGS "--ld-path=${LD_MOLD}") |
|
else() |
|
message(STATUS "Need clang 12.0.0 or later to use mold linker: ${CMAKE_CXX_COMPILER_VERSION}" |
|
) |
|
endif() |
|
else() |
|
message(STATUS "Using the default linker because compiler doesn't support mold: ${CMAKE_CXX_COMPILER_ID}" |
|
) |
|
endif() |
|
if(MOLD_LINKER_FLAGS) |
|
message(STATUS "Using optional mold linker") |
|
string(APPEND CMAKE_EXE_LINKER_FLAGS " ${MOLD_LINKER_FLAGS}") |
|
string(APPEND CMAKE_MODULE_LINKER_FLAGS " ${MOLD_LINKER_FLAGS}") |
|
string(APPEND CMAKE_SHARED_LINKER_FLAGS " ${MOLD_LINKER_FLAGS}") |
|
endif() |
|
else() |
|
message(STATUS "Using the default linker because mold isn't found") |
|
endif() |
|
endif() |
|
endif() |
|
|
|
if(ARROW_USE_LLD) |
|
find_program(LD_LLD ld.lld) |
|
if(LD_LLD) |
|
unset(LLD_LINKER_FLAGS) |
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "9.1.0") |
|
set(LLD_LINKER_FLAGS "-fuse-ld=lld") |
|
else() |
|
message(STATUS "Need GCC 9.1.0 or later to use LLD linker: ${CMAKE_CXX_COMPILER_VERSION}" |
|
) |
|
endif() |
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") |
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.0.0") |
|
set(LLD_LINKER_FLAGS "--ld-path=${LD_LLD}") |
|
else() |
|
message(STATUS "Need clang 12.0.0 or later to use LLD linker: ${CMAKE_CXX_COMPILER_VERSION}" |
|
) |
|
endif() |
|
else() |
|
message(STATUS "Using the default linker because compiler doesn't support LLD: ${CMAKE_CXX_COMPILER_ID}" |
|
) |
|
endif() |
|
if(LLD_LINKER_FLAGS) |
|
message(STATUS "Using optional LLVM LLD linker") |
|
string(APPEND CMAKE_EXE_LINKER_FLAGS " ${LLD_LINKER_FLAGS}") |
|
string(APPEND CMAKE_MODULE_LINKER_FLAGS " ${LLD_LINKER_FLAGS}") |
|
string(APPEND CMAKE_SHARED_LINKER_FLAGS " ${LLD_LINKER_FLAGS}") |
|
else() |
|
message(STATUS "Using the default linker because the LLD isn't supported") |
|
endif() |
|
endif() |
|
endif() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(NOT MSVC) |
|
set(C_RELEASE_FLAGS "") |
|
if(CMAKE_C_FLAGS_RELEASE MATCHES "-O3") |
|
string(APPEND C_RELEASE_FLAGS " -O2") |
|
endif() |
|
set(CXX_RELEASE_FLAGS "") |
|
if(CMAKE_CXX_FLAGS_RELEASE MATCHES "-O3") |
|
string(APPEND CXX_RELEASE_FLAGS " -O2") |
|
endif() |
|
set(C_RELWITHDEBINFO_FLAGS "") |
|
if(CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES "-O3") |
|
string(APPEND C_RELWITHDEBINFO_FLAGS " -O2") |
|
endif() |
|
set(CXX_RELWITHDEBINFO_FLAGS "") |
|
if(CMAKE_CXX_FLAGS_RELWITHDEBINFO MATCHES "-O3") |
|
string(APPEND CXX_RELWITHDEBINFO_FLAGS " -O2") |
|
endif() |
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
|
string(APPEND C_RELEASE_FLAGS " -ftree-vectorize") |
|
string(APPEND CXX_RELEASE_FLAGS " -ftree-vectorize") |
|
string(APPEND C_RELWITHDEBINFO_FLAGS " -ftree-vectorize") |
|
string(APPEND CXX_RELWITHDEBINFO_FLAGS " -ftree-vectorize") |
|
endif() |
|
set(C_DEBUG_FLAGS "") |
|
set(CXX_DEBUG_FLAGS "") |
|
if(NOT MSVC) |
|
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") |
|
|
|
|
|
string(REPLACE "-g" " " CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) |
|
string(REPLACE "-g" " " CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) |
|
string(APPEND C_DEBUG_FLAGS " -g2") |
|
string(APPEND CXX_DEBUG_FLAGS " -g2") |
|
string(APPEND C_RELWITHDEBINFO_FLAGS " -g2") |
|
string(APPEND CXX_RELWITHDEBINFO_FLAGS " -g2") |
|
|
|
if(NOT CMAKE_C_FLAGS_DEBUG MATCHES "-O") |
|
string(APPEND C_DEBUG_FLAGS " -O1") |
|
endif() |
|
if(NOT CMAKE_CXX_FLAGS_DEBUG MATCHES "-O") |
|
string(APPEND CXX_DEBUG_FLAGS " -O1") |
|
endif() |
|
else() |
|
if(NOT CMAKE_C_FLAGS_DEBUG MATCHES "-O") |
|
string(APPEND C_DEBUG_FLAGS " -O0") |
|
endif() |
|
if(NOT CMAKE_CXX_FLAGS_DEBUG MATCHES "-O") |
|
string(APPEND CXX_DEBUG_FLAGS " -O0") |
|
endif() |
|
|
|
if(ARROW_GGDB_DEBUG) |
|
string(APPEND C_DEBUG_FLAGS " -ggdb") |
|
string(APPEND CXX_DEBUG_FLAGS " -ggdb") |
|
string(APPEND C_RELWITHDEBINFO_FLAGS " -ggdb") |
|
string(APPEND CXX_RELWITHDEBINFO_FLAGS " -ggdb") |
|
endif() |
|
endif() |
|
endif() |
|
|
|
string(APPEND CMAKE_C_FLAGS_RELEASE "${C_RELEASE_FLAGS} ${ARROW_C_FLAGS_RELEASE}") |
|
string(APPEND CMAKE_CXX_FLAGS_RELEASE "${CXX_RELEASE_FLAGS} ${ARROW_CXX_FLAGS_RELEASE}") |
|
string(APPEND CMAKE_C_FLAGS_DEBUG "${C_DEBUG_FLAGS} ${ARROW_C_FLAGS_DEBUG}") |
|
string(APPEND CMAKE_CXX_FLAGS_DEBUG "${CXX_DEBUG_FLAGS} ${ARROW_CXX_FLAGS_DEBUG}") |
|
string(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO |
|
"${C_RELWITHDEBINFO_FLAGS} ${ARROW_C_FLAGS_RELWITHDEBINFO}") |
|
string(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO |
|
"${CXX_RELWITHDEBINFO_FLAGS} ${ARROW_CXX_FLAGS_RELWITHDEBINFO}") |
|
endif() |
|
|
|
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}") |
|
|
|
|
|
|
|
|
|
if(MSVC) |
|
set(MSVC_LINKER_FLAGS) |
|
if(MSVC_LINK_VERBOSE) |
|
set(MSVC_LINKER_FLAGS "${MSVC_LINKER_FLAGS} /VERBOSE:LIB") |
|
endif() |
|
if(NOT ARROW_USE_STATIC_CRT) |
|
set(MSVC_LINKER_FLAGS "${MSVC_LINKER_FLAGS} /NODEFAULTLIB:LIBCMT") |
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MSVC_LINKER_FLAGS}") |
|
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${MSVC_LINKER_FLAGS}") |
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${MSVC_LINKER_FLAGS}") |
|
endif() |
|
endif() |
|
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") |
|
|
|
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -fexceptions") |
|
|
|
set(CMAKE_CXX_FLAGS |
|
"${CMAKE_CXX_FLAGS} -fPIC -fexceptions -Wno-error=deprecated-literal-operator") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set(ARROW_EMSCRIPTEN_LINKER_FLAGS "-sWASM_BIGINT=1 -fexceptions -Wno-error=linkflags") |
|
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS |
|
"-sSIDE_MODULE=1 ${ARROW_EMSCRIPTEN_LINKER_FLAGS}") |
|
set(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS |
|
"-sSIDE_MODULE=1 ${ARROW_EMSCRIPTEN_LINKER_FLAGS}") |
|
set(CMAKE_SHARED_LINKER_FLAGS "-sSIDE_MODULE=1 ${ARROW_EMSCRIPTEN_LINKER_FLAGS}") |
|
if(ARROW_TESTING) |
|
|
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE") |
|
set(CMAKE_EXE_LINKER_FLAGS |
|
"${ARROW_EMSCRIPTEN_LINKER_FLAGS} -sALLOW_MEMORY_GROWTH -lnodefs.js -lnoderawfs.js --pre-js ${BUILD_SUPPORT_DIR}/emscripten-test-init.js" |
|
) |
|
else() |
|
set(CMAKE_EXE_LINKER_FLAGS |
|
"${ARROW_EMSCRIPTEN_LINKER_FLAGS} -sERROR_ON_WASM_CHANGES_AFTER_LINK=1 -sALLOW_MEMORY_GROWTH -lnodefs.js -lnoderawfs.js --pre-js ${BUILD_SUPPORT_DIR}/emscripten-test-init.js" |
|
) |
|
endif() |
|
else() |
|
set(CMAKE_EXE_LINKER_FLAGS "${ARROW_EMSCRIPTEN_LINKER_FLAGS} -sALLOW_MEMORY_GROWTH") |
|
endif() |
|
endif() |
|
|