Optimize monorepo unified build paths, Botan package lookups, and Makefile orchestrator

This commit is contained in:
jolavillette 2026-05-19 07:58:00 +02:00
parent a6c9695168
commit ff60b62868
4 changed files with 154 additions and 87 deletions

View File

@ -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)

View File

@ -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})

View File

@ -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)

View File

@ -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)