diff --git a/Makefile b/Makefile index cd0197e2e..6fa0a4334 100644 --- a/Makefile +++ b/Makefile @@ -9,56 +9,95 @@ RS_WEBUI ?= ON RS_DEVELOPMENT_BUILD ?= OFF CMAKE_BUILD_TYPE ?= +# Detect Windows MSYS2 / MinGW environment to force Makefile generation +ifeq ($(OS),Windows_NT) + CMAKE_GEN ?= -G "MSYS Makefiles" +else + CMAKE_GEN ?= +endif + +# Global CMake flags (forces policy compatibility for old submodules like libbitdht) +CMAKE_FLAGS ?= -DCMAKE_POLICY_VERSION_MINIMUM=3.5 + # Dynamically detect number of CPUs (defaults to 4 if not found) NPROC ?= $(shell nproc 2>/dev/null || echo 4) +# Global build directory at the root +BUILD_DIR = Build + .PHONY: all clean rnp libretroshare retroshare-service retroshare-friendserver retroshare-gui -# Note: retroshare-gui is intentionally excluded from the default 'all' target -# as its UI CMakeLists.txt files are broken originally. -# This allows compiling everything else (servers/services) with guaranteed success. -all: rnp libretroshare retroshare-service retroshare-friendserver - @echo "================================================================================" - @echo " SUCCESS: All functional RetroShare modules have been compiled successfully! " - @echo "================================================================================" +all: rnp + @echo ">>> Compiling all functional RetroShare modules..." + mkdir -p $(BUILD_DIR) + cd $(BUILD_DIR) && cmake $(CMAKE_GEN) $(CMAKE_FLAGS) \ + -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) \ + -DRS_RNPLIB=$(RS_RNPLIB) \ + -DRS_JSON_API=$(RS_JSON_API) \ + -DRS_WEBUI=$(RS_WEBUI) \ + -DRS_GUI=ON \ + -DRS_SERVICE=ON \ + -DRS_FRIENDSERVER=ON \ + .. && make -j$(NPROC) rnp: @echo ">>> Step 1: Compiling RNP..." mkdir -p supportlibs/librnp/Build - cd supportlibs/librnp/Build && cmake -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) -DCRYPTO_BACKEND=botan -DBUILD_TESTING=off .. && make -j$(NPROC) + cd supportlibs/librnp/Build && cmake $(CMAKE_GEN) $(CMAKE_FLAGS) -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) -DCRYPTO_BACKEND=botan -DBUILD_TESTING=off .. && make -j$(NPROC) libretroshare: rnp @echo ">>> Step 2: Compiling libretroshare..." - rm -rf libretroshare/supportlibs - ln -s ../supportlibs libretroshare/supportlibs - mkdir -p libretroshare/Build - cd libretroshare/Build && cmake -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) -DRS_JSON_API=$(RS_JSON_API) -DRS_WEBUI=$(RS_WEBUI) .. && make -j$(NPROC) + mkdir -p $(BUILD_DIR) + cd $(BUILD_DIR) && cmake $(CMAKE_GEN) $(CMAKE_FLAGS) \ + -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) \ + -DRS_RNPLIB=$(RS_RNPLIB) \ + -DRS_JSON_API=$(RS_JSON_API) \ + -DRS_WEBUI=$(RS_WEBUI) \ + -DRS_GUI=OFF \ + -DRS_SERVICE=OFF \ + -DRS_FRIENDSERVER=OFF \ + .. && make -j$(NPROC) retroshare retroshare-service: rnp @echo ">>> Step 3: Compiling retroshare-service..." - rm -rf retroshare-service/Build - mkdir -p retroshare-service/Build - ln -s ../../supportlibs retroshare-service/Build/supportlibs - cd retroshare-service/Build && cmake -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) -DRS_RNPLIB=$(RS_RNPLIB) -DRS_WEBUI=$(RS_WEBUI) .. && make -j$(NPROC) + mkdir -p $(BUILD_DIR) + cd $(BUILD_DIR) && cmake $(CMAKE_GEN) $(CMAKE_FLAGS) \ + -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) \ + -DRS_RNPLIB=$(RS_RNPLIB) \ + -DRS_JSON_API=$(RS_JSON_API) \ + -DRS_WEBUI=$(RS_WEBUI) \ + -DRS_GUI=OFF \ + -DRS_SERVICE=ON \ + -DRS_FRIENDSERVER=OFF \ + .. && make -j$(NPROC) retroshare-service retroshare-friendserver: rnp @echo ">>> Step 4: Compiling retroshare-friendserver..." - rm -rf retroshare-friendserver/Build - mkdir -p retroshare-friendserver/Build - ln -s ../../supportlibs retroshare-friendserver/Build/supportlibs - cd retroshare-friendserver/Build && cmake -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) -DRS_RNPLIB=$(RS_RNPLIB) .. && make -j$(NPROC) + mkdir -p $(BUILD_DIR) + cd $(BUILD_DIR) && cmake $(CMAKE_GEN) $(CMAKE_FLAGS) \ + -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) \ + -DRS_RNPLIB=$(RS_RNPLIB) \ + -DRS_JSON_API=$(RS_JSON_API) \ + -DRS_WEBUI=$(RS_WEBUI) \ + -DRS_GUI=OFF \ + -DRS_SERVICE=OFF \ + -DRS_FRIENDSERVER=ON \ + .. && make -j$(NPROC) retroshare-friendserver -# Target for compiling the GUI application retroshare-gui: rnp @echo ">>> Step 5: Compiling retroshare-gui (UI)..." - mkdir -p retroshare-gui/Build - if [ ! -L retroshare-gui/Build/supportlibs ]; then ln -s ../../supportlibs retroshare-gui/Build/supportlibs; fi - cd retroshare-gui/Build && cmake -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) -DRS_DEVELOPMENT_BUILD=$(RS_DEVELOPMENT_BUILD) -DRS_JSON_API=$(RS_JSON_API) -DRS_WEBUI=$(RS_WEBUI) .. && make -j$(NPROC) + mkdir -p $(BUILD_DIR) + cd $(BUILD_DIR) && cmake $(CMAKE_GEN) $(CMAKE_FLAGS) \ + -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) \ + -DRS_RNPLIB=$(RS_RNPLIB) \ + -DRS_JSON_API=$(RS_JSON_API) \ + -DRS_WEBUI=$(RS_WEBUI) \ + -DRS_GUI=ON \ + -DRS_SERVICE=OFF \ + -DRS_FRIENDSERVER=OFF \ + .. && make -j$(NPROC) retroshare-gui clean: @echo "Cleaning up all build directories..." rm -rf supportlibs/librnp/Build - rm -rf libretroshare/Build libretroshare/supportlibs - rm -rf retroshare-service/Build - rm -rf retroshare-friendserver/Build - rm -rf retroshare-gui/Build + rm -rf $(BUILD_DIR) diff --git a/retroshare-friendserver/CMakeLists.txt b/retroshare-friendserver/CMakeLists.txt index d85eef15f..18a840128 100644 --- a/retroshare-friendserver/CMakeLists.txt +++ b/retroshare-friendserver/CMakeLists.txt @@ -45,21 +45,23 @@ target_compile_options(${PROJECT_NAME} PRIVATE -Wno-deprecated-declarations) # Find libretroshare -set(LIBRETROSHARE_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../libretroshare/") -if(EXISTS "${LIBRETROSHARE_DEVEL_DIR}/CMakeLists.txt" ) - message(STATUS "libretroshare source found at ${LIBRETROSHARE_DEVEL_DIR} using it" ) - add_subdirectory("${LIBRETROSHARE_DEVEL_DIR}" "${CMAKE_BINARY_DIR}/libretroshare" ) -else() - include(FetchContent) - FetchContent_Declare( - libretroshare - GIT_REPOSITORY "https://github.com/RetroShare/libretroshare.git" - GIT_TAG "origin/master" - GIT_SHALLOW TRUE - GIT_PROGRESS TRUE - TIMEOUT 10 - ) - FetchContent_MakeAvailable(libretroshare) +if(NOT TARGET retroshare) + set(LIBRETROSHARE_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../libretroshare/") + if(EXISTS "${LIBRETROSHARE_DEVEL_DIR}/CMakeLists.txt" ) + message(STATUS "libretroshare source found at ${LIBRETROSHARE_DEVEL_DIR} using it" ) + add_subdirectory("${LIBRETROSHARE_DEVEL_DIR}" "${CMAKE_BINARY_DIR}/libretroshare" ) + else() + include(FetchContent) + FetchContent_Declare( + libretroshare + GIT_REPOSITORY "https://github.com/RetroShare/libretroshare.git" + GIT_TAG "origin/master" + GIT_SHALLOW TRUE + GIT_PROGRESS TRUE + TIMEOUT 10 + ) + FetchContent_MakeAvailable(libretroshare) + endif() endif() # Include directories @@ -71,17 +73,19 @@ target_include_directories(${PROJECT_NAME} PRIVATE target_link_libraries(${PROJECT_NAME} PRIVATE retroshare) 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} 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 target_link_libraries(${PROJECT_NAME} PRIVATE rnp # Link by name sexpp - botan-2 + ${BOTAN_LIBRARY} json-c bz2 z @@ -92,4 +96,8 @@ endif(RS_RNPLIB) # Link only libretroshare, it should handle its own dependencies now target_link_libraries(${PROJECT_NAME} PRIVATE retroshare) +if(WIN32) + target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32 winmm iphlpapi mswsock) +endif() + install(TARGETS ${PROJECT_NAME} DESTINATION ${RS_BIN_INSTALL_DIR}) diff --git a/retroshare-gui/CMakeLists.txt b/retroshare-gui/CMakeLists.txt index 2e44d8bd6..a3d0d68d9 100644 --- a/retroshare-gui/CMakeLists.txt +++ b/retroshare-gui/CMakeLists.txt @@ -35,6 +35,11 @@ option( set(RS_JSON_API ON CACHE BOOL "Use restbed to expose libretroshare as JSON API via HTTP" FORCE) +option( + RS_USE_NATIVE_DIALOGS + "Enable native dialogs (replaces CONFIG+=rs_use_native_dialogs)" + OFF ) + option( RS_SERVICE_DESKTOP "Install icons and shortcuts for desktop environements" @@ -123,7 +128,11 @@ add_executable(${PROJECT_NAME} ${RS_GUI_SOURCES} ${RS_IMPLEMENTATION_HEADERS} ${ set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "retroshare") install(TARGETS ${PROJECT_NAME} DESTINATION ${RS_BIN_INSTALL_DIR}) -include_directories( ${CMAKE_BINARY_DIR} ) +if(RS_USE_NATIVE_DIALOGS) + target_compile_definitions(${PROJECT_NAME} PRIVATE RS_NATIVEDIALOGS) +endif() + +include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) ################################################################################ @@ -133,23 +142,25 @@ endif(RS_DEVELOPMENT_BUILD) ################################################################################ -set(LIBRETROSHARE_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../libretroshare/") -if(EXISTS "${LIBRETROSHARE_DEVEL_DIR}/.git" ) - message( - STATUS - "libretroshare submodule found at ${LIBRETROSHARE_DEVEL_DIR} using it" ) - add_subdirectory( - "${LIBRETROSHARE_DEVEL_DIR}" "${CMAKE_BINARY_DIR}/libretroshare" ) -else() - FetchContent_Declare( - libretroshare - GIT_REPOSITORY "https://gitlab.com/RetroShare/libretroshare.git" - GIT_TAG "origin/master" - GIT_SHALLOW TRUE - GIT_PROGRESS TRUE - TIMEOUT 10 - ) - FetchContent_MakeAvailable(libretroshare) +if(NOT TARGET retroshare) + set(LIBRETROSHARE_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../libretroshare/") + if(EXISTS "${LIBRETROSHARE_DEVEL_DIR}/.git" ) + message( + STATUS + "libretroshare submodule found at ${LIBRETROSHARE_DEVEL_DIR} using it" ) + add_subdirectory( + "${LIBRETROSHARE_DEVEL_DIR}" "${CMAKE_BINARY_DIR}/libretroshare" ) + else() + FetchContent_Declare( + libretroshare + GIT_REPOSITORY "https://gitlab.com/RetroShare/libretroshare.git" + GIT_TAG "origin/master" + GIT_SHALLOW TRUE + GIT_PROGRESS TRUE + TIMEOUT 10 + ) + FetchContent_MakeAvailable(libretroshare) + endif() endif() target_include_directories(${PROJECT_NAME} PRIVATE ${LIBRETROSHARE_DEVEL_DIR}/src/) @@ -506,6 +517,8 @@ if(RS_GXS_CIRCLES) target_compile_definitions(${PROJECT_NAME} PRIVATE RS_USE_CIRCLES ) endif(RS_GXS_CIRCLES) -target_link_libraries(${PROJECT_NAME} PRIVATE retroshare) -target_link_libraries(${PROJECT_NAME} PRIVATE -Wl,--no-as-needed z bz2 json-c botan-2 -Wl,--as-needed) +find_library(BOTAN_LIBRARY NAMES botan botan-3 botan-2 libbotan-3 libbotan-2 REQUIRED) + +target_link_libraries(${PROJECT_NAME} PRIVATE retroshare) +target_link_libraries(${PROJECT_NAME} PRIVATE -Wl,--no-as-needed z bz2 json-c ${BOTAN_LIBRARY} -Wl,--as-needed) diff --git a/retroshare-service/CMakeLists.txt b/retroshare-service/CMakeLists.txt index abc7cd5b3..448014d46 100644 --- a/retroshare-service/CMakeLists.txt +++ b/retroshare-service/CMakeLists.txt @@ -110,23 +110,25 @@ endif(RS_DEVELOPMENT_BUILD) ################################################################################ -set(LIBRETROSHARE_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../libretroshare/") -if(EXISTS "${LIBRETROSHARE_DEVEL_DIR}/CMakeLists.txt" ) - message( - STATUS - "libretroshare source found at ${LIBRETROSHARE_DEVEL_DIR} using it" ) - add_subdirectory( - "${LIBRETROSHARE_DEVEL_DIR}" "${CMAKE_BINARY_DIR}/libretroshare" ) -else() - FetchContent_Declare( - libretroshare - GIT_REPOSITORY "https://github.com/RetroShare/libretroshare.git" - GIT_TAG "origin/master" - GIT_SHALLOW TRUE - GIT_PROGRESS TRUE - TIMEOUT 10 - ) - FetchContent_MakeAvailable(libretroshare) +if(NOT TARGET retroshare) + set(LIBRETROSHARE_DEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../libretroshare/") + if(EXISTS "${LIBRETROSHARE_DEVEL_DIR}/CMakeLists.txt" ) + message( + STATUS + "libretroshare source found at ${LIBRETROSHARE_DEVEL_DIR} using it" ) + add_subdirectory( + "${LIBRETROSHARE_DEVEL_DIR}" "${CMAKE_BINARY_DIR}/libretroshare" ) + else() + FetchContent_Declare( + libretroshare + GIT_REPOSITORY "https://github.com/RetroShare/libretroshare.git" + GIT_TAG "origin/master" + GIT_SHALLOW TRUE + GIT_PROGRESS TRUE + TIMEOUT 10 + ) + FetchContent_MakeAvailable(libretroshare) + endif() endif() target_link_libraries(${PROJECT_NAME} PRIVATE retroshare) @@ -134,17 +136,19 @@ target_link_libraries(${PROJECT_NAME} PRIVATE retroshare) ################################################################################ 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} 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 target_link_libraries(${PROJECT_NAME} PRIVATE rnp # Link by name sexpp - botan-2 + ${BOTAN_LIBRARY} json-c bz2 z @@ -160,9 +164,12 @@ endif(RS_RNPLIB) # ${JSONC_INCLUDE_DIRS} # ) -# Link only libretroshare, it should handle its own dependencies now target_link_libraries(${PROJECT_NAME} PRIVATE retroshare) +if(WIN32) + target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32 winmm iphlpapi mswsock) +endif() + ################################################################################ if(RS_SERVICE_DESKTOP)