]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Fix replxx build with LLVM 21+
authorVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 29 Dec 2025 22:28:40 +0000 (22:28 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 29 Dec 2025 22:28:40 +0000 (22:28 +0000)
- 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

contrib/DEPENDENCY_INFO.md
contrib/replxx/CMakeLists.txt
contrib/replxx/src/history.hxx
contrib/replxx/src/replxx_impl.hxx
contrib/replxx/src/unicodestring.hxx

index 8e7cb8e797a6d36df9f6f459cc2c9001eee58166..750b3697ef683460e62d23a6cb0481a44ddfad3c 100644 (file)
@@ -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         |
index f48a0688d03a3904f7e0e083335f1fbfb06bc3fc..11d47797f44ba72a7e427652a77c239692450a7a 100644 (file)
@@ -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})
index 4e72c036763ddfec6e9e7b851c203df1a7989283..2dee274a82e486e54f2c090740b58702c12d0e70 100644 (file)
@@ -2,30 +2,13 @@
 #define REPLXX_HISTORY_HXX_INCLUDED 1
 
 #include <list>
-#include <unordered_map>
+#include <map>
 
 #include "unicodestring.hxx"
 #include "utf8string.hxx"
 #include "conversion.hxx"
 #include "util.hxx"
 
-namespace std {
-template<>
-struct hash<replxx::UnicodeString> {
-       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<Entry> entries_t;
-       typedef std::unordered_map<UnicodeString, entries_t::const_iterator> locations_t;
+       typedef std::map<UnicodeString, entries_t::const_iterator> locations_t;
+
 private:
        entries_t _entries;
        locations_t _locations;
index bec9383c15fb0dd3a9951ea1f2e48eddc673614d..da8248682f4273ea18bd2b534f79f166dc05befe 100644 (file)
@@ -35,7 +35,7 @@
 #include <deque>
 #include <memory>
 #include <string>
-#include <unordered_map>
+#include <map>
 #include <thread>
 #include <mutex>
 #include <chrono>
@@ -87,9 +87,10 @@ public:
                TRIM,
                SKIP
        };
-       typedef std::unordered_map<std::string, Replxx::key_press_handler_t> named_actions_t;
+       typedef std::map<std::string, Replxx::key_press_handler_t> named_actions_t;
        typedef Replxx::ACTION_RESULT ( ReplxxImpl::* key_press_handler_raw_t )( char32_t );
-       typedef std::unordered_map<int, Replxx::key_press_handler_t> key_press_handlers_t;
+       typedef std::map<int, Replxx::key_press_handler_t> key_press_handlers_t;
+
 private:
        typedef int long long unsigned action_trait_t;
        static action_trait_t const NOOP                       =  0;
index 8ff98a7299caf8081ba0afbe61bbe6e3dda83453..e9dc0d2708f4b4b88407f7223c51743f4a4321fc 100644 (file)
@@ -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;