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:
Raúl Marín
2026-02-20 13:13:21 +01:00
co-authored by Claude Opus 4.6
parent 60af8784e1
commit ea576d71d2
11 changed files with 25 additions and 25 deletions
+1 -1
View File
@@ -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
View File
@@ -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.
+1 -1
View File
@@ -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")
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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 -1
View File
@@ -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()
+1 -1
View File
@@ -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 -1
View File
@@ -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()
+2 -2
View File
@@ -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
View File
@@ -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