25475d1057
C++20 broke two things in the prior bump: 1. std::allocator no longer exposes pointer/const_pointer/reference/ const_reference member typedefs, and the 2-arg allocate(n, hint) was removed. Both secure_allocator and zero_after_free_allocator inherited these from std::allocator. Define the typedefs ourselves and switch the secure_allocator allocate() to the single-arg form. 2. Bundled src/leveldb uses `std::memory_order::memory_order_relaxed` which was valid in C++17 but became a hard error in C++20 (memory_order is now a scoped enum class — the values are at namespace scope or memory_order::relaxed, not memory_order::memory_order_relaxed). LevelDB itself only needs C++11, so pin its targets to C++17 in BuildLevelDB.cmake instead of patching vendored code. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
29 lines
1.0 KiB
CMake
29 lines
1.0 KiB
CMake
# cmake/BuildLevelDB.cmake
|
|
# Builds the bundled LevelDB via its native CMake sub-build.
|
|
# Exposes leveldb_lib, leveldb_memenv, leveldb_bundled, and build_leveldb.
|
|
|
|
set(LEVELDB_SOURCE_DIR "${CMAKE_SOURCE_DIR}/src/leveldb")
|
|
set(LEVELDB_BINARY_DIR "${CMAKE_BINARY_DIR}/leveldb")
|
|
|
|
if(NOT TARGET leveldb_lib)
|
|
add_subdirectory("${LEVELDB_SOURCE_DIR}" "${LEVELDB_BINARY_DIR}")
|
|
endif()
|
|
|
|
# Pin bundled LevelDB to C++17. It only needs C++11 (declared via its own
|
|
# target_compile_features) but inherits CMAKE_CXX_STANDARD=20 from the
|
|
# top-level project, where some of its atomic-enum syntax
|
|
# (std::memory_order::memory_order_relaxed) becomes a hard error.
|
|
foreach(_leveldb_target leveldb_lib leveldb_memenv)
|
|
if(TARGET ${_leveldb_target})
|
|
set_target_properties(${_leveldb_target} PROPERTIES
|
|
CXX_STANDARD 17
|
|
CXX_STANDARD_REQUIRED ON
|
|
CXX_EXTENSIONS OFF
|
|
)
|
|
endif()
|
|
endforeach()
|
|
|
|
if(NOT TARGET build_leveldb)
|
|
add_custom_target(build_leveldb DEPENDS leveldb_lib leveldb_memenv)
|
|
endif()
|