mirror of
https://github.com/hanzoai/datastore.git
synced 2026-09-26 13:55:07 +00:00
Use numeric X86_ARCH_LEVEL and CMake VERSION_* comparisons
Change `X86_ARCH_LEVEL` from string values ("v1"..."v4") to numeric
(1...4) and replace `STREQUAL`/`STRGREATER_EQUAL` with CMake's native
`VERSION_LESS`/`VERSION_GREATER_EQUAL` comparisons. The "v" prefix is
now prepended only when constructing compiler flags
(`-march=x86-64-v${X86_ARCH_LEVEL}`).
Co-Authored-By: Claude Opus 4.6 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
60af8784e1
commit
ea576d71d2
@@ -36,7 +36,7 @@ BUILD_TYPE_TO_CMAKE = {
|
||||
BuildTypes.ARM_V80COMPAT: f"cmake --debug-trycompile -DCMAKE_VERBOSE_MAKEFILE=1 -LA -DCMAKE_BUILD_TYPE=None -DENABLE_THINLTO=0 -DSANITIZE= -DENABLE_CHECK_HEAVY_BUILDS=1 -DBUILD_STRIPPED_BINARY=1 -DENABLE_CLICKHOUSE_SELF_EXTRACTING=1 -DCMAKE_C_COMPILER={ToolSet.COMPILER_C} -DCMAKE_CXX_COMPILER={ToolSet.COMPILER_CPP} -DCOMPILER_CACHE={ToolSet.COMPILER_CACHE} -DCMAKE_TOOLCHAIN_FILE={repo_path_normalized}/cmake/linux/toolchain-aarch64.cmake -DNO_ARMV81_OR_HIGHER=1 -DENABLE_BUILD_PROFILING=1 -DENABLE_TESTS=0 -DENABLE_LEXER_TEST=0 -DENABLE_UTILS=0 -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON",
|
||||
BuildTypes.AMD_FREEBSD: f" cmake --debug-trycompile -DCMAKE_VERBOSE_MAKEFILE=1 -LA -DCMAKE_BUILD_TYPE=None -DENABLE_THINLTO=0 -DSANITIZE= -DENABLE_CHECK_HEAVY_BUILDS=1 -DBUILD_STRIPPED_BINARY=1 -DENABLE_CLICKHOUSE_SELF_EXTRACTING=1 -DCMAKE_C_COMPILER={ToolSet.COMPILER_C} -DCMAKE_CXX_COMPILER={ToolSet.COMPILER_CPP} -DCOMPILER_CACHE={ToolSet.COMPILER_CACHE_LEGACY} -DCMAKE_TOOLCHAIN_FILE={repo_path_normalized}/cmake/freebsd/toolchain-x86_64.cmake -DENABLE_BUILD_PROFILING=1 -DENABLE_TESTS=0 -DENABLE_LEXER_TEST=0 -DENABLE_UTILS=0 -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON",
|
||||
BuildTypes.PPC64LE: f" cmake --debug-trycompile -DCMAKE_VERBOSE_MAKEFILE=1 -LA -DCMAKE_BUILD_TYPE=None -DENABLE_THINLTO=1 -DSANITIZE= -DENABLE_CHECK_HEAVY_BUILDS=1 -DBUILD_STRIPPED_BINARY=1 -DENABLE_CLICKHOUSE_SELF_EXTRACTING=1 -DCMAKE_C_COMPILER={ToolSet.COMPILER_C} -DCMAKE_CXX_COMPILER={ToolSet.COMPILER_CPP} -DCOMPILER_CACHE={ToolSet.COMPILER_CACHE_LEGACY} -DCMAKE_TOOLCHAIN_FILE={repo_path_normalized}/cmake/linux/toolchain-ppc64le.cmake -DENABLE_BUILD_PROFILING=1 -DENABLE_TESTS=0 -DENABLE_LEXER_TEST=0 -DENABLE_UTILS=0 -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON",
|
||||
BuildTypes.AMD_COMPAT: f" cmake --debug-trycompile -DCMAKE_VERBOSE_MAKEFILE=1 -LA -DCMAKE_BUILD_TYPE=None -DENABLE_THINLTO=0 -DSANITIZE= -DENABLE_CHECK_HEAVY_BUILDS=1 -DBUILD_STRIPPED_BINARY=1 -DENABLE_CLICKHOUSE_SELF_EXTRACTING=1 -DCMAKE_C_COMPILER={ToolSet.COMPILER_C} -DCMAKE_CXX_COMPILER={ToolSet.COMPILER_CPP} -DCOMPILER_CACHE={ToolSet.COMPILER_CACHE} -DCMAKE_TOOLCHAIN_FILE={repo_path_normalized}/cmake/linux/toolchain-x86_64.cmake -DENABLE_BUILD_PROFILING=1 -DENABLE_TESTS=0 -DENABLE_LEXER_TEST=0 -DENABLE_UTILS=0 -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON -DX86_ARCH_LEVEL=v1 -DENABLE_EXAMPLES=1",
|
||||
BuildTypes.AMD_COMPAT: f" cmake --debug-trycompile -DCMAKE_VERBOSE_MAKEFILE=1 -LA -DCMAKE_BUILD_TYPE=None -DENABLE_THINLTO=0 -DSANITIZE= -DENABLE_CHECK_HEAVY_BUILDS=1 -DBUILD_STRIPPED_BINARY=1 -DENABLE_CLICKHOUSE_SELF_EXTRACTING=1 -DCMAKE_C_COMPILER={ToolSet.COMPILER_C} -DCMAKE_CXX_COMPILER={ToolSet.COMPILER_CPP} -DCOMPILER_CACHE={ToolSet.COMPILER_CACHE} -DCMAKE_TOOLCHAIN_FILE={repo_path_normalized}/cmake/linux/toolchain-x86_64.cmake -DENABLE_BUILD_PROFILING=1 -DENABLE_TESTS=0 -DENABLE_LEXER_TEST=0 -DENABLE_UTILS=0 -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON -DX86_ARCH_LEVEL=1 -DENABLE_EXAMPLES=1",
|
||||
BuildTypes.AMD_MUSL: f" cmake --debug-trycompile -DCMAKE_VERBOSE_MAKEFILE=1 -LA -DCMAKE_BUILD_TYPE=None -DENABLE_THINLTO=0 -DSANITIZE= -DENABLE_CHECK_HEAVY_BUILDS=1 -DBUILD_STRIPPED_BINARY=1 -DENABLE_CLICKHOUSE_SELF_EXTRACTING=1 -DCMAKE_C_COMPILER={ToolSet.COMPILER_C} -DCMAKE_CXX_COMPILER={ToolSet.COMPILER_CPP} -DCOMPILER_CACHE={ToolSet.COMPILER_CACHE} -DCMAKE_TOOLCHAIN_FILE={repo_path_normalized}/cmake/linux/toolchain-x86_64-musl.cmake -DENABLE_BUILD_PROFILING=1 -DENABLE_TESTS=0 -DENABLE_LEXER_TEST=0 -DENABLE_UTILS=0 -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON",
|
||||
BuildTypes.RISCV64: f" cmake --debug-trycompile -DCMAKE_VERBOSE_MAKEFILE=1 -LA -DCMAKE_BUILD_TYPE=None -DENABLE_THINLTO=1 -DSANITIZE= -DENABLE_CHECK_HEAVY_BUILDS=1 -DBUILD_STRIPPED_BINARY=1 -DENABLE_CLICKHOUSE_SELF_EXTRACTING=1 -DCMAKE_C_COMPILER={ToolSet.COMPILER_C} -DCMAKE_CXX_COMPILER={ToolSet.COMPILER_CPP} -DCOMPILER_CACHE={ToolSet.COMPILER_CACHE_LEGACY} -DCMAKE_TOOLCHAIN_FILE={repo_path_normalized}/cmake/linux/toolchain-riscv64.cmake -DENABLE_BUILD_PROFILING=1 -DENABLE_TESTS=0 -DENABLE_LEXER_TEST=0 -DENABLE_UTILS=0 -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON",
|
||||
BuildTypes.S390X: f" cmake --debug-trycompile -DCMAKE_VERBOSE_MAKEFILE=1 -LA -DCMAKE_BUILD_TYPE=None -DENABLE_THINLTO=1 -DSANITIZE= -DENABLE_CHECK_HEAVY_BUILDS=1 -DBUILD_STRIPPED_BINARY=1 -DENABLE_CLICKHOUSE_SELF_EXTRACTING=1 -DCMAKE_C_COMPILER={ToolSet.COMPILER_C} -DCMAKE_CXX_COMPILER={ToolSet.COMPILER_CPP} -DCOMPILER_CACHE={ToolSet.COMPILER_CACHE_LEGACY} -DCMAKE_TOOLCHAIN_FILE={repo_path_normalized}/cmake/linux/toolchain-s390x.cmake -DENABLE_BUILD_PROFILING=1 -DENABLE_TESTS=0 -DENABLE_LEXER_TEST=0 -DENABLE_UTILS=0 -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=ON",
|
||||
|
||||
+14
-14
@@ -1,6 +1,6 @@
|
||||
# https://software.intel.com/sites/landingpage/IntrinsicsGuide/
|
||||
|
||||
# On x86-64, the build target is specified as a microarchitecture level (v1, v2, v3, v4) via `X86_ARCH_LEVEL`.
|
||||
# On x86-64, the build target is specified as a microarchitecture level (1, 2, 3, 4) via `X86_ARCH_LEVEL`.
|
||||
# All of this is unrelated to the instruction set of the host machine
|
||||
# (you can compile for a newer instruction set on old machines and vice versa).
|
||||
|
||||
@@ -85,34 +85,34 @@ elseif (ARCH_PPC64LE)
|
||||
|
||||
elseif (ARCH_AMD64)
|
||||
# x86-64 microarchitecture levels (https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels):
|
||||
# v1 — SSE2 baseline, maximum compatibility with older/embedded hardware
|
||||
# v2 — SSE4.2, SSSE3, POPCNT (default, matches ClickHouse's historical baseline)
|
||||
# v3 — AVX2, BMI1/2, FMA, F16C etc.
|
||||
# v4 — AVX-512F/BW/CD/DQ/VL
|
||||
set (X86_ARCH_LEVEL "v2" CACHE STRING "x86-64 microarchitecture level (v1, v2, v3, v4)")
|
||||
set_property (CACHE X86_ARCH_LEVEL PROPERTY STRINGS "v1" "v2" "v3" "v4")
|
||||
# 1 — SSE2 baseline, maximum compatibility with older/embedded hardware
|
||||
# 2 — SSE4.2, SSSE3, POPCNT (default, matches ClickHouse's historical baseline)
|
||||
# 3 — AVX2, BMI1/2, FMA, F16C etc.
|
||||
# 4 — AVX-512F/BW/CD/DQ/VL
|
||||
set (X86_ARCH_LEVEL "2" CACHE STRING "x86-64 microarchitecture level (1, 2, 3, 4)")
|
||||
set_property (CACHE X86_ARCH_LEVEL PROPERTY STRINGS "1" "2" "3" "4")
|
||||
|
||||
if (NOT X86_ARCH_LEVEL MATCHES "^v[1-4]$")
|
||||
message (FATAL_ERROR "X86_ARCH_LEVEL must be one of: v1, v2, v3, v4 (got '${X86_ARCH_LEVEL}')")
|
||||
if (NOT X86_ARCH_LEVEL MATCHES "^[1-4]$")
|
||||
message (FATAL_ERROR "X86_ARCH_LEVEL must be one of: 1, 2, 3, 4 (got '${X86_ARCH_LEVEL}')")
|
||||
endif ()
|
||||
|
||||
# Same best-effort check for x86 as above for ARM.
|
||||
if (OS_LINUX AND CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64" AND NOT X86_ARCH_LEVEL STREQUAL "v1")
|
||||
if (OS_LINUX AND CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64" AND X86_ARCH_LEVEL VERSION_GREATER_EQUAL 2)
|
||||
# Test for flags in the default v2 profile.
|
||||
execute_process(
|
||||
COMMAND grep -P "^(?=.*ssse3)(?=.*sse4_1)(?=.*sse4_2)" /proc/cpuinfo
|
||||
OUTPUT_VARIABLE FLAGS)
|
||||
if (NOT FLAGS)
|
||||
MESSAGE(FATAL_ERROR "The build machine does not satisfy the minimum CPU requirements, try to run cmake with -DX86_ARCH_LEVEL=v1")
|
||||
MESSAGE(FATAL_ERROR "The build machine does not satisfy the minimum CPU requirements, try to run cmake with -DX86_ARCH_LEVEL=1")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# ClickHouse can be cross-compiled (e.g. on an ARM host for x86) but it is also possible to build ClickHouse on x86 w/o AVX for x86 w/
|
||||
# AVX. We only assume that the compiler can emit certain SIMD instructions, we don't care if the host system is able to run the binary.
|
||||
|
||||
if (NOT X86_ARCH_LEVEL STREQUAL "v1")
|
||||
set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=x86-64-${X86_ARCH_LEVEL}")
|
||||
list (APPEND RUSTFLAGS_CPU "-C" "target-cpu=x86-64-${X86_ARCH_LEVEL}")
|
||||
if (X86_ARCH_LEVEL VERSION_GREATER_EQUAL 2)
|
||||
set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=x86-64-v${X86_ARCH_LEVEL}")
|
||||
list (APPEND RUSTFLAGS_CPU "-C" "target-cpu=x86-64-v${X86_ARCH_LEVEL}")
|
||||
|
||||
# PCLMULQDQ is not formally part of any psABI microarchitecture level but ClickHouse's baseline has always included it and
|
||||
# third-party dependencies (zlib-ng, RocksDB) rely on it. All CPUs that support x86-64-v2 also support PCLMULQDQ.
|
||||
|
||||
@@ -32,7 +32,7 @@ if (ENABLE_LLVM_LIBC_MATH)
|
||||
link_directories("${CMAKE_BINARY_DIR}/contrib/libllvmlibc-cmake")
|
||||
|
||||
if (ARCH_AMD64)
|
||||
if (X86_ARCH_LEVEL STREQUAL "v1")
|
||||
if (X86_ARCH_LEVEL VERSION_LESS 2)
|
||||
# Compat mode: single library, no dispatch
|
||||
target_link_libraries(global-libs INTERFACE libllvmlibc)
|
||||
set (DEFAULT_LIBS "${DEFAULT_LIBS} -llibllvmlibc")
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# SPDX-License-Identifier: Apache-2.0.
|
||||
|
||||
if (USE_CPU_EXTENSIONS)
|
||||
if (ARCH_AMD64 AND X86_ARCH_LEVEL STRGREATER_EQUAL "v3")
|
||||
if (ARCH_AMD64 AND X86_ARCH_LEVEL VERSION_GREATER_EQUAL 3)
|
||||
set (AVX2_CFLAGS "-mavx -mavx2")
|
||||
set (HAVE_AVX2_INTRINSICS 1)
|
||||
set (HAVE_MM256_EXTRACT_EPI64 1)
|
||||
|
||||
@@ -21,7 +21,7 @@ if(ARCH_AARCH64)
|
||||
list(APPEND CRC32C_SOURCES "${CRC32C_DIR}/src/crc32c_arm64.cc")
|
||||
endif()
|
||||
elseif(ARCH_AMD64)
|
||||
if(X86_ARCH_LEVEL STRGREATER_EQUAL "v2")
|
||||
if(X86_ARCH_LEVEL VERSION_GREATER_EQUAL 2)
|
||||
include_directories(${CRC32C_CMAKE_DIR}/x86_64/sse42)
|
||||
list(APPEND CRC32C_SOURCES "${CRC32C_DIR}/src/crc32c_sse42.cc")
|
||||
else()
|
||||
|
||||
@@ -48,7 +48,7 @@ set(LLVMLIBC_DEFS_COMMON
|
||||
)
|
||||
|
||||
if (ARCH_AMD64)
|
||||
if (X86_ARCH_LEVEL STREQUAL "v1")
|
||||
if (X86_ARCH_LEVEL VERSION_LESS 2)
|
||||
# Compat build: Single library without dispatch, minimal CPU features (SSE2 baseline)
|
||||
add_library(libllvmlibc ${SRCS})
|
||||
set_target_properties(libllvmlibc PROPERTIES FOLDER "contrib/libllvmlibc-cmake")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
option (ENABLE_ROCKSDB "Enable RocksDB" ${ENABLE_LIBRARIES})
|
||||
|
||||
if (NOT ENABLE_ROCKSDB OR (ARCH_AMD64 AND X86_ARCH_LEVEL STREQUAL "v1")) # assumes SSE4.2 and PCLMUL
|
||||
if (NOT ENABLE_ROCKSDB OR (ARCH_AMD64 AND X86_ARCH_LEVEL VERSION_LESS 2)) # assumes SSE4.2 and PCLMUL
|
||||
message (STATUS "Not using RocksDB")
|
||||
return()
|
||||
endif()
|
||||
|
||||
@@ -18,7 +18,7 @@ set (HAVE_BUILTIN_CTZ 1)
|
||||
set (HAVE_FUNC_MMAP 1)
|
||||
set (HAVE_FUNC_SYSCONF 1)
|
||||
|
||||
if (ARCH_AMD64 AND X86_ARCH_LEVEL STRGREATER_EQUAL "v2")
|
||||
if (ARCH_AMD64 AND X86_ARCH_LEVEL VERSION_GREATER_EQUAL 2)
|
||||
set (SNAPPY_HAVE_SSSE3 1)
|
||||
set (SNAPPY_HAVE_X86_CRC32 1)
|
||||
else ()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Vectorscan is drop-in replacement for Hyperscan.
|
||||
if ((ARCH_AMD64 AND NOT X86_ARCH_LEVEL STREQUAL "v1") OR ARCH_AARCH64)
|
||||
if ((ARCH_AMD64 AND X86_ARCH_LEVEL VERSION_GREATER_EQUAL 2) OR ARCH_AARCH64)
|
||||
option (ENABLE_VECTORSCAN "Enable vectorscan" ${ENABLE_LIBRARIES})
|
||||
endif()
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ elseif(ARCH_AMD64)
|
||||
target_compile_definitions(_zlib PUBLIC -DX86_FEATURES)
|
||||
list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/x86_features.h)
|
||||
list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/x86_features.c)
|
||||
if(X86_ARCH_LEVEL STRGREATER_EQUAL "v3")
|
||||
if(X86_ARCH_LEVEL VERSION_GREATER_EQUAL 3)
|
||||
target_compile_definitions(_zlib PUBLIC -DX86_AVX2)
|
||||
set(AVX2_SRCS ${ARCHDIR}/slide_hash_avx2.c)
|
||||
list(APPEND AVX2_SRCS ${ARCHDIR}/chunkset_avx2.c)
|
||||
@@ -78,7 +78,7 @@ elseif(ARCH_AMD64)
|
||||
list(APPEND AVX2_SRCS ${ARCHDIR}/adler32_avx2.c)
|
||||
list(APPEND ZLIB_ARCH_SRCS ${AVX2_SRCS})
|
||||
endif()
|
||||
if(X86_ARCH_LEVEL STRGREATER_EQUAL "v2")
|
||||
if(X86_ARCH_LEVEL VERSION_GREATER_EQUAL 2)
|
||||
target_compile_definitions(_zlib PUBLIC -DX86_SSE42 -DX86_SSSE3 -DX86_PCLMULQDQ_CRC)
|
||||
set(SSE42_SRCS ${ARCHDIR}/adler32_sse42.c ${ARCHDIR}/insert_string_sse42.c)
|
||||
set(SSSE3_SRCS ${ARCHDIR}/adler32_ssse3.c ${ARCHDIR}/chunkset_ssse3.c)
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ configure_file (Common/config_version.cpp.in ${CONFIG_INCLUDE_PATH}/config_versi
|
||||
# See `src/Common/TargetSpecific.h`
|
||||
option(ENABLE_MULTITARGET_CODE "Enable platform-dependent code" ON)
|
||||
|
||||
if (ARCH_AMD64 AND X86_ARCH_LEVEL STREQUAL "v1")
|
||||
if (ARCH_AMD64 AND X86_ARCH_LEVEL VERSION_LESS 2)
|
||||
# Optimized x86 code in DECLARE_*_SPECIFIC_CODE blocks (see `src/Common/TargetSpecific.h`) is sometimes marked FORCE_INLINE. As a
|
||||
# result, its instruction set requirements (e.g. SSE4.2) leak into generic code. This is normally not a problem for standard x86 builds
|
||||
# because generic code is compiled with SSE 4.2 anyways. But it breaks SSE2-only builds. Therefore disabling the multitarget code
|
||||
|
||||
Reference in New Issue
Block a user