From ffcfda9d020f7881cbb308a7640d0ed6c51b2a74 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Mon, 18 May 2026 16:01:30 +0200 Subject: [PATCH 01/22] build(cmake): minimal fixes for transitive restbed headers, i2pcommon, and versioning --- CMakeLists.txt | 29 +++++++++++++++++++++++++---- src/CMakeLists.txt | 7 +++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7700cf5247..88f9a382c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -484,9 +484,9 @@ if(RS_JSON_API) # dependencies see https://stackoverflow.com/a/64900982 target_include_directories( - ${PROJECT_NAME} PRIVATE "${RESTBED_DEVEL_DIR}/source/" ) + ${PROJECT_NAME} PUBLIC "${RESTBED_DEVEL_DIR}/source/" ) target_link_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/../supportlibs/restbed") - target_link_libraries(${PROJECT_NAME} PRIVATE restbed) + target_link_libraries(${PROJECT_NAME} PRIVATE restbed-static) else() message( WARNING "FetchContent restbed, will be installed if you run make install") @@ -503,7 +503,7 @@ if(RS_JSON_API) FetchContent_MakeAvailable(restbed) target_include_directories( - ${PROJECT_NAME} PRIVATE ${restbed_SOURCE_DIR}/source/ ) + ${PROJECT_NAME} PUBLIC ${restbed_SOURCE_DIR}/source/ ) target_link_libraries(${PROJECT_NAME} PRIVATE restbed-static) endif() @@ -690,9 +690,14 @@ else() set(V_GIT_DESCRIBE_OUTPUT "") set(V_GIT_DESCRIBE_REGEXP "^v([0-9]+).([0-9]+).([0-9]+)(.*)\n$") + set(V_GIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../.git") + set(V_GIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..") + endif() + execute_process( COMMAND ${GIT_EXECUTABLE} describe --tags --long --match v*.*.* - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + WORKING_DIRECTORY "${V_GIT_DIR}" OUTPUT_VARIABLE V_GIT_DESCRIBE_OUTPUT ) if(V_GIT_DESCRIBE_OUTPUT MATCHES "${V_GIT_DESCRIBE_REGEXP}") @@ -721,6 +726,22 @@ if(V_VERSION_SET) PUBLIC RS_EXTRA_VERSION="${RS_EXTRA_VERSION}" ) endif(V_VERSION_SET) +# Define the libretroshare specific version hash (submodule hash) +set(V_LIB_GIT_HASH "") +execute_process( + COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=7 --always --dirty + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + OUTPUT_VARIABLE V_LIB_GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE ) + +if(V_LIB_GIT_HASH STREQUAL "") + set(V_LIB_GIT_HASH "[version not available]") +endif() + +target_compile_definitions( + ${PROJECT_NAME} + PUBLIC RS_LIB_VERSION_HASH="${V_LIB_GIT_HASH}" ) + ################################################################################ # TODO: Use generator expressions instead of CMAKE_BUILD_TYPE see diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ef55447a0c..4ad8b43006 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -617,13 +617,12 @@ list( util/rsnet.cc util/rsnet_ss.cc util/rsstacktrace.cc - util/rsthreads.cc ) - -# util/i2pcommon.cpp -# util/i2pcommon.h + util/rsthreads.cc + util/i2pcommon.cpp ) list( APPEND RS_IMPLEMENTATION_HEADERS + util/i2pcommon.h util/argstream.h util/contentvalue.h util/cxx11retrocompat.h From 5edeb5f5de20f1a01e39bedcde4ac66a2d7071ec Mon Sep 17 00:00:00 2001 From: jolavillette Date: Tue, 19 May 2026 07:57:31 +0200 Subject: [PATCH 02/22] SAVE: Toutes les modifications courantes (Universel + Windows) --- CMakeLists.txt | 58 ++++++++++++++++++++++---------- src/CMakeLists.txt | 8 +++-- src/jsonapi/jsonapi-generator.py | 20 ++++++----- src/pqi/sslfns.h | 9 ++++- src/retroshare/rstor.h | 4 +++ src/util/rsdebug.h | 4 +++ 6 files changed, 73 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 88f9a382c6..43fc79a2c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -245,6 +245,19 @@ else() set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17) endif() +if(WIN32) + target_compile_definitions( + ${PROJECT_NAME} PUBLIC + WINDOWS_SYS + UNICODE + _UNICODE + NOGDI + NOMINMAX + NOCRYPT + WIN_DLL_EXPORT ) + target_link_libraries(${PROJECT_NAME} PUBLIC ws2_32) +endif() + ## As of today libretroshare doesn't hide implementation details properly so it ## is necessary to flag all implementation headers as public target_include_directories( @@ -299,8 +312,8 @@ target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) if(RS_RNPLIB) # Add RNP build directories to linker search path target_link_directories(${PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_BINARY_DIR}/../supportlibs/librnp/Build/src/lib - ${CMAKE_CURRENT_BINARY_DIR}/../supportlibs/librnp/Build/src/libsexpp + ${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib + ${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/libsexpp ) # Link libraries by name, including RNP libs and dependencies first @@ -311,7 +324,7 @@ if(RS_RNPLIB) target_include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/include" - "${CMAKE_CURRENT_BINARY_DIR}/../supportlibs/librnp/Build/src/lib" + "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib" ) else() @@ -430,19 +443,21 @@ if(RS_JSON_API) JSONAPI_GENERATOR_EXECUTABLE "${JSONAPI_GENERATOR_SOURCE_DIR}/jsonapi-generator.py" ) - file( - COPY "src/jsonapi/jsonapi-generator-doxygen.conf" - DESTINATION "${JSON_API_GENERATOR_WORK_DIR}" ) - - file( - APPEND - "${JSON_API_GENERATOR_DOXYFILE}" - "OUTPUT_DIRECTORY=${JSONAPI_GENERATOR_OUTPUT_DIR}\n" - "INPUT=${CMAKE_CURRENT_SOURCE_DIR}/src/\n" - "EXCLUDE=" - " ${CMAKE_CURRENT_SOURCE_DIR}/src/tests" - " ${CMAKE_CURRENT_SOURCE_DIR}/src/unused" - " ${CMAKE_CURRENT_SOURCE_DIR}/src/unfinished\n" ) + if(NOT EXISTS "${JSON_API_GENERATOR_DOXYFILE}") + file( + COPY "src/jsonapi/jsonapi-generator-doxygen.conf" + DESTINATION "${JSON_API_GENERATOR_WORK_DIR}" ) + + file( + APPEND + "${JSON_API_GENERATOR_DOXYFILE}" + "OUTPUT_DIRECTORY=${JSONAPI_GENERATOR_OUTPUT_DIR}\n" + "INPUT=${CMAKE_CURRENT_SOURCE_DIR}/src/\n" + "EXCLUDE=" + " ${CMAKE_CURRENT_SOURCE_DIR}/src/tests" + " ${CMAKE_CURRENT_SOURCE_DIR}/src/unused" + " ${CMAKE_CURRENT_SOURCE_DIR}/src/unfinished\n" ) + endif() add_custom_command( OUTPUT @@ -465,6 +480,8 @@ if(RS_JSON_API) set(BUILD_TESTS OFF CACHE BOOL "Do not build restbed tests") set(BUILD_SSL OFF CACHE BOOL "Do not build restbed SSL support") + set(BUILD_SHARED_LIBRARY OFF) + set(BUILD_SHARED_LIBS OFF) set(RESTBED_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/restbed/") if(RS_ANDROID) @@ -498,13 +515,20 @@ if(RS_JSON_API) GIT_SHALLOW TRUE GIT_PROGRESS TRUE TIMEOUT 10 -# EXCLUDE_FROM_ALL # Available only in CMake >= 3.28 + PATCH_COMMAND sed -i -e "s|/wd4251||g" -e "s|VERSION 3.1.0|VERSION 3.5.0|g" CMakeLists.txt ) FetchContent_MakeAvailable(restbed) + if(TARGET restbed-shared) + set_target_properties(restbed-shared PROPERTIES EXCLUDE_FROM_ALL TRUE) + endif() + target_include_directories( ${PROJECT_NAME} PUBLIC ${restbed_SOURCE_DIR}/source/ ) target_link_libraries(${PROJECT_NAME} PRIVATE restbed-static) + if(WIN32) + target_link_libraries(restbed-static INTERFACE ws2_32 winmm iphlpapi mswsock) + endif() endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4ad8b43006..def1b2e9ea 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -250,12 +250,14 @@ else() list(APPEND RS_IMPLEMENTATION_HEADERS pgp/openpgpsdkhandler.h) endif() -#./plugins/dlfcn_win32.cc -#./plugins/dlfcn_win32.h -#./plugins/pluginmanager.h #./plugins/rscacheservice.h #./plugins/rspqiservice.h +if(WIN32) + list(APPEND RS_SOURCES plugins/dlfcn_win32.cc) + list(APPEND RS_IMPLEMENTATION_HEADERS plugins/dlfcn_win32.h) +endif() + list( APPEND RS_SOURCES plugins/pluginmanager.cc ) diff --git a/src/jsonapi/jsonapi-generator.py b/src/jsonapi/jsonapi-generator.py index 1795469999..e8c09c5685 100755 --- a/src/jsonapi/jsonapi-generator.py +++ b/src/jsonapi/jsonapi-generator.py @@ -190,15 +190,17 @@ def processFile(file): orderedParamNames.append(pName) for tmpPN in memberdef.findall('.//parametername'): - tmpParam = paramsMap[tmpPN.text] - tmpD = tmpPN.attrib['direction'] if 'direction' in tmpPN.attrib else '' - - if 'in' in tmpD: - tmpParam._in = True - hasInput = True - if 'out' in tmpD: - tmpParam._out = True - hasOutput = True + pName = getText(tmpPN) + if pName in paramsMap: + tmpParam = paramsMap[pName] + tmpD = tmpPN.attrib['direction'] if 'direction' in tmpPN.attrib else '' + + if 'in' in tmpD: + tmpParam._in = True + hasInput = True + if 'out' in tmpD: + tmpParam._out = True + hasOutput = True # Params sanity check for pmKey in paramsMap: diff --git a/src/pqi/sslfns.h b/src/pqi/sslfns.h index c22076c510..560d84c458 100644 --- a/src/pqi/sslfns.h +++ b/src/pqi/sslfns.h @@ -1,4 +1,4 @@ -/******************************************************************************* +/******************************************************************************* * libretroshare/src/pqi: sslfns.h * * * * libretroshare: retroshare core library * @@ -28,6 +28,13 @@ /******************** notify of new Cert **************************/ +#ifdef X509_NAME +#undef X509_NAME +#endif +#ifdef X509_EXTENSIONS +#undef X509_EXTENSIONS +#endif + #include #include diff --git a/src/retroshare/rstor.h b/src/retroshare/rstor.h index 486c830fe9..9f22dcbbbb 100644 --- a/src/retroshare/rstor.h +++ b/src/retroshare/rstor.h @@ -41,6 +41,10 @@ enum class RsTorManagerEventCode: uint8_t TOR_MANAGER_STOPPED = 0x06, }; +#ifdef ERROR +#undef ERROR +#endif + // Status of the Tor hidden service setup/loaded by RS enum class RsTorHiddenServiceStatus: uint8_t { diff --git a/src/util/rsdebug.h b/src/util/rsdebug.h index 384e6eb2a7..799325fcee 100644 --- a/src/util/rsdebug.h +++ b/src/util/rsdebug.h @@ -38,6 +38,10 @@ #include "util/rsmacrosugar.hpp" +#ifdef ERROR +#undef ERROR +#endif + #ifdef __ANDROID__ enum class RsLoggerCategories { From df1642bacd1d206e65069a148b47992f736a2b33 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Tue, 19 May 2026 07:57:40 +0200 Subject: [PATCH 03/22] Fix jsonapi generator and OpenSSL macro collisions --- src/jsonapi/jsonapi-generator.py | 20 +++++++++++--------- src/pqi/sslfns.h | 9 ++++++++- src/retroshare/rstor.h | 4 ++++ src/util/rsdebug.h | 4 ++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/jsonapi/jsonapi-generator.py b/src/jsonapi/jsonapi-generator.py index 1795469999..e8c09c5685 100755 --- a/src/jsonapi/jsonapi-generator.py +++ b/src/jsonapi/jsonapi-generator.py @@ -190,15 +190,17 @@ def processFile(file): orderedParamNames.append(pName) for tmpPN in memberdef.findall('.//parametername'): - tmpParam = paramsMap[tmpPN.text] - tmpD = tmpPN.attrib['direction'] if 'direction' in tmpPN.attrib else '' - - if 'in' in tmpD: - tmpParam._in = True - hasInput = True - if 'out' in tmpD: - tmpParam._out = True - hasOutput = True + pName = getText(tmpPN) + if pName in paramsMap: + tmpParam = paramsMap[pName] + tmpD = tmpPN.attrib['direction'] if 'direction' in tmpPN.attrib else '' + + if 'in' in tmpD: + tmpParam._in = True + hasInput = True + if 'out' in tmpD: + tmpParam._out = True + hasOutput = True # Params sanity check for pmKey in paramsMap: diff --git a/src/pqi/sslfns.h b/src/pqi/sslfns.h index c22076c510..560d84c458 100644 --- a/src/pqi/sslfns.h +++ b/src/pqi/sslfns.h @@ -1,4 +1,4 @@ -/******************************************************************************* +/******************************************************************************* * libretroshare/src/pqi: sslfns.h * * * * libretroshare: retroshare core library * @@ -28,6 +28,13 @@ /******************** notify of new Cert **************************/ +#ifdef X509_NAME +#undef X509_NAME +#endif +#ifdef X509_EXTENSIONS +#undef X509_EXTENSIONS +#endif + #include #include diff --git a/src/retroshare/rstor.h b/src/retroshare/rstor.h index 486c830fe9..9f22dcbbbb 100644 --- a/src/retroshare/rstor.h +++ b/src/retroshare/rstor.h @@ -41,6 +41,10 @@ enum class RsTorManagerEventCode: uint8_t TOR_MANAGER_STOPPED = 0x06, }; +#ifdef ERROR +#undef ERROR +#endif + // Status of the Tor hidden service setup/loaded by RS enum class RsTorHiddenServiceStatus: uint8_t { diff --git a/src/util/rsdebug.h b/src/util/rsdebug.h index 384e6eb2a7..799325fcee 100644 --- a/src/util/rsdebug.h +++ b/src/util/rsdebug.h @@ -38,6 +38,10 @@ #include "util/rsmacrosugar.hpp" +#ifdef ERROR +#undef ERROR +#endif + #ifdef __ANDROID__ enum class RsLoggerCategories { From ef67686d9e60a947dc1ec6d0f9ba31b1247580de Mon Sep 17 00:00:00 2001 From: jolavillette Date: Tue, 19 May 2026 07:57:49 +0200 Subject: [PATCH 04/22] Fix RNP include paths and jsonapi recompilation cache in CMake --- CMakeLists.txt | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 88f9a382c6..08e8e89d41 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -245,6 +245,7 @@ else() set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17) endif() + ## As of today libretroshare doesn't hide implementation details properly so it ## is necessary to flag all implementation headers as public target_include_directories( @@ -299,8 +300,8 @@ target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) if(RS_RNPLIB) # Add RNP build directories to linker search path target_link_directories(${PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_BINARY_DIR}/../supportlibs/librnp/Build/src/lib - ${CMAKE_CURRENT_BINARY_DIR}/../supportlibs/librnp/Build/src/libsexpp + ${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib + ${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/libsexpp ) # Link libraries by name, including RNP libs and dependencies first @@ -311,7 +312,7 @@ if(RS_RNPLIB) target_include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/include" - "${CMAKE_CURRENT_BINARY_DIR}/../supportlibs/librnp/Build/src/lib" + "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib" ) else() @@ -430,19 +431,21 @@ if(RS_JSON_API) JSONAPI_GENERATOR_EXECUTABLE "${JSONAPI_GENERATOR_SOURCE_DIR}/jsonapi-generator.py" ) - file( - COPY "src/jsonapi/jsonapi-generator-doxygen.conf" - DESTINATION "${JSON_API_GENERATOR_WORK_DIR}" ) - - file( - APPEND - "${JSON_API_GENERATOR_DOXYFILE}" - "OUTPUT_DIRECTORY=${JSONAPI_GENERATOR_OUTPUT_DIR}\n" - "INPUT=${CMAKE_CURRENT_SOURCE_DIR}/src/\n" - "EXCLUDE=" - " ${CMAKE_CURRENT_SOURCE_DIR}/src/tests" - " ${CMAKE_CURRENT_SOURCE_DIR}/src/unused" - " ${CMAKE_CURRENT_SOURCE_DIR}/src/unfinished\n" ) + if(NOT EXISTS "${JSON_API_GENERATOR_DOXYFILE}") + file( + COPY "src/jsonapi/jsonapi-generator-doxygen.conf" + DESTINATION "${JSON_API_GENERATOR_WORK_DIR}" ) + + file( + APPEND + "${JSON_API_GENERATOR_DOXYFILE}" + "OUTPUT_DIRECTORY=${JSONAPI_GENERATOR_OUTPUT_DIR}\n" + "INPUT=${CMAKE_CURRENT_SOURCE_DIR}/src/\n" + "EXCLUDE=" + " ${CMAKE_CURRENT_SOURCE_DIR}/src/tests" + " ${CMAKE_CURRENT_SOURCE_DIR}/src/unused" + " ${CMAKE_CURRENT_SOURCE_DIR}/src/unfinished\n" ) + endif() add_custom_command( OUTPUT @@ -465,6 +468,8 @@ if(RS_JSON_API) set(BUILD_TESTS OFF CACHE BOOL "Do not build restbed tests") set(BUILD_SSL OFF CACHE BOOL "Do not build restbed SSL support") + set(BUILD_SHARED_LIBRARY OFF) + set(BUILD_SHARED_LIBS OFF) set(RESTBED_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/restbed/") if(RS_ANDROID) @@ -498,13 +503,18 @@ if(RS_JSON_API) GIT_SHALLOW TRUE GIT_PROGRESS TRUE TIMEOUT 10 -# EXCLUDE_FROM_ALL # Available only in CMake >= 3.28 + PATCH_COMMAND sed -i -e "s|/wd4251||g" -e "s|VERSION 3.1.0|VERSION 3.5.0|g" CMakeLists.txt ) FetchContent_MakeAvailable(restbed) + if(TARGET restbed-shared) + set_target_properties(restbed-shared PROPERTIES EXCLUDE_FROM_ALL TRUE) + endif() + target_include_directories( ${PROJECT_NAME} PUBLIC ${restbed_SOURCE_DIR}/source/ ) target_link_libraries(${PROJECT_NAME} PRIVATE restbed-static) + endif() From 39df2f2300587f49ee687a1c76c1daf09ac05e05 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Tue, 19 May 2026 11:55:25 +0200 Subject: [PATCH 05/22] build(cmake): support dynamic plugin linkage by exposing RNP directories --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08e8e89d41..17d769dade 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -299,7 +299,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) if(RS_RNPLIB) # Add RNP build directories to linker search path - target_link_directories(${PROJECT_NAME} PRIVATE + target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib ${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/libsexpp ) @@ -786,3 +786,4 @@ if(RS_CPPTRACE_STACKTRACE) target_compile_definitions( ${LIBRARY_NAME} PRIVATE RS_JEREMY_RIFKIN_CPPTRACE ) endif(RS_CPPTRACE_STACKTRACE) + From ed9415168818e702021b30f15e35e8edfbd33d53 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Wed, 20 May 2026 13:59:41 +0200 Subject: [PATCH 06/22] Build: WIN32: use FetchContent restbed 4.8 with bundled ASIO instead of local submodule --- CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dac014bc6e..db5acae8b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -490,7 +490,10 @@ if(RS_JSON_API) ## should be sent upstream. ## Restbed is therefore compiled by Android toolchain preparation script target_link_libraries(${PROJECT_NAME} PRIVATE restbed) - elseif(EXISTS "${RESTBED_DEVEL_DIR}/CMakeLists.txt") + elseif(NOT WIN32 AND EXISTS "${RESTBED_DEVEL_DIR}/CMakeLists.txt") + ## On Windows, skip the local submodule: recent restbed HEAD requires + ## system ASIO (not available by default on MSYS2/MinGW). Fall through + ## to FetchContent which downloads restbed 4.8 with bundled ASIO. message( STATUS "Restbed submodule found at ${RESTBED_DEVEL_DIR} using it" ) add_subdirectory( From 60e127ec548794d95731ed73b4981b6f073c012d Mon Sep 17 00:00:00 2001 From: jolavillette Date: Wed, 20 May 2026 19:39:38 +0200 Subject: [PATCH 07/22] build: encapsulate RNP and PGP dependencies as PUBLIC targets --- CMakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 17d769dade..45e804a332 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -298,6 +298,8 @@ target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) ################################################################################ if(RS_RNPLIB) + find_library(BOTAN_LIBRARY NAMES botan botan-3 botan-2 libbotan-3 libbotan-2 REQUIRED) + # Add RNP build directories to linker search path target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib @@ -305,9 +307,13 @@ if(RS_RNPLIB) ) # Link libraries by name, including RNP libs and dependencies first - target_link_libraries(${PROJECT_NAME} PRIVATE + target_link_libraries(${PROJECT_NAME} PUBLIC rnp # Link by name sexpp + ${BOTAN_LIBRARY} + json-c + bz2 + z ) target_include_directories(${PROJECT_NAME} PUBLIC From c9804e8f320e62b1db0284c90e4d3e5992225f5d Mon Sep 17 00:00:00 2001 From: jolavillette Date: Thu, 21 May 2026 03:02:33 +0200 Subject: [PATCH 08/22] build: use target_compile_options instead of global CMAKE_CXX_FLAGS --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 45e804a332..3fe716a426 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -692,7 +692,7 @@ endif(RS_ANDROID) ################################################################################ -set( CMAKE_CXX_FLAGS "-Wno-deprecated-declarations" ) +target_compile_options(${PROJECT_NAME} PRIVATE -Wno-deprecated-declarations) target_compile_definitions(${PROJECT_NAME} PUBLIC RS_NO_WARN_DEPRECATED ) set(V_VERSION_SET OFF) From ad0dcf686e5f2db97b727ed169de068c5ab873c5 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Thu, 21 May 2026 08:22:08 +0200 Subject: [PATCH 09/22] build: fix deprecation warning encapsulation and set default RS_WARN_DEPRECATED to OFF --- CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fe716a426..576381c77c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,7 +101,7 @@ cmake_dependent_option( option( RS_WARN_DEPRECATED "Print warning about RetroShare deprecated components usage during build" - ON ) + OFF ) option( RS_WARN_LESS @@ -635,7 +635,7 @@ if(RS_BRODCAST_DISCOVERY) endif(RS_BRODCAST_DISCOVERY) if(NOT RS_WARN_DEPRECATED) - target_compile_definitions(${PROJECT_NAME} PRIVATE RS_NO_WARN_DEPRECATED) + target_compile_definitions(${PROJECT_NAME} PUBLIC RS_NO_WARN_DEPRECATED) target_compile_options( ${PROJECT_NAME} PRIVATE -Wno-deprecated -Wno-deprecated-declarations ) @@ -692,8 +692,6 @@ endif(RS_ANDROID) ################################################################################ -target_compile_options(${PROJECT_NAME} PRIVATE -Wno-deprecated-declarations) -target_compile_definitions(${PROJECT_NAME} PUBLIC RS_NO_WARN_DEPRECATED ) set(V_VERSION_SET OFF) From dc0347bca50b66174137e0a1a5ecb01c314d3133 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Fri, 22 May 2026 04:41:04 +0200 Subject: [PATCH 10/22] build: disable LTO on Windows to bypass GCC 15 thunk link bug --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1467a04b2..86964d58af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -787,7 +787,7 @@ if(RS_ANDROID AND CMAKE_BUILD_TYPE STREQUAL "Release") set_property(TARGET ${PROJECT_NAME} PROPERTY VISIBILITY_INLINES_HIDDEN ON) endif() -if(CMAKE_BUILD_TYPE STREQUAL "Release") +if(CMAKE_BUILD_TYPE STREQUAL "Release" AND NOT WIN32) set_property(TARGET ${PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION ON) endif() From 72041cfeedfccd3d01bfdad6e013d1836ccb7558 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Sun, 24 May 2026 02:03:54 +0200 Subject: [PATCH 11/22] cmake: configure libretroshare as DLL on Windows and restrict exported symbols to avoid PE limit --- CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 86964d58af..7cd3a510f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -227,6 +227,13 @@ if(RS_LIBRETROSHARE_SHARED) ## Ensure statically linked libraries such as openpgpsdk are compiled with ## PIC Which is needed for shared library set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + if(WIN32) + set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--export-all-symbols,--exclude-libs,libcrypto.a:libssl.a:libsqlite3.a:libopenpgpsdk.a:libbitdht.a:librestbed.a:librestbed-static.a:libminiupnpc.a:librnp.a:libsexpp.a:libbotan.a:libbotan-3.a:libbotan-2.a:libz.a:libbz2.a:libjson-c.a") + endif() + endif() endif(RS_LIBRETROSHARE_SHARED) if(RS_ANDROID) From f98b61f0a57913230842a421352564f4af28fcfb Mon Sep 17 00:00:00 2001 From: jolavillette Date: Sun, 31 May 2026 16:27:38 +0200 Subject: [PATCH 12/22] CMake: Dynamically find RNP include paths to support macOS and custom build dirs --- CMakeLists.txt | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cd3a510f0..6e4969c317 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -335,9 +335,28 @@ if(RS_RNPLIB) z ) + find_path(RNP_INCLUDE_DIR + NAMES rnp/rnp.h + PATHS + "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/include" + "/opt/homebrew/include" + "/usr/local/include" + DOC "Path to RNP headers" + ) + + find_path(RNP_EXPORT_INCLUDE_DIR + NAMES rnp/rnp_export.h + PATHS + "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib" + "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/build/src/lib" + "/opt/homebrew/include" + "/usr/local/include" + DOC "Path to RNP generated export headers" + ) + target_include_directories(${PROJECT_NAME} PUBLIC - "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/include" - "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib" + "${RNP_INCLUDE_DIR}" + "${RNP_EXPORT_INCLUDE_DIR}" ) else() From b60973cc04a00c1cf5620c5b633b524405d55cb8 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Mon, 1 Jun 2026 12:58:00 +0200 Subject: [PATCH 13/22] fix(build): conditionally compile I2P SAMv3 support and link sam3 library --- CMakeLists.txt | 3 +++ src/CMakeLists.txt | 24 ++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e4969c317..67c519ddf4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -834,3 +834,6 @@ if(RS_CPPTRACE_STACKTRACE) ${LIBRARY_NAME} PRIVATE RS_JEREMY_RIFKIN_CPPTRACE ) endif(RS_CPPTRACE_STACKTRACE) +if(RS_USE_I2P_SAM3) + target_link_libraries(${PROJECT_NAME} PRIVATE sam3) +endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index def1b2e9ea..19360affdc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -340,10 +340,14 @@ list( pqi/pqistreamer.h pqi/pqithreadstreamer.h pqi/sslfns.h ) - -#./pqi/pqissli2psam3.cpp -#./pqi/pqissli2psam3.h - +if(RS_USE_I2P_SAM3) + list(APPEND RS_SOURCES + pqi/pqissli2psam3.cpp + ) + list(APPEND RS_IMPLEMENTATION_HEADERS + pqi/pqissli2psam3.h + ) +endif() list( APPEND RS_SOURCES rsitems/rsbanlistitems.cc @@ -477,11 +481,15 @@ list( serialiser/rstlvmaps.h serialiser/rstlvstring.h serialiser/rstypeserializer.h ) - # ./services/autoproxy -#./services/autoproxy/p3i2psam3.cpp -#./services/autoproxy/p3i2psam3.h - +if(RS_USE_I2P_SAM3) + list(APPEND RS_SOURCES + services/autoproxy/p3i2psam3.cpp + ) + list(APPEND RS_IMPLEMENTATION_HEADERS + services/autoproxy/p3i2psam3.h + ) +endif() list( APPEND RS_SOURCES services/autoproxy/rsautoproxymonitor.cc From e7086b28c0095c9854c0e07fe7def1ceabd04340 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Mon, 1 Jun 2026 16:36:29 +0200 Subject: [PATCH 14/22] fix(cmake): add missing target_include_directories for system rapidjson --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 67c519ddf4..6e93dd1bdb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -432,6 +432,9 @@ find_path( if(EXISTS "${RS_RAPIDJSON_INCLUDE}") message( STATUS "RapidJSON found in system at ${RS_RAPIDJSON_INCLUDE}" ) + target_include_directories( + ${PROJECT_NAME} + PUBLIC "${RS_RAPIDJSON_INCLUDE}" ) elseif(EXISTS "${RAPIDJSON_DEVEL_DIR}/CMakeLists.txt") message( STATUS "RapidJSON found in development dir at ${RAPIDJSON_DEVEL_DIR}" ) From e38be45215da0f191e0e6ef5dd6783c459435af2 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Tue, 2 Jun 2026 15:14:42 +0200 Subject: [PATCH 15/22] Address PR review: link heavy cryptographic dependencies (RNP, Botan) privately via absolute paths --- CMakeLists.txt | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e93dd1bdb..7476d925c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -319,16 +319,11 @@ target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) if(RS_RNPLIB) find_library(BOTAN_LIBRARY NAMES botan botan-3 botan-2 libbotan-3 libbotan-2 REQUIRED) - # Add RNP build directories to linker search path - target_link_directories(${PROJECT_NAME} PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib - ${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/libsexpp - ) - - # Link libraries by name, including RNP libs and dependencies first - target_link_libraries(${PROJECT_NAME} PUBLIC - rnp # Link by name - sexpp + # Link RNP libraries by absolute path and with PRIVATE visibility to prevent leaking symbols + # to downstream targets (retroshare-gui, plugins), fixing the Windows "too many symbols" error. + target_link_libraries(${PROJECT_NAME} PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib/${CMAKE_STATIC_LIBRARY_PREFIX}rnp${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/libsexpp/${CMAKE_STATIC_LIBRARY_PREFIX}sexpp${CMAKE_STATIC_LIBRARY_SUFFIX}" ${BOTAN_LIBRARY} json-c bz2 From 6a1d720040d6606d09644ae4fb51f356ba5dd184 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Tue, 2 Jun 2026 15:42:07 +0200 Subject: [PATCH 16/22] Address PR review: set RS_WARN_DEPRECATED back to ON --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7476d925c6..5e5055ae43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,7 +101,7 @@ cmake_dependent_option( option( RS_WARN_DEPRECATED "Print warning about RetroShare deprecated components usage during build" - OFF ) + ON ) option( RS_WARN_LESS From 1f54e958aa708c3b1e983d32786bda7656e40d72 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Tue, 2 Jun 2026 20:08:41 +0200 Subject: [PATCH 17/22] tempory fixes following gio comments on github --- CMakeLists.txt | 33 ++++++++++++++++----------------- src/pqi/sslfns.h | 6 ++++-- src/retroshare/rstor.h | 3 ++- src/util/rsdebug.h | 3 ++- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e5055ae43..fb5ec10283 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -321,6 +321,7 @@ if(RS_RNPLIB) # Link RNP libraries by absolute path and with PRIVATE visibility to prevent leaking symbols # to downstream targets (retroshare-gui, plugins), fixing the Windows "too many symbols" error. + # Note: We use CMAKE_CURRENT_SOURCE_DIR because the librnp Build directory is hardcoded in its custom build script. target_link_libraries(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib/${CMAKE_STATIC_LIBRARY_PREFIX}rnp${CMAKE_STATIC_LIBRARY_SUFFIX}" "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/libsexpp/${CMAKE_STATIC_LIBRARY_PREFIX}sexpp${CMAKE_STATIC_LIBRARY_SUFFIX}" @@ -473,21 +474,16 @@ if(RS_JSON_API) JSONAPI_GENERATOR_EXECUTABLE "${JSONAPI_GENERATOR_SOURCE_DIR}/jsonapi-generator.py" ) - if(NOT EXISTS "${JSON_API_GENERATOR_DOXYFILE}") - file( - COPY "src/jsonapi/jsonapi-generator-doxygen.conf" - DESTINATION "${JSON_API_GENERATOR_WORK_DIR}" ) - - file( - APPEND - "${JSON_API_GENERATOR_DOXYFILE}" - "OUTPUT_DIRECTORY=${JSONAPI_GENERATOR_OUTPUT_DIR}\n" - "INPUT=${CMAKE_CURRENT_SOURCE_DIR}/src/\n" - "EXCLUDE=" - " ${CMAKE_CURRENT_SOURCE_DIR}/src/tests" - " ${CMAKE_CURRENT_SOURCE_DIR}/src/unused" - " ${CMAKE_CURRENT_SOURCE_DIR}/src/unfinished\n" ) - endif() + file(READ "src/jsonapi/jsonapi-generator-doxygen.conf" DOXYFILE_CONTENT) + string(APPEND DOXYFILE_CONTENT + "\nOUTPUT_DIRECTORY=${JSONAPI_GENERATOR_OUTPUT_DIR}\n" + "INPUT=${CMAKE_CURRENT_SOURCE_DIR}/src/\n" + "EXCLUDE=" + " ${CMAKE_CURRENT_SOURCE_DIR}/src/tests" + " ${CMAKE_CURRENT_SOURCE_DIR}/src/unused" + " ${CMAKE_CURRENT_SOURCE_DIR}/src/unfinished\n" + ) + file(WRITE "${JSON_API_GENERATOR_DOXYFILE}" "${DOXYFILE_CONTENT}") add_custom_command( OUTPUT @@ -510,8 +506,8 @@ if(RS_JSON_API) set(BUILD_TESTS OFF CACHE BOOL "Do not build restbed tests") set(BUILD_SSL OFF CACHE BOOL "Do not build restbed SSL support") - set(BUILD_SHARED_LIBRARY OFF) - set(BUILD_SHARED_LIBS OFF) + set(BUILD_SHARED_LIBRARY ${RS_LIBRETROSHARE_SHARED}) + set(BUILD_SHARED_LIBS ${RS_LIBRETROSHARE_SHARED}) set(RESTBED_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/restbed/") if(RS_ANDROID) @@ -548,6 +544,9 @@ if(RS_JSON_API) GIT_SHALLOW TRUE GIT_PROGRESS TRUE TIMEOUT 10 + # PATCH_COMMAND applies hotfixes to restbed before building: + # 1. Removes /wd4251 (MSVC-specific flag) that breaks GCC/Clang builds. + # 2. Bumps CMake minimum version to 3.5.0 to suppress deprecation warnings in CMake >= 3.27. PATCH_COMMAND sed -i -e "s|/wd4251||g" -e "s|VERSION 3.1.0|VERSION 3.5.0|g" CMakeLists.txt ) FetchContent_MakeAvailable(restbed) diff --git a/src/pqi/sslfns.h b/src/pqi/sslfns.h index 560d84c458..c1029831e6 100644 --- a/src/pqi/sslfns.h +++ b/src/pqi/sslfns.h @@ -28,10 +28,12 @@ /******************** notify of new Cert **************************/ -#ifdef X509_NAME +#if defined(WINDOWS_SYS) && defined(X509_NAME) +// Workaround: Windows headers () define X509_NAME which conflicts with RetroShare types. #undef X509_NAME #endif -#ifdef X509_EXTENSIONS +#if defined(WINDOWS_SYS) && defined(X509_EXTENSIONS) +// Workaround: Windows headers () define X509_EXTENSIONS which conflicts with RetroShare types. #undef X509_EXTENSIONS #endif diff --git a/src/retroshare/rstor.h b/src/retroshare/rstor.h index 9f22dcbbbb..5c5b63ebbf 100644 --- a/src/retroshare/rstor.h +++ b/src/retroshare/rstor.h @@ -41,7 +41,8 @@ enum class RsTorManagerEventCode: uint8_t TOR_MANAGER_STOPPED = 0x06, }; -#ifdef ERROR +#if defined(WINDOWS_SYS) && defined(ERROR) +// Workaround: Windows headers () define ERROR as 0, which breaks enum members named ERROR. #undef ERROR #endif diff --git a/src/util/rsdebug.h b/src/util/rsdebug.h index 799325fcee..173d235029 100644 --- a/src/util/rsdebug.h +++ b/src/util/rsdebug.h @@ -38,7 +38,8 @@ #include "util/rsmacrosugar.hpp" -#ifdef ERROR +#if defined(WINDOWS_SYS) && defined(ERROR) +// Workaround: Windows headers () define ERROR as 0, which breaks enum members named ERROR. #undef ERROR #endif From 2225487f9c911bef523cf2757210d4d298ed6e70 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Tue, 2 Jun 2026 23:36:31 +0200 Subject: [PATCH 18/22] tempory fixes #2 following gio comments on github --- CMakeLists.txt | 66 ++++++++++++++++++------------------------ src/retroshare/rstor.h | 4 --- src/util/rsdebug.h | 4 --- 3 files changed, 28 insertions(+), 46 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb5ec10283..5cf76ba9be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -230,8 +230,10 @@ if(RS_LIBRETROSHARE_SHARED) if(WIN32) set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + # Add WIN32_LEAN_AND_MEAN to prevent from including and polluting the global namespace with macros like ERROR + target_compile_definitions(${PROJECT_NAME} PUBLIC WIN32_LEAN_AND_MEAN) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--export-all-symbols,--exclude-libs,libcrypto.a:libssl.a:libsqlite3.a:libopenpgpsdk.a:libbitdht.a:librestbed.a:librestbed-static.a:libminiupnpc.a:librnp.a:libsexpp.a:libbotan.a:libbotan-3.a:libbotan-2.a:libz.a:libbz2.a:libjson-c.a") + target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--export-all-symbols,--exclude-libs,ALL") endif() endif() endif(RS_LIBRETROSHARE_SHARED) @@ -319,40 +321,19 @@ target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) if(RS_RNPLIB) find_library(BOTAN_LIBRARY NAMES botan botan-3 botan-2 libbotan-3 libbotan-2 REQUIRED) - # Link RNP libraries by absolute path and with PRIVATE visibility to prevent leaking symbols - # to downstream targets (retroshare-gui, plugins), fixing the Windows "too many symbols" error. - # Note: We use CMAKE_CURRENT_SOURCE_DIR because the librnp Build directory is hardcoded in its custom build script. - target_link_libraries(${PROJECT_NAME} PRIVATE - "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib/${CMAKE_STATIC_LIBRARY_PREFIX}rnp${CMAKE_STATIC_LIBRARY_SUFFIX}" - "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/libsexpp/${CMAKE_STATIC_LIBRARY_PREFIX}sexpp${CMAKE_STATIC_LIBRARY_SUFFIX}" - ${BOTAN_LIBRARY} - json-c - bz2 - z - ) - - find_path(RNP_INCLUDE_DIR - NAMES rnp/rnp.h - PATHS - "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/include" - "/opt/homebrew/include" - "/usr/local/include" - DOC "Path to RNP headers" - ) + set(BUILD_TESTING OFF CACHE BOOL "Disable librnp tests" FORCE) + set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build static librnp" FORCE) + set(DOWNLOAD_GTEST OFF CACHE BOOL "Disable downloading Googletest" FORCE) + add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp" "${CMAKE_CURRENT_BINARY_DIR}/librnp") - find_path(RNP_EXPORT_INCLUDE_DIR - NAMES rnp/rnp_export.h - PATHS - "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/Build/src/lib" - "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/build/src/lib" - "/opt/homebrew/include" - "/usr/local/include" - DOC "Path to RNP generated export headers" + target_link_libraries(${PROJECT_NAME} PRIVATE + librnp + sexpp ) target_include_directories(${PROJECT_NAME} PUBLIC - "${RNP_INCLUDE_DIR}" - "${RNP_EXPORT_INCLUDE_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp/include" + "${CMAKE_CURRENT_BINARY_DIR}/librnp/src/lib" ) else() @@ -529,10 +510,14 @@ if(RS_JSON_API) # EXCLUDE_FROM_ALL prevent executing install directives from included # dependencies see https://stackoverflow.com/a/64900982 + set(RESTBED_TARGET restbed-static) + if(TARGET restbed-shared AND BUILD_SHARED_LIBS) + set(RESTBED_TARGET restbed-shared) + endif() + target_include_directories( ${PROJECT_NAME} PUBLIC "${RESTBED_DEVEL_DIR}/source/" ) - target_link_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/../supportlibs/restbed") - target_link_libraries(${PROJECT_NAME} PRIVATE restbed-static) + target_link_libraries(${PROJECT_NAME} PRIVATE ${RESTBED_TARGET}) else() message( WARNING "FetchContent restbed, will be installed if you run make install") @@ -551,15 +536,16 @@ if(RS_JSON_API) ) FetchContent_MakeAvailable(restbed) - if(TARGET restbed-shared) - set_target_properties(restbed-shared PROPERTIES EXCLUDE_FROM_ALL TRUE) + set(RESTBED_TARGET restbed-static) + if(TARGET restbed-shared AND BUILD_SHARED_LIBS) + set(RESTBED_TARGET restbed-shared) endif() target_include_directories( ${PROJECT_NAME} PUBLIC ${restbed_SOURCE_DIR}/source/ ) - target_link_libraries(${PROJECT_NAME} PRIVATE restbed-static) + target_link_libraries(${PROJECT_NAME} PRIVATE ${RESTBED_TARGET}) if(WIN32) - target_link_libraries(restbed-static INTERFACE ws2_32 winmm iphlpapi mswsock) + target_link_libraries(${RESTBED_TARGET} PUBLIC ws2_32 winmm iphlpapi mswsock) endif() endif() @@ -675,7 +661,7 @@ if(RS_BRODCAST_DISCOVERY) endif(RS_BRODCAST_DISCOVERY) if(NOT RS_WARN_DEPRECATED) - target_compile_definitions(${PROJECT_NAME} PUBLIC RS_NO_WARN_DEPRECATED) + target_compile_definitions(${PROJECT_NAME} PRIVATE RS_NO_WARN_DEPRECATED) target_compile_options( ${PROJECT_NAME} PRIVATE -Wno-deprecated -Wno-deprecated-declarations ) @@ -810,6 +796,10 @@ if(RS_ANDROID AND CMAKE_BUILD_TYPE STREQUAL "Release") set_property(TARGET ${PROJECT_NAME} PROPERTY VISIBILITY_INLINES_HIDDEN ON) endif() +# Note: Disabling LTO (Interprocedural Optimization) on Windows is necessary for RetroShare +# because enabling it causes the MinGW linker (ld) to run out of memory or exhaust the maximum +# number of exported symbols due to the massive code size. While this makes the binary fatter +# and slower, it prevents fatal build failures. if(CMAKE_BUILD_TYPE STREQUAL "Release" AND NOT WIN32) set_property(TARGET ${PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION ON) endif() diff --git a/src/retroshare/rstor.h b/src/retroshare/rstor.h index 5c5b63ebbf..d61b2a08a4 100644 --- a/src/retroshare/rstor.h +++ b/src/retroshare/rstor.h @@ -41,10 +41,6 @@ enum class RsTorManagerEventCode: uint8_t TOR_MANAGER_STOPPED = 0x06, }; -#if defined(WINDOWS_SYS) && defined(ERROR) -// Workaround: Windows headers () define ERROR as 0, which breaks enum members named ERROR. -#undef ERROR -#endif // Status of the Tor hidden service setup/loaded by RS diff --git a/src/util/rsdebug.h b/src/util/rsdebug.h index 173d235029..d6da14e39e 100644 --- a/src/util/rsdebug.h +++ b/src/util/rsdebug.h @@ -38,10 +38,6 @@ #include "util/rsmacrosugar.hpp" -#if defined(WINDOWS_SYS) && defined(ERROR) -// Workaround: Windows headers () define ERROR as 0, which breaks enum members named ERROR. -#undef ERROR -#endif #ifdef __ANDROID__ enum class RsLoggerCategories From 8e42c18fb7c2bcc5c89c700f2ae36a4fc7a7aca4 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Wed, 3 Jun 2026 13:21:00 +0200 Subject: [PATCH 19/22] CMake: build librnp as a subdirectory + Windows build fixes - Build librnp via add_subdirectory under RS_RNPLIB, saving/restoring BUILD_SHARED_LIBS so libretroshare stays shared while librnp is static. - Windows: propagate UNICODE/_UNICODE to subprojects, link winmm/iphlpapi, attach socket libs to whichever restbed target exists. Co-Authored-By: Claude Opus 4.8 (1M context) --- CMakeLists.txt | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cf76ba9be..392571e0d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,11 @@ include(GNUInstallDirs) set(FETCHCONTENT_QUIET OFF) include(FetchContent) +if(WIN32) + # Force Unicode mappings for Windows API (fixes MoveFileEx and similar errors) + add_definitions(-DUNICODE -D_UNICODE) +endif() + option( RS_SQLCIPHER "SQLCipher encryption for GXS database" @@ -264,7 +269,7 @@ if(WIN32) NOMINMAX NOCRYPT WIN_DLL_EXPORT ) - target_link_libraries(${PROJECT_NAME} PUBLIC ws2_32) + target_link_libraries(${PROJECT_NAME} PUBLIC ws2_32 winmm iphlpapi) endif() ## As of today libretroshare doesn't hide implementation details properly so it @@ -320,11 +325,14 @@ target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) if(RS_RNPLIB) find_library(BOTAN_LIBRARY NAMES botan botan-3 botan-2 libbotan-3 libbotan-2 REQUIRED) - - set(BUILD_TESTING OFF CACHE BOOL "Disable librnp tests" FORCE) - set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build static librnp" FORCE) - set(DOWNLOAD_GTEST OFF CACHE BOOL "Disable downloading Googletest" FORCE) + # librnp + set(SAVED_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) + set(BUILD_TESTING OFF) + set(BUILD_SHARED_LIBS OFF) + set(DOWNLOAD_GTEST OFF) + set(ENABLE_DOC OFF CACHE BOOL "Disable librnp docs" FORCE) add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../supportlibs/librnp" "${CMAKE_CURRENT_BINARY_DIR}/librnp") + set(BUILD_SHARED_LIBS ${SAVED_BUILD_SHARED_LIBS}) target_link_libraries(${PROJECT_NAME} PRIVATE librnp @@ -545,7 +553,12 @@ if(RS_JSON_API) ${PROJECT_NAME} PUBLIC ${restbed_SOURCE_DIR}/source/ ) target_link_libraries(${PROJECT_NAME} PRIVATE ${RESTBED_TARGET}) if(WIN32) - target_link_libraries(${RESTBED_TARGET} PUBLIC ws2_32 winmm iphlpapi mswsock) + if(TARGET restbed-static) + target_link_libraries(restbed-static PUBLIC ws2_32 winmm iphlpapi mswsock) + endif() + if(TARGET restbed-shared) + target_link_libraries(restbed-shared PUBLIC ws2_32 winmm iphlpapi mswsock) + endif() endif() endif() From 8d09daf22d4a39903a80ce31dba32623b9429f9a Mon Sep 17 00:00:00 2001 From: jolavillette Date: Wed, 3 Jun 2026 18:02:17 +0200 Subject: [PATCH 20/22] fix(cmake): apply WIN32_LEAN_AND_MEAN to the static lib too and drop the sslfns.h X509_NAME/X509_EXTENSIONS #undef workaround --- CMakeLists.txt | 11 +++++++++-- src/pqi/sslfns.h | 13 ++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 392571e0d1..6f23fb1e95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,14 +235,21 @@ if(RS_LIBRETROSHARE_SHARED) if(WIN32) set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) - # Add WIN32_LEAN_AND_MEAN to prevent from including and polluting the global namespace with macros like ERROR - target_compile_definitions(${PROJECT_NAME} PUBLIC WIN32_LEAN_AND_MEAN) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--export-all-symbols,--exclude-libs,ALL") endif() endif() endif(RS_LIBRETROSHARE_SHARED) +if(WIN32) + # Define WIN32_LEAN_AND_MEAN for both the static and shared library targets + # to prevent from including extra headers such as + # (which pollutes the global namespace with macros like ERROR) and + # (whose X509_NAME / X509_EXTENSIONS macros collide with the + # OpenSSL types of the same name used in pqi/sslfns.h). + target_compile_definitions(${PROJECT_NAME} PUBLIC WIN32_LEAN_AND_MEAN) +endif() + if(RS_ANDROID) # As of today Android NDK libc++ doesn't support std::filesystem properly, # in a very confusing manner the headers have the function declarations but diff --git a/src/pqi/sslfns.h b/src/pqi/sslfns.h index c1029831e6..7027dbba11 100644 --- a/src/pqi/sslfns.h +++ b/src/pqi/sslfns.h @@ -28,15 +28,10 @@ /******************** notify of new Cert **************************/ -#if defined(WINDOWS_SYS) && defined(X509_NAME) -// Workaround: Windows headers () define X509_NAME which conflicts with RetroShare types. -#undef X509_NAME -#endif -#if defined(WINDOWS_SYS) && defined(X509_EXTENSIONS) -// Workaround: Windows headers () define X509_EXTENSIONS which conflicts with RetroShare types. -#undef X509_EXTENSIONS -#endif - +/* OpenSSL's X509_NAME and X509_EXTENSIONS types collide with macros of the + * same name defined by Windows' . We rely on WIN32_LEAN_AND_MEAN + * (set by the build system) to keep from pulling in , + * rather than #undef-ing those macros here. */ #include #include From 29a6dd39564e6f7451e688c2a70f6925ab3480e3 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Thu, 4 Jun 2026 15:21:57 +0200 Subject: [PATCH 21/22] fix(cmake): use explicit --exclude-libs list instead of ALL on Windows --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f23fb1e95..8d73ed911b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -236,7 +236,7 @@ if(RS_LIBRETROSHARE_SHARED) if(WIN32) set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--export-all-symbols,--exclude-libs,ALL") + target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--export-all-symbols,--exclude-libs,libbitdht.a:librnp.a:libsexpp.a:libudp-discovery.a:librestbed.a:libsqlcipher.a:libbotan-2.a:libbotan-3.a:libz.a:libbz2.a") endif() endif() endif(RS_LIBRETROSHARE_SHARED) @@ -818,8 +818,8 @@ endif() # Note: Disabling LTO (Interprocedural Optimization) on Windows is necessary for RetroShare # because enabling it causes the MinGW linker (ld) to run out of memory or exhaust the maximum -# number of exported symbols due to the massive code size. While this makes the binary fatter -# and slower, it prevents fatal build failures. +# number of exported symbols, or emit "multiple definition" errors during LTO code generation. +# While this makes the binary fatter and slower, it prevents fatal build failures. if(CMAKE_BUILD_TYPE STREQUAL "Release" AND NOT WIN32) set_property(TARGET ${PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION ON) endif() From b38ba510522b769ddf90f42cd234b5410bd09517 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Thu, 4 Jun 2026 20:59:49 +0200 Subject: [PATCH 22/22] fix(cmake): address PR review comments for Windows build - Add detailed comments explaining the necessity of an explicit --exclude-libs list over ALL (due to CMake objects.a export stripping). - Group WIN32_LEAN_AND_MEAN with other Windows compile definitions. - Add inline comments explaining each Windows compile definition (_UNICODE, NOGDI, NOMINMAX, NOCRYPT). - Remove dead find_library(BOTAN_LIBRARY) code now that librnp is a CMake subdirectory. --- CMakeLists.txt | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d73ed911b..cc53b58f40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -236,19 +236,15 @@ if(RS_LIBRETROSHARE_SHARED) if(WIN32) set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + # We must use an explicit list of heavy 3rd-party archives instead of "ALL" for --exclude-libs. + # Using "ALL" also hides symbols from CMake's internal objects.a archive (created by WINDOWS_EXPORT_ALL_SYMBOLS), + # which prevents libretroshare from exporting its own core C++ symbols, causing massive linkage errors downstream. target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--export-all-symbols,--exclude-libs,libbitdht.a:librnp.a:libsexpp.a:libudp-discovery.a:librestbed.a:libsqlcipher.a:libbotan-2.a:libbotan-3.a:libz.a:libbz2.a") endif() endif() endif(RS_LIBRETROSHARE_SHARED) -if(WIN32) - # Define WIN32_LEAN_AND_MEAN for both the static and shared library targets - # to prevent from including extra headers such as - # (which pollutes the global namespace with macros like ERROR) and - # (whose X509_NAME / X509_EXTENSIONS macros collide with the - # OpenSSL types of the same name used in pqi/sslfns.h). - target_compile_definitions(${PROJECT_NAME} PUBLIC WIN32_LEAN_AND_MEAN) -endif() + if(RS_ANDROID) # As of today Android NDK libc++ doesn't support std::filesystem properly, @@ -270,11 +266,17 @@ if(WIN32) target_compile_definitions( ${PROJECT_NAME} PUBLIC WINDOWS_SYS + # Forces the Windows API to use wide-char variants (e.g. MoveFileExW) UNICODE _UNICODE + # Prevents from pulling in which #defines ERROR NOGDI + # Prevents from defining min/max macros that break std::min/max NOMINMAX + # Prevents from pulling in which shadows OpenSSL X509 types NOCRYPT + # Prevents from including extra headers and polluting the namespace + WIN32_LEAN_AND_MEAN WIN_DLL_EXPORT ) target_link_libraries(${PROJECT_NAME} PUBLIC ws2_32 winmm iphlpapi) endif() @@ -331,7 +333,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto) ################################################################################ if(RS_RNPLIB) - find_library(BOTAN_LIBRARY NAMES botan botan-3 botan-2 libbotan-3 libbotan-2 REQUIRED) + # librnp set(SAVED_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) set(BUILD_TESTING OFF)