From: Vsevolod Stakhov Date: Mon, 29 Dec 2025 22:28:40 +0000 (+0000) Subject: [Fix] Fix replxx build with LLVM 21+ X-Git-Tag: 3.14.3~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1e3329d9d8c2b17bed7e7e9a9af5eaab93a83aed;p=thirdparty%2Frspamd.git [Fix] Fix replxx build with LLVM 21+ - Simplify CMakeLists.txt to use CMAKE_CXX_STANDARD 20 - Replace std::unordered_map with std::map to avoid libc++ ABI issues - Add operator< to UnicodeString for std::map compatibility --- diff --git a/contrib/DEPENDENCY_INFO.md b/contrib/DEPENDENCY_INFO.md index 8e7cb8e797..750b3697ef 100644 --- a/contrib/DEPENDENCY_INFO.md +++ b/contrib/DEPENDENCY_INFO.md @@ -10,7 +10,7 @@ | libottery | ? | Public Domain / CC0 | YES | many changes | | librdns | ? | BSD-2-Clause | YES | | | libucl | ? | BSD-2-Clause | YES | | -| replxx | 6d93360 | BSD-2-Clause | YES | libicu usage | +| replxx | 6d93360 | BSD-2-Clause | YES | libicu, libc++ link | | lua-argparse | 0.7.1 | MIT | NO | | | lua-bit | 1.0.2 | MIT | YES | build fixes | | lua-fun | ? | MIT | YES | rspamd text | diff --git a/contrib/replxx/CMakeLists.txt b/contrib/replxx/CMakeLists.txt index f48a0688d0..11d47797f4 100644 --- a/contrib/replxx/CMakeLists.txt +++ b/contrib/replxx/CMakeLists.txt @@ -1,54 +1,13 @@ # -*- mode: CMAKE; -*- -project( replxx VERSION 0.0.2 LANGUAGES CXX C ) +project(replxx VERSION 0.0.2 LANGUAGES CXX C) -# INFO -set(REPLXX_DISPLAY_NAME "replxx") -set(REPLXX_URL_INFO_ABOUT "https://github.com/AmokHuginnsson/replxx") -set(REPLXX_CONTACT "amok@codestation.org") -set(REPLXX_FRIENDLY_STRING "replxx - Read Evaluate Print Loop library") +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) -# compiler options -if(CMAKE_COMPILER_IS_GNUCXX) - message(STATUS "Compiler type GNU: ${CMAKE_CXX_COMPILER}") - set(BASE_COMPILER_OPTIONS "-std=c++11 -Wall -D_GNU_SOURCE -pthread") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${BASE_COMPILER_OPTIONS}") - set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS} ${BASE_COMPILER_OPTIONS} -O0 --coverage -fno-inline -fno-default-inline -fno-inline-small-functions") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${BASE_COMPILER_OPTIONS} -O0 -g -ggdb -g3 -ggdb3") - set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} ${BASE_COMPILER_OPTIONS} -Os") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${BASE_COMPILER_OPTIONS} -O3 -fomit-frame-pointer") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${BASE_COMPILER_OPTIONS} -O3 -g") - set(CMAKE_C_FLAGS "-std=c99") -elseif(CMAKE_COMPILER_IS_CLANGCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") - # using regular Clang or AppleClang - message(STATUS "Compiler type CLANG: ${CMAKE_CXX_COMPILER}") - set(BASE_COMPILER_OPTIONS "-std=c++11 -Wall -Wextra -D_GNU_SOURCE -pthread") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${BASE_COMPILER_OPTIONS}") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${BASE_COMPILER_OPTIONS} -O0 -g") - set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} ${BASE_COMPILER_OPTIONS} -Os") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${BASE_COMPILER_OPTIONS} -O3 -fomit-frame-pointer") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${BASE_COMPILER_OPTIONS} -O3 -g") - set(CMAKE_C_FLAGS "-std=c99") -elseif(MSVC) - message(STATUS "Compiler type MSVC: ${CMAKE_CXX_COMPILER}") +if(MSVC) add_definitions("-D_CRT_SECURE_NO_WARNINGS=1") - - set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /INCREMENTAL:NO /SUBSYSTEM:CONSOLE /LTCG /ignore:4099") - set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} /SUBSYSTEM:CONSOLE /ignore:4099") - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:CONSOLE /ignore:4099") - set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /SUBSYSTEM:CONSOLE /ignore:4099") -else() - # unknown compiler - message(STATUS "Compiler type UNKNOWN: ${CMAKE_CXX_COMPILER}") - set(BASE_COMPILER_OPTIONS "-std=c++11 -Wall -pthread") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${BASE_COMPILER_OPTIONS}") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${BASE_COMPILER_OPTIONS} -O0 -g") - set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} ${BASE_COMPILER_OPTIONS} -Os") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${BASE_COMPILER_OPTIONS} -O3 -fomit-frame-pointer") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${BASE_COMPILER_OPTIONS} -O3 -g") - set(CMAKE_C_FLAGS "-std=c99") endif() -# build libreplxx set( REPLXX_SOURCES src/conversion.cxx @@ -75,8 +34,8 @@ target_include_directories( PUBLIC ${PROJECT_SOURCE_DIR}/include PRIVATE ${PROJECT_SOURCE_DIR}/src ) -set( TARGETS ${TARGETS} rspamd-replxx ) +set(TARGETS ${TARGETS} rspamd-replxx) target_compile_definitions(rspamd-replxx PRIVATE REPLXX_BUILDING_DLL) target_link_libraries(rspamd-replxx "${RSPAMD_REQUIRED_LIBRARIES}") -install( TARGETS ${TARGETS} LIBRARY DESTINATION ${RSPAMD_LIBDIR}) \ No newline at end of file +install(TARGETS ${TARGETS} LIBRARY DESTINATION ${RSPAMD_LIBDIR}) diff --git a/contrib/replxx/src/history.hxx b/contrib/replxx/src/history.hxx index 4e72c03676..2dee274a82 100644 --- a/contrib/replxx/src/history.hxx +++ b/contrib/replxx/src/history.hxx @@ -2,30 +2,13 @@ #define REPLXX_HISTORY_HXX_INCLUDED 1 #include -#include +#include #include "unicodestring.hxx" #include "utf8string.hxx" #include "conversion.hxx" #include "util.hxx" -namespace std { -template<> -struct hash { - std::size_t operator()( replxx::UnicodeString const& us_ ) const { - std::size_t h( 0 ); - char32_t const* p( us_.get() ); - char32_t const* e( p + us_.length() ); - while ( p != e ) { - h *= 31; - h += *p; - ++ p; - } - return ( h ); - } -}; -} - namespace replxx { class History { @@ -49,7 +32,8 @@ public: } }; typedef std::list entries_t; - typedef std::unordered_map locations_t; + typedef std::map locations_t; + private: entries_t _entries; locations_t _locations; diff --git a/contrib/replxx/src/replxx_impl.hxx b/contrib/replxx/src/replxx_impl.hxx index bec9383c15..da8248682f 100644 --- a/contrib/replxx/src/replxx_impl.hxx +++ b/contrib/replxx/src/replxx_impl.hxx @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include @@ -87,9 +87,10 @@ public: TRIM, SKIP }; - typedef std::unordered_map named_actions_t; + typedef std::map named_actions_t; typedef Replxx::ACTION_RESULT ( ReplxxImpl::* key_press_handler_raw_t )( char32_t ); - typedef std::unordered_map key_press_handlers_t; + typedef std::map key_press_handlers_t; + private: typedef int long long unsigned action_trait_t; static action_trait_t const NOOP = 0; diff --git a/contrib/replxx/src/unicodestring.hxx b/contrib/replxx/src/unicodestring.hxx index 8ff98a7299..e9dc0d2708 100644 --- a/contrib/replxx/src/unicodestring.hxx +++ b/contrib/replxx/src/unicodestring.hxx @@ -97,6 +97,11 @@ public: return ( _data != other_._data ); } + bool operator<(UnicodeString const &other_) const + { + return (_data < other_._data); + } + UnicodeString& append( UnicodeString const& other ) { _data.insert( _data.end(), other._data.begin(), other._data.end() ); return *this;