mirror of
https://github.com/RetroShare/RetroShare.git
synced 2026-09-13 18:46:04 +05:00
Compare commits
No commits in common. "master" and "v0.6.6-RC1" have entirely different histories.
master
...
v0.6.6-RC1
83
.github/workflows/ci-macOS.yml
vendored
83
.github/workflows/ci-macOS.yml
vendored
@ -1,83 +0,0 @@
|
||||
name: macOS Build
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow}}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: macos-14
|
||||
permissions:
|
||||
actions: write
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
steps:
|
||||
- name: Setup XCode
|
||||
uses: maxim-lobanov/setup-xcode@v1
|
||||
with:
|
||||
xcode-version: 15.0.1
|
||||
|
||||
- name: Show current version of Xcode
|
||||
run: xcodebuild -version
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Homebrew
|
||||
id: set-up-homebrew
|
||||
uses: Homebrew/actions/setup-homebrew@main
|
||||
|
||||
- name: Show OpenSSL version
|
||||
run: pkg-config --cflags libcrypto
|
||||
|
||||
- name: Install Packages
|
||||
run: brew install openssl
|
||||
miniupnpc
|
||||
rapidjson
|
||||
sqlcipher
|
||||
bzip2
|
||||
zlib
|
||||
botan@2
|
||||
libxslt
|
||||
libxml2
|
||||
qt
|
||||
|
||||
- name: Checkout submodules
|
||||
run: |
|
||||
env
|
||||
git submodule update --init --remote libbitdht/ libretroshare/ retroshare-webui/
|
||||
git submodule update --init supportlibs/librnp supportlibs/rapidjson supportlibs/restbed openpgpsdk/
|
||||
|
||||
- name: CI-Build
|
||||
run: |
|
||||
qmake6 . -r "CONFIG+=rs_macos14.0" "CONFIG+=release" "CONFIG+=rs_autologin" "CONFIG+=no_rs_sam3" "CONFIG+=no_rs_sam3_libsam3" "CONFIG+=rs_no_rnplib" \
|
||||
INCLUDEPATH+="/opt/homebrew/opt/openssl@3/include" \
|
||||
INCLUDEPATH+="/opt/homebrew/opt/rapidjson/include" \
|
||||
INCLUDEPATH+="/opt/homebrew/opt/sqlcipher/include" \
|
||||
INCLUDEPATH+="/opt/homebrew/opt/miniupnpc/include" \
|
||||
INCLUDEPATH+="/opt/homebrew/opt/libxslt/include" \
|
||||
INCLUDEPATH+="/opt/homebrew/opt/libxml2/include" \
|
||||
QMAKE_LIBDIR+="/opt/homebrew/opt/openssl@3/lib" \
|
||||
QMAKE_LIBDIR+="/opt/homebrew/opt/rapidjson/lib" \
|
||||
QMAKE_LIBDIR+="/opt/homebrew/opt/sqlcipher/lib" \
|
||||
QMAKE_LIBDIR+="/opt/homebrew/opt/miniupnpc/lib" \
|
||||
QMAKE_LIBDIR+="/opt/homebrew/opt/libxslt/lib" \
|
||||
QMAKE_LIBDIR+="/opt/homebrew/opt/libxml2/lib" \
|
||||
CONFIG+=no_retroshare_service \
|
||||
CONFIG+=no_retroshare_friendserver
|
||||
make
|
||||
76
.github/workflows/ci-mingw64-Qt6.yml
vendored
76
.github/workflows/ci-mingw64-Qt6.yml
vendored
@ -1,76 +0,0 @@
|
||||
name: MINGW64 Qt6 Build
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow}}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
permissions:
|
||||
actions: write
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup MSYS2
|
||||
uses: msys2/setup-msys2@40677d36a502eb2cf0fb808cc9dec31bf6152638 # v2.28.0
|
||||
with:
|
||||
msystem: MINGW64
|
||||
update: true
|
||||
install: >-
|
||||
base-devel
|
||||
git
|
||||
wget
|
||||
p7zip
|
||||
gcc
|
||||
perl
|
||||
ruby
|
||||
doxygen
|
||||
cmake
|
||||
mingw-w64-x86_64-toolchain
|
||||
mingw-w64-x86_64-miniupnpc
|
||||
mingw-w64-x86_64-libxslt
|
||||
mingw-w64-x86_64-xapian-core
|
||||
mingw-w64-x86_64-sqlcipher
|
||||
mingw-w64-x86_64-qt6-base
|
||||
mingw-w64-x86_64-qt6-multimedia
|
||||
mingw-w64-x86_64-qt6
|
||||
mingw-w64-x86_64-ccmake
|
||||
mingw-w64-x86_64-rapidjson
|
||||
mingw-w64-x86_64-json-c
|
||||
mingw-w64-x86_64-libbotan
|
||||
mingw-w64-x86_64-asio
|
||||
|
||||
- name: Checkout submodules
|
||||
run: |
|
||||
env
|
||||
git submodule update --init --remote libbitdht/ libretroshare/ retroshare-webui/
|
||||
git submodule update --init supportlibs/librnp supportlibs/rapidjson supportlibs/restbed
|
||||
|
||||
- name: Workaround librnp strlen build regression
|
||||
run: |
|
||||
FILE="supportlibs/librnp/src/lib/crypto/mem.cpp"
|
||||
grep -q '#include <cstring>' "$FILE" || sed -i '/#include <cstdio>/a #include <cstring>' "$FILE"
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
qmake6 . -r -spec win32-g++ "CONFIG+=release" "CONFIG+=rs_autologin" "CONFIG+=no_rs_sam3" "CONFIG+=no_rs_sam3_libsam3"
|
||||
mingw32-make -j3
|
||||
75
.github/workflows/ci-mingw64.yml
vendored
75
.github/workflows/ci-mingw64.yml
vendored
@ -1,75 +0,0 @@
|
||||
name: MINGW64 Qt5 Build
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow}}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
permissions:
|
||||
actions: write
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup MSYS2
|
||||
uses: msys2/setup-msys2@40677d36a502eb2cf0fb808cc9dec31bf6152638 # v2.28.0
|
||||
with:
|
||||
msystem: MINGW64
|
||||
update: true
|
||||
install: >-
|
||||
base-devel
|
||||
git
|
||||
wget
|
||||
p7zip
|
||||
gcc
|
||||
perl
|
||||
ruby
|
||||
doxygen
|
||||
cmake
|
||||
mingw-w64-x86_64-toolchain
|
||||
mingw-w64-x86_64-miniupnpc
|
||||
mingw-w64-x86_64-libxslt
|
||||
mingw-w64-x86_64-xapian-core
|
||||
mingw-w64-x86_64-sqlcipher
|
||||
mingw-w64-x86_64-qt5-base
|
||||
mingw-w64-x86_64-qt5-multimedia
|
||||
mingw-w64-x86_64-ccmake
|
||||
mingw-w64-x86_64-rapidjson
|
||||
mingw-w64-x86_64-json-c
|
||||
mingw-w64-x86_64-libbotan
|
||||
mingw-w64-x86_64-asio
|
||||
|
||||
- name: Checkout submodules
|
||||
run: |
|
||||
env
|
||||
git submodule update --init --remote libbitdht/ libretroshare/ retroshare-webui/
|
||||
git submodule update --init supportlibs/librnp supportlibs/rapidjson supportlibs/restbed
|
||||
|
||||
- name: Workaround librnp strlen build regression
|
||||
run: |
|
||||
FILE="supportlibs/librnp/src/lib/crypto/mem.cpp"
|
||||
grep -q '#include <cstring>' "$FILE" || sed -i '/#include <cstdio>/a #include <cstring>' "$FILE"
|
||||
|
||||
- name: CI-Build
|
||||
run: |
|
||||
qmake-qt5.exe . -r -spec win32-g++ "CONFIG+=release" "CONFIG+=rs_autologin" "CONFIG+=no_rs_sam3" "CONFIG+=no_rs_sam3_libsam3"
|
||||
mingw32-make -j3
|
||||
89
.github/workflows/macos-cmake-qt6.yml
vendored
89
.github/workflows/macos-cmake-qt6.yml
vendored
@ -1,89 +0,0 @@
|
||||
# macOS CMake CI for the RetroShare super-project built against Qt6.
|
||||
#
|
||||
# Qt6 counterpart of macos-cmake.yml. Same whole-tree build and Homebrew flag
|
||||
# harvesting, but installs the `qt` formula (Qt6, which bundles qt5compat, svg,
|
||||
# multimedia and tools) instead of qt@5, and builds with plugins OFF (VOIP still
|
||||
# uses the Qt5-era QtMultimedia API; out of scope for this migration).
|
||||
#
|
||||
# Submodules are initialised WITHOUT --remote so libretroshare stays on its
|
||||
# pinned, CMake-enabled commit.
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
name: macOS CMake C/C++ CI (Qt6)
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: macOS 14 / Qt6 / CMake
|
||||
runs-on: macos-14
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Same pinned-commit init as the Ubuntu CMake CI (no --remote); librnp needs
|
||||
# --recursive for its nested src/libsexpp.
|
||||
- name: Init submodules (pinned commits)
|
||||
run: |
|
||||
git submodule update --init \
|
||||
libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/
|
||||
git submodule update --init --recursive \
|
||||
supportlibs/librnp
|
||||
git submodule update --init \
|
||||
supportlibs/restbed supportlibs/libsam3 \
|
||||
supportlibs/udp-discovery-cpp supportlibs/rapidjson
|
||||
git --no-pager -C libretroshare log --max-count 1 --oneline
|
||||
|
||||
- name: Install Homebrew dependencies
|
||||
run: >
|
||||
brew install
|
||||
ninja qt openssl@3 botan@2 sqlcipher miniupnpc
|
||||
json-c asio speex speexdsp ffmpeg
|
||||
libxml2 libxslt bzip2 zlib rapidjson doxygen
|
||||
|
||||
# Mirrors the validated local macOS command: harvest every Homebrew opt/*
|
||||
# include/lib dir into the compiler/linker flags, and additionally expose them
|
||||
# to find_package() via CMAKE_PREFIX_PATH (needed for keg-only botan@2…).
|
||||
- name: CMake configure
|
||||
run: |
|
||||
HB="$(brew --prefix)"
|
||||
QT6="$(brew --prefix qt)"
|
||||
IFLAGS="-I$HB/include"; for d in "$HB"/opt/*/include; do IFLAGS="$IFLAGS -I$d"; done
|
||||
LFLAGS="-L$HB/lib"; for d in "$HB"/opt/*/lib; do LFLAGS="$LFLAGS -L$d"; done
|
||||
# qt (Qt6) first so find_package(QT NAMES Qt6 Qt5) resolves to this config.
|
||||
PREFIX="$QT6;$HB"; for d in "$HB"/opt/*; do PREFIX="$PREFIX;$d"; done
|
||||
cmake -G Ninja -B Build-cmake -S . \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_PREFIX_PATH="$PREFIX" \
|
||||
-DQt6_DIR="$QT6/lib/cmake/Qt6" \
|
||||
-DOPENSSL_ROOT_DIR="$(brew --prefix openssl@3)" \
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON \
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON -DRS_PLUGINS=OFF -DRS_FORUM_DEEP_INDEX=OFF \
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON \
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON \
|
||||
-DCMAKE_C_FLAGS="$IFLAGS" -DCMAKE_CXX_FLAGS="$IFLAGS" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="$LFLAGS" \
|
||||
-DCMAKE_SHARED_LINKER_FLAGS="$LFLAGS" \
|
||||
-DCMAKE_MODULE_LINKER_FLAGS="$LFLAGS"
|
||||
|
||||
- name: CMake build
|
||||
run: cmake --build Build-cmake -j$(sysctl -n hw.ncpu)
|
||||
90
.github/workflows/macos-cmake.yml
vendored
90
.github/workflows/macos-cmake.yml
vendored
@ -1,90 +0,0 @@
|
||||
# macOS CMake CI for the RetroShare super-project (root aggregate build).
|
||||
#
|
||||
# CMake counterpart of the legacy qmake ci-macOS.yml. Unlike that one (which
|
||||
# disables service/friendserver/sam3/rnp), this builds the WHOLE tree with the
|
||||
# same feature set as the Linux CMake CI, using the user's validated local macOS
|
||||
# command (Homebrew -I/-L flag harvesting).
|
||||
#
|
||||
# Submodules are initialised WITHOUT --remote (identical to ubuntu-cmake.yml) so
|
||||
# libretroshare stays on its pinned, CMake-enabled commit.
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
name: macOS CMake C/C++ CI
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: macOS 14 / Qt5 / CMake
|
||||
runs-on: macos-14
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Same pinned-commit init as the Ubuntu CMake CI (no --remote); librnp needs
|
||||
# --recursive for its nested src/libsexpp.
|
||||
- name: Init submodules (pinned commits)
|
||||
run: |
|
||||
git submodule update --init \
|
||||
libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/
|
||||
git submodule update --init --recursive \
|
||||
supportlibs/librnp
|
||||
git submodule update --init \
|
||||
supportlibs/restbed supportlibs/libsam3 \
|
||||
supportlibs/udp-discovery-cpp supportlibs/rapidjson
|
||||
git --no-pager -C libretroshare log --max-count 1 --oneline
|
||||
|
||||
- name: Install Homebrew dependencies
|
||||
run: >
|
||||
brew install
|
||||
ninja qt@5 openssl@3 botan@2 sqlcipher miniupnpc
|
||||
json-c asio speex speexdsp ffmpeg
|
||||
libxml2 libxslt bzip2 zlib rapidjson doxygen
|
||||
|
||||
# Mirrors the validated local macOS command: harvest every Homebrew opt/*
|
||||
# include/lib dir into the compiler/linker flags, and additionally expose them
|
||||
# to find_package() via CMAKE_PREFIX_PATH (needed for keg-only qt@5, botan@2…).
|
||||
- name: CMake configure
|
||||
run: |
|
||||
HB="$(brew --prefix)"
|
||||
QT5="$(brew --prefix qt@5)"
|
||||
IFLAGS="-I$HB/include"; for d in "$HB"/opt/*/include; do IFLAGS="$IFLAGS -I$d"; done
|
||||
LFLAGS="-L$HB/lib"; for d in "$HB"/opt/*/lib; do LFLAGS="$LFLAGS -L$d"; done
|
||||
# qt@5 first so find_package(Qt5) picks the keg-only (correct) config, not a
|
||||
# broken Qt5 config that may sit directly under the Homebrew prefix.
|
||||
PREFIX="$QT5;$HB"; for d in "$HB"/opt/*; do PREFIX="$PREFIX;$d"; done
|
||||
cmake -G Ninja -B Build-cmake -S . \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_PREFIX_PATH="$PREFIX" \
|
||||
-DQt5_DIR="$QT5/lib/cmake/Qt5" \
|
||||
-DOPENSSL_ROOT_DIR="$(brew --prefix openssl@3)" \
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON \
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON -DRS_PLUGINS=ON -DRS_FORUM_DEEP_INDEX=OFF \
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON \
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON \
|
||||
-DCMAKE_C_FLAGS="$IFLAGS" -DCMAKE_CXX_FLAGS="$IFLAGS" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="$LFLAGS" \
|
||||
-DCMAKE_SHARED_LINKER_FLAGS="$LFLAGS" \
|
||||
-DCMAKE_MODULE_LINKER_FLAGS="$LFLAGS"
|
||||
|
||||
- name: CMake build
|
||||
run: cmake --build Build-cmake -j$(sysctl -n hw.ncpu)
|
||||
30
.github/workflows/mirror-to-gitlab.yml
vendored
30
.github/workflows/mirror-to-gitlab.yml
vendored
@ -1,30 +0,0 @@
|
||||
name: Mirror to GitLab
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '**'
|
||||
tags:
|
||||
- '**'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
mirror:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Install GitLab deploy key
|
||||
uses: webfactory/ssh-agent@v0.9.0
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.RETROSHARE_GITLAB_MIRROR_SSH_KEY }}
|
||||
|
||||
- name: Trust GitLab host key
|
||||
run: |
|
||||
ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
|
||||
|
||||
- name: Mirror repository to GitLab
|
||||
run: |
|
||||
git clone --bare "https://github.com/${GITHUB_REPOSITORY}.git" repo.git
|
||||
cd repo.git
|
||||
git remote set-url --push origin git@gitlab.com:RetroShare/RetroShare.git
|
||||
git push --prune origin 'refs/heads/*:refs/heads/*' 'refs/tags/*:refs/tags/*'
|
||||
86
.github/workflows/ubuntu-cmake-qt6.yml
vendored
86
.github/workflows/ubuntu-cmake-qt6.yml
vendored
@ -1,86 +0,0 @@
|
||||
# Ubuntu CMake CI for the RetroShare super-project built against Qt6.
|
||||
#
|
||||
# This is the Qt6 counterpart of ubuntu-cmake.yml (which builds against Qt5).
|
||||
# It exercises the version-agnostic Qt detection added to
|
||||
# retroshare-gui/CMakeLists.txt (find_package(QT NAMES Qt6 Qt5 ...)).
|
||||
#
|
||||
# Scope note: plugins are built OFF here. The VOIP plugin still uses the Qt5-era
|
||||
# QtMultimedia API (QAudioInput/QAudioOutput/QCameraInfo, removed/redesigned in
|
||||
# Qt6) and FeedReader's CMake still hardcodes Qt5; both are out of scope for the
|
||||
# Qt6 GUI migration and are intentionally excluded until ported.
|
||||
#
|
||||
# As in ubuntu-cmake.yml, submodules are initialised WITHOUT --remote so the
|
||||
# pinned, CMake-enabled commits are used.
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
name: Ubuntu CMake C/C++ CI (Qt6)
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Ubuntu 24.04 / Qt6 / CMake
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
# NOTE: no --remote here (on purpose) so the pinned, CMake-enabled commits
|
||||
# are checked out. librnp needs --recursive for its nested src/libsexpp.
|
||||
- name: Init submodules (pinned commits)
|
||||
run: |
|
||||
git submodule update --init \
|
||||
libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/
|
||||
git submodule update --init --recursive \
|
||||
supportlibs/librnp
|
||||
git submodule update --init \
|
||||
supportlibs/restbed supportlibs/libsam3 \
|
||||
supportlibs/udp-discovery-cpp supportlibs/rapidjson
|
||||
git --no-pager -C libretroshare log --max-count 1 --oneline
|
||||
|
||||
- name: apt update
|
||||
run: sudo apt-get update
|
||||
|
||||
- name: apt install build dependencies
|
||||
run: >
|
||||
sudo apt-get install -y
|
||||
build-essential g++ cmake ninja-build pkg-config git
|
||||
qt6-base-dev qt6-base-dev-tools qt6-multimedia-dev libqt6svg6-dev
|
||||
qt6-5compat-dev libqt6core5compat6-dev qt6-tools-dev qt6-tools-dev-tools
|
||||
libssl-dev zlib1g-dev libbz2-dev libbotan-2-dev libjson-c-dev
|
||||
libasio-dev libsqlcipher-dev
|
||||
libspeex-dev libspeexdsp-dev libminiupnpc-dev
|
||||
libavcodec-dev libavutil-dev
|
||||
libx11-dev libxss-dev
|
||||
libxml2-dev libxslt1-dev libcurl4-openssl-dev
|
||||
doxygen python3
|
||||
|
||||
- name: print working directory
|
||||
run: pwd && ls -la
|
||||
|
||||
# Mirrors ubuntu-cmake.yml but selects Qt6 (qmake6 / Qt6 cmake config are the
|
||||
# only Qt available on the runner) and keeps plugins OFF (see scope note).
|
||||
- name: CMake configure
|
||||
run: >
|
||||
cmake -G Ninja -B Build-cmake -S .
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||
-DCMAKE_BUILD_TYPE=Release
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON
|
||||
-DRS_PLUGINS=OFF -DRS_FORUM_DEEP_INDEX=OFF
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON
|
||||
|
||||
- name: CMake build
|
||||
run: cmake --build Build-cmake -j$(nproc)
|
||||
83
.github/workflows/ubuntu-cmake.yml
vendored
83
.github/workflows/ubuntu-cmake.yml
vendored
@ -1,83 +0,0 @@
|
||||
# Ubuntu CMake CI for the RetroShare super-project (root aggregate build).
|
||||
#
|
||||
# This is the CMake counterpart of the legacy qmake workflows
|
||||
# (ubuntu-qt5_c-cpp.yml / ubuntu-qt6_c-cpp.yml). It builds the WHOLE tree from
|
||||
# the top-level CMakeLists.txt: libretroshare + retroshare-gui + service +
|
||||
# friendserver + plugins, with the JSON API / WebUI enabled.
|
||||
#
|
||||
# Key difference vs the qmake CI: submodules are initialised WITHOUT --remote, so
|
||||
# libretroshare stays on the commit pinned by this super-project (a CMake-enabled
|
||||
# commit that lives on master). Using --remote would move it to the latest upstream
|
||||
# tip and could pull a non-CMake state, breaking the build.
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
name: Ubuntu CMake C/C++ CI
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Ubuntu 22.04 / Qt5 / CMake
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
# NOTE: no --remote here (on purpose) so the pinned, CMake-enabled commits
|
||||
# are checked out. librnp needs --recursive for its nested src/libsexpp.
|
||||
- name: Init submodules (pinned commits)
|
||||
run: |
|
||||
git submodule update --init \
|
||||
libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/
|
||||
git submodule update --init --recursive \
|
||||
supportlibs/librnp
|
||||
git submodule update --init \
|
||||
supportlibs/restbed supportlibs/libsam3 \
|
||||
supportlibs/udp-discovery-cpp supportlibs/rapidjson
|
||||
git --no-pager -C libretroshare log --max-count 1 --oneline
|
||||
|
||||
- name: apt update
|
||||
run: sudo apt-get update
|
||||
|
||||
- name: apt install build dependencies
|
||||
run: >
|
||||
sudo apt-get install -y
|
||||
build-essential g++ cmake ninja-build pkg-config git
|
||||
qtbase5-dev qtbase5-dev-tools qtmultimedia5-dev libqt5svg5-dev
|
||||
libqt5x11extras5-dev qttools5-dev qttools5-dev-tools
|
||||
libssl-dev zlib1g-dev libbz2-dev libbotan-2-dev libjson-c-dev
|
||||
libasio-dev libsqlcipher-dev
|
||||
libspeex-dev libspeexdsp-dev libminiupnpc-dev
|
||||
libavcodec-dev libavutil-dev
|
||||
libx11-dev libxss-dev
|
||||
libxml2-dev libxslt1-dev libcurl4-openssl-dev
|
||||
doxygen python3
|
||||
|
||||
- name: print working directory
|
||||
run: pwd && ls -la
|
||||
|
||||
# Mirrors the validated local Linux build command.
|
||||
- name: CMake configure
|
||||
run: >
|
||||
cmake -G Ninja -B Build-cmake -S .
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||
-DCMAKE_BUILD_TYPE=Release
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON
|
||||
-DRS_PLUGINS=ON -DRS_FORUM_DEEP_INDEX=OFF
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON
|
||||
|
||||
- name: CMake build
|
||||
run: cmake --build Build-cmake -j$(nproc)
|
||||
40
.github/workflows/ubuntu-qt5_c-cpp.yml
vendored
40
.github/workflows/ubuntu-qt5_c-cpp.yml
vendored
@ -1,40 +0,0 @@
|
||||
name: Ubuntu Qt 5 C/C++ CI
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: git init
|
||||
run: git submodule update --init --remote libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/ && git --no-pager log --max-count 1
|
||||
- name: git submodule supportlibs
|
||||
run: git submodule update --init supportlibs/librnp supportlibs/restbed #supportlibs/rapidjson
|
||||
- name: run apt update
|
||||
run: sudo apt-get update
|
||||
- name: apt install
|
||||
run: sudo apt-get install g++ cmake qt5-qmake qtmultimedia5-dev libqt5x11extras5-dev libasio-dev libbz2-dev libjson-c-dev libssl-dev libsqlcipher-dev libupnp-dev libxss-dev rapidjson-dev libbotan-2-dev doxygen libsecret-1-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev libavcodec-dev libavutil-dev libspeex-dev libspeexdsp-dev
|
||||
- name: print working directory
|
||||
run: pwd && ls -la
|
||||
- name: qmake
|
||||
run: |
|
||||
qmake CONFIG+=debug \
|
||||
CONFIG+=rs_autologin \
|
||||
CONFIG+=rs_webui \
|
||||
CONFIG+=rs_jsonapi \
|
||||
CONFIG+=wikipoos \
|
||||
CONFIG+=gxsthewire \
|
||||
CONFIG+=retroshare_plugins
|
||||
- name: make
|
||||
run: make
|
||||
- name: make check
|
||||
run: make check
|
||||
40
.github/workflows/ubuntu-qt6_c-cpp.yml
vendored
40
.github/workflows/ubuntu-qt6_c-cpp.yml
vendored
@ -1,40 +0,0 @@
|
||||
name: Ubuntu Qt 6 C/C++ CI
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: git init
|
||||
run: git submodule update --init --remote libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/ && git --no-pager log --max-count 1
|
||||
- name: git submodule supportlibs
|
||||
run: git submodule update --init supportlibs/librnp supportlibs/restbed #supportlibs/rapidjson
|
||||
- name: run apt update
|
||||
run: sudo apt-get update
|
||||
- name: apt install
|
||||
run: sudo apt-get install g++ cmake qt6-base-dev qt6-multimedia-dev libasio-dev libbz2-dev libjson-c-dev libssl-dev libsqlcipher-dev libupnp-dev libxss-dev rapidjson-dev libbotan-2-dev doxygen qt6-5compat-dev libqt6core5compat6-dev libsecret-1-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev
|
||||
- name: print working directory
|
||||
run: pwd && ls -la
|
||||
- name: qmake
|
||||
run: |
|
||||
qmake6 CONFIG+=debug \
|
||||
CONFIG+=rs_autologin \
|
||||
CONFIG+=rs_webui \
|
||||
CONFIG+=rs_jsonapi \
|
||||
CONFIG+=wikipoos \
|
||||
CONFIG+=gxsthewire \
|
||||
CONFIG+=retroshare_plugins
|
||||
- name: make
|
||||
run: make
|
||||
- name: make check
|
||||
run: make check
|
||||
109
.github/workflows/windows-cmake-qt6.yml
vendored
109
.github/workflows/windows-cmake-qt6.yml
vendored
@ -1,109 +0,0 @@
|
||||
# Windows (MSYS2 / UCRT64) CMake CI for the RetroShare super-project built against Qt6.
|
||||
#
|
||||
# Qt6 counterpart of windows-cmake.yml. Same whole-tree build and flags, but the
|
||||
# UCRT64 toolchain installs the qt6-* packages (incl. qt6-5compat for the
|
||||
# Core5Compat module my version-agnostic CMake requires) and plugins are OFF
|
||||
# (VOIP still uses the Qt5-era QtMultimedia API; out of scope for this migration).
|
||||
#
|
||||
# Submodules are initialised WITHOUT --remote so libretroshare stays on its
|
||||
# pinned, CMake-enabled commit.
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
name: Windows UCRT64 CMake C/C++ CI (Qt6)
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Windows UCRT64 / Qt6 / CMake
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup MSYS2 (UCRT64)
|
||||
uses: msys2/setup-msys2@40677d36a502eb2cf0fb808cc9dec31bf6152638 # v2.28.0
|
||||
with:
|
||||
msystem: UCRT64
|
||||
update: true
|
||||
install: >-
|
||||
base-devel
|
||||
git
|
||||
perl
|
||||
ruby
|
||||
mingw-w64-ucrt-x86_64-toolchain
|
||||
mingw-w64-ucrt-x86_64-doxygen
|
||||
mingw-w64-ucrt-x86_64-cmake
|
||||
mingw-w64-ucrt-x86_64-ninja
|
||||
mingw-w64-ucrt-x86_64-python
|
||||
mingw-w64-ucrt-x86_64-qt6-base
|
||||
mingw-w64-ucrt-x86_64-qt6-multimedia
|
||||
mingw-w64-ucrt-x86_64-qt6-svg
|
||||
mingw-w64-ucrt-x86_64-qt6-5compat
|
||||
mingw-w64-ucrt-x86_64-qt6-tools
|
||||
mingw-w64-ucrt-x86_64-openssl
|
||||
mingw-w64-ucrt-x86_64-libbotan
|
||||
mingw-w64-ucrt-x86_64-sqlcipher
|
||||
mingw-w64-ucrt-x86_64-miniupnpc
|
||||
mingw-w64-ucrt-x86_64-json-c
|
||||
mingw-w64-ucrt-x86_64-rapidjson
|
||||
mingw-w64-ucrt-x86_64-asio
|
||||
mingw-w64-ucrt-x86_64-libxml2
|
||||
mingw-w64-ucrt-x86_64-libxslt
|
||||
mingw-w64-ucrt-x86_64-speex
|
||||
mingw-w64-ucrt-x86_64-speexdsp
|
||||
mingw-w64-ucrt-x86_64-ffmpeg
|
||||
mingw-w64-ucrt-x86_64-bzip2
|
||||
mingw-w64-ucrt-x86_64-zlib
|
||||
|
||||
# Same pinned-commit init as the Ubuntu/macOS CMake CI (no --remote); librnp
|
||||
# needs --recursive for its nested src/libsexpp.
|
||||
- name: Init submodules (pinned commits)
|
||||
run: |
|
||||
git submodule update --init \
|
||||
libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/
|
||||
git submodule update --init --recursive \
|
||||
supportlibs/librnp
|
||||
git submodule update --init \
|
||||
supportlibs/restbed supportlibs/libsam3 \
|
||||
supportlibs/udp-discovery-cpp supportlibs/rapidjson
|
||||
git --no-pager -C libretroshare log --max-count 1 --oneline
|
||||
|
||||
# Mirrors windows-cmake.yml (Ninja, shared libretroshare) but with Qt6 and
|
||||
# plugins OFF.
|
||||
- name: CMake configure
|
||||
run: >
|
||||
cmake -G Ninja -B Build-cmake -S .
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||
-DCMAKE_BUILD_TYPE=Release
|
||||
-DRS_LIBRETROSHARE_STATIC=OFF -DRS_LIBRETROSHARE_SHARED=ON
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON
|
||||
-DRS_PLUGINS=OFF -DRS_FORUM_DEEP_INDEX=OFF
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON
|
||||
-DCMAKE_C_FLAGS="-include string.h -include stdint.h"
|
||||
-DCMAKE_CXX_FLAGS="-include cstring -include cstdint -Wno-template-body"
|
||||
|
||||
- name: CMake build
|
||||
run: cmake --build Build-cmake -j3
|
||||
108
.github/workflows/windows-cmake.yml
vendored
108
.github/workflows/windows-cmake.yml
vendored
@ -1,108 +0,0 @@
|
||||
# Windows (MSYS2 / UCRT64) CMake CI for the RetroShare super-project.
|
||||
#
|
||||
# CMake counterpart of the legacy qmake ci-ucrt64.yml. Unlike that one (GUI-only,
|
||||
# sam3 disabled, mingw32-make), this builds the WHOLE tree with the same feature
|
||||
# set as the Linux/macOS CMake CIs, using Ninja and the user's validated local
|
||||
# Windows command (shared libretroshare).
|
||||
#
|
||||
# Submodules are initialised WITHOUT --remote (identical to ubuntu-cmake.yml) so
|
||||
# libretroshare stays on its pinned, CMake-enabled commit. On WIN32 libretroshare
|
||||
# pulls restbed via FetchContent, so the restbed submodule is unused there.
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
name: Windows UCRT64 CMake C/C++ CI
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/*.md'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.head_ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Windows UCRT64 / Qt5 / CMake
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup MSYS2 (UCRT64)
|
||||
uses: msys2/setup-msys2@40677d36a502eb2cf0fb808cc9dec31bf6152638 # v2.28.0
|
||||
with:
|
||||
msystem: UCRT64
|
||||
update: true
|
||||
install: >-
|
||||
base-devel
|
||||
git
|
||||
perl
|
||||
ruby
|
||||
mingw-w64-ucrt-x86_64-toolchain
|
||||
mingw-w64-ucrt-x86_64-doxygen
|
||||
mingw-w64-ucrt-x86_64-cmake
|
||||
mingw-w64-ucrt-x86_64-ninja
|
||||
mingw-w64-ucrt-x86_64-python
|
||||
mingw-w64-ucrt-x86_64-qt5-base
|
||||
mingw-w64-ucrt-x86_64-qt5-multimedia
|
||||
mingw-w64-ucrt-x86_64-qt5-svg
|
||||
mingw-w64-ucrt-x86_64-qt5-tools
|
||||
mingw-w64-ucrt-x86_64-openssl
|
||||
mingw-w64-ucrt-x86_64-libbotan
|
||||
mingw-w64-ucrt-x86_64-sqlcipher
|
||||
mingw-w64-ucrt-x86_64-miniupnpc
|
||||
mingw-w64-ucrt-x86_64-json-c
|
||||
mingw-w64-ucrt-x86_64-rapidjson
|
||||
mingw-w64-ucrt-x86_64-asio
|
||||
mingw-w64-ucrt-x86_64-libxml2
|
||||
mingw-w64-ucrt-x86_64-libxslt
|
||||
mingw-w64-ucrt-x86_64-speex
|
||||
mingw-w64-ucrt-x86_64-speexdsp
|
||||
mingw-w64-ucrt-x86_64-ffmpeg
|
||||
mingw-w64-ucrt-x86_64-bzip2
|
||||
mingw-w64-ucrt-x86_64-zlib
|
||||
|
||||
# Same pinned-commit init as the Ubuntu/macOS CMake CI (no --remote); librnp
|
||||
# needs --recursive for its nested src/libsexpp.
|
||||
- name: Init submodules (pinned commits)
|
||||
run: |
|
||||
git submodule update --init \
|
||||
libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/
|
||||
git submodule update --init --recursive \
|
||||
supportlibs/librnp
|
||||
git submodule update --init \
|
||||
supportlibs/restbed supportlibs/libsam3 \
|
||||
supportlibs/udp-discovery-cpp supportlibs/rapidjson
|
||||
git --no-pager -C libretroshare log --max-count 1 --oneline
|
||||
|
||||
# Mirrors the validated local Windows command (Ninja, shared libretroshare).
|
||||
- name: CMake configure
|
||||
run: >
|
||||
cmake -G Ninja -B Build-cmake -S .
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||
-DCMAKE_BUILD_TYPE=Release
|
||||
-DRS_LIBRETROSHARE_STATIC=OFF -DRS_LIBRETROSHARE_SHARED=ON
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON
|
||||
-DRS_PLUGINS=ON -DRS_FORUM_DEEP_INDEX=OFF
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON
|
||||
-DCMAKE_C_FLAGS="-include string.h -include stdint.h"
|
||||
-DCMAKE_CXX_FLAGS="-include cstring -include cstdint -Wno-template-body"
|
||||
|
||||
- name: CMake build
|
||||
run: cmake --build Build-cmake -j3
|
||||
26
.gitignore
vendored
26
.gitignore
vendored
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: (C) 2004-2022 Retroshare Team <contact@retroshare.cc>
|
||||
# SPDX-FileCopyrightText: (C) 2004-2019 Retroshare Team <contact@retroshare.cc>
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
*.o
|
||||
@ -15,27 +15,3 @@ Thumbs.db
|
||||
*.pro.user
|
||||
.kdev4
|
||||
*.kdev4
|
||||
|
||||
.qmake.stash
|
||||
|
||||
!supportlibs/libsam3/Makefile
|
||||
|
||||
# QtCreator cruft
|
||||
*CMakeLists.txt.user*
|
||||
|
||||
# Build artifacts
|
||||
/jsonapi-generator/src/jsonapi-generator
|
||||
/jsonapi-generator/src/jsonapi-generator-doxygen-final.conf
|
||||
/jsonapi-generator/src/jsonapi-includes.inl
|
||||
/jsonapi-generator/src/jsonapi-wrappers.inl
|
||||
/jsonapi-generator/src/xml/
|
||||
/retroshare-friendserver/src/retroshare-friendserver
|
||||
/retroshare-gui/src/include/
|
||||
/retroshare-gui/src/retroshare
|
||||
/retroshare-gui/src/temp/
|
||||
/retroshare-service/src/retroshare-service
|
||||
/*.tar.?z
|
||||
|
||||
# Build artifacts
|
||||
build/
|
||||
.vscode/
|
||||
|
||||
@ -1,50 +1,32 @@
|
||||
image: docker:latest
|
||||
image: docker:stable
|
||||
|
||||
services:
|
||||
- docker:dind
|
||||
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
- docker:stable-dind
|
||||
|
||||
workflow:
|
||||
rules:
|
||||
- if: $CI_MERGE_REQUEST_ID
|
||||
- if: $CI_COMMIT_BRANCH
|
||||
|
||||
variables:
|
||||
UBUNTU_TESTING_IMAGE_TAG: "$CI_REGISTRY_IMAGE/gitlabci_outputs/ubuntu_testing:$CI_COMMIT_SHA"
|
||||
|
||||
build-ubuntu-test-image:
|
||||
stage: build
|
||||
build-and-test:
|
||||
script:
|
||||
- docker --version
|
||||
- >
|
||||
docker login "$CI_REGISTRY"
|
||||
--username "$CI_REGISTRY_USER"
|
||||
--password "$CI_REGISTRY_PASSWORD"
|
||||
- >
|
||||
if [ -n "$CI_MERGE_REQUEST_ID" ]; then
|
||||
REPO_ARGS="--build-arg REPO_URL=$CI_MERGE_REQUEST_SOURCE_PROJECT_URL" ;
|
||||
REPO_ARGS="$REPO_ARGS --build-arg REPO_BRANCH=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" ;
|
||||
else
|
||||
REPO_ARGS="--build-arg REPO_URL=$CI_REPOSITORY_URL" ;
|
||||
REPO_ARGS="$REPO_ARGS --build-arg REPO_BRANCH=$CI_COMMIT_BRANCH" ;
|
||||
fi ;
|
||||
export REPO_ARGS ;
|
||||
echo REPO_ARGS=$REPO_ARGS ;
|
||||
- mkdir Dockercontext
|
||||
- >
|
||||
docker build
|
||||
-t $UBUNTU_TESTING_IMAGE_TAG
|
||||
$($CI_PROJECT_DIR/build_scripts/GitlabCI/getRepoArgs.sh)
|
||||
docker build -t retroshare:testing $REPO_ARGS
|
||||
--file $CI_PROJECT_DIR/build_scripts/GitlabCI/gitlabCI.Dockerfile
|
||||
Dockercontext
|
||||
- docker push $UBUNTU_TESTING_IMAGE_TAG
|
||||
- echo UBUNTU_TESTING_IMAGE_TAG=$UBUNTU_TESTING_IMAGE_TAG
|
||||
|
||||
test-ubuntu:
|
||||
stage: test
|
||||
script:
|
||||
- docker --version
|
||||
- >
|
||||
docker login "$CI_REGISTRY"
|
||||
--username "$CI_REGISTRY_USER"
|
||||
--password "$CI_REGISTRY_PASSWORD"
|
||||
- echo UBUNTU_TESTING_IMAGE_TAG=$UBUNTU_TESTING_IMAGE_TAG
|
||||
- docker pull $UBUNTU_TESTING_IMAGE_TAG
|
||||
- >
|
||||
docker run --name retroshare --detach --tty $UBUNTU_TESTING_IMAGE_TAG
|
||||
docker run --name retroshare --detach --tty retroshare:testing
|
||||
retroshare-service --jsonApiPort 9092
|
||||
- apk add jq
|
||||
- >
|
||||
|
||||
29
.gitmodules
vendored
29
.gitmodules
vendored
@ -10,34 +10,7 @@
|
||||
[submodule "supportlibs/udp-discovery-cpp"]
|
||||
path = supportlibs/udp-discovery-cpp
|
||||
url = https://github.com/truvorskameikin/udp-discovery-cpp.git
|
||||
branch = master
|
||||
# develop branch was removed we were using it at commit f3a3103a6c52e5707629e8d0a7e279a7758fe845
|
||||
branch = develop
|
||||
[submodule "supportlibs/rapidjson"]
|
||||
path = supportlibs/rapidjson
|
||||
url = https://github.com/Tencent/rapidjson.git
|
||||
[submodule "supportlibs/libsam3"]
|
||||
path = supportlibs/libsam3
|
||||
url = https://github.com/i2p/libsam3.git
|
||||
[submodule "supportlibs/jni.hpp"]
|
||||
path = supportlibs/jni.hpp
|
||||
url = https://github.com/RetroShare/jni.hpp.git
|
||||
[submodule "openpgpsdk"]
|
||||
path = openpgpsdk
|
||||
url = https://github.com/RetroShare/OpenPGP-SDK.git
|
||||
branch = master
|
||||
[submodule "libbitdht"]
|
||||
path = libbitdht
|
||||
url = https://github.com/RetroShare/BitDHT.git
|
||||
branch = master
|
||||
[submodule "libretroshare"]
|
||||
path = libretroshare
|
||||
url = https://github.com/RetroShare/libretroshare.git
|
||||
branch = master
|
||||
[submodule "retroshare-webui"]
|
||||
path = retroshare-webui
|
||||
url = https://github.com/RetroShare/RSNewWebUI.git
|
||||
branch = master
|
||||
[submodule "supportlibs/librnp"]
|
||||
path = supportlibs/librnp
|
||||
url = https://github.com/rnpgp/rnp.git
|
||||
branch = main
|
||||
|
||||
14
.travis.yml
14
.travis.yml
@ -8,12 +8,12 @@ language: cpp
|
||||
|
||||
matrix:
|
||||
include:
|
||||
# - os: linux
|
||||
# dist: bionic
|
||||
# sudo: required
|
||||
# compiler: gcc
|
||||
- os: linux
|
||||
dist: bionic
|
||||
sudo: required
|
||||
compiler: gcc
|
||||
- os: osx
|
||||
osx_image: xcode10.2
|
||||
osx_image: xcode10.1
|
||||
compiler: clang
|
||||
sudo: false
|
||||
|
||||
@ -68,11 +68,11 @@ before_script:
|
||||
fi
|
||||
|
||||
script:
|
||||
- if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then travis_wait 30 make -j$(nproc); fi
|
||||
- if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make -j4; fi
|
||||
|
||||
after_success:
|
||||
- if [ $TRAVIS_OS_NAME == osx ]; then build_scripts/OSX/travis_makeOSXPackage.sh ; fi
|
||||
# - if [ $TRAVIS_OS_NAME == linux ] && [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make -j2; fi
|
||||
- if [ $TRAVIS_OS_NAME == linux ] && [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make -j2; fi
|
||||
|
||||
|
||||
# branches:
|
||||
|
||||
469
BUILD-cmake.md
469
BUILD-cmake.md
@ -1,469 +0,0 @@
|
||||
# RetroShare — CMake build (Linux / macOS / Windows)
|
||||
|
||||
Build commands for the whole tree from the root of the super-project. The
|
||||
top-level `CMakeLists.txt` only *aggregates* the independent component projects
|
||||
(libretroshare + GUI + service + friendserver + plugins) — each is a standalone
|
||||
CMake project, buildable on its own. JSON API / WebUI enabled.
|
||||
|
||||
## Qt5 or Qt6
|
||||
|
||||
The build is **version-agnostic**: `retroshare-gui/CMakeLists.txt` probes Qt6
|
||||
first (`find_package(Qt6 QUIET COMPONENTS Core)`) and falls back to Qt5, so the
|
||||
same tree builds against **either** Qt5 or Qt6. When both are installed **Qt6 is
|
||||
preferred**; force Qt5 with `-DCMAKE_DISABLE_FIND_PACKAGE_Qt6=ON`.
|
||||
|
||||
> Why an explicit probe and not `find_package(QT NAMES Qt6 Qt5 …)`: on
|
||||
> Debian/Ubuntu multiarch (Qt5 and Qt6 both under `/usr/lib/<arch>/cmake`) the
|
||||
> `NAMES` order is **not** honoured — CMake globs the sibling `Qt5*`/`Qt6*`
|
||||
> config dirs and stops at whichever `…Config.cmake` it reaches first, which is
|
||||
> filesystem-order dependent and routinely lands on Qt5 even with Qt6 listed
|
||||
> first. The explicit Qt6 probe makes the preference deterministic, and is also
|
||||
> what makes `-DCMAKE_DISABLE_FIND_PACKAGE_Qt6=ON` actually force a Qt5 build
|
||||
> (with the versionless `QT` package name that switch had no effect).
|
||||
|
||||
Two deltas for a Qt6 build (everything else is identical):
|
||||
- different Qt `-dev` packages (see each platform below);
|
||||
- **`-DRS_PLUGINS=OFF`** — the VOIP plugin still uses the Qt5-era QtMultimedia API
|
||||
(`QAudioInput`/`QAudioOutput`/`QCameraInfo`) and isn't ported to Qt6 yet;
|
||||
FeedReader's CMake is also still Qt5-only.
|
||||
|
||||
Each configure below is prefixed with `rm -rf Build-cmake`, so the build dir is
|
||||
recreated from scratch every time. This keeps switching between Qt5 and Qt6 in the
|
||||
same `Build-cmake` clean (no stale `CMakeCache.txt` pinning the previous Qt
|
||||
version). Drop the `rm -rf` if you want an incremental rebuild instead.
|
||||
|
||||
Validated by the CMake CI:
|
||||
`.github/workflows/{ubuntu,macos,windows}-cmake.yml` (Qt5) and the matching
|
||||
`…-cmake-qt6.yml` (Qt6).
|
||||
|
||||
Other notes:
|
||||
- `RS_FORUM_DEEP_INDEX=OFF` on purpose (Xapian unused; re-enabled later via the
|
||||
ForumContentSearchFTS5 branch).
|
||||
- Ninja is used on all three platforms for consistency.
|
||||
- `RS_SERVICE_TERMINAL_WEBUI_PASSWORD=ON` is **required** for `retroshare-service`
|
||||
to expose the `-W`/`-B` flags that enable and serve the WebUI. `RS_WEBUI=ON`
|
||||
alone builds the WebUI machinery, but the service then has **no way to turn it
|
||||
on** — `enableWebUI` defaults to false and only `-W` ever sets it, so the WebUI
|
||||
never serves. It is a `cmake_dependent_option` requiring `RS_WEBUI=ON`.
|
||||
|
||||
## Submodules (init WITHOUT --remote)
|
||||
|
||||
`--remote` would move libretroshare off its pinned CMake commit and break the
|
||||
build. librnp needs `--recursive` for its nested `src/libsexpp`.
|
||||
|
||||
```bash
|
||||
git submodule update --init libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/
|
||||
git submodule update --init --recursive supportlibs/librnp
|
||||
git submodule update --init supportlibs/restbed supportlibs/libsam3 \
|
||||
supportlibs/udp-discovery-cpp supportlibs/rapidjson
|
||||
```
|
||||
|
||||
**rapidjson / GCC >= 13:** the commit pinned by the super-project (`f54b0e47`)
|
||||
has a broken `GenericStringRef::operator=` that assigns to the `const` member
|
||||
`length`, so it fails to compile on modern toolchains (e.g. Debian 13 / GCC 14)
|
||||
with *"assignment of read-only member 'length'"*. Check out the upstream fix
|
||||
commit (#719, on Tencent/rapidjson master):
|
||||
|
||||
```bash
|
||||
git -C supportlibs/rapidjson fetch origin
|
||||
git -C supportlibs/rapidjson checkout 9bd618f5
|
||||
```
|
||||
|
||||
## Version numbering
|
||||
|
||||
Versions are **not** hard-coded — CMake derives them at configure time from
|
||||
`git describe` run in each component's working tree, so what a build reports is
|
||||
exactly what your local checkout resolves to. Three independent strings are
|
||||
stamped in:
|
||||
|
||||
| String | Source command | CMake file |
|
||||
|---|---|---|
|
||||
| `RS_GUI_VERSION` — the GUI's own version (shown in *Help ▸ About*) | `git describe --tags --always --dirty` in the super-project, leading `v` stripped | `retroshare-gui/CMakeLists.txt` |
|
||||
| libRetroShare version (`RS_MAJOR`/`RS_MINOR`/`RS_MINI` + `RS_EXTRA_VERSION`) | `git describe --tags --long --match 'v*.*.*'` in `libretroshare/`, parsed into `major.minor.mini` + trailing extra | `libretroshare/CMakeLists.txt` |
|
||||
| `RS_LIB_VERSION_HASH` — engine build hash | `git describe --tags --always --dirty` in `libretroshare/`, leading `v` stripped | `libretroshare/CMakeLists.txt` |
|
||||
|
||||
The super-project's `describe` resolves to a `v0.6.7.x` tag; libretroshare's own
|
||||
tags are `v0.6.7`. So a GUI version reads like `0.6.7.3-1112-gd6047eb5a` and the
|
||||
engine like `0.6.7-548-g25845f94`, i.e. `<tag>-<commits since tag>-g<short hash>`.
|
||||
|
||||
To read the exact values a build **would** stamp, without building, run from the
|
||||
super-project root:
|
||||
|
||||
```bash
|
||||
git describe --tags --always --dirty
|
||||
git -C libretroshare describe --tags --long --match 'v*.*.*'
|
||||
```
|
||||
|
||||
The first line is `RS_GUI_VERSION` (drop the leading `v`); the second is the
|
||||
libRetroShare version.
|
||||
|
||||
Notes:
|
||||
- **`-dirty`** is appended whenever the working tree has *tracked* modifications
|
||||
at configure time. Modified **submodule pointers count as tracked changes**, so
|
||||
a tree that is otherwise clean apart from submodule drift still stamps `-dirty`
|
||||
on the GUI/engine version. Untracked files never trigger it.
|
||||
- libretroshare uses `--long`, which **always** prints the `-<N>-g<hash>` suffix —
|
||||
even on a tagged commit you get `v0.6.7-0-g…`, never a bare `0.6.7`.
|
||||
- Merging feature branches into an integration branch (e.g. `combo`) only grows
|
||||
the `-<N>-` commit count and changes the `-g<hash>`; the `v0.6.7.x` / `v0.6.7`
|
||||
tag prefix stays put. An octopus merge (one merge commit) yields a slightly
|
||||
lower `<N>` than the same branches merged one by one (one merge commit each).
|
||||
- If git metadata is unavailable (tarball / distro build, or the git call fails),
|
||||
the GUI falls back to the default in `retroshare-gui/src/rsguiversion.h`
|
||||
(`"version not available"`), and libretroshare must be given the version on the
|
||||
CMake command line: `-DRS_MAJOR_VERSION=… -DRS_MINOR_VERSION=… -DRS_MINI_VERSION=…`.
|
||||
|
||||
---
|
||||
|
||||
## Linux (Ubuntu/Debian)
|
||||
|
||||
Dependencies — **Qt5**:
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
build-essential g++ cmake ninja-build pkg-config git \
|
||||
qtbase5-dev qtbase5-dev-tools qtmultimedia5-dev libqt5svg5-dev \
|
||||
libqt5x11extras5-dev qttools5-dev qttools5-dev-tools \
|
||||
libssl-dev zlib1g-dev libbz2-dev libbotan-2-dev libjson-c-dev \
|
||||
libasio-dev libsqlcipher-dev \
|
||||
libspeex-dev libspeexdsp-dev libminiupnpc-dev \
|
||||
libavcodec-dev libavutil-dev \
|
||||
libxml2-dev libxslt1-dev libcurl4-openssl-dev \
|
||||
doxygen python3
|
||||
```
|
||||
|
||||
Dependencies — **Qt6** (self-contained; only the `qt*` packages differ from the
|
||||
Qt5 list above):
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
build-essential g++ cmake ninja-build pkg-config git \
|
||||
qt6-base-dev qt6-base-dev-tools qt6-multimedia-dev \
|
||||
qt6-5compat-dev qt6-tools-dev qt6-tools-dev-tools \
|
||||
libssl-dev zlib1g-dev libbz2-dev libbotan-2-dev libjson-c-dev \
|
||||
libasio-dev libsqlcipher-dev \
|
||||
libspeex-dev libspeexdsp-dev libminiupnpc-dev \
|
||||
libavcodec-dev libavutil-dev \
|
||||
libxml2-dev libxslt1-dev libcurl4-openssl-dev \
|
||||
doxygen python3
|
||||
```
|
||||
> On Ubuntu 24.04 the Core5Compat dev headers come from `qt6-5compat-dev` (there
|
||||
> is no `libqt6core5compat6-dev`). Svg/X11Extras dev packages aren't needed on
|
||||
> Linux for Qt6.
|
||||
|
||||
Build — **Qt5**:
|
||||
```bash
|
||||
rm -rf Build-cmake
|
||||
cmake -G Ninja -B Build-cmake -S . \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_DISABLE_FIND_PACKAGE_Qt6=ON \
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON -DRS_SERVICE_TERMINAL_WEBUI_PASSWORD=ON \
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON -DRS_PLUGINS=ON -DRS_FORUM_DEEP_INDEX=OFF \
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON \
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON
|
||||
cmake --build Build-cmake -j$(nproc)
|
||||
```
|
||||
|
||||
Build — **Qt6** (auto-selected once the qt6 `-dev` packages are installed):
|
||||
```bash
|
||||
rm -rf Build-cmake
|
||||
cmake -G Ninja -B Build-cmake -S . \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=Release \
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON -DRS_SERVICE_TERMINAL_WEBUI_PASSWORD=ON \
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON -DRS_PLUGINS=OFF -DRS_FORUM_DEEP_INDEX=OFF \
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON \
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON
|
||||
cmake --build Build-cmake -j$(nproc)
|
||||
```
|
||||
|
||||
### Debug build (Linux)
|
||||
|
||||
The commands above build `Release` (`-O3 -DNDEBUG`): aggressive inlining, assertions
|
||||
stripped. Fine for daily use, wrong under a debugger — backtraces land on
|
||||
misattributed lines and locals read `<optimized out>`. To step through code or
|
||||
investigate a crash with `gdb`, build `Debug` instead.
|
||||
|
||||
Two changes to the Qt5 configure above:
|
||||
- swap `-DCMAKE_BUILD_TYPE=Release` for `-DCMAKE_BUILD_TYPE=Debug` (gives `-g -O0`);
|
||||
- pin explicit debug flags so every symbol is emitted and nothing is inlined:
|
||||
`-DCMAKE_CXX_FLAGS_DEBUG` / `-DCMAKE_C_FLAGS_DEBUG` = `-g3 -O0 -fno-omit-frame-pointer`.
|
||||
|
||||
`-g3` emits full debug info **including macro definitions**; `-O0` disables inlining so
|
||||
backtrace line numbers are exact; `-fno-omit-frame-pointer` keeps stack unwinding
|
||||
reliable.
|
||||
|
||||
```bash
|
||||
rm -rf Build-cmake
|
||||
cmake -G Ninja -B Build-cmake -S . \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=Debug \
|
||||
-DCMAKE_CXX_FLAGS_DEBUG="-g3 -O0 -fno-omit-frame-pointer" \
|
||||
-DCMAKE_C_FLAGS_DEBUG="-g3 -O0 -fno-omit-frame-pointer" \
|
||||
-DCMAKE_DISABLE_FIND_PACKAGE_Qt6=ON \
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON -DRS_SERVICE_TERMINAL_WEBUI_PASSWORD=ON \
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON -DRS_PLUGINS=ON -DRS_FORUM_DEEP_INDEX=OFF \
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON \
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON
|
||||
cmake --build Build-cmake -j$(nproc)
|
||||
```
|
||||
|
||||
> For a **Qt6** debug build, drop `-DCMAKE_DISABLE_FIND_PACKAGE_Qt6=ON` and set
|
||||
> `-DRS_PLUGINS=OFF` (as in the Release Qt6 command); the debug flags are identical.
|
||||
|
||||
> A Debug build compiles slower and produces a much larger binary — expected.
|
||||
> `RelWithDebInfo` (`-O2 -g`) is a middle ground with usable symbols, but because it
|
||||
> still optimizes it gives approximate backtraces; prefer `Debug` when chasing a crash.
|
||||
|
||||
Run the GUI under gdb (the binary lands at `Build-cmake/retroshare-gui/retroshare`):
|
||||
|
||||
```bash
|
||||
gdb ./Build-cmake/retroshare-gui/retroshare
|
||||
```
|
||||
|
||||
then `run`, reproduce the issue, and `bt` at the crash for a full symbolized stack.
|
||||
|
||||
#### AddressSanitizer (use-after-free / heap bugs)
|
||||
|
||||
For memory-corruption bugs (use-after-free, heap overflow, double free), an ASan build
|
||||
reports the fault **at the moment of the bad access**, with three stacks — allocation,
|
||||
free, and the offending access — instead of a bare `SIGSEGV` after the fact. Add
|
||||
`-fsanitize=address` to both the compile and the link flags:
|
||||
|
||||
```bash
|
||||
rm -rf Build-cmake
|
||||
cmake -G Ninja -B Build-cmake -S . \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=Debug \
|
||||
-DCMAKE_CXX_FLAGS_DEBUG="-g3 -O1 -fno-omit-frame-pointer -fsanitize=address" \
|
||||
-DCMAKE_C_FLAGS_DEBUG="-g3 -O1 -fno-omit-frame-pointer -fsanitize=address" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address" \
|
||||
-DCMAKE_SHARED_LINKER_FLAGS="-fsanitize=address" \
|
||||
-DCMAKE_MODULE_LINKER_FLAGS="-fsanitize=address" \
|
||||
-DCMAKE_DISABLE_FIND_PACKAGE_Qt6=ON \
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON -DRS_SERVICE_TERMINAL_WEBUI_PASSWORD=ON \
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON -DRS_PLUGINS=ON -DRS_FORUM_DEEP_INDEX=OFF \
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON \
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON
|
||||
cmake --build Build-cmake -j$(nproc)
|
||||
```
|
||||
|
||||
> Needs the ASan runtime: `sudo apt-get install -y libasan8`. Run with leak detection
|
||||
> **off** — RetroShare allocates plenty at startup that would otherwise bury the report:
|
||||
> ```bash
|
||||
> ASAN_OPTIONS=abort_on_error=1:detect_leaks=0 ./Build-cmake/retroshare-gui/retroshare
|
||||
> ```
|
||||
> `-O1` (not `-O0`) is deliberate: ASan needs light optimization for acceptable runtime
|
||||
> and cleaner reports, and the sanitizer preserves accurate line numbers regardless.
|
||||
|
||||
---
|
||||
|
||||
## macOS (Homebrew, Apple Silicon)
|
||||
|
||||
Dependencies — **Qt5**:
|
||||
```bash
|
||||
brew install ninja qt@5 openssl@3 botan@2 sqlcipher miniupnpc \
|
||||
json-c asio speex speexdsp ffmpeg libxml2 libxslt bzip2 zlib rapidjson doxygen
|
||||
```
|
||||
Dependencies — **Qt6** (self-contained; only the Qt package differs from the Qt5
|
||||
list above). Unlike Linux's split `qt6-*` packages, Homebrew ships Qt6 as a
|
||||
**single monolithic `qt` formula** that already bundles qt5compat / svg /
|
||||
multimedia / tools — so installing `qt` is all you need:
|
||||
```bash
|
||||
brew install ninja qt openssl@3 botan@2 sqlcipher miniupnpc \
|
||||
json-c asio speex speexdsp ffmpeg libxml2 libxslt bzip2 zlib rapidjson doxygen
|
||||
```
|
||||
> `qt5compat` (bundled in `qt`) provides `Qt6::Core5Compat`, required by the GUI
|
||||
> (QRegExp / QTextCodec).
|
||||
>
|
||||
> **If `brew install qt` fails with** `Cannot install qtbase because conflicting
|
||||
> formulae are installed … qt@5: because both link conflicting binaries`, your
|
||||
> qt@5 is (force-)linked. Run `brew unlink qt@5` first, then re-run
|
||||
> `brew install qt`:
|
||||
> ```bash
|
||||
> brew unlink qt@5
|
||||
> brew install qt
|
||||
> ```
|
||||
> Both Qt versions then coexist: the Qt6 build finds Qt6 via `Qt6_DIR`, and the
|
||||
> Qt5 build still finds qt@5 via `-DQt5_DIR="$(brew --prefix qt@5)/lib/cmake/Qt5"`
|
||||
> (the keg path works whether or not qt@5 is linked).
|
||||
|
||||
> **Botan:** with several Botan versions installed (`botan`=v3, `botan@2`,
|
||||
> `botan@3`), a fresh configure can mismatch — Botan 3 headers + Botan 2 lib →
|
||||
> `Undefined symbols … Botan::…` linker errors in librnp. Both macOS commands
|
||||
> below pin it with `-DBOTAN_ROOT_DIR="$(brew --prefix botan@2)"` so headers and
|
||||
> lib come from the **same** keg ([FindBotan.cmake] searches `BOTAN_ROOT_DIR`
|
||||
> only, via `NO_DEFAULT_PATH`). To build against Botan 3 instead, point it at
|
||||
> `$(brew --prefix botan)` — RNP then detects v3 and links `libbotan-3`.
|
||||
|
||||
> The harvest loop in both macOS commands skips every `qt*` keg on purpose: Qt is
|
||||
> provided via `Qt6_DIR` / `Qt5_DIR`, and pulling a second Qt's headers off
|
||||
> `/opt/homebrew/opt/qt*` would mix Qt5/Qt6 and break the build.
|
||||
|
||||
Build — **Qt5** (harvest Homebrew include/lib dirs; point find_package(Qt5) at keg-only qt@5):
|
||||
```bash
|
||||
HB="$(brew --prefix)"; QT5="$(brew --prefix qt@5)"
|
||||
IFLAGS="-I$HB/include"; LFLAGS="-L$HB/lib"; PREFIX="$QT5;$HB"
|
||||
for d in "$HB"/opt/*; do
|
||||
case "${d##*/}" in qt*) continue;; esac
|
||||
[ -d "$d/include" ] && IFLAGS="$IFLAGS -I$d/include"
|
||||
[ -d "$d/lib" ] && LFLAGS="$LFLAGS -L$d/lib"
|
||||
PREFIX="$PREFIX;$d"
|
||||
done
|
||||
|
||||
rm -rf Build-cmake
|
||||
cmake -G Ninja -B Build-cmake -S . \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_PREFIX_PATH="$PREFIX" -DQt5_DIR="$QT5/lib/cmake/Qt5" \
|
||||
-DCMAKE_DISABLE_FIND_PACKAGE_Qt6=ON \
|
||||
-DOPENSSL_ROOT_DIR="$(brew --prefix openssl@3)" \
|
||||
-DBOTAN_ROOT_DIR="$(brew --prefix botan@2)" \
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON -DRS_SERVICE_TERMINAL_WEBUI_PASSWORD=ON \
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON -DRS_PLUGINS=ON -DRS_FORUM_DEEP_INDEX=OFF \
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON \
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON \
|
||||
-DCMAKE_C_FLAGS="$IFLAGS" -DCMAKE_CXX_FLAGS="$IFLAGS" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="$LFLAGS" \
|
||||
-DCMAKE_SHARED_LINKER_FLAGS="$LFLAGS" \
|
||||
-DCMAKE_MODULE_LINKER_FLAGS="$LFLAGS"
|
||||
cmake --build Build-cmake -j$(sysctl -n hw.ncpu)
|
||||
```
|
||||
|
||||
Build — **Qt6** (use the `qt` prefix + `Qt6_DIR`; plugins OFF):
|
||||
```bash
|
||||
HB="$(brew --prefix)"; QT6="$(brew --prefix qt)"
|
||||
IFLAGS="-I$HB/include"; LFLAGS="-L$HB/lib"; PREFIX="$QT6;$HB"
|
||||
for d in "$HB"/opt/*; do
|
||||
case "${d##*/}" in qt*) continue;; esac
|
||||
[ -d "$d/include" ] && IFLAGS="$IFLAGS -I$d/include"
|
||||
[ -d "$d/lib" ] && LFLAGS="$LFLAGS -L$d/lib"
|
||||
PREFIX="$PREFIX;$d"
|
||||
done
|
||||
|
||||
rm -rf Build-cmake
|
||||
cmake -G Ninja -B Build-cmake -S . \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_PREFIX_PATH="$PREFIX" -DQt6_DIR="$QT6/lib/cmake/Qt6" \
|
||||
-DOPENSSL_ROOT_DIR="$(brew --prefix openssl@3)" \
|
||||
-DBOTAN_ROOT_DIR="$(brew --prefix botan@2)" \
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON -DRS_SERVICE_TERMINAL_WEBUI_PASSWORD=ON \
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON -DRS_PLUGINS=OFF -DRS_FORUM_DEEP_INDEX=OFF \
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON \
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON \
|
||||
-DCMAKE_C_FLAGS="$IFLAGS" -DCMAKE_CXX_FLAGS="$IFLAGS" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="$LFLAGS" \
|
||||
-DCMAKE_SHARED_LINKER_FLAGS="$LFLAGS" \
|
||||
-DCMAKE_MODULE_LINKER_FLAGS="$LFLAGS"
|
||||
cmake --build Build-cmake -j$(sysctl -n hw.ncpu)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Windows (MSYS2 — UCRT64 shell)
|
||||
|
||||
> The build commands use `-j$(nproc)` (all cores; `nproc` is available in MSYS2).
|
||||
> MinGW C++ compilation is RAM-hungry (RNP/rapidjson can use ~1.5 GB per job), so
|
||||
> on a low-memory machine lower it manually, e.g. `-j4` — that's why it used to be
|
||||
> hard-capped at `-j3`.
|
||||
|
||||
> **`RS_USE_NATIVE_DIALOGS=ON`** — Qt's own (non-native) file/directory dialogs
|
||||
> hang on Windows. Using the OS native dialogs (`RS_USE_NATIVE_DIALOGS=ON`)
|
||||
> avoids the problem. On Linux/macOS the default `OFF` works fine.
|
||||
|
||||
Dependencies — common + **Qt5** (use the UCRT64 doxygen, not the base MSYS one —
|
||||
it mishandles `D:/` paths):
|
||||
```bash
|
||||
pacman -S --needed base-devel git perl ruby \
|
||||
mingw-w64-ucrt-x86_64-toolchain mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja \
|
||||
mingw-w64-ucrt-x86_64-doxygen mingw-w64-ucrt-x86_64-python \
|
||||
mingw-w64-ucrt-x86_64-qt5-base mingw-w64-ucrt-x86_64-qt5-multimedia \
|
||||
mingw-w64-ucrt-x86_64-qt5-svg mingw-w64-ucrt-x86_64-qt5-tools \
|
||||
mingw-w64-ucrt-x86_64-openssl mingw-w64-ucrt-x86_64-libbotan mingw-w64-ucrt-x86_64-sqlcipher \
|
||||
mingw-w64-ucrt-x86_64-miniupnpc mingw-w64-ucrt-x86_64-json-c mingw-w64-ucrt-x86_64-rapidjson \
|
||||
mingw-w64-ucrt-x86_64-asio mingw-w64-ucrt-x86_64-libxml2 mingw-w64-ucrt-x86_64-libxslt \
|
||||
mingw-w64-ucrt-x86_64-speex mingw-w64-ucrt-x86_64-speexdsp mingw-w64-ucrt-x86_64-ffmpeg \
|
||||
mingw-w64-ucrt-x86_64-bzip2 mingw-w64-ucrt-x86_64-zlib
|
||||
```
|
||||
Dependencies — **Qt6** (self-contained; only the `qt*` packages differ from the
|
||||
Qt5 list above):
|
||||
```bash
|
||||
pacman -S --needed base-devel git perl ruby \
|
||||
mingw-w64-ucrt-x86_64-toolchain mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja \
|
||||
mingw-w64-ucrt-x86_64-doxygen mingw-w64-ucrt-x86_64-python \
|
||||
mingw-w64-ucrt-x86_64-qt6-base mingw-w64-ucrt-x86_64-qt6-multimedia \
|
||||
mingw-w64-ucrt-x86_64-qt6-svg mingw-w64-ucrt-x86_64-qt6-5compat mingw-w64-ucrt-x86_64-qt6-tools \
|
||||
mingw-w64-ucrt-x86_64-openssl mingw-w64-ucrt-x86_64-libbotan mingw-w64-ucrt-x86_64-sqlcipher \
|
||||
mingw-w64-ucrt-x86_64-miniupnpc mingw-w64-ucrt-x86_64-json-c mingw-w64-ucrt-x86_64-rapidjson \
|
||||
mingw-w64-ucrt-x86_64-asio mingw-w64-ucrt-x86_64-libxml2 mingw-w64-ucrt-x86_64-libxslt \
|
||||
mingw-w64-ucrt-x86_64-speex mingw-w64-ucrt-x86_64-speexdsp mingw-w64-ucrt-x86_64-ffmpeg \
|
||||
mingw-w64-ucrt-x86_64-bzip2 mingw-w64-ucrt-x86_64-zlib
|
||||
```
|
||||
|
||||
Build — **Qt5** (the `-include` / `-Wno-template-body` flags are only needed for
|
||||
GCC >= 16 — RNP/rapidjson; harmless on older GCC):
|
||||
```bash
|
||||
rm -rf Build-cmake
|
||||
cmake -G Ninja -B Build-cmake -S . \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=Release \
|
||||
-DRS_LIBRETROSHARE_STATIC=OFF -DRS_LIBRETROSHARE_SHARED=ON \
|
||||
-DCMAKE_DISABLE_FIND_PACKAGE_Qt6=ON \
|
||||
-DRS_USE_NATIVE_DIALOGS=ON \
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON -DRS_SERVICE_TERMINAL_WEBUI_PASSWORD=ON \
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON -DRS_PLUGINS=ON -DRS_FORUM_DEEP_INDEX=OFF \
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON \
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON \
|
||||
-DCMAKE_C_FLAGS="-include string.h -include stdint.h" \
|
||||
-DCMAKE_CXX_FLAGS="-include cstring -include cstdint -Wno-template-body"
|
||||
cmake --build Build-cmake -j$(nproc)
|
||||
```
|
||||
|
||||
Build — **Qt6** (auto-selected once the qt6 packages are installed; plugins OFF):
|
||||
```bash
|
||||
rm -rf Build-cmake
|
||||
cmake -G Ninja -B Build-cmake -S . \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=Release \
|
||||
-DRS_LIBRETROSHARE_STATIC=OFF -DRS_LIBRETROSHARE_SHARED=ON \
|
||||
-DRS_USE_NATIVE_DIALOGS=ON \
|
||||
-DRS_RNPLIB=ON -DRS_JSON_API=ON -DRS_WEBUI=ON -DRS_SERVICE_TERMINAL_WEBUI_PASSWORD=ON \
|
||||
-DRS_GUI=ON -DRS_SERVICE=ON -DRS_FRIENDSERVER=ON -DRS_PLUGINS=OFF -DRS_FORUM_DEEP_INDEX=OFF \
|
||||
-DRS_USE_I2P_SAM3=ON -DRS_BITDHT=ON -DRS_MINIUPNPC=ON \
|
||||
-DRS_BRODCAST_DISCOVERY=ON -DRS_SQLCIPHER=ON \
|
||||
-DCMAKE_C_FLAGS="-include string.h -include stdint.h" \
|
||||
-DCMAKE_CXX_FLAGS="-include cstring -include cstdint -Wno-template-body"
|
||||
cmake --build Build-cmake -j$(nproc)
|
||||
```
|
||||
|
||||
### Packaging & Deployment (Portable & Setup Installer)
|
||||
|
||||
Once the CMake build finishes successfully, you can bundle RetroShare and all its DLL dependencies into a standalone portable folder, a compressed archive, and a Windows Setup Installer.
|
||||
|
||||
To do this, run the deployment script from the project root:
|
||||
|
||||
```bash
|
||||
./build_scripts/Windows-msys2/deploy-windows.sh
|
||||
```
|
||||
|
||||
By default, the script looks for your build files in `Build-cmake/`. You can override this by setting the `BUILD_DIR` environment variable:
|
||||
|
||||
```bash
|
||||
BUILD_DIR=MyCustomBuildDir ./build_scripts/Windows-msys2/deploy-windows.sh
|
||||
```
|
||||
|
||||
#### Portable Archives (7z / ZIP)
|
||||
- The script automatically gathers all DLLs (Qt libraries, compiler runtime, and third-party dependencies) and places them alongside the executables.
|
||||
- It then compresses the folder into a portable package.
|
||||
- If `p7zip` is installed, it will compress using **7-Zip** for high compression ratios. Otherwise, it falls back to standard **ZIP**.
|
||||
- To install 7-Zip in MSYS2:
|
||||
```bash
|
||||
pacman -S --needed p7zip
|
||||
```
|
||||
|
||||
#### Setup Installer (NSIS)
|
||||
- If `makensis` is found, the script will automatically compile a self-extracting Windows installer (`-setup.exe`) using Nullsoft Scriptable Install System (NSIS).
|
||||
- To enable this, you must install the NSIS package for your active shell environment:
|
||||
- **UCRT64 shell**:
|
||||
```bash
|
||||
pacman -S --needed mingw-w64-ucrt-x86_64-nsis
|
||||
```
|
||||
- **MinGW64 shell**:
|
||||
```bash
|
||||
pacman -S --needed mingw-w64-x86_64-nsis
|
||||
```
|
||||
|
||||
109
CMakeLists.txt
109
CMakeLists.txt
@ -1,109 +0,0 @@
|
||||
# CMakeLists.txt for the RetroShare super-project (root aggregate build)
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
cmake_minimum_required(VERSION 3.5.0)
|
||||
set(CMAKE_POLICY_VERSION_MINIMUM 3.5)
|
||||
project(retroshare-superproject)
|
||||
|
||||
# Default to Release build type if not specified
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build (Debug or Release)" FORCE)
|
||||
endif()
|
||||
# Force C++17 globally for all targets (including plugins)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
if(APPLE)
|
||||
# On macOS, allow undefined symbols in shared modules/libraries at link time
|
||||
# because they will be resolved at runtime by the host executable (retroshare-gui)
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -undefined dynamic_lookup")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -undefined dynamic_lookup")
|
||||
endif()
|
||||
|
||||
# Global setting to allow executables to export symbols for plugin/module linking
|
||||
set(CMAKE_ENABLE_EXPORTS ON)
|
||||
|
||||
# Configuration Options
|
||||
option(RS_GUI "Build RetroShare GUI" ON)
|
||||
option(RS_SERVICE "Build RetroShare Service" ON)
|
||||
option(RS_FRIENDSERVER "Build RetroShare Friendserver" ON)
|
||||
option(RS_PLUGINS "Build RetroShare Plugins" OFF)
|
||||
option(RS_USE_I2P_SAM3 "Enable I2P SAMv3 support" ON)
|
||||
|
||||
# The "sam3" target is defined once here, at the top level, because it is linked
|
||||
# by more than one subproject: libretroshare AND retroshare-gui (which uses libsam3
|
||||
# directly in gui/settings/ServerPage.cpp). Defining it once avoids a duplicate
|
||||
# target definition when the whole tree is configured together. If libretroshare is
|
||||
# reworked to export sam3 as a target, this top-level definition could be dropped.
|
||||
if(RS_USE_I2P_SAM3)
|
||||
add_definitions(-DRS_USE_I2P_SAM3 -DRS_USE_I2P_SAM3_LIBSAM3)
|
||||
|
||||
set(SAM3_DEVEL_DIR "${CMAKE_SOURCE_DIR}/supportlibs/libsam3")
|
||||
if(EXISTS "${SAM3_DEVEL_DIR}")
|
||||
message(STATUS "libsam3 found at ${SAM3_DEVEL_DIR}, defining target sam3 globally")
|
||||
add_library(sam3 STATIC
|
||||
"${SAM3_DEVEL_DIR}/src/libsam3/libsam3.c"
|
||||
"${SAM3_DEVEL_DIR}/src/libsam3a/libsam3a.c"
|
||||
)
|
||||
target_include_directories(sam3 PUBLIC
|
||||
"${SAM3_DEVEL_DIR}/src/libsam3"
|
||||
"${SAM3_DEVEL_DIR}/src/libsam3a"
|
||||
)
|
||||
if(WIN32)
|
||||
target_link_libraries(sam3 PUBLIC ws2_32)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# NOTE: Windows-specific workarounds that used to live here as global
|
||||
# add_definitions()/add_compile_options() have been moved to the specific targets
|
||||
# that need them (see the per-target block after the add_subdirectory() calls
|
||||
# below), so they no longer leak into every target in the tree.
|
||||
|
||||
# 1. First add the core library (libretroshare)
|
||||
add_subdirectory(libretroshare)
|
||||
|
||||
# 2. Then add the dependent executables
|
||||
if(RS_GUI)
|
||||
add_subdirectory(retroshare-gui)
|
||||
if(RS_PLUGINS)
|
||||
add_subdirectory(plugins)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(RS_SERVICE)
|
||||
add_subdirectory(retroshare-service)
|
||||
endif()
|
||||
|
||||
if(RS_FRIENDSERVER)
|
||||
add_subdirectory(retroshare-friendserver)
|
||||
endif()
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Per-target Windows fixups (applied to the specific targets that need them,
|
||||
# rather than globally, per review feedback). These run after the subdirectories
|
||||
# so the targets already exist.
|
||||
# ---------------------------------------------------------------------------
|
||||
if(WIN32)
|
||||
# libbitdht needs the wide-char Windows API (e.g. MoveFileExW). libretroshare
|
||||
# already sets UNICODE/_UNICODE PUBLIC for itself and its consumers, but
|
||||
# libbitdht is a dependency (not a consumer) so it needs its own definition.
|
||||
if(TARGET bitdht)
|
||||
target_compile_definitions(bitdht PRIVATE UNICODE _UNICODE)
|
||||
endif()
|
||||
|
||||
# Legacy C submodules trip strict GCC >= 15 diagnostics that are now errors by
|
||||
# default; downgrade them to warnings only for those targets. Add other legacy
|
||||
# targets here if a future toolchain flags them.
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
foreach(legacy_target sam3 bitdht miniupnpc udp-discovery)
|
||||
if(TARGET ${legacy_target})
|
||||
target_compile_options(${legacy_target} PRIVATE
|
||||
-Wno-error=incompatible-pointer-types
|
||||
-Wno-error=int-conversion
|
||||
-Wno-error=implicit-function-declaration )
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
56
README.asciidoc
Normal file
56
README.asciidoc
Normal file
@ -0,0 +1,56 @@
|
||||
// SPDX-FileCopyrightText: Retroshare Team <contact@retroshare.cc>
|
||||
// SPDX-License-Identifier: CC-BY-SA-4.0
|
||||
|
||||
= RetroShare
|
||||
|
||||
RetroShare is a decentralized, private, secure, cross-platform, communication
|
||||
toolkit.
|
||||
RetroShare provides file sharing, chat, messages, forums, channels and more.
|
||||
|
||||
.Build Status
|
||||
|===============================================================================
|
||||
|GNU/Linux (via Gitlab CI) | image:https://gitlab.com/RetroShare/RetroShare/badges/master/pipeline.svg[link="https://gitlab.com/RetroShare/RetroShare/-/commits/master",title="pipeline status"]
|
||||
|GNU/Linux, macOS, (via Travis CI) | image:https://travis-ci.org/RetroShare/RetroShare.svg?branch=master[link="https://travis-ci.org/RetroShare/RetroShare"]
|
||||
|Windows (via AppVeyor) | image:https://ci.appveyor.com/api/projects/status/github/RetroShare/RetroShare?svg=true[link="https://ci.appveyor.com/project/RetroShare58622/retroshare"]
|
||||
|===============================================================================
|
||||
|
||||
|
||||
== Compilation
|
||||
|
||||
Short of comprehensive and updated documentation on how to build RetroShare
|
||||
(for the many supported platforms it runs on), scripts and recipes are provided
|
||||
in the aim of creating packages for the supported platforms (and more)
|
||||
in the `build_scripts` directory of this repository.
|
||||
|
||||
Those packaging receipts together with the continuous integration files
|
||||
`.travis.yml` and `appveyor.yml` are a good source of knowledge on how to
|
||||
compile RetroShare on different platforms.
|
||||
|
||||
|
||||
== Using RetroShare on a headless computer with web UI
|
||||
|
||||
WARNING: This section is outdated need to be adapted to the new web UI
|
||||
|
||||
The web UI needs to be enabled as a parameter option to the retroshare-service:
|
||||
|
||||
[source,bash]
|
||||
--------
|
||||
./retroshare-nogui --webinterface 9090 --docroot /usr/share/retroshare/webui/
|
||||
--------
|
||||
|
||||
The web UI is only accessible on localhost:9090. It is advised to keep it that way so that your RS
|
||||
cannot be controlled using an untrusted connection.
|
||||
|
||||
To access your web UI from a distance, just open a SSH tunnel to it:
|
||||
|
||||
[source,bash]
|
||||
--------
|
||||
distant_machine:~/ > ssh rs_host -L 9090:localhost:9090 -N
|
||||
--------
|
||||
|
||||
"rs_host" is the machine running `retroshare-nogui`. Then on the distant machine, access your web UI on
|
||||
|
||||
|
||||
http://localhost:9090
|
||||
|
||||
(This can also be done from the RetroShare GUI.)
|
||||
55
README.md
55
README.md
@ -1,55 +0,0 @@
|
||||
## RetroShare
|
||||
|
||||
RetroShare is a decentralized, private, secure, cross-platform, communication
|
||||
toolkit.
|
||||
RetroShare provides file sharing, chat, messages, forums, channels, boards and more.
|
||||
|
||||
[](https://github.com/retroshare/retroshare/releases/latest)
|
||||
[](https://github.com/retroshare/retroshare/releases/latest)
|
||||
[](https://github.com/RetroShare/RetroShare/actions/workflows/ci-mingw64.yml)
|
||||
[](https://github.com/RetroShare/RetroShare/actions/workflows/ci-ucrt64.yml)
|
||||
[](https://github.com/RetroShare/RetroShare/actions/workflows/ci-mingw64-Qt6.yml)
|
||||
[](https://gitlab.com/RetroShare/RetroShare/-/commits/master)
|
||||
[](https://gitlab.com/RetroShare/libretroshare/-/commits/master)
|
||||
[](https://deepwiki.com/RetroShare/RetroShare)
|
||||
|
||||
## Get the source
|
||||
|
||||
Clone this repository, enter the directory and then get the submodules with the
|
||||
following command
|
||||
|
||||
git submodule update --init --remote --force libbitdht/ libretroshare/ openpgpsdk/
|
||||
|
||||
|
||||
|
||||
## Compilation
|
||||
|
||||
Short of comprehensive and updated documentation on how to build RetroShare
|
||||
(for the many supported platforms it runs on), scripts and recipes are provided
|
||||
in the aim of creating packages for the supported platforms (and more)
|
||||
in the [build_scripts](https://github.com/RetroShare/RetroShare/tree/master/build_scripts) directory of this repository.
|
||||
|
||||
## Compilation on Windows
|
||||
Follow this file : [WindowsMSys2_InstallGuide](https://github.com/RetroShare/RetroShare/blob/master/build_scripts/Windows-msys2/WindowsMSys2_InstallGuide.md)
|
||||
|
||||
With QtCreator : [Windows-QtCreator-InstallGuide](https://github.com/RetroShare/RetroShare/blob/master/build_scripts/Windows/Windows-QtCreator-InstallGuide.md)
|
||||
|
||||
## Compilation on MacOSX
|
||||
|
||||
Follow this file : [MacOS_X_InstallGuide](https://github.com/RetroShare/RetroShare/blob/master/build_scripts/OSX/MacOS_X_InstallGuide.md)
|
||||
|
||||
## Compilation on Linux
|
||||
|
||||
Follow this file : [Linux_InstallGuide](https://github.com/RetroShare/RetroShare/blob/master/build_scripts/Debian+Ubuntu/Linux_InstallGuide.md)
|
||||
|
||||
## Releases
|
||||
|
||||
Latest release [here](https://github.com/RetroShare/RetroShare/releases)
|
||||
|
||||
Other Builds [RetroShare Downloads](https://retroshare.cc/downloads.html)
|
||||
|
||||
|
||||
## Documentation
|
||||
|
||||
- [RetroShare Docs](https://retrosharedocs.readthedocs.io/en/latest/)
|
||||
|
||||
@ -25,6 +25,9 @@ CONFIG += c++14
|
||||
|
||||
TEMPLATE = subdirs
|
||||
|
||||
SUBDIRS += openpgpsdk
|
||||
openpgpsdk.file = openpgpsdk/src/openpgpsdk.pro
|
||||
|
||||
rs_jsonapi:isEmpty(JSONAPI_GENERATOR_EXE) {
|
||||
SUBDIRS += jsonapi-generator
|
||||
jsonapi-generator.file = jsonapi-generator/src/jsonapi-generator.pro
|
||||
@ -33,7 +36,7 @@ rs_jsonapi:isEmpty(JSONAPI_GENERATOR_EXE) {
|
||||
|
||||
SUBDIRS += libbitdht
|
||||
libbitdht.file = libbitdht/src/libbitdht.pro
|
||||
libretroshare.depends += libbitdht
|
||||
libretroshare.depends += openpgpsdk libbitdht
|
||||
|
||||
SUBDIRS += libretroshare
|
||||
libretroshare.file = libretroshare/src/libretroshare.pro
|
||||
@ -52,12 +55,6 @@ retroshare_service {
|
||||
retroshare_service.target = retroshare_service
|
||||
}
|
||||
|
||||
retroshare_friendserver {
|
||||
SUBDIRS += retroshare_friendserver
|
||||
retroshare_friendserver.file = retroshare-friendserver/src/retroshare-friendserver.pro
|
||||
retroshare_friendserver.depends = libretroshare
|
||||
retroshare_friendserver.target = retroshare_friendserver
|
||||
}
|
||||
retroshare_plugins {
|
||||
SUBDIRS += plugins
|
||||
plugins.file = plugins/plugins.pro
|
||||
@ -65,13 +62,6 @@ retroshare_plugins {
|
||||
plugins.target = plugins
|
||||
}
|
||||
|
||||
rs_webui {
|
||||
SUBDIRS += retroshare-webui
|
||||
retroshare-webui.file = retroshare-webui/webui.pro
|
||||
retroshare-webui.target = rs_webui
|
||||
retroshare-webui.depends = retroshare_gui
|
||||
}
|
||||
|
||||
wikipoos {
|
||||
SUBDIRS += pegmarkdown
|
||||
pegmarkdown.file = supportlibs/pegmarkdown/pegmarkdown.pro
|
||||
|
||||
311
appveyor.yml
Normal file
311
appveyor.yml
Normal file
@ -0,0 +1,311 @@
|
||||
# SPDX-FileCopyrightText: (C) 2004-2019 Retroshare Team <contact@retroshare.cc>
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
# Notes:
|
||||
# - Minimal appveyor.yml file is an empty file. All sections are optional.
|
||||
# - Indent each level of configuration with 2 spaces. Do not use tabs!
|
||||
# - All section names are case-sensitive.
|
||||
# - Section names should be unique on each level.
|
||||
# from example:
|
||||
# https://github.com/Phonations/Joker/blob/master/appveyor.yml
|
||||
# https://github.com/unicorn-engine/autobuild/blob/master/.appveyor.yml
|
||||
|
||||
#---------------------------------#
|
||||
# general configuration #
|
||||
#---------------------------------#
|
||||
|
||||
# version format
|
||||
version: RetroShare-git-{branch}-{build}
|
||||
|
||||
# you can use {branch} name in version format too
|
||||
# version: 1.0.{build}-{branch}
|
||||
|
||||
# branches to build
|
||||
branches:
|
||||
# whitelist
|
||||
#only:
|
||||
# - master
|
||||
|
||||
# blacklist
|
||||
except:
|
||||
- /^skipthisbranch$/
|
||||
|
||||
# Do not build on tags (GitHub only)
|
||||
skip_tags: true
|
||||
|
||||
# Skipping commits with particular message or from user
|
||||
skip_commits:
|
||||
message: /Created.*\.(png|jpg|jpeg|bmp|gif)/ # Regex for matching commit message
|
||||
#author: Anonymous # Commit author's username, name, email or regexp maching one of these.
|
||||
|
||||
#---------------------------------#
|
||||
# environment configuration #
|
||||
#---------------------------------#
|
||||
|
||||
# Operating system (build VM template)
|
||||
#os: Windows Server 2012
|
||||
|
||||
# scripts that are called at very beginning, before repo cloning
|
||||
init:
|
||||
- git config --global core.autocrlf input
|
||||
#To get RDP while compiling
|
||||
- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
||||
on_finish:
|
||||
#To get RDP running after compiling
|
||||
#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
||||
|
||||
# clone directory
|
||||
clone_folder: C:\projects\RetroShare
|
||||
|
||||
# fetch repository as zip archive
|
||||
#shallow_clone: true # default is "false"
|
||||
|
||||
# set clone depth
|
||||
clone_depth: 2000 # clone entire repository history if not defined
|
||||
|
||||
environment:
|
||||
global:
|
||||
## Qt: https://www.appveyor.com/docs/installed-software#qt
|
||||
# QTDIR: C:\Qt\5.10.1\mingw53_32
|
||||
MSYS2_ARCH: i686
|
||||
TARGET: i686_32-pc-msys
|
||||
MINGW_PREFIX: C:\msys64\mingw32
|
||||
RS_DEPLOY: RetroShare_deploy
|
||||
|
||||
|
||||
# build cache to preserve files/folders between builds
|
||||
#cache:
|
||||
# Disabled because it's bigger then supported by appveyor free plan
|
||||
# - C:\msys64\var\cache\pacman\pkg
|
||||
|
||||
# scripts that run after cloning repository
|
||||
#install:
|
||||
# # by default, all script lines are interpreted as batch
|
||||
# - echo This is batch
|
||||
# # to run script as a PowerShell command prepend it with ps:
|
||||
# - ps: Write-Host 'This is PowerShell'
|
||||
# # batch commands start from cmd:
|
||||
# - cmd: echo This is batch again
|
||||
# - cmd: set MY_VAR=12345
|
||||
install:
|
||||
# We cannot get OBS submodule as it use illegal folder name for windows.
|
||||
#- git submodule update --init
|
||||
# Configuring MSys2
|
||||
- set PATH=C:\msys64\usr\bin;%PATH%
|
||||
- set PATH=C:\msys64\mingw32\bin;%PATH%
|
||||
- >
|
||||
pacman --noconfirm -S
|
||||
mingw-w64-i686-qt5 mingw-w64-i686-miniupnpc mingw-w64-i686-rapidjson
|
||||
mingw-w64-i686-sqlcipher mingw-w64-i686-xapian-core mingw-w64-i686-cmark
|
||||
#- set PATH=C:\msys64\mingw32\qt5-static\bin\;%PATH%
|
||||
|
||||
# Configuring Qt
|
||||
# - set PATH=%QTDIR%\bin;C:\Qt\Tools\mingw491_32\bin;%PATH%
|
||||
|
||||
# Hack for new MSys2
|
||||
- copy C:\msys64\mingw32\i686-w64-mingw32\bin\ar.exe C:\msys64\mingw32\bin\i686-w64-mingw32-ar.exe
|
||||
- copy C:\msys64\mingw32\i686-w64-mingw32\bin\ranlib.exe C:\msys64\mingw32\bin\i686-w64-mingw32-ranlib.exe
|
||||
- copy C:\msys64\mingw32\bin\windres.exe C:\msys64\mingw32\bin\i686-w64-mingw32-windres.exe
|
||||
- copy C:\msys64\mingw64\x86_64-w64-mingw32\bin\ar.exe C:\msys64\mingw64\bin\x86_64-w64-mingw32-ar.exe
|
||||
- copy C:\msys64\mingw64\x86_64-w64-mingw32\bin\ranlib.exe C:\msys64\mingw64\bin\x86_64-w64-mingw32-ranlib.exe
|
||||
- copy C:\msys64\mingw64\bin\windres.exe C:\msys64\mingw64\bin\x86_64-w64-mingw32-windres.exe
|
||||
|
||||
# Work-around linker looking for Qt dll in wrong place
|
||||
- copy C:\msys64\mingw32\bin\Qt5PrintSupport.dll C:\msys64\mingw32\lib\Qt5PrintSupport.dll
|
||||
- copy C:\msys64\mingw32\bin\Qt5Widgets.dll C:\msys64\mingw32\lib\Qt5Widgets.dll
|
||||
- copy C:\msys64\mingw32\bin\Qt5Multimedia.dll C:\msys64\mingw32\lib\Qt5Multimedia.dll
|
||||
- copy C:\msys64\mingw32\bin\Qt5Gui.dll C:\msys64\mingw32\lib\Qt5Gui.dll
|
||||
- copy C:\msys64\mingw32\bin\Qt5Network.dll C:\msys64\mingw32\lib\Qt5Network.dll
|
||||
- copy C:\msys64\mingw32\bin\Qt5Xml.dll C:\msys64\mingw32\lib\Qt5Xml.dll
|
||||
- copy C:\msys64\mingw32\bin\Qt5Core.dll C:\msys64\mingw32\lib\Qt5Core.dll
|
||||
|
||||
|
||||
#---------------------------------#
|
||||
# build configuration #
|
||||
#---------------------------------#
|
||||
|
||||
# build platform, i.e. x86, x64, Any CPU. This setting is optional.
|
||||
platform: x86
|
||||
|
||||
# to add several platforms to build matrix:
|
||||
#platform:
|
||||
# - x86
|
||||
# - Any CPU
|
||||
|
||||
# build Configuration, i.e. Debug, Release, etc.
|
||||
configuration: Release
|
||||
|
||||
# to add several configurations to build matrix:
|
||||
#configuration:
|
||||
# - Debug
|
||||
# - Release
|
||||
|
||||
# scripts to run before build
|
||||
before_build:
|
||||
- cd C:\projects\RetroShare
|
||||
- git submodule update --init
|
||||
- cd C:\projects\
|
||||
- mkdir RetroShare-build
|
||||
- cd RetroShare-build
|
||||
# - find C:\ > filelist.txt
|
||||
|
||||
# scripts to run *after* solution is built and *before* automatic packaging occurs (web apps, NuGet packages, Azure Cloud Services)
|
||||
before_package:
|
||||
|
||||
# to run your custom scripts instead of automatic MSBuild
|
||||
build_script:
|
||||
- env
|
||||
- qmake ../RetroShare -spec win32-g++ "CONFIG+=debug"
|
||||
- mingw32-make -j3
|
||||
|
||||
# scripts to run after build
|
||||
after_build:
|
||||
- find .
|
||||
|
||||
- mkdir %RS_DEPLOY%
|
||||
- copy retroshare-gui\src\debug\retroshare.exe %RS_DEPLOY%\
|
||||
- copy retroshare-service\src\debug\retroshare-service.exe %RS_DEPLOY%\
|
||||
# - copy retroshare-service\src\retroshare-service.exe %RS_DEPLOY%\
|
||||
# - copy retroshare-gui\src\retroshare.exe %RS_DEPLOY%\
|
||||
|
||||
## In Debug build winedeplyqt forget the non debug Qt libs
|
||||
- copy C:\msys64\mingw32\bin\Qt5Svg.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\Qt5Core.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\Qt5Multimedia.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\Qt5Widgets.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\Qt5Xml.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\Qt5PrintSupport.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\Qt5Gui.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\Qt5Network.dll %RS_DEPLOY%\
|
||||
|
||||
- mkdir %RS_DEPLOY%\playlistformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\playlistformats\qtmultimedia_m3u.dll %RS_DEPLOY%\playlistformats
|
||||
|
||||
- mkdir %RS_DEPLOY%\printsupport\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\printsupport\windowsprintersupport.dll %RS_DEPLOY%\printsupport\
|
||||
|
||||
- mkdir %RS_DEPLOY%\iconengines\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\iconengines\qsvgicon.dll %RS_DEPLOY%\iconengines\
|
||||
|
||||
- mkdir %RS_DEPLOY%\bearer\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\bearer\qgenericbearer.dll %RS_DEPLOY%\bearer\
|
||||
|
||||
- mkdir %RS_DEPLOY%\mediaservice\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\mediaservice\qtmedia_audioengine.dll %RS_DEPLOY%\mediaservice\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\mediaservice\dsengine.dll %RS_DEPLOY%\mediaservice\
|
||||
|
||||
- mkdir %RS_DEPLOY%\styles\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\styles\qwindowsvistastyle.dll %RS_DEPLOY%\styles\
|
||||
|
||||
- mkdir %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qwebp.dll %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qicns.dll %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qjpeg.dll %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qtiff.dll %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qtga.dll %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qjp2.dll %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qico.dll %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qwbmp.dll %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qicns.dll %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qgif.dll %RS_DEPLOY%\imageformats\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\imageformats\qsvg.dll %RS_DEPLOY%\imageformats\
|
||||
|
||||
- mkdir %RS_DEPLOY%\platforms\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\platforms\qwindows.dll %RS_DEPLOY%\platforms\
|
||||
|
||||
- mkdir %RS_DEPLOY%\audio\
|
||||
- copy C:\msys64\mingw32\share\qt5\plugins\audio\qtaudio_windows.dll %RS_DEPLOY%\audio\
|
||||
|
||||
- windeployqt %RS_DEPLOY%\retroshare.exe
|
||||
|
||||
- copy C:\msys64\mingw32\bin\libbz2*.dll %RS_DEPLOY%\
|
||||
#- copy C:\msys64\mingw32\bin\libeay32.dll %RS_DEPLOY%\
|
||||
- copy C:\OpenSSL-Win32\libeay32.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libminiupnpc.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libsqlcipher*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libsqlite3*.dll %RS_DEPLOY%\
|
||||
#- copy C:\msys64\mingw32\bin\ssleay32.dll %RS_DEPLOY%\
|
||||
- copy C:\OpenSSL-Win32\ssleay32.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\zlib*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libgcc_s_dw2*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libstdc*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libwinpthread*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libicu*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libpcre*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libharfbuzz*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libpng*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libfreetype*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libglib*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libgraphite2.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libintl*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libiconv*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libjasper*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libjpeg*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libtiff*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libwebp*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libwebpdemux*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\liblzma*.dll %RS_DEPLOY%\
|
||||
|
||||
## Needed for cmark
|
||||
- copy C:\msys64\mingw32\bin\libcmark*.dll %RS_DEPLOY%\
|
||||
- copy C:\msys64\mingw32\bin\libdouble-conversion*.dll %RS_DEPLOY%\
|
||||
|
||||
# to disable automatic builds
|
||||
#build: off
|
||||
|
||||
#---------------------------------#
|
||||
# artifacts configuration #
|
||||
#---------------------------------#
|
||||
|
||||
#artifacts:
|
||||
# - path: '**\*.exe'
|
||||
# - path: filelist.txt
|
||||
# - path: $(RS_DEPLOY)
|
||||
|
||||
#
|
||||
# # pushing a single file
|
||||
# - path: test.zip
|
||||
#
|
||||
# # pushing a single file with environment variable in path and "Deployment name" specified
|
||||
# - path: MyProject\bin\$(configuration)
|
||||
# name: myapp
|
||||
#
|
||||
# # pushing entire folder as a zip archive
|
||||
# - path: logs
|
||||
|
||||
|
||||
#---------------------------------#
|
||||
# deployment configuration #
|
||||
#---------------------------------#
|
||||
#No deployment under unknown computer!!!
|
||||
|
||||
#---------------------------------#
|
||||
# global handlers #
|
||||
#---------------------------------#
|
||||
|
||||
# on successful build
|
||||
#on_success:
|
||||
# - do something
|
||||
|
||||
# on build failure
|
||||
#on_failure:
|
||||
# - do something
|
||||
|
||||
# after build failure or success
|
||||
#on_finish:
|
||||
# - do something
|
||||
|
||||
|
||||
#---------------------------------#
|
||||
# notifications #
|
||||
#---------------------------------#
|
||||
|
||||
notifications:
|
||||
|
||||
# Email
|
||||
- provider: Email
|
||||
to:
|
||||
- retrosharephenom@gmail.com
|
||||
subject: 'Build {{status}}' # optional
|
||||
message: "{{message}}, {{commitId}}, ..." # optional
|
||||
on_build_status_changed: true
|
||||
399
build_scripts/Android/README.asciidoc
Normal file
399
build_scripts/Android/README.asciidoc
Normal file
@ -0,0 +1,399 @@
|
||||
= RetroShare development on Android
|
||||
|
||||
// SPDX-FileCopyrightText: RetroShare Team <contact@retroshare.cc>
|
||||
// SPDX-License-Identifier: CC-BY-SA-4.0
|
||||
|
||||
|
||||
Compiling an application for Android is not as easy as one would imagine,
|
||||
expecially one like RetroShare that has a big codebase and is not well
|
||||
documented. This document is aimed to empower the reader so she can hopefully
|
||||
succed or at least have a significant help in compiling her own RetroShare APK
|
||||
installable on Android.
|
||||
|
||||
|
||||
== Preparing The Environement
|
||||
|
||||
First of all setup your Qt for Android development environement following the
|
||||
guide on the link:http://doc.qt.io/qt-5/androidgs.html[Qt for android web site].
|
||||
At this point you should have Android SDK, Android NDK, and Qt for Android
|
||||
working fine, and you should be capable of executing on an Android emulator or
|
||||
on your Android phone Qt for Android examples.
|
||||
|
||||
But RetroShare is not as simple to compile as those examples. The good news is
|
||||
that Android NDK ships all the necessary to build a custom toolchain that is
|
||||
suitable to build RetroShare.
|
||||
In order to build the toolchain with needed libraries RetroShare provides the
|
||||
+android-prepare-toolchain.sh+ script; before you execute it you should define
|
||||
some variables the script cannot determine in an easy and reliable manner by
|
||||
itself in your terminal.
|
||||
|
||||
[source,bash]
|
||||
-------------------------------------------------------------------------------
|
||||
## The path where Android NDK is installed in your system
|
||||
export ANDROID_NDK_PATH="/opt/android-ndk/"
|
||||
|
||||
## The path where your fresh compiled toolchain will be installed, make sure
|
||||
## the parent exists
|
||||
export NATIVE_LIBS_TOOLCHAIN_PATH="${HOME}/Builds/android-toolchains/retroshare-android/"
|
||||
|
||||
## The CPU architecture of the Android device you want to target
|
||||
export ANDROID_NDK_ARCH="arm"
|
||||
|
||||
## The Android API level the Android device you want to target
|
||||
export ANDROID_PLATFORM_VER="16"
|
||||
|
||||
## The number of core that yout host CPU have (just to speed up compilation) set
|
||||
## it to 1 if unsure
|
||||
export HOST_NUM_CPU=1
|
||||
|
||||
./android-prepare-toolchain.sh
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
== Preparing Qt Creator
|
||||
|
||||
Now that your environement is set up you should configure Qt Creator for Android
|
||||
following the
|
||||
link:http://doc.qt.io/qtcreator/creator-developing-android.html[official guide].
|
||||
At the end of this step your Qt Creator should recognize the Android compiler
|
||||
and the Qt for Android kit.
|
||||
|
||||
Your Kit is now ready to use. Now you can open RetroShare as a Qt Creator
|
||||
project and in the Projects left menu add the newly created kit if not already
|
||||
present, so you can select it on the build type selection button down on the
|
||||
left.
|
||||
|
||||
Now you need to set properly a few options like `JSONAPI_GENERATOR_EXE` and
|
||||
disable some of RetroShare modules like `retroshare-gui` that are not available
|
||||
on Android so you will have to go to
|
||||
|
||||
_Qt Creator left pane -> Projects -> Build and Run -> Android SOMESTUFF kit ->
|
||||
Build Steps -> qmake -> Additional arguments_ +
|
||||
|
||||
and add the following configurations (change `Your_Path` according to your
|
||||
deployment)
|
||||
|
||||
[source,makefile]
|
||||
-------------------------------------------------------------------------------
|
||||
CONFIG+=retroshare_service CONFIG+=rs_jsonapi CONFIG+=rs_deep_search
|
||||
RS_UPNP_LIB=miniupnpc
|
||||
JSONAPI_GENERATOR_EXE=Your_Path/jsonapi-generator/src/jsonapi-generator
|
||||
NATIVE_LIBS_TOOLCHAIN_PATH=Your_Path/retroshare-android-16-arm/
|
||||
CONFIG+=no_retroshare_gui CONFIG+=no_rs_service_webui_terminal_password
|
||||
CONFIG+=no_rs_service_terminal_login
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
TIP: Some versions of QtCreator try to find the Android SDK in
|
||||
`/opt/android/sdk`. A workaround to this is to make a symbolic link there
|
||||
pointing to your SDK installation path, like
|
||||
+mkdir -p /opt/android/sdk && ln -s /home/user/android-sdk-linux
|
||||
/opt/android/sdk+
|
||||
|
||||
|
||||
== Quircks
|
||||
|
||||
=== Protected Apps
|
||||
|
||||
On some Android devices like +Huawei ALE-L21+ background applications are
|
||||
killed when screen is turned off unless they are in the _protected app_ list.
|
||||
At moment seems apps developers don't have a way to have the application
|
||||
_protected_ by default, unless the phone vendor decide the app is _popular_ so
|
||||
the user have to enable _protection_ for RetroShare manually on those mobile
|
||||
phones. +
|
||||
|
||||
{empty} +
|
||||
To enable enable _protection_: +Android menu -> Settings -> Privacy & security
|
||||
-> Protected apps -> RetroShare+ +
|
||||
{empty} +
|
||||
|
||||
Other devices may offer similar _features_ please report them.
|
||||
|
||||
|
||||
=== APK signature mismatch
|
||||
|
||||
If you try to install a RetroShare APK that comes from a different source
|
||||
(eg: if you try to upgrade from F-Droid when you originally installed an APK
|
||||
build by yourself) Android will prevent that from happening. In that case the
|
||||
only solution is to uninstall the app and then install the new APK but if you do
|
||||
it also the application data and your precious cryptographic keys, friend list
|
||||
etc. will be lost forever.
|
||||
To avoid that you can attempt to manually backup and then restore from the
|
||||
command-line (`adb backup` seems not working either) to change the app source
|
||||
without erasing the appliation data.
|
||||
|
||||
CAUTION: Following steps require root access on your Android device
|
||||
|
||||
.Backup RetroShare Android application data
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
export ORIG_DIR="/data/data/org.retroshare.android.qml_app"
|
||||
export BACKUP_DIR="org.retroshare.android.qml_app.backup"
|
||||
|
||||
adb root
|
||||
|
||||
adb shell am force-stop org.retroshare.android.qml_app
|
||||
sleep 1s
|
||||
|
||||
mkdir ${BACKUP_DIR}
|
||||
|
||||
# Avoid adb pull failing
|
||||
adb shell rm ${ORIG_DIR}/files/.retroshare/libresapi.sock
|
||||
adb pull ${ORIG_DIR}/files/ ${BACKUP_DIR}/files/
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
After this you should be able to uninstall the old APK with your preferred
|
||||
method, as example from the command-line.
|
||||
|
||||
.Uninstall RetroShare Android from the command-line
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
adb uninstall org.retroshare.android.qml_app
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Now you can install a different signature APK and then restore the application
|
||||
data with the following commands.
|
||||
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
export ORIG_DIR="/data/data/org.retroshare.android.qml_app"
|
||||
export BACKUP_DIR="org.retroshare.android.qml_app.backup"
|
||||
|
||||
adb root
|
||||
|
||||
## Launch the app to make sure the parent directory exists and has proper owner
|
||||
adb shell monkey -p org.retroshare.android.qml_app -c android.intent.category.LAUNCHER 1
|
||||
sleep 1s
|
||||
|
||||
adb shell am force-stop org.retroshare.android.qml_app
|
||||
sleep 1s
|
||||
|
||||
|
||||
APP_OWNER="$(adb shell busybox ls -lnd ${ORIG_DIR} | awk '{print $3":"$4}')"
|
||||
adb shell rm -rf ${ORIG_DIR}/files
|
||||
adb push ${BACKUP_DIR}/files/ ${ORIG_DIR}/files/
|
||||
adb shell busybox chown -R ${APP_OWNER} ${ORIG_DIR}/files/
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Opening RetroShare android app now should show your old profile.
|
||||
|
||||
|
||||
== Debugging with GDB
|
||||
|
||||
If building RetroShare Android package seems tricky, setting up a functional
|
||||
debugging environement for it feels like black magic. This section is meant to
|
||||
help you doing it with less headache and hopefully in a reproducible way.
|
||||
|
||||
Unfortunately at the time of the last update to this guide, Qt build system
|
||||
strips debugging symbols from the package and from the buildroot also if you
|
||||
compile with debugging enabled. Fiddling with `qmake` configurations and
|
||||
variables like `CONFIG+=debug`, `CONFIG+=force_debug_info` or `QMAKE_STRIP`
|
||||
either as commandline arguments or inside retroshare `.pro` and `.pri` files is
|
||||
uneffective. IMHO Qt should handle this on itself so it is probably worth
|
||||
reporting a bug to them. So to workaround this problem you need to fiddle a bit
|
||||
with the Android NDK. In my case I always keep +Debug+ or +Release+ suffix in
|
||||
my build directory name depending on what kind of build it is, so I use this
|
||||
information and modify `llvm-strip` in a way that it will strip only if stripped
|
||||
file path doesn't contain +Debug+.
|
||||
|
||||
.Modify llvm-strip inside Android NDK
|
||||
--------------------------------------------------------------------------------
|
||||
## Set ANDROID_NDK_PATH to your Android NDK installation path
|
||||
export ANDROID_NDK_PATH="/opt/android-ndk/"
|
||||
|
||||
## Define a convenience variable with llvm-strip path
|
||||
export ANDROID_NDK_LLVM_STRIP="${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip"
|
||||
|
||||
## If not existing yer create a backup of the original llvm-strip
|
||||
[ -f "${ANDROID_NDK_LLVM_STRIP}.back" ] ||
|
||||
cp "${ANDROID_NDK_LLVM_STRIP}" "${ANDROID_NDK_LLVM_STRIP}.back"
|
||||
|
||||
## Create a new llvm-strip that does nothing if the argument path contains Debug
|
||||
cat > "${ANDROID_NDK_LLVM_STRIP}" << LLVMSTRIPTRICK
|
||||
#!/bin/bash
|
||||
|
||||
echo "\${2}" | grep -q Debug ||
|
||||
"${ANDROID_NDK_LLVM_STRIP}.back" --strip-all "\${2}"
|
||||
|
||||
LLVMSTRIPTRICK
|
||||
|
||||
## Eventually you can revert back simply by running
|
||||
# `mv "${ANDROID_NDK_LLVM_STRIP}.back" "${ANDROID_NDK_LLVM_STRIP}"`
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
To attach to the `retroshare-service` running on Android you need also to pull a
|
||||
debugging sysroot out of your device first, RetroShare sources provides an
|
||||
helper script to do that.
|
||||
|
||||
.Prepare debugging sysroot with helper script
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
## Set RetroShare source path
|
||||
export RS_SOURCE_DIR="${HOME}/Development/rs-develop"
|
||||
|
||||
## Optionally set your device ID first available will be used, you can run
|
||||
## `adb devices` to list available devices.
|
||||
#export ANDROID_SERIAL="YT013PSPGK"
|
||||
|
||||
## Optionally set a path where to save the debugging sysroot otherwise default
|
||||
## is used.
|
||||
#export DEBUG_SYSROOT="${HOME}/Builds/debug_sysroot/${ANDROID_SERIAL}/"
|
||||
|
||||
## Run the helper script
|
||||
${RS_SOURCE_DIR}/build_scripts/Android/pull_sysroot.sh
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
.Prepare Android NDK GDB configurations
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
## Optionally set Qt version variable consistently with your installation
|
||||
export QT_VERSION="5.12.7"
|
||||
|
||||
## Optionally set Qt architecture variable consistently with Android device
|
||||
export QT_ARCH="arm64_v8a"
|
||||
|
||||
## Optionally set Qt path variable consistently with your installation
|
||||
export QT_DIR="/opt/Qt-${QT_VERSION}/${QT_VERSION}/"
|
||||
|
||||
## Optionally set RetroShare buildroot path
|
||||
export RS_BUILD_DIR="${HOME}/Builds/RetroShare-Android_for_${QT_ARCH}_Clang_Qt_${QT_VERSION//./_}_android_${QT_ARCH}-Debug/"
|
||||
|
||||
## Optionally set gdb config file path
|
||||
export GDB_CONFIGS_FILE="${HOME}/Builds/gdb_configs_${QT_ARCH}"
|
||||
|
||||
## Generate Android NDK GDB configuration
|
||||
${RS_SOURCE_DIR}/build_scripts/Android/generate_gdb_init_commands.sh
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
You will need to run the following steps everytime you want to debug
|
||||
`retroshare-service` on Android.
|
||||
|
||||
Make sure `retroshare-service` is running on your connected Android device.
|
||||
|
||||
.Run GDB server on your Android device from your host console
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
${RS_SOURCE_DIR}/build_scripts/Android/start_gdbserver.sh
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
.Run Android NDK GDB on your workstation and attach
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
## Start NDK gdb
|
||||
${ANDROID_NDK_PATH}/prebuilt/linux-x86_64/bin/gdb
|
||||
|
||||
## Instruct GDB how and where to find debugging symbols
|
||||
(gdb) source $GDB_CONFIGS_FILE
|
||||
|
||||
## Connect to the gdbserver running on the phone
|
||||
(gdb) target remote 127.0.01:5039
|
||||
|
||||
## Have fun debugging
|
||||
(gdb)
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
== Debugging with Qt Creator
|
||||
|
||||
WARNING: As of the last update to this guide, debugging retroshare-service
|
||||
running on Android via Qt creator doesn't wrok even with all the trickery
|
||||
explained in this section, you better learn how to debug with GDB reading
|
||||
carefully previous section.
|
||||
|
||||
Qt Creator actually support debugging only for the foreground activity, so to
|
||||
debug what's happening in the core extra trickery is needed.
|
||||
|
||||
- Run the App in Debug mode from QtCreator "Start Debugging" button
|
||||
- Enable QtCreator debugger console view Menu->Window->Debugger Log
|
||||
- Run +show solib-search-path+ in the QtCreator GDB console
|
||||
- Take note of the output you get in the right pane of the console
|
||||
- Thanks https://stackoverflow.com/a/31164313 for the idea
|
||||
|
||||
TIP: QtCreator GDB console seems a bit buggy and easly trigger timeout
|
||||
message when a command is run, in that case attempt to run the command while the
|
||||
debugging is paused or at breakpoint, or with other similar tricks.
|
||||
|
||||
CAUTION: Following steps require root access on your Android device
|
||||
|
||||
Now on your phone yuo need to authorize root access to applications, then once
|
||||
you plug your sacrifical Android phone run this commands
|
||||
|
||||
.Run gdbserver as root on Android phone
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
## Open a shell from your workstation on the connected Android phone
|
||||
adb shell
|
||||
|
||||
## take the note of the phone IP address
|
||||
ip address show
|
||||
|
||||
## Gain root permissions on the shell
|
||||
su
|
||||
|
||||
## Attach with gdbserver and listen on one TCP port
|
||||
gdbserver :4567 --attach $(pgrep org.retroshare.android.qml_app:rs)
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
.Prepare and run Android NDK GDB on your workstation
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
## Setup some convenience variables
|
||||
NDK_GDB="${ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gdb"
|
||||
RS_BUILD_PATH="${HOME}/Builds/RetroShare-Android_for_armeabi_v7a_GCC_4_9_Qt_5_9_2_android_armv7-Debug/"
|
||||
|
||||
## Start Android NDK GDB of your phone architecture passing the executable
|
||||
$NDK_GDB $RS_BUILD_PATH/retroshare-android-service/src/libretroshare-android-service.so
|
||||
|
||||
## Instruct GDB how and where to find debugging symbols
|
||||
(gdb) set auto-solib-add on
|
||||
(gdb) set solib-search-path THE:BIG:LIST:OF:DIRECTORIES:YOU:TAKE:NOTE:BEFORE
|
||||
|
||||
## Connect to the gdbserver running on the phone
|
||||
(gdb) target remote $PHONE_IP:4567
|
||||
|
||||
## Have fun debugging
|
||||
(gdb)
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
TIP: Some time WiFi power saving on Android mess with the GDB connection,
|
||||
to prevent that from appening open another +adb shell+ and live +ping+ toward
|
||||
your work-station running
|
||||
|
||||
== Embedding into other Android packages
|
||||
|
||||
As showed by https://elrepo.io/[elRepo.io] developers it is possible and quite
|
||||
easy to embed `retroshare-service` into other Android packages see description
|
||||
|
||||
https://gitlab.com/elRepo.io/elRepo.io-android/-/blob/master/README.adoc
|
||||
|
||||
And implementation details
|
||||
|
||||
https://gitlab.com/elRepo.io/elRepo.io-android/-/blob/master/android/app/build.gradle
|
||||
|
||||
|
||||
== Furter Readings
|
||||
|
||||
- link:http://doc.qt.io/qt-5/android-support.html[]
|
||||
- link:https://developer.android.com/ndk/guides/libs.html[]
|
||||
- link:retroshare://forum?name=Compiling%20nogui%20for%20android&id=8fd22bd8f99754461e7ba1ca8a727995&msgid=4e0f92330600bba9cf978f384f4b7b2f2ca64eff[]
|
||||
- link:retroshare://file?name=Android%20Native%20Development%20Kit%20Cookbook.pdf&size=29214468&hash=0123361c1b14366ce36118e82b90faf7c7b1b136[]
|
||||
- link:https://groups.google.com/forum/#!topic/android-developers/srATPaL0aRU[]
|
||||
- link:https://stackoverflow.com/questions/31638986/protected-apps-setting-on-huawei-phones-and-how-to-handle-it[]
|
||||
- link:https://tthtlc.wordpress.com/2012/09/19/how-to-do-remote-debugging-via-gdbserver-running-inside-the-android-phone/[]
|
||||
- link:https://source.android.com/devices/tech/debug/[]
|
||||
- link:https://source.android.com/devices/tech/debug/gdb[]
|
||||
- link:https://fw4spl-org.github.io/fw4spl-blog/2015/07/27/Native-debugging-on-Android-with-QtCreator.html[]
|
||||
- link:https://fragglet.livejournal.com/19646.html[]
|
||||
- link:https://github.com/android-ndk/ndk/issues/773[How to build without using standalone toolchain?]
|
||||
|
||||
== License
|
||||
|
||||
Copyright (C) 2016-2020 Gioacchino Mazzurco <gio@eigenlab.org> +
|
||||
Copyright (C) 2020 Asociación Civil Altermundi <info@altermundi.net> +
|
||||
|
||||
This work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.
|
||||
|
||||
image::https://i.creativecommons.org/l/by-sa/4.0/88x31.png[Creative Commons License, link=http://creativecommons.org/licenses/by-sa/4.0/]
|
||||
85
build_scripts/Android/generate_gdb_init_commands.sh
Executable file
85
build_scripts/Android/generate_gdb_init_commands.sh
Executable file
@ -0,0 +1,85 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script to prepare Android NDK GDB configurations to debug retroshare-service
|
||||
#
|
||||
# Copyright (C) 2020 Gioacchino Mazzurco <gio@eigenlab.org>
|
||||
# Copyright (C) 2020 Asociación Civil Altermundi <info@altermundi.net>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under
|
||||
# the terms of the GNU Affero General Public License as published by the
|
||||
# Free Software Foundation, version 3.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License along
|
||||
# with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
|
||||
|
||||
## Define default value for variable, take two arguments, $1 variable name,
|
||||
## $2 default variable value, if the variable is not already define define it
|
||||
## with default value.
|
||||
function define_default_value()
|
||||
{
|
||||
VAR_NAME="${1}"
|
||||
DEFAULT_VALUE="${2}"
|
||||
|
||||
[ -z "${!VAR_NAME}" ] && export ${VAR_NAME}="${DEFAULT_VALUE}"
|
||||
}
|
||||
|
||||
define_default_value QT_VERSION "5.12.4"
|
||||
define_default_value QT_ARCH "arm64_v8a"
|
||||
define_default_value QT_DIR "/opt/Qt-${QT_VERSION}/${QT_VERSION}/"
|
||||
define_default_value ANDROID_SERIAL "$(adb devices | head -n 2 | tail -n 1 | awk '{print $1}')"
|
||||
define_default_value RS_BUILD_DIR "${HOME}/Builds/RetroShare-Android_for_${QT_ARCH}_Clang_Qt_${QT_VERSION//./_}_android_${QT_ARCH}-Debug/"
|
||||
define_default_value RS_SOURCE_DIR "${HOME}/Development/rs-develop/"
|
||||
define_default_value DEBUG_SYSROOT "${HOME}/Builds/debug_sysroot/${ANDROID_SERIAL}/"
|
||||
define_default_value GDB_CONFIGS_FILE "${HOME}/Builds/gdb_configs_${QT_ARCH}"
|
||||
|
||||
scanDir()
|
||||
{
|
||||
find "$1" -type d -not -path '*/\.git/*' | tr '\n' ':' >> $GDB_CONFIGS_FILE
|
||||
}
|
||||
|
||||
putSeparator()
|
||||
{
|
||||
echo >> $GDB_CONFIGS_FILE
|
||||
echo >> $GDB_CONFIGS_FILE
|
||||
}
|
||||
|
||||
echo "set sysroot ${DEBUG_SYSROOT}" > $GDB_CONFIGS_FILE
|
||||
putSeparator
|
||||
|
||||
echo "set auto-solib-add on" >> $GDB_CONFIGS_FILE
|
||||
echo -n "set solib-search-path " >> $GDB_CONFIGS_FILE
|
||||
scanDir "${RS_BUILD_DIR}"
|
||||
scanDir "${DEBUG_SYSROOT}"
|
||||
scanDir "${QT_DIR}/android_${QT_ARCH}/lib/"
|
||||
scanDir "${QT_DIR}/android_${QT_ARCH}/plugins/"
|
||||
scanDir "${QT_DIR}/android_${QT_ARCH}/qml/"
|
||||
putSeparator
|
||||
|
||||
echo -n "directory " >> $GDB_CONFIGS_FILE
|
||||
scanDir ${RS_SOURCE_DIR}/jsonapi-generator/src
|
||||
scanDir ${RS_SOURCE_DIR}/libbitdht/src
|
||||
scanDir ${RS_SOURCE_DIR}/openpgpsdk/src
|
||||
scanDir ${RS_SOURCE_DIR}/libretroshare/src
|
||||
scanDir ${RS_SOURCE_DIR}/retroshare-service/src
|
||||
scanDir ${RS_SOURCE_DIR}/supportlibs/rapidjson/include/
|
||||
scanDir ${RS_SOURCE_DIR}/supportlibs/restbed/source/
|
||||
scanDir ${RS_SOURCE_DIR}/supportlibs/udp-discovery-cpp/
|
||||
scanDir ${RS_SOURCE_DIR}/supportlibs/restbed/dependency/asio/asio/include/
|
||||
scanDir ${RS_SOURCE_DIR}/supportlibs/restbed/dependency/catch/include/
|
||||
putSeparator
|
||||
|
||||
## see https://stackoverflow.com/questions/28972367/gdb-backtrace-without-stopping
|
||||
echo "catch signal SIGSEGV" >> $GDB_CONFIGS_FILE
|
||||
echo "commands
|
||||
bt
|
||||
continue
|
||||
end" >> $GDB_CONFIGS_FILE
|
||||
putSeparator
|
||||
|
||||
echo GDB_CONFIGS_FILE=$GDB_CONFIGS_FILE
|
||||
549
build_scripts/Android/prepare-toolchain-clang.sh
Executable file
549
build_scripts/Android/prepare-toolchain-clang.sh
Executable file
@ -0,0 +1,549 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script to prepare RetroShare Android package building toolchain
|
||||
#
|
||||
# Copyright (C) 2016-2020 Gioacchino Mazzurco <gio@eigenlab.org>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under
|
||||
# the terms of the GNU Affero General Public License as published by the
|
||||
# Free Software Foundation, version 3.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License along
|
||||
# with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
#
|
||||
# SPDX-FileCopyrightText: Retroshare Team <contact@retroshare.cc>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
|
||||
## Define default value for variable, take two arguments, $1 variable name,
|
||||
## $2 default variable value, if the variable is not already define define it
|
||||
## with default value.
|
||||
function define_default_value()
|
||||
{
|
||||
VAR_NAME="${1}"
|
||||
DEFAULT_VALUE="${2}"
|
||||
|
||||
[ -z "${!VAR_NAME}" ] && export ${VAR_NAME}="${DEFAULT_VALUE}"
|
||||
}
|
||||
|
||||
## You are supposed to provide the following variables according to your system setup
|
||||
define_default_value ANDROID_NDK_PATH "/opt/android-ndk/"
|
||||
define_default_value ANDROID_NDK_ARCH "arm"
|
||||
define_default_value ANDROID_PLATFORM_VER "16"
|
||||
define_default_value NATIVE_LIBS_TOOLCHAIN_PATH "${HOME}/Builds/android-toolchains/retroshare-android-${ANDROID_PLATFORM_VER}-${ANDROID_NDK_ARCH}/"
|
||||
define_default_value HOST_NUM_CPU $(nproc)
|
||||
|
||||
define_default_value BZIP2_SOURCE_VERSION "1.0.6"
|
||||
define_default_value BZIP2_SOURCE_SHA256 a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd
|
||||
|
||||
define_default_value OPENSSL_SOURCE_VERSION "1.1.1c"
|
||||
define_default_value OPENSSL_SOURCE_SHA256 f6fb3079ad15076154eda9413fed42877d668e7069d9b87396d0804fdb3f4c90
|
||||
|
||||
define_default_value SQLITE_SOURCE_YEAR "2018"
|
||||
define_default_value SQLITE_SOURCE_VERSION "3250200"
|
||||
define_default_value SQLITE_SOURCE_SHA256 da9a1484423d524d3ac793af518cdf870c8255d209e369bd6a193e9f9d0e3181
|
||||
|
||||
define_default_value SQLCIPHER_SOURCE_VERSION "4.2.0"
|
||||
define_default_value SQLCIPHER_SOURCE_SHA256 105c1b813f848da038c03647a8bfc9d42fb46865e6aaf4edfd46ff3b18cdccfc
|
||||
|
||||
define_default_value LIBUPNP_SOURCE_VERSION "1.8.4"
|
||||
define_default_value LIBUPNP_SOURCE_SHA256 976c3e4555604cdd8391ed2f359c08c9dead3b6bf131c24ce78e64d6669af2ed
|
||||
|
||||
define_default_value INSTALL_QT_ANDROID "false"
|
||||
define_default_value QT_VERSION "5.12.0"
|
||||
define_default_value QT_ANDROID_INSTALLER_SHA256 a214084e2295c9a9f8727e8a0131c37255bf724bfc69e80f7012ba3abeb1f763
|
||||
|
||||
define_default_value RESTBED_SOURCE_VERSION f74f9329dac82e662c1d570b7cd72c192b729eb4
|
||||
|
||||
define_default_value UDP_DISCOVERY_CPP_SOURCE "https://github.com/truvorskameikin/udp-discovery-cpp.git"
|
||||
define_default_value UDP_DISCOVERY_CPP_VERSION "develop"
|
||||
|
||||
define_default_value XAPIAN_SOURCE_VERSION "1.4.7"
|
||||
define_default_value XAPIAN_SOURCE_SHA256 13f08a0b649c7afa804fa0e85678d693fd6069dd394c9b9e7d41973d74a3b5d3
|
||||
|
||||
define_default_value RAPIDJSON_SOURCE_VERSION "1.1.0"
|
||||
define_default_value RAPIDJSON_SOURCE_SHA256 bf7ced29704a1e696fbccf2a2b4ea068e7774fa37f6d7dd4039d0787f8bed98e
|
||||
|
||||
define_default_value MINIUPNPC_SOURCE_VERSION "2.1.20190625"
|
||||
define_default_value MINIUPNPC_SOURCE_SHA256 8723f5d7fd7970de23635547700878cd29a5c2bb708b5e5475b2d1d2510317fb
|
||||
|
||||
|
||||
## $1 filename, $2 sha256 hash
|
||||
function check_sha256()
|
||||
{
|
||||
echo ${2} "${1}" | sha256sum -c &> /dev/null
|
||||
}
|
||||
|
||||
## $1 filename, $2 sha256 hash, $3 url
|
||||
function verified_download()
|
||||
{
|
||||
FILENAME="$1"
|
||||
SHA256="$2"
|
||||
URL="$3"
|
||||
|
||||
check_sha256 "${FILENAME}" "${SHA256}" ||
|
||||
{
|
||||
rm -rf "${FILENAME}"
|
||||
|
||||
wget -O "${FILENAME}" "$URL" ||
|
||||
{
|
||||
echo "Failed downloading ${FILENAME} from $URL"
|
||||
exit 1
|
||||
}
|
||||
|
||||
check_sha256 "${FILENAME}" "${SHA256}" ||
|
||||
{
|
||||
echo "SHA256 mismatch for ${FILENAME} from ${URL} expected sha256 ${SHA256} got $(sha256sum ${FILENAME} | awk '{print $1}')"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cArch=""
|
||||
eABI=""
|
||||
|
||||
case "${ANDROID_NDK_ARCH}" in
|
||||
"arm")
|
||||
cArch="${ANDROID_NDK_ARCH}"
|
||||
eABI="eabi"
|
||||
;;
|
||||
"arm64")
|
||||
cArch="aarch64"
|
||||
eABI=""
|
||||
;;
|
||||
"x86")
|
||||
cArch="i686"
|
||||
eABI=""
|
||||
;;
|
||||
esac
|
||||
|
||||
export SYSROOT="${NATIVE_LIBS_TOOLCHAIN_PATH}/sysroot/"
|
||||
export PREFIX="${SYSROOT}/usr/"
|
||||
export CC="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-clang"
|
||||
export CXX="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-clang++"
|
||||
export AR="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-ar"
|
||||
export RANLIB="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-ranlib"
|
||||
|
||||
|
||||
## More information available at https://android.googlesource.com/platform/ndk/+/ics-mr0/docs/STANDALONE-TOOLCHAIN.html
|
||||
build_toolchain()
|
||||
{
|
||||
echo "build_toolchain()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
rm -rf ${NATIVE_LIBS_TOOLCHAIN_PATH}
|
||||
${ANDROID_NDK_PATH}/build/tools/make_standalone_toolchain.py --verbose \
|
||||
--arch ${ANDROID_NDK_ARCH} --install-dir ${NATIVE_LIBS_TOOLCHAIN_PATH} \
|
||||
--api ${ANDROID_PLATFORM_VER}
|
||||
find "${PREFIX}/include/" -not -type d > "${NATIVE_LIBS_TOOLCHAIN_PATH}/deletefiles"
|
||||
}
|
||||
|
||||
## This avoid <cmath> include errors due to -isystem and -I ordering issue
|
||||
delete_copied_includes()
|
||||
{
|
||||
echo "delete_copied_includes()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
cat "${NATIVE_LIBS_TOOLCHAIN_PATH}/deletefiles" | while read delFile ; do
|
||||
rm "$delFile"
|
||||
done
|
||||
}
|
||||
|
||||
## More information available at https://gitlab.com/relan/provisioners/merge_requests/1 and http://stackoverflow.com/a/34032216
|
||||
install_qt_android()
|
||||
{
|
||||
echo "install_qt_android()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
QT_VERSION_CODE=$(echo $QT_VERSION | tr -d .)
|
||||
QT_INSTALL_PATH=${NATIVE_LIBS_TOOLCHAIN_PATH}/Qt
|
||||
QT_INSTALLER="qt-unified-linux-x64-3.0.2-online.run"
|
||||
|
||||
verified_download $QT_INSTALLER $QT_ANDROID_INSTALLER_SHA256 \
|
||||
http://master.qt.io/archive/online_installers/3.0/${QT_INSTALLER}
|
||||
|
||||
chmod a+x ${QT_INSTALLER}
|
||||
|
||||
QT_INSTALLER_SCRIPT="qt_installer_script.js"
|
||||
cat << EOF > "${QT_INSTALLER_SCRIPT}"
|
||||
function Controller() {
|
||||
installer.autoRejectMessageBoxes();
|
||||
installer.installationFinished.connect(function() {
|
||||
gui.clickButton(buttons.NextButton);
|
||||
});
|
||||
|
||||
var welcomePage = gui.pageWidgetByObjectName("WelcomePage");
|
||||
welcomePage.completeChanged.connect(function() {
|
||||
if (gui.currentPageWidget().objectName == welcomePage.objectName)
|
||||
gui.clickButton(buttons.NextButton);
|
||||
});
|
||||
}
|
||||
|
||||
Controller.prototype.WelcomePageCallback = function() {
|
||||
gui.clickButton(buttons.NextButton);
|
||||
}
|
||||
|
||||
Controller.prototype.CredentialsPageCallback = function() {
|
||||
gui.clickButton(buttons.NextButton);
|
||||
}
|
||||
|
||||
Controller.prototype.IntroductionPageCallback = function() {
|
||||
gui.clickButton(buttons.NextButton);
|
||||
}
|
||||
|
||||
Controller.prototype.TargetDirectoryPageCallback = function() {
|
||||
gui.currentPageWidget().TargetDirectoryLineEdit.setText("$QT_INSTALL_PATH");
|
||||
gui.clickButton(buttons.NextButton);
|
||||
}
|
||||
|
||||
Controller.prototype.ComponentSelectionPageCallback = function() {
|
||||
var widget = gui.currentPageWidget();
|
||||
|
||||
// You can get these component names by running the installer with the
|
||||
// --verbose flag. It will then print out a resource tree.
|
||||
|
||||
widget.deselectComponent("qt.tools.qtcreator");
|
||||
widget.deselectComponent("qt.tools.doc");
|
||||
widget.deselectComponent("qt.tools.examples");
|
||||
|
||||
widget.selectComponent("qt.$QT_VERSION_CODE.android_armv7");
|
||||
|
||||
gui.clickButton(buttons.NextButton);
|
||||
}
|
||||
|
||||
Controller.prototype.LicenseAgreementPageCallback = function() {
|
||||
gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);
|
||||
gui.clickButton(buttons.NextButton);
|
||||
}
|
||||
|
||||
Controller.prototype.StartMenuDirectoryPageCallback = function() {
|
||||
gui.clickButton(buttons.NextButton);
|
||||
}
|
||||
|
||||
Controller.prototype.ReadyForInstallationPageCallback = function() {
|
||||
gui.clickButton(buttons.NextButton);
|
||||
}
|
||||
|
||||
Controller.prototype.FinishedPageCallback = function() {
|
||||
var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm;
|
||||
if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox)
|
||||
checkBoxForm.launchQtCreatorCheckBox.checked = false;
|
||||
gui.clickButton(buttons.FinishButton);
|
||||
}
|
||||
EOF
|
||||
|
||||
QT_QPA_PLATFORM=minimal ./${QT_INSTALLER} --script ${QT_INSTALLER_SCRIPT}
|
||||
}
|
||||
|
||||
## More information available at retroshare://file?name=Android%20Native%20Development%20Kit%20Cookbook.pdf&size=29214468&hash=0123361c1b14366ce36118e82b90faf7c7b1b136
|
||||
build_bzlib()
|
||||
{
|
||||
echo "build_bzlib()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
B_dir="bzip2-${BZIP2_SOURCE_VERSION}"
|
||||
rm -rf $B_dir
|
||||
|
||||
verified_download $B_dir.tar.gz $BZIP2_SOURCE_SHA256 \
|
||||
http://distfiles.gentoo.org/distfiles/bzip2-${BZIP2_SOURCE_VERSION}.tar.gz
|
||||
|
||||
tar -xf $B_dir.tar.gz
|
||||
cd $B_dir
|
||||
sed -i "/^CC=.*/d" Makefile
|
||||
sed -i "/^AR=.*/d" Makefile
|
||||
sed -i "/^RANLIB=.*/d" Makefile
|
||||
sed -i "/^LDFLAGS=.*/d" Makefile
|
||||
sed -i "s/^all: libbz2.a bzip2 bzip2recover test/all: libbz2.a bzip2 bzip2recover/" Makefile
|
||||
make -j${HOST_NUM_CPU}
|
||||
make install PREFIX=${PREFIX}
|
||||
# sed -i "/^CC=.*/d" Makefile-libbz2_so
|
||||
# make -f Makefile-libbz2_so -j${HOST_NUM_CPU}
|
||||
# cp libbz2.so.1.0.6 ${SYSROOT}/usr/lib/libbz2.so
|
||||
cd ..
|
||||
}
|
||||
|
||||
## More information available at http://doc.qt.io/qt-5/opensslsupport.html
|
||||
build_openssl()
|
||||
{
|
||||
echo "build_openssl()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
B_dir="openssl-${OPENSSL_SOURCE_VERSION}"
|
||||
rm -rf $B_dir
|
||||
|
||||
verified_download $B_dir.tar.gz $OPENSSL_SOURCE_SHA256 \
|
||||
https://www.openssl.org/source/$B_dir.tar.gz
|
||||
|
||||
tar -xf $B_dir.tar.gz
|
||||
cd $B_dir
|
||||
## We link openssl statically to avoid android silently sneaking in his own
|
||||
## version of libssl.so (we noticed this because it had some missing symbol
|
||||
## that made RS crash), the crash in some android version is only one of the
|
||||
## possible problems the fact that android insert his own binary libssl.so pose
|
||||
## non neglegible security concerns.
|
||||
oBits="32"
|
||||
[[ ${ANDROID_NDK_ARCH} =~ .*64.* ]] && oBits=64
|
||||
|
||||
ANDROID_NDK="${ANDROID_NDK_PATH}" PATH="${SYSROOT}/bin/:${PATH}" \
|
||||
./Configure linux-generic${oBits} -fPIC --prefix="${PREFIX}" \
|
||||
--openssldir="${SYSROOT}/etc/ssl"
|
||||
# sed -i 's/LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \\/LIBNAME=$$i \\/g' Makefile
|
||||
# sed -i '/LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \\/d' Makefile
|
||||
make -j${HOST_NUM_CPU}
|
||||
make install
|
||||
rm -f ${PREFIX}/lib/libssl.so*
|
||||
rm -f ${PREFIX}/lib/libcrypto.so*
|
||||
cd ..
|
||||
}
|
||||
|
||||
build_sqlite()
|
||||
{
|
||||
echo "build_sqlite()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
B_dir="sqlite-autoconf-${SQLITE_SOURCE_VERSION}"
|
||||
rm -rf $B_dir
|
||||
|
||||
verified_download $B_dir.tar.gz $SQLITE_SOURCE_SHA256 \
|
||||
https://www.sqlite.org/${SQLITE_SOURCE_YEAR}/$B_dir.tar.gz
|
||||
|
||||
tar -xf $B_dir.tar.gz
|
||||
cd $B_dir
|
||||
./configure --with-pic --prefix="${PREFIX}" --host=${cArch}-linux
|
||||
make -j${HOST_NUM_CPU}
|
||||
make install
|
||||
rm -f ${PREFIX}/lib/libsqlite3.so*
|
||||
# ${CC} -shared -o libsqlite3.so -fPIC sqlite3.o -ldl
|
||||
# cp libsqlite3.so "${SYSROOT}/usr/lib"
|
||||
cd ..
|
||||
}
|
||||
|
||||
build_sqlcipher()
|
||||
{
|
||||
echo "build_sqlcipher()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
B_dir="sqlcipher-${SQLCIPHER_SOURCE_VERSION}"
|
||||
rm -rf $B_dir
|
||||
|
||||
T_file="${B_dir}.tar.gz"
|
||||
|
||||
verified_download $T_file $SQLCIPHER_SOURCE_SHA256 \
|
||||
https://github.com/sqlcipher/sqlcipher/archive/v${SQLCIPHER_SOURCE_VERSION}.tar.gz
|
||||
|
||||
tar -xf $T_file
|
||||
cd $B_dir
|
||||
case "${ANDROID_NDK_ARCH}" in
|
||||
"arm64")
|
||||
# SQLCipher config.sub is outdated and doesn't recognize newer architectures
|
||||
rm config.sub
|
||||
autoreconf --verbose --install --force
|
||||
automake --add-missing --copy --force-missing
|
||||
;;
|
||||
esac
|
||||
./configure --with-pic --build=$(sh ./config.guess) \
|
||||
--host=${cArch}-linux \
|
||||
--prefix="${PREFIX}" --with-sysroot="${SYSROOT}" \
|
||||
--enable-tempstore=yes \
|
||||
--disable-tcl --disable-shared \
|
||||
CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="${PREFIX}/lib/libcrypto.a"
|
||||
make -j${HOST_NUM_CPU}
|
||||
make install
|
||||
cd ..
|
||||
}
|
||||
|
||||
build_libupnp()
|
||||
{
|
||||
echo "build_libupnp()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
B_dir="pupnp-release-${LIBUPNP_SOURCE_VERSION}"
|
||||
B_ext=".tar.gz"
|
||||
B_file="${B_dir}${B_ext}"
|
||||
rm -rf $B_dir
|
||||
|
||||
verified_download $B_file $LIBUPNP_SOURCE_SHA256 \
|
||||
https://github.com/mrjimenez/pupnp/archive/release-${LIBUPNP_SOURCE_VERSION}${B_ext}
|
||||
|
||||
tar -xf $B_file
|
||||
cd $B_dir
|
||||
./bootstrap
|
||||
## liupnp must be configured as static library because if not the linker will
|
||||
## look for libthreadutils.so.6 at runtime that cannot be packaged on android
|
||||
## as it supports only libname.so format for libraries, thus resulting in a
|
||||
## crash at startup.
|
||||
./configure --with-pic --enable-static --disable-shared --disable-samples \
|
||||
--disable-largefile \
|
||||
--prefix="${PREFIX}" --host=${cArch}-linux
|
||||
make -j${HOST_NUM_CPU}
|
||||
make install
|
||||
cd ..
|
||||
}
|
||||
|
||||
build_rapidjson()
|
||||
{
|
||||
echo "build_rapidjson()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
B_dir="rapidjson-${RAPIDJSON_SOURCE_VERSION}"
|
||||
D_file="${B_dir}.tar.gz"
|
||||
verified_download $D_file $RAPIDJSON_SOURCE_SHA256 \
|
||||
https://github.com/Tencent/rapidjson/archive/v${RAPIDJSON_SOURCE_VERSION}.tar.gz
|
||||
tar -xf $D_file
|
||||
cp -r "${B_dir}/include/rapidjson/" "${PREFIX}/include/rapidjson"
|
||||
}
|
||||
|
||||
build_restbed()
|
||||
{
|
||||
echo "build_restbed()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
[ -d restbed ] || git clone --depth=2000 https://github.com/Corvusoft/restbed.git
|
||||
cd restbed
|
||||
# git fetch --tags
|
||||
# git checkout tags/${RESTBED_SOURCE_VERSION}
|
||||
git checkout ${RESTBED_SOURCE_VERSION}
|
||||
git submodule update --init dependency/asio
|
||||
git submodule update --init dependency/catch
|
||||
git submodule update --init dependency/kashmir
|
||||
cd ..
|
||||
|
||||
rm -rf restbed-build; mkdir restbed-build ; cd restbed-build
|
||||
cmake \
|
||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON BUILD_TESTS=OFF \
|
||||
-DBUILD_SSL=OFF -DCMAKE_INSTALL_PREFIX="${PREFIX}" -B. -H../restbed
|
||||
make -j${HOST_NUM_CPU}
|
||||
make install
|
||||
cp "${PREFIX}/library/librestbed.a" "${PREFIX}/lib/"
|
||||
cd ..
|
||||
}
|
||||
|
||||
build_udp-discovery-cpp()
|
||||
{
|
||||
echo "build_udp-discovery-cpp()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
S_dir="udp-discovery-cpp"
|
||||
[ -d $S_dir ] || git clone $UDP_DISCOVERY_CPP_SOURCE $S_dir
|
||||
cd $S_dir
|
||||
git checkout $UDP_DISCOVERY_CPP_VERSION
|
||||
cd ..
|
||||
|
||||
B_dir="udp-discovery-cpp-build"
|
||||
rm -rf ${B_dir}; mkdir ${B_dir}; cd ${B_dir}
|
||||
cmake \
|
||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
|
||||
-DCMAKE_INSTALL_PREFIX="${PREFIX}" -B. -H../udp-discovery-cpp
|
||||
make -j${HOST_NUM_CPU}
|
||||
cp libudp-discovery.a "${PREFIX}/lib/"
|
||||
cp ../$S_dir/*.hpp "${PREFIX}/include/"
|
||||
cd ..
|
||||
}
|
||||
|
||||
build_xapian()
|
||||
{
|
||||
echo "build_xapian()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
|
||||
B_dir="xapian-core-${XAPIAN_SOURCE_VERSION}"
|
||||
D_file="$B_dir.tar.xz"
|
||||
verified_download $D_file $XAPIAN_SOURCE_SHA256 \
|
||||
https://oligarchy.co.uk/xapian/${XAPIAN_SOURCE_VERSION}/$D_file
|
||||
rm -rf $B_dir
|
||||
tar -xf $D_file
|
||||
cd $B_dir
|
||||
B_endiannes_detection_failure_workaround="ac_cv_c_bigendian=no"
|
||||
B_large_file=""
|
||||
[ "${ANDROID_PLATFORM_VER}" -lt "24" ] && B_large_file="--disable-largefile"
|
||||
./configure ${B_endiannes_detection_failure_workaround} ${B_large_file} \
|
||||
--with-pic \
|
||||
--disable-backend-inmemory --disable-backend-remote \
|
||||
--disable--backend-chert --enable-backend-glass \
|
||||
--host=${cArch}-linux --enable-static --disable-shared \
|
||||
--prefix="${PREFIX}" --with-sysroot="${SYSROOT}"
|
||||
make -j${HOST_NUM_CPU}
|
||||
make install
|
||||
}
|
||||
|
||||
build_miniupnpc()
|
||||
{
|
||||
echo "build_miniupnpc()
|
||||
################################################################################
|
||||
################################################################################
|
||||
################################################################################
|
||||
"
|
||||
S_dir="miniupnpc-${MINIUPNPC_SOURCE_VERSION}"
|
||||
B_dir="miniupnpc-${MINIUPNPC_SOURCE_VERSION}-build"
|
||||
D_file="$S_dir.tar.gz"
|
||||
verified_download $D_file $MINIUPNPC_SOURCE_SHA256 \
|
||||
http://miniupnp.free.fr/files/${D_file}
|
||||
rm -rf $S_dir $B_dir
|
||||
tar -xf $D_file
|
||||
mkdir $B_dir
|
||||
cd $B_dir
|
||||
cmake \
|
||||
-DUPNPC_BUILD_STATIC=TRUE \
|
||||
-DUPNPC_BUILD_SHARED=FALSE \
|
||||
-DUPNPC_BUILD_TESTS=FALSE \
|
||||
-DUPNPC_BUILD_SAMPLE=FALSE \
|
||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
|
||||
-DCMAKE_INSTALL_PREFIX="${PREFIX}" -B. -S../$S_dir
|
||||
make -j${HOST_NUM_CPU}
|
||||
make install
|
||||
}
|
||||
|
||||
build_toolchain
|
||||
[ "${INSTALL_QT_ANDROID}X" != "trueX" ] || install_qt_android
|
||||
build_bzlib
|
||||
build_openssl
|
||||
build_sqlite
|
||||
build_sqlcipher
|
||||
build_libupnp
|
||||
build_rapidjson
|
||||
build_restbed
|
||||
build_udp-discovery-cpp
|
||||
build_xapian
|
||||
build_miniupnpc
|
||||
delete_copied_includes
|
||||
|
||||
echo NATIVE_LIBS_TOOLCHAIN_PATH=${NATIVE_LIBS_TOOLCHAIN_PATH}
|
||||
90
build_scripts/Android/pull_sysroot.sh
Executable file
90
build_scripts/Android/pull_sysroot.sh
Executable file
@ -0,0 +1,90 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script to pull debugging sysroot from Android devices
|
||||
#
|
||||
# Copyright (C) 2020 Gioacchino Mazzurco <gio@eigenlab.org>
|
||||
# Copyright (C) 2020 Asociación Civil Altermundi <info@altermundi.net>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under
|
||||
# the terms of the GNU Affero General Public License as published by the
|
||||
# Free Software Foundation, version 3.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License along
|
||||
# with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
|
||||
<<"ASCIIDOC"
|
||||
|
||||
Pull files from Android device to prepare a debugging sysroot
|
||||
Inspired by:
|
||||
https://fw4spl-org.github.io/fw4spl-blog/2015/07/27/Native-debugging-on-Android-with-QtCreator.html
|
||||
|
||||
The goal is to have a local copy of the sysroot of the connected device.
|
||||
For that we use the command `adb pull <remote_dir_or_file> <local_dir_or_file>`
|
||||
|
||||
We will get a copy of:
|
||||
|
||||
- `/system/lib/`
|
||||
- `/vendor/lib/`
|
||||
- `libc.so`
|
||||
- `libcutils.so`
|
||||
|
||||
As well as the binaries `linker` and `app_process`
|
||||
|
||||
IMPORTANT:
|
||||
from one device to another, the remote file `app_process` can be a binary file
|
||||
or a symlink to a binary file - which is NOT ok for us.
|
||||
That's so we will try to pull every known possible variants of `app_process`,
|
||||
e.g. `app_process32` or `app_process_init`
|
||||
|
||||
ASCIIDOC
|
||||
|
||||
|
||||
## Define default value for variable, take two arguments, $1 variable name,
|
||||
## $2 default variable value, if the variable is not already define define it
|
||||
## with default value.
|
||||
function define_default_value()
|
||||
{
|
||||
VAR_NAME="${1}"
|
||||
DEFAULT_VALUE="${2}"
|
||||
|
||||
[ -z "${!VAR_NAME}" ] && export ${VAR_NAME}="${DEFAULT_VALUE}"
|
||||
}
|
||||
|
||||
define_default_value ANDROID_SERIAL "$(adb devices | head -n 2 | tail -n 1 | awk '{print $1}')"
|
||||
define_default_value DEBUG_SYSROOT "${HOME}/Builds/debug_sysroot/${ANDROID_SERIAL}/"
|
||||
|
||||
rm -rf "${DEBUG_SYSROOT}"
|
||||
|
||||
for mDir in "/system/lib/" "/vendor/lib/"; do
|
||||
mkdir -p "${DEBUG_SYSROOT}/${mDir}"
|
||||
# adb pull doesn't behave like rsync dirA/ dirB/ so avoid nesting the
|
||||
# directory by deleting last one before copying
|
||||
rmdir "${DEBUG_SYSROOT}/${mDir}"
|
||||
adb pull "${mDir}" "${DEBUG_SYSROOT}/${mDir}"
|
||||
done
|
||||
|
||||
# Retrieve the specific binaries - some of these adb commands will fail, since
|
||||
# some files may not exist, but that's ok.
|
||||
|
||||
mkdir -p "${DEBUG_SYSROOT}/system/bin/"
|
||||
for mBin in "/system/bin/linker" "/system/bin/app_process" \
|
||||
"/system/bin/app_process_init" "/system/bin/app_process32" \
|
||||
"/system/bin/app_process64" ; do
|
||||
adb pull "${mBin}" "${DEBUG_SYSROOT}/${mBin}"
|
||||
done
|
||||
|
||||
# Verify which variants of the specific binaries could be pulled
|
||||
echo
|
||||
echo "Found the following specific binaries:"
|
||||
echo
|
||||
ls -1 "${DEBUG_SYSROOT}/system/bin/"*
|
||||
ls -1 "${DEBUG_SYSROOT}/system/lib/libc.so"*
|
||||
ls -1 "${DEBUG_SYSROOT}/system/lib/libcutils.so"*
|
||||
echo
|
||||
|
||||
echo DEBUG_SYSROOT="${DEBUG_SYSROOT}"
|
||||
116
build_scripts/Android/start_gdbserver.sh
Executable file
116
build_scripts/Android/start_gdbserver.sh
Executable file
@ -0,0 +1,116 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script to start gdbserver on Android device and attach to retroshare-service
|
||||
#
|
||||
# Copyright (C) 2020 Gioacchino Mazzurco <gio@eigenlab.org>
|
||||
# Copyright (C) 2020 Asociación Civil Altermundi <info@altermundi.net>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under
|
||||
# the terms of the GNU Affero General Public License as published by the
|
||||
# Free Software Foundation, version 3.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License along
|
||||
# with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
|
||||
<<"ASCIIDOC"
|
||||
|
||||
Start gdbserver on Android device and attach it to the retroshare service
|
||||
process
|
||||
|
||||
Inspired by:
|
||||
https://fw4spl-org.github.io/fw4spl-blog/2015/07/27/Native-debugging-on-Android-with-QtCreator.html
|
||||
|
||||
ASCIIDOC
|
||||
|
||||
|
||||
## Define default value for variable, take two arguments, $1 variable name,
|
||||
## $2 default variable value, if the variable is not already define define it
|
||||
## with default value.
|
||||
function define_default_value()
|
||||
{
|
||||
VAR_NAME="${1}"
|
||||
DEFAULT_VALUE="${2}"
|
||||
|
||||
[ -z "${!VAR_NAME}" ] && export ${VAR_NAME}="${DEFAULT_VALUE}"
|
||||
}
|
||||
|
||||
define_default_value ANDROID_APK_PACKAGE "org.retroshare.service"
|
||||
define_default_value ANDROID_PROCESS_NAME "org.retroshare.service:rs"
|
||||
define_default_value ANDROID_INSTALL_PATH ""
|
||||
define_default_value LIB_GDB_SERVER_PATH ""
|
||||
define_default_value ANDROID_SERIAL "$(adb devices | head -n 2 | tail -n 1 | awk '{print $1}')"
|
||||
define_default_value GDB_SERVER_PORT 5039
|
||||
|
||||
adb_ushell()
|
||||
{
|
||||
adb shell run-as ${ANDROID_APK_PACKAGE} $@
|
||||
}
|
||||
|
||||
[ -z "${ANDROID_INSTALL_PATH}" ] &&
|
||||
{
|
||||
ANDROID_INSTALL_PATH="$(adb_ushell pm path "${ANDROID_APK_PACKAGE}")"
|
||||
ANDROID_INSTALL_PATH="$(dirname ${ANDROID_INSTALL_PATH#"package:"})"
|
||||
[ -z "${ANDROID_INSTALL_PATH}" ] &&
|
||||
cat <<EOF
|
||||
Cannot find install path for ${ANDROID_APK_PACKAGE} make sure it is installed,
|
||||
or manually specify ANDROID_INSTALL_PATH
|
||||
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
## If not passed as environement variable try to determine gdbserver path
|
||||
## shipped withing APK
|
||||
[ -z "${LIB_GDB_SERVER_PATH}" ] &&
|
||||
{
|
||||
|
||||
for mUsualPath in \
|
||||
"${ANDROID_INSTALL_PATH}/lib/libgdbserver.so" \
|
||||
"${ANDROID_INSTALL_PATH}/lib/arm64/libgdbserver.so"
|
||||
do
|
||||
adb_ushell ls "${mUsualPath}" &&
|
||||
export LIB_GDB_SERVER_PATH="${mUsualPath}" && break
|
||||
done
|
||||
}
|
||||
|
||||
[ -z "${LIB_GDB_SERVER_PATH}" ] &&
|
||||
{
|
||||
cat <<EOF
|
||||
libgdbserver.so not found in any of the usual path attempting to look for it
|
||||
with find, it will take a little more time. Take note of the discovered path and
|
||||
define LIB_GDB_SERVER_PATH on your commandline at next run to avoid waiting
|
||||
again.
|
||||
|
||||
|
||||
EOF
|
||||
tFile="$(mktemp)"
|
||||
adb_ushell find ${ANDROID_INSTALL_PATH} -type f -name 'libgdbserver.so' | \
|
||||
tee "${tFile}"
|
||||
|
||||
LIB_GDB_SERVER_PATH="$(head -n 1 "${tFile}")"
|
||||
rm "${tFile}"
|
||||
}
|
||||
|
||||
[ -z "${LIB_GDB_SERVER_PATH}" ] &&
|
||||
{
|
||||
echo "Cannot find libgdbserver.so, are you sure your package ships it?"
|
||||
exit -1
|
||||
}
|
||||
|
||||
mPid="$(adb_ushell ps | grep ${ANDROID_PROCESS_NAME} | awk '{print $2}')"
|
||||
[ -z "${mPid}" ] &&
|
||||
{
|
||||
echo "Failed ${ANDROID_PROCESS_NAME} PID retrival are you sure it is running?"
|
||||
exit -2
|
||||
}
|
||||
|
||||
|
||||
## Establish port forwarding so we can connect to gdbserver with gdb
|
||||
adb forward tcp:${GDB_SERVER_PORT} tcp:${GDB_SERVER_PORT}
|
||||
|
||||
((adb_ushell ${LIB_GDB_SERVER_PATH} 127.0.0.1:${GDB_SERVER_PORT} --attach ${mPid})&)
|
||||
@ -1,170 +0,0 @@
|
||||
|
||||
## Compilation on Linux
|
||||
|
||||
|
||||
### Install package dependencies:
|
||||
#### Debian / Ubuntu / Linux Mint
|
||||
```bash
|
||||
sudo apt-get install git g++ cmake libbz2-dev libjson-c-dev libssl-dev libsqlcipher-dev \
|
||||
libupnp-dev doxygen libxss-dev rapidjson-dev libbotan-2-dev libasio-dev
|
||||
```
|
||||
|
||||
To compile with Qt5:
|
||||
```bash
|
||||
sudo apt-get install qt5-qmake qtmultimedia5-dev libqt5x11extras5-dev
|
||||
```
|
||||
|
||||
To compile with Qt6:
|
||||
```bash
|
||||
sudo apt-get install qt6-base-dev qt6-multimedia-dev qt6-5compat-dev
|
||||
```
|
||||
|
||||
Additional dependencies for Feedreader plugin:
|
||||
```bash
|
||||
sudo apt-get install libxml2-dev libxslt1-dev libcurl4-openssl-dev
|
||||
```
|
||||
|
||||
Additional dependencies for Voip plugin:
|
||||
```bash
|
||||
sudo apt-get install libavcodec-dev libcurl4-openssl-dev \
|
||||
libqt5multimedia5-plugins libspeexdsp-dev
|
||||
```
|
||||
|
||||
Autologin:
|
||||
```bash
|
||||
sudo apt install libsecret-1-dev
|
||||
```
|
||||
|
||||
#### openSUSE
|
||||
```bash
|
||||
sudo zypper install git gcc-c++ cmake libqt5-qtbase-devel \
|
||||
libqt5-qtmultimedia-devel libqt5-qtx11extras-devel libbz2-devel \
|
||||
libopenssl-devel libupnp-devel libXss-devel sqlcipher-devel rapidjson-devel \
|
||||
json-c botan bzip2
|
||||
```
|
||||
|
||||
Additional packages to compile with Qt6:
|
||||
```bash
|
||||
sudo zypper install qt6-base-devel qt6-multimedia-devel qt6-qt5compat-devel
|
||||
```
|
||||
|
||||
Additional dependencies for plugins:
|
||||
```bash
|
||||
sudo zypper install ffmpeg-4-libavcodec-devel libcurl-devel libxml2-devel \
|
||||
libxslt-devel speex-devel speexdsp-devel
|
||||
```
|
||||
|
||||
#### Arch Linux / Manjaro / EndeavourOS
|
||||
```bash
|
||||
sudo pacman -S base-devel libgnome-keyring cmake qt5-tools qt5-multimedia qt5-x11extras \
|
||||
rapidjson doxygen libupnp libxslt libxss sqlcipher botan2 bzip2 json-c
|
||||
```
|
||||
|
||||
To compile with Qt6:
|
||||
```bash
|
||||
sudo pacman -S qt6-base qt6-multimedia qt6-5compat
|
||||
```
|
||||
|
||||
### Checkout the source code
|
||||
```bash
|
||||
cd ~
|
||||
git clone https://github.com/RetroShare/RetroShare.git retroshare
|
||||
```
|
||||
|
||||
### Checkout the submodules
|
||||
```bash
|
||||
cd retroshare
|
||||
git submodule update --init --remote libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/
|
||||
git submodule update --init --remote supportlibs/librnp supportlibs/restbed supportlibs/rapidjson
|
||||
```
|
||||
|
||||
### Compile
|
||||
```bash
|
||||
qmake CONFIG+=release CONFIG+=rs_jsonapi CONFIG+=rs_webui
|
||||
make
|
||||
```
|
||||
|
||||
The executable produced will be:
|
||||
```bash
|
||||
./retroshare-gui/src/retroshare
|
||||
```
|
||||
|
||||
### Install
|
||||
```bash
|
||||
sudo make install
|
||||
```
|
||||
|
||||
The executable produced will be:
|
||||
```bash
|
||||
~/usr/bin/RetroShare
|
||||
```
|
||||
|
||||
### For packagers
|
||||
|
||||
Packagers can use PREFIX and LIB\_DIR to customize the installation paths:
|
||||
```bash
|
||||
qmake PREFIX=/usr LIB_DIR=/usr/lib64 "CONFIG-=debug" "CONFIG+=release"
|
||||
make
|
||||
make INSTALL_ROOT=${PKGDIR} install
|
||||
```
|
||||
|
||||
|
||||
### libsqlcipher
|
||||
If libsqlcipher is not available as a package
|
||||
|
||||
You need to place sqlcipher so that the hierarchy is:
|
||||
|
||||
~Home
|
||||
|
|
||||
+--- retroshare
|
||||
|
|
||||
+--- lib
|
||||
|
|
||||
+---- sqlcipher
|
||||
```bash
|
||||
mkdir lib
|
||||
cd lib
|
||||
git clone https://github.com/sqlcipher/sqlcipher.git --depth=1 --branch v3.4.1
|
||||
cd sqlcipher
|
||||
./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
|
||||
make
|
||||
cd ..
|
||||
```
|
||||
|
||||
### Build infos
|
||||
|
||||
Note: If you installed Qt6 you need to use `qmake6` on the command line.
|
||||
|
||||
For the `FeedReader` it is required to append the config option `CONFIG+=retroshare_plugins`.
|
||||
Make sure `plugins/plugins.pro` contains `FeedReader` in the list of plugins to compile.
|
||||
|
||||
Do not mix plugins compiled with Qt5 with those compiled with Qt6. They work only if they are compiled
|
||||
with the same Qt version as RetroShare.
|
||||
|
||||
Voip is outdated and is not compileable on the latest Debian.
|
||||
|
||||
For `Autologin` it is required to append the config option `CONFIG+=rs_autologin`.
|
||||
|
||||
|
||||
### Build options
|
||||
|
||||
* Mandatory
|
||||
* release or debug: normally you would like to use the release option
|
||||
* Extra features (optional)
|
||||
* rs_autologin: enable autologin
|
||||
* retroshare_plugins: build plugins
|
||||
* rs_webui: enable Web interface
|
||||
* rs_jsonapi: enable json api interface, required by rs_webui
|
||||
* gxsthewire: enable Wire service (experimental)
|
||||
* wikipoos: enable Wiki service
|
||||
* rs_use_native_dialogs: enable native dialogs (may cause crashes with some versions of Gtk)
|
||||
* rs_deep_channels_index: build with deep channel indexing support
|
||||
* rs_deep_files_index: build with deep file indexing support
|
||||
* "CONFIG+=..." enable other extra compile time features, you can find the almost complete list in file *<sourcefolder>\retroshare.pri*
|
||||
|
||||
### Examples:
|
||||
|
||||
```batch
|
||||
qmake CONFIG+=debug CONFIG+=release CONFIG+=rs_use_native_dialog CONFIG+=rs_gui_cmark
|
||||
qmake CONFIG+=rs_jsonapi CONFIG+=rs_webui CONFIG+=rs_autologin
|
||||
```
|
||||
@ -2,57 +2,42 @@
|
||||
## force cloning a new
|
||||
|
||||
## To prepare an image suitable as base for Gitlab CI use
|
||||
# export CI_REGISTRY_IMAGE="registry.gitlab.com/retroshare/retroshare:base"
|
||||
# docker build -t "${CI_REGISTRY_IMAGE}" -f base.Dockerfile .
|
||||
# docker build -t "${CI_REGISTRY_IMAGE}:base" --build-arg KEEP_SOURCE=true --build-arg REPO_DEPTH="" -f base.Dockerfile .
|
||||
|
||||
## Now you need to tag it so you can later push it
|
||||
# docker tag ${ID_OF_THE_CREATED_IMAGE} registry.gitlab.com/retroshare/${CI_REGISTRY_IMAGE}:base
|
||||
|
||||
## To push it to gitlab CI registry you need first to login and the to push
|
||||
# docker login registry.gitlab.com
|
||||
# docker push "${CI_REGISTRY_IMAGE}"
|
||||
# docker push registry.gitlab.com/retroshare/${CI_REGISTRY_IMAGE}:base
|
||||
|
||||
|
||||
## To run the container
|
||||
# docker run -it -p 127.0.0.1:9092:9092 "${CI_REGISTRY_IMAGE}" retroshare-service --jsonApiPort 9092 --jsonApiBindAddress 0.0.0.0
|
||||
# docker run -it -p 127.0.0.1:9092:9092 "${CI_REGISTRY_IMAGE}:base" retroshare-service --jsonApiPort 9092 --jsonApiBindAddress 0.0.0.0
|
||||
|
||||
FROM ubuntu:26.04
|
||||
FROM ubuntu
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV APT_UNAT="--assume-yes --quiet"
|
||||
|
||||
RUN apt-get update $APT_UNAT && \
|
||||
apt-get upgrade --show-upgraded $APT_UNAT && \
|
||||
apt-get clean $APT_UNAT && \
|
||||
apt-get install --no-install-recommends $APT_UNAT \
|
||||
bash build-essential cimg-dev libssl-dev libbz2-dev \
|
||||
libminiupnpc-dev \
|
||||
libsqlite3-dev libsqlcipher-dev \
|
||||
pkg-config libz-dev \
|
||||
libxapian-dev doxygen rapidjson-dev \
|
||||
git cmake curl python3 libasio-dev libjson-c-dev libbotan-3-dev
|
||||
|
||||
## Avoid git cloning spuriously failing with
|
||||
# server certificate verification failed. CAfile: none CRLfile: none
|
||||
RUN apt-get install --no-install-recommends $APT_UNAT --reinstall \
|
||||
ca-certificates
|
||||
|
||||
RUN git clone --depth 1 https://github.com/aetilius/pHash.git && \
|
||||
rm -rf pHash-build && mkdir pHash-build && cd pHash-build && \
|
||||
cmake -B. -H../pHash -DCMAKE_INSTALL_PREFIX=/usr && \
|
||||
make -j$(nproc) && make install && cd .. && \
|
||||
rm -rf pHash-build pHash
|
||||
ARG CACHEBUST=0
|
||||
RUN \
|
||||
apt-get update -y && apt-get upgrade -y && \
|
||||
apt-get install -y build-essential libssl-dev libbz2-dev libsqlite3-dev \
|
||||
libsqlcipher-dev libupnp-dev pkg-config libz-dev \
|
||||
qt5-default libxapian-dev qttools5-dev doxygen rapidjson-dev \
|
||||
git cmake curl
|
||||
|
||||
ARG FRESHCLONE=0
|
||||
ARG REPO_URL=https://github.com/RetroShare/RetroShare.git
|
||||
ARG REPO_URL=https://gitlab.com/RetroShare/RetroShare.git
|
||||
ARG REPO_BRANCH=master
|
||||
ARG REPO_DEPTH="--depth 2000"
|
||||
RUN git clone $REPO_DEPTH $REPO_URL -b $REPO_BRANCH && \
|
||||
cd RetroShare && \
|
||||
git fetch --tags && \
|
||||
git submodule update --init \
|
||||
libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/ \
|
||||
supportlibs/restbed/
|
||||
|
||||
ARG KEEP_SOURCE=false
|
||||
RUN apt-get update -y && apt-get upgrade -y
|
||||
RUN git clone $REPO_DEPTH $REPO_URL -b $REPO_BRANCH && cd RetroShare && \
|
||||
git fetch --tags && cd ..
|
||||
RUN \
|
||||
mkdir RetroShare-build && cd RetroShare-build && \
|
||||
cmake -B. -S../RetroShare/retroshare-service \
|
||||
-DRS_FORUM_DEEP_INDEX=ON -DRS_JSON_API=ON -DRS_WEBUI=ON && \
|
||||
make -j$(nproc) && make install && \
|
||||
cd .. && rm -rf RetroShare-build
|
||||
qmake ../RetroShare \
|
||||
CONFIG+=no_retroshare_plugins CONFIG+=ipv6 \
|
||||
CONFIG+=retroshare_service CONFIG+=no_retroshare_gui \
|
||||
CONFIG+=rs_jsonapi CONFIG+=rs_deep_search && \
|
||||
(make -j$(nproc) || make -j$(nproc) || make) && make install && \
|
||||
cd .. && rm -rf RetroShare-build && ($KEEP_SOURCE || rm -rf RetroShare)
|
||||
|
||||
@ -1,16 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Emit --build-arg flags so gitlabCI.Dockerfile fetches the EXACT ref that
|
||||
# triggered the pipeline. REPO_REF can be a commit SHA (the CI default), a
|
||||
# branch name, or a tag. The remote URL is still chosen per-case so
|
||||
# MR-from-fork fetches from the fork.
|
||||
|
||||
if [ -n "$CI_MERGE_REQUEST_ID" ]; then
|
||||
REPO_URL="$CI_MERGE_REQUEST_SOURCE_PROJECT_URL"
|
||||
else
|
||||
REPO_URL="$CI_REPOSITORY_URL"
|
||||
fi
|
||||
|
||||
echo \
|
||||
--build-arg REPO_URL="$REPO_URL" \
|
||||
--build-arg REPO_REF="$CI_COMMIT_SHA"
|
||||
@ -2,21 +2,17 @@ FROM registry.gitlab.com/retroshare/retroshare:base
|
||||
|
||||
RUN apt-get update -y && apt-get upgrade -y
|
||||
|
||||
ARG REPO_URL=https://github.com/RetroShare/RetroShare.git
|
||||
ARG REPO_REF=master
|
||||
ARG REPO_URL=https://gitlab.com/RetroShare/RetroShare.git
|
||||
ARG REPO_BRANCH=master
|
||||
RUN \
|
||||
cd RetroShare && git remote add testing $REPO_URL && \
|
||||
git fetch --tags testing $REPO_REF && \
|
||||
git checkout --force FETCH_HEAD && \
|
||||
git submodule deinit -f --all && \
|
||||
git submodule update --init \
|
||||
libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/ \
|
||||
supportlibs/restbed/ && \
|
||||
git fetch --tags testing $REPO_BRANCH && \
|
||||
git reset --hard testing/$REPO_BRANCH && \
|
||||
git --no-pager log --max-count 1
|
||||
RUN \
|
||||
mkdir RetroShare-build && cd RetroShare-build && \
|
||||
cmake -B. -S../RetroShare/retroshare-service \
|
||||
-DRS_FORUM_DEEP_INDEX=ON -DRS_JSON_API=ON -DRS_WEBUI=ON \
|
||||
-DRS_WARN_DEPRECATED=OFF -DRS_WARN_LESS=ON && \
|
||||
make -j$(nproc) && make install && \
|
||||
qmake ../RetroShare CONFIG+=no_retroshare_gui \
|
||||
CONFIG+=retroshare_service \
|
||||
CONFIG+=rs_jsonapi CONFIG+=rs_deep_search && \
|
||||
(make -j$(nproc) || make -j$(nproc) || make) && make install && \
|
||||
cd .. && rm -rf RetroShare-build
|
||||
|
||||
@ -1 +1 @@
|
||||
Subproject commit 042d1d5a9f65e51e1abafe527cab2f04d6fab29b
|
||||
Subproject commit b0d7ae39fe9d9192848bbf7b8902d2188da895c9
|
||||
60
build_scripts/OSX/MacOS.10.6_RS_Compilation_Instructions.txt
Normal file
60
build_scripts/OSX/MacOS.10.6_RS_Compilation_Instructions.txt
Normal file
@ -0,0 +1,60 @@
|
||||
Hi there,
|
||||
|
||||
I heard about RetroShare recently (on Slashdot) and really like the goal of the program; it's something I've been wanting for a long time now. I'm a software developer so I figured I could help contribute to the project. I started by getting a build up and running on my mac, which was non-trivial as it looks like the Mac build hasn't been maintained (or maybe it's just targetting older OS X version?). Anyway, I have instructions and patches to get a build going on OS X 10.6, if you want to put them up on the wiki or something. The steps I used boiled down to running the following commands in a directory that also contains the retroshare-mac-build.patch file, which I posted at https://staktrace.com/pub/retroshare-mac-build.patch (you can also see the changes at https://github.com/staktrace/retroshare/commit/51f554f909086f4baca7be215d5edacab744dea4)
|
||||
|
||||
sudo port selfupdate
|
||||
sudo port install qt4-mac
|
||||
sudo port install wget
|
||||
|
||||
wget ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.10.tar.bz2
|
||||
tar xjf libgpg-error-1.10.tar.bz2
|
||||
rm libgpg-error-1.10.tar.bz2
|
||||
pushd libgpg-error-1.10
|
||||
./configure --prefix=$PWD/build --enable-static=yes --enable-shared=no
|
||||
make
|
||||
make install
|
||||
popd
|
||||
|
||||
wget ftp://ftp.gnupg.org/gcrypt/gpgme/gpgme-1.3.1.tar.bz2
|
||||
tar xjf gpgme-1.3.1.tar.bz2
|
||||
rm gpgme-1.3.1.tar.bz2
|
||||
pushd gpgme-1.3.1
|
||||
./configure --prefix=$PWD/build --enable-static=yes --enable-shared=no --with-gpg-error-prefix=$PWD/../libgpg-error-1.10/build
|
||||
make
|
||||
make install
|
||||
popd
|
||||
|
||||
wget http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.3.tar.gz
|
||||
tar xzf miniupnpc-1.3.tar.gz
|
||||
rm miniupnpc-1.3.tar.gz
|
||||
pushd miniupnpc-1.3
|
||||
make upnpc-static
|
||||
popd
|
||||
|
||||
git clone https://github.com/kigeia/retroshare
|
||||
pushd retroshare
|
||||
git apply ../retroshare-mac-build.patch
|
||||
popd
|
||||
|
||||
pushd retroshare/libbitdht/src
|
||||
qmake
|
||||
make
|
||||
popd
|
||||
|
||||
pushd retroshare/libretroshare/src
|
||||
qmake
|
||||
make
|
||||
popd
|
||||
|
||||
pushd retroshare/retroshare-gui/src
|
||||
qmake
|
||||
make
|
||||
popd
|
||||
|
||||
At the end there is a RetroShare.App in the retroshare/retroshare-gui/ folder which seems to work as expected.
|
||||
|
||||
Now that I've gotten it building and working, I'd like to start working on adding features. One that I would like to see is taking advantage of the RetroShare platform to enable F2F games. A while back I wrote a P2P collaborative crossword solver app in Java; porting that to work as a RetroShare plugin would probably be a good start for me. I looked briefly at the existing plugins in the source tree but haven't yet had time to peruse the rsplugin.h API in detail; if you have any tips or pointers before I dive in, please do let me know. I'll probably start work on it in a couple of days and progress might be a little slow because I'm also fairly busy with other things right now.
|
||||
|
||||
Cheers,
|
||||
kats
|
||||
|
||||
@ -2,50 +2,41 @@
|
||||
|
||||
## Qt Installation
|
||||
|
||||
Qt 5.15 is not available as install package.
|
||||
Install Qt via: [Qt Download](http://www.qt.io/download/)
|
||||
|
||||
Download Qt 5.15.x from here: [Qt 5.15.17](https://download.qt.io/archive/qt/5.15/5.15.17/single/qt-everywhere-opensource-src-5.15.17.tar.xz)
|
||||
Use default options. And add Qt Script support.
|
||||
|
||||
Instruction howto Build Qt 5.15.x on macOS: [macOS Building](https://doc.qt.io/archives/qt-5.15/macos-building.html)
|
||||
## Set the Environment Variables
|
||||
Add to the PATH environment variable by editing your *~/.profile* file.
|
||||
|
||||
export PATH="/users/$USER/Qt/5.15.17/clang_64/bin:$PATH"
|
||||
export PATH="/users/$USER/Qt/5.5/clang_64/bin:$PATH"
|
||||
|
||||
Depends on which version of Qt you use.
|
||||
|
||||
## Get RetroShare
|
||||
## ***Choose if you use MacPort or HomeBrew***
|
||||
|
||||
In Qt Creator Projects -> New -> Import Project -> Git Clone -> Choose
|
||||
Add Repository and Continoue
|
||||
### MacPort Installation
|
||||
|
||||
Repository: https://github.com/RetroShare/RetroShare.git
|
||||
Install MacPort and XCode following this guide: [MacPort and XCode](http://guide.macports.org/#installing.xcode)
|
||||
|
||||
via Terminal:
|
||||
Start XCode to get it updated and to able C compiler to create executables.
|
||||
|
||||
cd <your development directory>
|
||||
git clone https://github.com/RetroShare/RetroShare.git retroshare
|
||||
#### Install libraries
|
||||
|
||||
via GitHub Desktop: [GitHub Desktop Download](https://central.github.com/deployments/desktop/desktop/latest/darwin)
|
||||
$sudo port -v selfupdate
|
||||
$sudo port install openssl
|
||||
$sudo port install miniupnpc
|
||||
$sudo port install libmicrohttpd
|
||||
|
||||
For VOIP Plugin:
|
||||
|
||||
In GitHub Desktop -> Clone Repository -> URL
|
||||
$sudo port install speex-devel
|
||||
$sudo port install opencv
|
||||
|
||||
Add Repository URL: https://github.com/RetroShare/RetroShare.git and Clone
|
||||
Get Your OSX SDK if missing: [MacOSX-SDKs](https://github.com/phracker/MacOSX-SDKs)
|
||||
|
||||
## ***Get XCode & MacOSX SDK***
|
||||
### HOMEBREW Installation
|
||||
|
||||
To identify the correct version of Xcode to install, you need to know which OS you are running. Go to the [x] menu -> "About This Mac" and read the macOS version number.
|
||||
|
||||
If you are running macOS Ventura 13.5 or later, you can install Xcode directly from App Store using the instructions below.
|
||||
|
||||
You can find older versions of Xcode at [Apple Developer Downloads](https://developer.apple.com/downloads/). Find the appropriate .xip file for your macOS version
|
||||
|
||||
To install from App Store:
|
||||
|
||||
Select [x] menu - > "App Store…".
|
||||
Search for Xcode. Download and install.
|
||||
|
||||
Once Xcode has installed, you must drag the XCode icon into your Applications folder. After you have done this, open Xcode from the Applications folder by double-clicking on the icon and then follow the remaining instructions below.
|
||||
Install HomeBrew following this guide: [HomeBrew](http://brew.sh/)
|
||||
|
||||
Install XCode command line developer tools:
|
||||
|
||||
@ -53,33 +44,11 @@ Install XCode command line developer tools:
|
||||
|
||||
Start XCode to get it updated and to able C compiler to create executables.
|
||||
|
||||
Older MacOSX SDK is available from here: [MacOSX-SDKs](https://github.com/phracker/MacOSX-SDKs)
|
||||
|
||||
### MacPort Installation
|
||||
|
||||
Install MacPort following this guide: [MacPort](http://guide.macports.org/#installing.xcode)
|
||||
|
||||
### HOMEBREW Installation
|
||||
|
||||
Install HomeBrew following this guide: [HomeBrew](http://brew.sh/)
|
||||
|
||||
#### Install libraries
|
||||
|
||||
$ brew install openssl
|
||||
$ brew install miniupnpc
|
||||
$ brew install rapidjson
|
||||
$ brew install sqlcipher
|
||||
|
||||
For RNP lib:
|
||||
|
||||
$ brew install bzip2
|
||||
$ brew install zlib
|
||||
$ brew install json-c
|
||||
$ brew install botan@2
|
||||
|
||||
#### Install CMake
|
||||
|
||||
$ brew install cmake
|
||||
$brew install openssl
|
||||
$brew install miniupnpc
|
||||
$brew install libmicrohttpd
|
||||
|
||||
If you have error in linking, run this:
|
||||
|
||||
@ -87,130 +56,37 @@ If you have error in linking, run this:
|
||||
|
||||
For VOIP Plugin:
|
||||
|
||||
$ brew install speex
|
||||
$ brew install speexdsp
|
||||
$ brew install opencv
|
||||
$ brew install ffmpeg
|
||||
$brew install speex
|
||||
$brew install speexdsp
|
||||
$brew install homebrew/science/opencv
|
||||
$brew install ffmpeg
|
||||
|
||||
For FeedReader Plugin:
|
||||
|
||||
$ brew install libxslt
|
||||
$ brew install libxml2
|
||||
Get Your OSX SDK if missing: [MacOSX-SDKs](https://github.com/phracker/MacOSX-SDKs)
|
||||
|
||||
## Last Settings
|
||||
|
||||
In QtCreator Projects -> Manage Kits > Version Control > Git:
|
||||
In QtCreator Option Git select "Pull" with "Rebase"
|
||||
|
||||
select "Pull with rebase"
|
||||
## Compil missing libraries
|
||||
### SQLCipher
|
||||
|
||||
cd <your development directory>
|
||||
git clone https://github.com/sqlcipher/sqlcipher.git
|
||||
cd sqlcipher
|
||||
./configure --disable-shared --disable-tcl --enable-static --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC -I/opt/local/include" LDFLAGS="-lcrypto"
|
||||
make
|
||||
sudo make install
|
||||
|
||||
In QtCreator Projects -> Build -> Build Settings -> Build Environment -> Add this path:
|
||||
NOTE, might be necessary to *chmod 000 /usr/local/ssl* temporarily during *./configure* if
|
||||
homebrew uses newer, non-stock ssl dependencies found there. Configure might get confused.
|
||||
|
||||
/usr/local/bin
|
||||
You can now compile RS into Qt Creator or with terminal
|
||||
|
||||
In QtCreator Projects -> Build -> Build Settings -> Build Steps -> Add Additional arguments:
|
||||
|
||||
"CONFIG+=rs_autologin" "CONFIG+=rs_use_native_dialogs"
|
||||
|
||||
## Set your Mac OS SDK version
|
||||
|
||||
|
||||
Edit retroshare.pri and set your installed sdk version example for 11.1 -> rs_macos11.1 (line 135:)
|
||||
|
||||
macx:CONFIG *= rs_macos11.1
|
||||
rs_macos10.8:CONFIG -= rs_macos11.1
|
||||
rs_macos10.9:CONFIG -= rs_macos11.1
|
||||
rs_macos10.10:CONFIG -= rs_macos11.1
|
||||
rs_macos10.12:CONFIG -= rs_macos11.1
|
||||
rs_macos10.13:CONFIG -= rs_macos11.1
|
||||
rs_macos10.14:CONFIG -= rs_macos11.1
|
||||
rs_macos10.15:CONFIG -= rs_macos11.1
|
||||
|
||||
|
||||
## Link Include & Libraries
|
||||
|
||||
When required edit your retroshare.pri macx-* section, check if the Include and Lib path are correct (macx-* section)
|
||||
|
||||
INCLUDEPATH += "/usr/local/opt/openssl/include"
|
||||
QMAKE_LIBDIR += "/usr/local/opt/openssl/lib"
|
||||
QMAKE_LIBDIR += "/usr/local/opt/sqlcipher/lib"
|
||||
QMAKE_LIBDIR += "/usr/local/opt/miniupnpc/lib"
|
||||
|
||||
alternative via Terminal
|
||||
|
||||
$ qmake
|
||||
INCLUDEPATH+="/usr/local/opt/openssl/include" \
|
||||
QMAKE_LIBDIR+="/usr/local/opt/openssl/lib" \
|
||||
QMAKE_LIBDIR+="/usr/local/opt/sqlcipher/lib" \
|
||||
QMAKE_LIBDIR+="/usr/local/opt/miniupnpc/lib" \
|
||||
CONFIG+=rs_autologin \
|
||||
CONFIG+=rs_use_native_dialogs \
|
||||
CONFIG+=release \
|
||||
..
|
||||
|
||||
For FeedReader Plugin:
|
||||
|
||||
INCLUDEPATH += "/usr/local/opt/libxml2/include/libxml2"
|
||||
|
||||
With plugins:
|
||||
|
||||
$ qmake \
|
||||
INCLUDEPATH+="/usr/local/opt/openssl/include" QMAKE_LIBDIR+="/usr/local/opt/openssl/lib" \
|
||||
QMAKE_LIBDIR+="/usr/local/opt/sqlcipher/lib" \
|
||||
QMAKE_LIBDIR+="/usr/local/opt/miniupnpc/lib" \
|
||||
INCLUDEPATH+="/usr/local/opt/opencv/include/opencv4" QMAKE_LIBDIR+="/usr/local/opt/opencv/lib" \
|
||||
INCLUDEPATH+="/usr/local/opt/speex/include" QMAKE_LIBDIR+="/usr/local/opt/speex/lib/" \
|
||||
INCLUDEPATH+="/usr/local/opt/speexdsp/include" QMAKE_LIBDIR+="/usr/local/opt/speexdsp/lib/" \
|
||||
INCLUDEPATH+="/usr/local/opt/libxslt/include" QMAKE_LIBDIR+="/usr/local/opt/libxslt/lib" \
|
||||
QMAKE_LIBDIR+="/usr/local/opt/ffmpeg/lib" \
|
||||
LIBS+=-lopencv_videoio \
|
||||
CONFIG+=retroshare_plugins \
|
||||
CONFIG+=rs_autologin \
|
||||
CONFIG+=rs_use_native_dialogs \
|
||||
CONFIG+=release \
|
||||
..
|
||||
|
||||
## Compile RetroShare
|
||||
|
||||
You can now compile RetroShare into Qt Creator or with Terminal
|
||||
|
||||
$ cd /path/to/retroshare
|
||||
$ qmake ..
|
||||
$ make
|
||||
cd <your development directory>
|
||||
git clone https://github.com/RetroShare/RetroShare.git retroshare
|
||||
cd retroshare
|
||||
qmake; make
|
||||
|
||||
You can change Target and SDK in *./retroshare.pri:82* changing value of QMAKE_MACOSX_DEPLOYMENT_TARGET and QMAKE_MAC_SDK
|
||||
|
||||
You can find the compiled application at *./retroshare/retroshare-gui/src/retroshare.app*
|
||||
|
||||
## Issues
|
||||
|
||||
If you have issues with openssl (Undefined symbols for architecture x86_64) try to add to *~/.profile* file this or via Terminal
|
||||
|
||||
export PATH="/usr/local/opt/openssl/bin:$PATH"
|
||||
export LDFLAGS="-L/usr/local/opt/openssl/lib"
|
||||
export CPPFLAGS="-I/usr/local/opt/openssl/include"
|
||||
export PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig"
|
||||
|
||||
For Qt Creator -> QtCreator Projects -> Build -> Build Settings -> Build Steps -> Add Additional arguments:
|
||||
|
||||
LDFLAGS="-L/usr/local/opt/openssl/lib"
|
||||
CPPFLAGS="-I/usr/local/opt/openssl/include"
|
||||
|
||||
|
||||
|
||||
## Copy Plugins
|
||||
|
||||
$ cp \
|
||||
./plugins/FeedReader/lib/libFeedReader.dylib \
|
||||
./plugins/VOIP/lib/libVOIP.dylib \
|
||||
./plugins/RetroChess/lib/libRetroChess.dylib \
|
||||
./retroshare-gui/src/RetroShare.app/Contents/Resources/
|
||||
|
||||
### Compile Retroshare-Service & Webui with CMake
|
||||
before you can compile overwrite the file "asio/include/asio/detail/config.hpp" here is a fix for macos [
|
||||
asio fix](https://github.com/chriskohlhoff/asio/commit/68df16d560c68944809bb2947360fe8035e9ae0a)
|
||||
|
||||
$ cd retroshare-service
|
||||
$ mkdir build-dir
|
||||
$ cd build-dir
|
||||
$ cmake -DRS_WEBUI=ON -DCMAKE_BUILD_TYPE=Release ..
|
||||
$ make
|
||||
You can find compiled application on *./retroshare/retroshare-gui/src/retroshare.app*
|
||||
|
||||
66
build_scripts/OSX/OSX_RS_Compilation_Instructions.txt
Normal file
66
build_scripts/OSX/OSX_RS_Compilation_Instructions.txt
Normal file
@ -0,0 +1,66 @@
|
||||
|
||||
Mac OSX Build Instructions.
|
||||
-------------------------------------------
|
||||
|
||||
There are several complications with building Retroshare under OSX.
|
||||
1) Support Libraries must be built and installed seperately.
|
||||
2) Universal and OSX 10.5 support is a little tricky, mainly due to the support libraries.
|
||||
|
||||
Additional Libraries
|
||||
---------------------
|
||||
|
||||
* GnuPG Package, that comes with Retroshare OSX install image. (GnuPG-1.4.9.dmg)
|
||||
|
||||
GPG Development libraries
|
||||
* libassuan (I'm using 2.0.1)
|
||||
* libgpg-error (I'm using 1.9)
|
||||
* libgpgme (I'm using 1.3.0)
|
||||
|
||||
These libraries use standard UNIX installation systems: AUTOCONF/AUTOMAKE (configure, make, etc)
|
||||
Unfortunately, this makes it difficult and a little manual to compile Universal and 10.5 libraries.
|
||||
|
||||
UPNPC (for OSX and windows)
|
||||
* miniupnpc (I'm using 1.0)
|
||||
|
||||
You will also need to install
|
||||
* XCode (available on the Apple Install CDs)
|
||||
* Qt4 (from trolltech.com)
|
||||
|
||||
First Compilation...
|
||||
--------------------
|
||||
|
||||
The First challenge is to build Retroshare on your Mac. For this first compilation,
|
||||
we only build for your specific machine, and not attempt a Generic / 10.5 / Univeral build.
|
||||
|
||||
|
||||
1) Install / Compile all the packages listed above.
|
||||
be sure to use a configure command like this where applicable to only create a static library.
|
||||
./configure --enable-static=yes --enable-shared=no CFLAGS="-arch i386" CPPFLAGS="-arch i386"
|
||||
|
||||
2) Check out the Retroshare SVN.
|
||||
|
||||
3) compile libbitdht:
|
||||
cd libbitdht/src
|
||||
qmake
|
||||
|
||||
This recreates a xcodeproj file for compilation using XCode.
|
||||
Open with Xcode, and build.
|
||||
|
||||
4) compile libretroshare: same way.
|
||||
5) compile retroshare-gui: same way.
|
||||
|
||||
|
||||
Creating Retroshare OSX Distribution Packages.
|
||||
-----------------------------------------------
|
||||
TODO, once I've got feedback on First Compilation!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,224 +0,0 @@
|
||||
#!/bin/bash
|
||||
# ==============================================================================
|
||||
# RetroShare macOS Portability & Deployment Packaging Script
|
||||
# Designed for macOS environment with CMake
|
||||
# ------------------------------------------------------------------------------
|
||||
# Why this is more than a one-liner: macdeployqt IS the standard tool and does the
|
||||
# heavy lifting (bundling Qt frameworks, fixing rpaths). The extra steps around it
|
||||
# handle RetroShare specifics that macdeployqt does not cover:
|
||||
# - RetroShare refuses to load plugins on macOS unless they end in ".dylib",
|
||||
# so built plugins are copied/renamed accordingly.
|
||||
# - macdeployqt skips .so plugins, so each plugin is passed via -executable=.
|
||||
# - Qt imageformats (SVG) are force-copied (macdeployqt sometimes misses them).
|
||||
# - Ad-hoc codesign is mandatory on Apple Silicon, otherwise the app won't run.
|
||||
# ==============================================================================
|
||||
set -e
|
||||
|
||||
# Always operate from the repository root, regardless of where this script lives
|
||||
# (it resides under build_scripts/OSX/). All paths below are relative to the root.
|
||||
cd "$(dirname "$0")/../.." || exit 1
|
||||
|
||||
# Build directory (override with: BUILD_DIR=mydir ./build_scripts/OSX/deploy-macos.sh)
|
||||
BUILD_DIR="${BUILD_DIR:-Build-cmake}"
|
||||
APP_NAME="RetroShare"
|
||||
|
||||
# 1. Vérifications initiales du dossier de build
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "ERROR: Build directory '$BUILD_DIR' not found. Please compile the project first!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# On cherche l'application compilée, mais on exclut les dossiers de déploiement précédents
|
||||
APP_BUNDLE=$(find "$BUILD_DIR" -maxdepth 3 -type d -name "retroshare-gui.app" ! -path "*/RetroShare-*" | head -n 1)
|
||||
|
||||
if [ -z "$APP_BUNDLE" ]; then
|
||||
echo "ERROR: retroshare-gui.app not found in $BUILD_DIR. Please compile the GUI first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "================================================================================"
|
||||
echo " RETROSHARE MACOS DEPLOYMENT GENERATOR"
|
||||
echo "================================================================================"
|
||||
|
||||
# 2. Détermination dynamique des variables de version
|
||||
echo ">>> Extracting versioning info from Git and environment..."
|
||||
|
||||
DATE_STR=$(date +%Y%m%d)
|
||||
GIT_DESC=$(git describe --tags --always --dirty 2>/dev/null || echo "0.6.7-unknown")
|
||||
CLEAN_DESC=${GIT_DESC#v}
|
||||
VERSION="$CLEAN_DESC"
|
||||
GIT_SUFFIX=""
|
||||
|
||||
if [[ "$CLEAN_DESC" == *-* ]]; then
|
||||
VERSION=$(echo "$CLEAN_DESC" | cut -d'-' -f1)
|
||||
COMMIT_INFO=$(echo "$CLEAN_DESC" | cut -d'-' -f2-)
|
||||
GIT_SUFFIX="-${DATE_STR}-${COMMIT_INFO}"
|
||||
else
|
||||
GIT_SUFFIX="-${DATE_STR}"
|
||||
fi
|
||||
|
||||
# Detect the Qt version for the archive name (qmake reports it). Homebrew's qt@5
|
||||
# is keg-only so its qmake is usually not in PATH; fall back to it, then to a
|
||||
# generic label if nothing is found.
|
||||
QT_VERSION=""
|
||||
if command -v qmake &> /dev/null; then
|
||||
QT_VERSION=$(qmake -query QT_VERSION 2>/dev/null)
|
||||
fi
|
||||
if [[ ! "$QT_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
QT5_QMAKE="$(brew --prefix qt@5 2>/dev/null)/bin/qmake"
|
||||
[ -x "$QT5_QMAKE" ] && QT_VERSION=$("$QT5_QMAKE" -query QT_VERSION 2>/dev/null)
|
||||
fi
|
||||
if [[ ! "$QT_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
QT_VERSION="UnknownQt"
|
||||
fi
|
||||
|
||||
MACVERSION=$(sw_vers -productVersion 2>/dev/null || echo "UnknownOS")
|
||||
ARCH=$(uname -m)
|
||||
|
||||
ARCHIVE_BASE="RetroShare-${VERSION}-macOS-${ARCH}${GIT_SUFFIX}-Qt-${QT_VERSION}"
|
||||
DEPLOY_DIR="${BUILD_DIR}/${ARCHIVE_BASE}"
|
||||
|
||||
echo " Target Package Name: ${ARCHIVE_BASE}"
|
||||
echo " Deploy Directory: ${DEPLOY_DIR}"
|
||||
|
||||
echo ">>> Cleaning up previous deployment directories..."
|
||||
rm -rf "${BUILD_DIR}/RetroShare-"*"-macOS-"*
|
||||
mkdir -p "$DEPLOY_DIR"
|
||||
|
||||
# 3. Copie de l'application dans notre dossier de déploiement
|
||||
echo ">>> Copying retroshare-gui.app..."
|
||||
cp -R "$APP_BUNDLE" "$DEPLOY_DIR/"
|
||||
TARGET_APP="$DEPLOY_DIR/$(basename "$APP_BUNDLE")"
|
||||
|
||||
echo ">>> Creating target directory layout..."
|
||||
APP_RESOURCES="$TARGET_APP/Contents/Resources"
|
||||
APP_MACOS="$TARGET_APP/Contents/MacOS"
|
||||
|
||||
mkdir -p "$APP_MACOS/extensions6"
|
||||
mkdir -p "$APP_RESOURCES/sounds"
|
||||
mkdir -p "$APP_RESOURCES/translations"
|
||||
mkdir -p "$APP_RESOURCES/webui"
|
||||
|
||||
# 4. Copie des exécutables annexes (service, friendserver) s'ils existent (non-bloquant)
|
||||
echo ">>> Copying additional executables if they exist..."
|
||||
for exe in retroshare-service retroshare-friendserver; do
|
||||
found_exe=$(find "$BUILD_DIR" -type f -name "$exe" -perm -0111 | grep -v "CMakeFiles" | head -n 1)
|
||||
if [ -n "$found_exe" ]; then
|
||||
echo " Found and copying: $found_exe"
|
||||
cp "$found_exe" "$APP_MACOS/"
|
||||
else
|
||||
echo " INFO: Executable '$exe' not found. Skipping."
|
||||
fi
|
||||
done
|
||||
|
||||
# Copie des plugins
|
||||
echo ">>> Copying RetroShare plugins..."
|
||||
if [ -d "$BUILD_DIR/plugins" ]; then
|
||||
mkdir -p "$APP_RESOURCES/extensions6"
|
||||
for plugin in $(find "$BUILD_DIR/plugins" -type f \( -name "*.dylib" -o -name "*.so" \)); do
|
||||
filename=$(basename "$plugin")
|
||||
# RetroShare sur macOS refuse de charger les plugins s'ils ne finissent pas par .dylib !
|
||||
newname="${filename%.*}.dylib"
|
||||
cp "$plugin" "$APP_RESOURCES/$newname"
|
||||
cp "$plugin" "$APP_RESOURCES/extensions6/$newname"
|
||||
done
|
||||
echo " Plugins copied and renamed to .dylib in $APP_RESOURCES/ and $APP_RESOURCES/extensions6/."
|
||||
else
|
||||
echo " INFO: Plugins directory not found. Skipping plugins."
|
||||
fi
|
||||
|
||||
# 5. Copie des ressources statiques
|
||||
echo ">>> Copying RetroShare static assets..."
|
||||
|
||||
if [ -d "retroshare-gui/src/sounds" ]; then
|
||||
cp -r retroshare-gui/src/sounds/* "$APP_RESOURCES/sounds/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -f "libbitdht/src/bitdht/bdboot.txt" ]; then
|
||||
cp "libbitdht/src/bitdht/bdboot.txt" "$APP_RESOURCES/"
|
||||
echo " Copied bdboot.txt"
|
||||
fi
|
||||
|
||||
if [ -d "retroshare-gui/src/translations" ]; then
|
||||
find "retroshare-gui/src/translations" -name "*.qm" -exec cp {} "$APP_RESOURCES/translations/" \; 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -d "retroshare-webui/src" ]; then
|
||||
cp -r retroshare-webui/src/* "$APP_RESOURCES/webui/" 2>/dev/null || true
|
||||
echo " WebUI copied to app resources."
|
||||
fi
|
||||
|
||||
# 6. Mise à jour du Info.plist
|
||||
echo ">>> Updating Info.plist..."
|
||||
PLIST_PATH="$TARGET_APP/Contents/Info.plist"
|
||||
if command -v /usr/libexec/PlistBuddy &> /dev/null; then
|
||||
/usr/libexec/PlistBuddy -c "Delete :CFBundleGetInfoString" "$PLIST_PATH" 2>/dev/null || true
|
||||
/usr/libexec/PlistBuddy -c "Delete :CFBundleVersion" "$PLIST_PATH" 2>/dev/null || true
|
||||
/usr/libexec/PlistBuddy -c "Add :CFBundleVersion string $VERSION" "$PLIST_PATH" 2>/dev/null || true
|
||||
/usr/libexec/PlistBuddy -c "Delete :CFBundleShortVersionString" "$PLIST_PATH" 2>/dev/null || true
|
||||
/usr/libexec/PlistBuddy -c "Add :CFBundleShortVersionString string $VERSION" "$PLIST_PATH" 2>/dev/null || true
|
||||
/usr/libexec/PlistBuddy -c "Delete :NSRequiresAquaSystemAppearance" "$PLIST_PATH" 2>/dev/null || true
|
||||
else
|
||||
echo " WARNING: PlistBuddy not found, skipping Info.plist update."
|
||||
fi
|
||||
|
||||
# 7. Déploiement Qt via macdeployqt
|
||||
echo ">>> Running macdeployqt..."
|
||||
if command -v macdeployqt &> /dev/null; then
|
||||
# Forcer la copie des plugins d'images (SVG, etc.) au cas où macdeployqt les oublie
|
||||
MACDEPLOY_BIN=$(command -v macdeployqt)
|
||||
QT_BASE=$(dirname "$(dirname "$MACDEPLOY_BIN")")
|
||||
QT_PLUGINS_DIR="$QT_BASE/share/qt/plugins"
|
||||
if [ ! -d "$QT_PLUGINS_DIR" ]; then
|
||||
QT_PLUGINS_DIR="$QT_BASE/plugins"
|
||||
fi
|
||||
|
||||
if [ -d "$QT_PLUGINS_DIR/imageformats" ]; then
|
||||
echo ">>> Forcing copy of Qt imageformats plugins (SVG support) from $QT_PLUGINS_DIR..."
|
||||
mkdir -p "$TARGET_APP/Contents/PlugIns/imageformats"
|
||||
cp "$QT_PLUGINS_DIR/imageformats/"*.dylib "$TARGET_APP/Contents/PlugIns/imageformats/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Par défaut macdeployqt ignore les fichiers .so, il faut le forcer avec -executable
|
||||
EXTRA_EXECS=""
|
||||
for plugin in "$TARGET_APP"/Contents/Resources/*.so "$TARGET_APP"/Contents/Resources/*.dylib "$TARGET_APP"/Contents/Resources/extensions6/*.so "$TARGET_APP"/Contents/Resources/extensions6/*.dylib "$TARGET_APP"/Contents/PlugIns/imageformats/*.dylib; do
|
||||
if [ -f "$plugin" ]; then
|
||||
EXTRA_EXECS="$EXTRA_EXECS -executable=$plugin"
|
||||
fi
|
||||
done
|
||||
|
||||
# macdeployqt copie les frameworks et ajuste les rpaths
|
||||
macdeployqt "$TARGET_APP" -always-overwrite $EXTRA_EXECS
|
||||
|
||||
echo ">>> Ad-hoc code signing (required for Apple Silicon)..."
|
||||
if command -v codesign &> /dev/null; then
|
||||
# On signe d'abord toutes les bibliothèques, plugins (.so/.dylib) et frameworks individuellement
|
||||
find "$TARGET_APP" -type f \( -name "*.dylib" -o -name "*.so" \) -exec codesign --force --sign - {} \; 2>/dev/null || true
|
||||
find "$TARGET_APP" -type d -name "*.framework" -exec codesign --force --sign - {} \; 2>/dev/null || true
|
||||
# Puis on signe l'application entière
|
||||
codesign --force --deep --sign - "$TARGET_APP"
|
||||
fi
|
||||
|
||||
echo ">>> Creating dmg archive using hdiutil..."
|
||||
DMG_FILE="${BUILD_DIR}/${ARCHIVE_BASE}.dmg"
|
||||
rm -f "$DMG_FILE"
|
||||
if command -v hdiutil &> /dev/null; then
|
||||
hdiutil create -volname "${APP_NAME}" -srcfolder "$TARGET_APP" -ov -format UDZO "$DMG_FILE"
|
||||
|
||||
if [ -f "$DMG_FILE" ]; then
|
||||
echo "================================================================================"
|
||||
echo "SUCCESS: Standalone package created at: $DMG_FILE"
|
||||
echo "================================================================================"
|
||||
else
|
||||
echo "WARNING: .dmg not generated."
|
||||
fi
|
||||
else
|
||||
echo "WARNING: hdiutil not found, cannot create .dmg."
|
||||
fi
|
||||
else
|
||||
echo " WARNING: macdeployqt tool not found in PATH! Make sure Qt is installed and its bin folder is in PATH."
|
||||
echo " Cannot bundle Qt dependencies or create DMG automatically."
|
||||
echo "================================================================================"
|
||||
echo "SUCCESS: App bundle generated at: ${TARGET_APP}"
|
||||
echo "================================================================================"
|
||||
fi
|
||||
@ -1,51 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
APP="RetroShare"
|
||||
RSVERSION="0.6.7a"
|
||||
QTVERSION="Qt-5.15.11"
|
||||
|
||||
# Install the 7z to create dmg archives.
|
||||
#brew list p7zip || brew install p7zip
|
||||
|
||||
# Package your app
|
||||
echo "Packaging retroshare..."
|
||||
#cd ${project_dir}/build/macOS/clang/x86_64/release/
|
||||
cd retroshare-gui/src/
|
||||
|
||||
# Remove build directories that you don't want to deploy
|
||||
rm -rf moc
|
||||
rm -rf obj
|
||||
rm -rf qrc
|
||||
|
||||
# This sets the CFBundleVersion & CFBundleShortVersionString string
|
||||
/usr/libexec/PlistBuddy -c "Delete :CFBundleGetInfoString" retroshare.app/Contents/Info.plist
|
||||
/usr/libexec/PlistBuddy -c "Add :CFBundleVersion string $RSVERSION" retroshare.app/Contents/Info.plist
|
||||
/usr/libexec/PlistBuddy -c "Add :CFBundleShortVersionString string $RSVERSION" retroshare.app/Contents/Info.plist
|
||||
/usr/libexec/PlistBuddy -c "Delete :NSRequiresAquaSystemAppearance" retroshare.app/Contents/Info.plist
|
||||
|
||||
# This automatically creates retroshare.dmg
|
||||
|
||||
echo "Creating dmg archive..."
|
||||
macdeployqt retroshare.app -dmg
|
||||
|
||||
DATE=`date +"%m-%d-%Y"`
|
||||
MACVERSION=`sw_vers -productVersion`
|
||||
#RSVERSION=`git describe --abbrev=0 --tags`
|
||||
GITHEAD=`git rev-parse --short HEAD`
|
||||
|
||||
mv $APP.dmg "$APP-$RSVERSION-$GITHEAD-$DATE-MacOS-$MACVERSION-$QTVERSION.dmg"
|
||||
|
||||
# You can use the appdmg command line app to create your dmg file if
|
||||
# you want to use a custom background and icon arrangement. I'm still
|
||||
# working on this for my apps, myself. If you want to do this, you'll
|
||||
# remove the -dmg option above.
|
||||
# appdmg json-path YourApp_${TRAVIS_TAG}.dmg
|
||||
|
||||
# Copy other project files
|
||||
cp "../../libbitdht/src/bitdht/bdboot.txt" "retroshare.app/Contents/Resources/"
|
||||
cp "../../plugins/FeedReader/lib/libFeedReader.dylib" "retroshare.app/Contents/Resources/"
|
||||
cp -R "sounds" "retroshare.app/Contents/Resources/sounds"
|
||||
|
||||
# cp "${project_dir}/README.md" "README.md"
|
||||
# cp "${project_dir}/LICENSE" "LICENSE"
|
||||
# cp "${project_dir}/Qt License" "Qt License"
|
||||
94
build_scripts/OSX/retroshare-mac-build.patch
Normal file
94
build_scripts/OSX/retroshare-mac-build.patch
Normal file
@ -0,0 +1,94 @@
|
||||
commit 51f554f909086f4baca7be215d5edacab744dea4
|
||||
Author: Kartikaya Gupta <kats@calvin.staktrace.com>
|
||||
Date: Wed Mar 7 23:30:48 2012 -0500
|
||||
|
||||
Modifications needed to get build working on Mac OS X 10.6
|
||||
|
||||
diff --git a/.gitignore b/.gitignore
|
||||
new file mode 100644
|
||||
index 0000000..3e90033
|
||||
--- /dev/null
|
||||
+++ b/.gitignore
|
||||
@@ -0,0 +1,6 @@
|
||||
+*.o
|
||||
+Makefile
|
||||
+libbitdht/src/lib/
|
||||
+libretroshare/src/lib/
|
||||
+retroshare-gui/src/RetroShare.app/
|
||||
+retroshare-gui/src/temp/
|
||||
diff --git a/libretroshare/src/libretroshare.pro b/libretroshare/src/libretroshare.pro
|
||||
index 6f35e01..267cc91 100644
|
||||
--- a/libretroshare/src/libretroshare.pro
|
||||
+++ b/libretroshare/src/libretroshare.pro
|
||||
@@ -312,7 +312,7 @@ mac {
|
||||
OBJECTS_DIR = temp/obj
|
||||
MOC_DIR = temp/moc
|
||||
#DEFINES = WINDOWS_SYS WIN32 STATICLIB MINGW
|
||||
- #DEFINES *= MINIUPNPC_VERSION=13
|
||||
+ DEFINES *= MINIUPNPC_VERSION=13
|
||||
DESTDIR = lib
|
||||
|
||||
#miniupnp implementation files
|
||||
@@ -326,12 +326,11 @@ mac {
|
||||
# Beautiful Hack to fix 64bit file access.
|
||||
QMAKE_CXXFLAGS *= -Dfseeko64=fseeko -Dftello64=ftello -Dfopen64=fopen -Dvstatfs64=vstatfs
|
||||
|
||||
- UPNPC_DIR = ../../../miniupnpc-1.0
|
||||
- GPG_ERROR_DIR = ../../../../libgpg-error-1.7
|
||||
- GPGME_DIR = ../../../../gpgme-1.1.8
|
||||
+ UPNPC_DIR = ../../../miniupnpc-1.3
|
||||
+ GPG_ERROR_DIR = ../../../libgpg-error-1.10
|
||||
+ GPGME_DIR = ../../../gpgme-1.3.1
|
||||
|
||||
- INCLUDEPATH += . $${UPNPC_DIR}
|
||||
- #INCLUDEPATH += . $${UPNPC_DIR} $${GPGME_DIR}/src $${GPG_ERROR_DIR}/src
|
||||
+ INCLUDEPATH += . $${UPNPC_DIR} $${GPGME_DIR}/src $${GPG_ERROR_DIR}/src
|
||||
}
|
||||
|
||||
################################# FreeBSD ##########################################
|
||||
diff --git a/libretroshare/src/pqi/sslfns.cc b/libretroshare/src/pqi/sslfns.cc
|
||||
index 2588cb8..305433f 100644
|
||||
--- a/libretroshare/src/pqi/sslfns.cc
|
||||
+++ b/libretroshare/src/pqi/sslfns.cc
|
||||
@@ -586,8 +586,8 @@ X509 *loadX509FromDER(const uint8_t *ptr, uint32_t len)
|
||||
X509 *tmp = NULL;
|
||||
#ifdef __APPLE__
|
||||
// This depends on which version you are compiling for... OSX10.5 doesn't have consts (old OpenSSL!)
|
||||
- unsigned char **certptr = (unsigned char **) &ptr;
|
||||
- //const unsigned char **certptr = (const unsigned char **) &ptr;
|
||||
+ //unsigned char **certptr = (unsigned char **) &ptr;
|
||||
+ const unsigned char **certptr = (const unsigned char **) &ptr;
|
||||
#else
|
||||
const unsigned char **certptr = (const unsigned char **) &ptr;
|
||||
#endif
|
||||
diff --git a/retroshare-gui/src/RetroShare.pro b/retroshare-gui/src/RetroShare.pro
|
||||
index adcb5a0..ffbf669 100644
|
||||
--- a/retroshare-gui/src/RetroShare.pro
|
||||
+++ b/retroshare-gui/src/RetroShare.pro
|
||||
@@ -140,19 +140,21 @@ win32 {
|
||||
|
||||
macx {
|
||||
# ENABLE THIS OPTION FOR Univeral Binary BUILD.
|
||||
- CONFIG += ppc x86
|
||||
- QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.4
|
||||
+ # CONFIG += ppc x86
|
||||
+ QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6
|
||||
|
||||
CONFIG += version_detail_bash_script
|
||||
LIBS += ../../libretroshare/src/lib/libretroshare.a
|
||||
- LIBS += -lssl -lcrypto -lz -lgpgme -lgpg-error -lassuan
|
||||
- LIBS += ../../../miniupnpc-1.0/libminiupnpc.a
|
||||
+ LIBS += ../../../libgpg-error-1.10/build/lib/libgpg-error.a
|
||||
+ LIBS += ../../../gpgme-1.3.1/build/lib/libgpgme.a
|
||||
+ LIBS += ../../../miniupnpc-1.3/libminiupnpc.a
|
||||
+ LIBS += -lssl -lcrypto -lz -lassuan
|
||||
LIBS += -framework CoreFoundation
|
||||
LIBS += -framework Security
|
||||
|
||||
# LIBS += -framework CoreServices
|
||||
|
||||
- INCLUDEPATH += .
|
||||
+ INCLUDEPATH += . ../../../gpgme-1.3.1/src
|
||||
#DEFINES* = MAC_IDLE # for idle feature
|
||||
CONFIG -= uitools
|
||||
|
||||
@ -1,129 +0,0 @@
|
||||
|
||||
## Compilation on Red Hat-based Linux
|
||||
|
||||
|
||||
### Install package dependencies:
|
||||
#### RedHat/Fedora
|
||||
```bash
|
||||
sudo dnf install mesa-libGL-devel gcc cmake rapidjson-devel \
|
||||
libupnp openssl sqlcipher sqlcipher-devel \
|
||||
botan2 botan2-devel json-c-devel bzip2-devel asio-devel libsecret libXScrnSaver-devel
|
||||
```
|
||||
|
||||
To compile with Qt5:
|
||||
```bash
|
||||
sudo dnf install qt5-qtbase-devel qt5-qtmultimedia qt5-qtx11extras
|
||||
```
|
||||
|
||||
To compile with Qt6:
|
||||
```bash
|
||||
sudo dnf install qt6-qtbase-devel qt6-qtmultimedia-devel qt6-qt5compat-devel
|
||||
```
|
||||
|
||||
Additional dependencies for Feedreader plugin:
|
||||
```bash
|
||||
sudo dnf install libxml2-devel libxslt-devel libcurl-devel
|
||||
```
|
||||
|
||||
### Checkout the source code
|
||||
```bash
|
||||
cd ~
|
||||
git clone https://github.com/RetroShare/RetroShare.git retroshare
|
||||
```
|
||||
|
||||
### Checkout the submodules
|
||||
```bash
|
||||
cd retroshare
|
||||
git submodule update --init --remote libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/
|
||||
git submodule update --init --remote supportlibs/librnp supportlibs/restbed supportlibs/rapidjson
|
||||
```
|
||||
|
||||
### Compile
|
||||
```bash
|
||||
qmake CONFIG+=release CONFIG+=rs_jsonapi CONFIG+=rs_webui
|
||||
make
|
||||
```
|
||||
|
||||
The executable produced will be:
|
||||
```bash
|
||||
./retroshare-gui/src/retroshare
|
||||
```
|
||||
|
||||
### Install
|
||||
```bash
|
||||
sudo make install
|
||||
```
|
||||
|
||||
The executable produced will be:
|
||||
```bash
|
||||
~/usr/bin/RetroShare
|
||||
```
|
||||
|
||||
### For packagers
|
||||
|
||||
Packagers can use PREFIX and LIB\_DIR to customize the installation paths:
|
||||
```bash
|
||||
qmake PREFIX=/usr LIB_DIR=/usr/lib64 "CONFIG-=debug" "CONFIG+=release"
|
||||
make
|
||||
make INSTALL_ROOT=${PKGDIR} install
|
||||
```
|
||||
|
||||
### SQLCipher
|
||||
If libsqlcipher is not available as a package
|
||||
|
||||
You need to place sqlcipher so that the hierarchy is:
|
||||
|
||||
~Home
|
||||
|
|
||||
+--- retroshare
|
||||
|
|
||||
+--- lib
|
||||
|
|
||||
+---- sqlcipher
|
||||
```bash
|
||||
mkdir lib
|
||||
cd lib
|
||||
git clone https://github.com/sqlcipher/sqlcipher.git --depth=1 --branch v3.4.1
|
||||
cd sqlcipher
|
||||
./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
|
||||
make
|
||||
cd ..
|
||||
```
|
||||
|
||||
### Build infos
|
||||
|
||||
Note: If you installed Qt6 you need to use `qmake6` on the command line.
|
||||
|
||||
For the `FeedReader` it is required to append the config option `CONFIG+=retroshare_plugins`.
|
||||
Make sure `plugins/plugins.pro` contains `FeedReader` in the list of plugins to compile.
|
||||
|
||||
Do not mix plugins compiled with Qt5 with those compiled with Qt6. They work only if they are compiled
|
||||
with the same Qt version as RetroShare.
|
||||
|
||||
Voip is outdated and is not compileable on the latest Debian.
|
||||
|
||||
For `Autologin` it is required to append the config option `CONFIG+=rs_autologin`.
|
||||
|
||||
|
||||
### Build options
|
||||
|
||||
* Mandatory
|
||||
* release or debug: normally you would like to use the release option
|
||||
* Extra features (optional)
|
||||
* rs_autologin: enable autologin
|
||||
* retroshare_plugins: build plugins
|
||||
* rs_webui: enable Web interface
|
||||
* rs_jsonapi: enable json api interface, required by rs_webui
|
||||
* gxsthewire: enable Wire service (experimental)
|
||||
* wikipoos: enable Wiki service
|
||||
* rs_use_native_dialogs: enable native dialogs (may cause crashes with some versions of Gtk)
|
||||
* rs_deep_channels_index: build with deep channel indexing support
|
||||
* rs_deep_files_index: build with deep file indexing support
|
||||
* "CONFIG+=..." enable other extra compile time features, you can find the almost complete list in file *<sourcefolder>\retroshare.pri*
|
||||
|
||||
Example:
|
||||
|
||||
```batch
|
||||
qmake CONFIG+=debug CONFIG+=release CONFIG+=rs_use_native_dialog CONFIG+=rs_gui_cmark
|
||||
qmake CONFIG+=rs_jsonapi CONFIG+=rs_webui CONFIG+=rs_autologin
|
||||
```
|
||||
@ -1,11 +1,10 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Version=1.0
|
||||
Name=RetroShare
|
||||
Comment=Securely communicate with your friends
|
||||
Comment=Securely share files with your friends
|
||||
Exec=/usr/bin/retroshare %U
|
||||
Icon=retroshare.xpm
|
||||
Icon=/usr/share/pixmaps/retroshare.xpm
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Network;Email;InstantMessaging;Chat;Feed;FileTransfer;P2P
|
||||
Categories=Network;P2P;
|
||||
MimeType=x-scheme-handler/retroshare;
|
||||
|
||||
@ -8,7 +8,7 @@ Requirements: about 12 GB of free space
|
||||
The resulting binary is a 32-bit build of Retroshare which will also work
|
||||
fine on a 64-bit system.
|
||||
|
||||
**If you want to make complete solution without debugging it, prefer to use \build_scripts\Windows-msys2\build.bat**
|
||||
**If you want to make complet solution without debugging it, prefer to use \build_scripts\Windows-msys2\build.bat**
|
||||
|
||||
This batch will install and build all for you.
|
||||
|
||||
@ -18,8 +18,8 @@ At the end, you'll get at ..\\*-msys2\deploy\ the Portable 7zip file.
|
||||
|
||||
### MSYS2 INSTALLATION (for editing or debugging)
|
||||
|
||||
Download MSYS2 from [MSYS2](http://www.msys2.org/). Installing
|
||||
MSYS2 requires 64 bit Windows 10 or newer.
|
||||
Download MSYS2 from [MSYS2](http://www.msys2.org/). Get the i686 version
|
||||
if you run a 32-bit Windows or the x86_64 if you run a 64-bit Windows.
|
||||
|
||||
Run the installer and install MSYS2.
|
||||
|
||||
@ -40,29 +40,26 @@ Run MSYS2 MSYS again and finish updating with:
|
||||
|
||||
Install the default programs needed to build:
|
||||
|
||||
pacman -S base-devel git wget p7zip gcc perl ruby doxygen cmake
|
||||
pacman -S base-devel git wget p7zip gcc perl ruby python2 doxygen cmake
|
||||
|
||||
Install the 64-bit toolchain:
|
||||
Install the 32-bit toolchain:
|
||||
|
||||
pacman -S mingw-w64-x86_64-toolchain
|
||||
pacman -S mingw-w64-i686-toolchain
|
||||
|
||||
Install all needed dependencies:
|
||||
|
||||
pacman -S mingw-w64-x86_64-miniupnpc
|
||||
pacman -S mingw-w64-x86_64-libxslt
|
||||
pacman -S mingw-w64-x86_64-xapian-core
|
||||
pacman -S mingw-w64-x86_64-sqlcipher
|
||||
pacman -S mingw-w64-x86_64-qt5-base
|
||||
pacman -S mingw-w64-x86_64-qt5-multimedia
|
||||
pacman -S mingw-w64-x86_64-ccmake
|
||||
pacman -S mingw-w64-x86_64-rapidjson
|
||||
pacman -S mingw-w64-x86_64-json-c
|
||||
pacman -S mingw-w64-x86_64-libbotan
|
||||
pacman -S mingw-w64-x86_64-asio
|
||||
pacman -S mingw-w64-i686-miniupnpc
|
||||
pacman -S mingw-w64-i686-libmicrohttpd
|
||||
pacman -S mingw-w64-i686-libxslt
|
||||
pacman -S mingw-w64-i686-xapian-core
|
||||
pacman -S mingw-w64-i686-sqlcipher
|
||||
pacman -S mingw-w64-i686-qt5
|
||||
pacman -S mingw32/mingw-w64-i686-cmake
|
||||
pacman -S mingw-w64-i686-rapidjson
|
||||
|
||||
If you want to use QtCreator as IDE, prefer using this one publish by MSYS2 as all build Kit are already setted.
|
||||
|
||||
pacman -S mingw-w64-x86_64-qt-creator
|
||||
pacman -S mingw-w64-i686-qt-creator
|
||||
*You can start it from MSYS2 terminal.*
|
||||
|
||||
|
||||
@ -70,7 +67,7 @@ We're done installing MSYS2, close the shell terminal.
|
||||
|
||||
### BUILDING RETROSHARE
|
||||
|
||||
Now run the MSYS2 MinGW 64-bit shell terminal (it's in the start menu).
|
||||
Now run the MSYS2 MinGW 32-bit shell terminal (it's in the start menu).
|
||||
We will use it to checkout Retroshare and build it:
|
||||
|
||||
git clone https://github.com/RetroShare/RetroShare.git
|
||||
|
||||
@ -43,9 +43,7 @@ set NSIS_PARAM=%NSIS_PARAM% /DDEPLOYDIR="%RsDeployPath%"
|
||||
set NSIS_PARAM=%NSIS_PARAM% /DOUTDIR="%RsPackPath%"
|
||||
set NSIS_PARAM=%NSIS_PARAM% /DINSTALLERADD="%RsArchiveAdd%"
|
||||
set NSIS_PARAM=%NSIS_PARAM% /DARCHITECTURE="%RsArchitecture%"
|
||||
set NSIS_PARAM=%NSIS_PARAM% /DTOOLCHAIN="%RsToolchain%"
|
||||
set NSIS_PARAM=%NSIS_PARAM% /DREVISION=%RsVersion.Extra%
|
||||
set NSIS_PARAM=%NSIS_PARAM% /DQTVERSION=%QtVersion%
|
||||
|
||||
set QtMainVersion=%QtVersion:~0,1%
|
||||
|
||||
@ -55,10 +53,7 @@ rem makensis %NSIS_PARAM% "%SourcePath%\build_scripts\Windows-msys2\installer\re
|
||||
rem pushd "%SourcePath%\build_scripts\Windows-msys2\installer"
|
||||
rem %EnvMSYS2Cmd% "makensis $0 retroshare-Qt%QtMainVersion%.nsi" "%NSIS_PARAM%"
|
||||
rem popd
|
||||
|
||||
rem Currently no need for separate nsi files
|
||||
rem "%RsMinGWPath%\bin\makensis" %NSIS_PARAM% "%SourcePath%\build_scripts\Windows-msys2\installer\retroshare-Qt%QtMainVersion%.nsi"
|
||||
"%RsMinGWPath%\bin\makensis" %NSIS_PARAM% "%SourcePath%\build_scripts\Windows-msys2\installer\retroshare.nsi"
|
||||
"%RsMinGWPath%\bin\makensis" %NSIS_PARAM% "%SourcePath%\build_scripts\Windows-msys2\installer\retroshare-Qt%QtMainVersion%.nsi"
|
||||
|
||||
exit /B %ERRORLEVEL%
|
||||
|
||||
|
||||
@ -15,37 +15,23 @@ call "%~dp0env-base.bat" %*
|
||||
if errorlevel 2 exit /B 2
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
title Build - %SourceName%-%RsBuildConfig% Qt-%QtVersion% %RsToolchain% [Prerequisites]
|
||||
|
||||
if not "%ParamNoupdate%"=="1" (
|
||||
:: Install needed things
|
||||
%EnvMSYS2Cmd% "pacman --noconfirm --needed -S make git mingw-w64-%RsMSYS2Architecture%-toolchain mingw-w64-%RsMSYS2Architecture%-qt%ParamQtVersion% mingw-w64-%RsMSYS2Architecture%-miniupnpc mingw-w64-%RsMSYS2Architecture%-sqlcipher mingw-w64-%RsMSYS2Architecture%-cmake mingw-w64-%RsMSYS2Architecture%-rapidjson"
|
||||
:: rnp
|
||||
%EnvMSYS2Cmd% "pacman --noconfirm --needed -S mingw-w64-%RsMSYS2Architecture%-json-c mingw-w64-%RsMSYS2Architecture%-libbotan"
|
||||
%EnvMSYS2Cmd% "pacman --noconfirm --needed -S make git mingw-w64-%RsMSYS2Architecture%-toolchain mingw-w64-%RsMSYS2Architecture%-qt5 mingw-w64-%RsMSYS2Architecture%-miniupnpc mingw-w64-%RsMSYS2Architecture%-sqlcipher mingw-w64-%RsMSYS2Architecture%-cmake mingw-w64-%RsMSYS2Architecture%-rapidjson"
|
||||
|
||||
:: Webui
|
||||
if "%ParamWebui%"=="1" %EnvMSYS2Cmd% "pacman --noconfirm --needed -S mingw-w64-%RsMSYS2Architecture%-doxygen mingw-w64-%RsMSYS2Architecture%-asio"
|
||||
if "%ParamWebui%"=="1" %EnvMSYS2Cmd% "pacman --noconfirm --needed -S mingw-w64-%RsMSYS2Architecture%-doxygen"
|
||||
|
||||
:: Plugins
|
||||
if "%ParamPlugins%"=="1" %EnvMSYS2Cmd% "pacman --noconfirm --needed -S mingw-w64-%RsMSYS2Architecture%-speex mingw-w64-%RsMSYS2Architecture%-speexdsp mingw-w64-%RsMSYS2Architecture%-curl mingw-w64-%RsMSYS2Architecture%-libxslt mingw-w64-%RsMSYS2Architecture%-opencv mingw-w64-%RsMSYS2Architecture%-ffmpeg"
|
||||
|
||||
:: Clang
|
||||
if "%ClangCompiler%"=="1" %EnvMSYS2Cmd% "pacman --noconfirm --needed -S mingw-w64-%RsMSYS2Architecture%-clang"
|
||||
if "%ParamClang%"=="1" %EnvMSYS2Cmd% "pacman --noconfirm --needed -S mingw-w64-%RsMSYS2Architecture%-clang"
|
||||
|
||||
:: Indexing
|
||||
if "%ParamIndexing%"=="1" %EnvMSYS2Cmd% "pacman --noconfirm --needed -S mingw-w64-%RsMSYS2Architecture%-xapian-core mingw-w64-%RsMSYS2Architecture%-libvorbis mingw-w64-%RsMSYS2Architecture%-flac mingw-w64-%RsMSYS2Architecture%-taglib"
|
||||
)
|
||||
|
||||
:: Fix webui compilation (TODO: remove when whole RS switched to cmake)
|
||||
if "%ParamWebui%"=="1" (
|
||||
pushd "%SourcePath%"
|
||||
copy "%SourcePath%\libretroshare\src\jsonapi\jsonapi-generator-doxygen.conf" "%SourcePath%\jsonapi-generator\src\jsonapi-generator-doxygen.conf" %Quite%
|
||||
copy "%SourcePath%\libretroshare\src\jsonapi\async-method-wrapper-template.cpp.tmpl" "%SourcePath%\jsonapi-generator\src\async-method-wrapper-template.cpp.tmpl" %Quite%
|
||||
copy "%SourcePath%\libretroshare\src\jsonapi\method-wrapper-template.cpp.tmpl" "%SourcePath%\jsonapi-generator\src\method-wrapper-template.cpp.tmpl" %Quite%
|
||||
git update-index --assume-unchanged "jsonapi-generator\src\jsonapi-generator-doxygen.conf" "jsonapi-generator\src\async-method-wrapper-template.cpp.tmpl" "jsonapi-generator\src\method-wrapper-template.cpp.tmpl"
|
||||
popd
|
||||
)
|
||||
|
||||
:: Initialize environment
|
||||
call "%~dp0env.bat" %*
|
||||
if errorlevel 2 exit /B 2
|
||||
@ -55,7 +41,7 @@ echo.
|
||||
echo === Version
|
||||
echo.
|
||||
|
||||
title Build - %SourceName%-%RsBuildConfig% Qt-%QtVersion% %RsToolchain% [Version]
|
||||
title Build - %SourceName%-%RsBuildConfig% [Version]
|
||||
|
||||
pushd "%SourcePath%\retroshare-gui\src\gui\images"
|
||||
:: Touch resource file
|
||||
@ -69,7 +55,7 @@ echo.
|
||||
echo === qmake
|
||||
echo.
|
||||
|
||||
title Build - %SourceName%-%RsBuildConfig% Qt-%QtVersion% %RsToolchain% [qmake]
|
||||
title Build - %SourceName%-%RsBuildConfig% [qmake]
|
||||
|
||||
set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% "CONFIG+=%RsBuildConfig%"
|
||||
if "%ParamAutologin%"=="1" set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% "CONFIG+=rs_autologin"
|
||||
@ -80,14 +66,14 @@ echo %RS_QMAKE_CONFIG% > buildinfo.txt
|
||||
echo %RsBuildConfig% >> buildinfo.txt
|
||||
echo %RsArchitecture% >> buildinfo.txt
|
||||
echo Qt %QtVersion% >> buildinfo.txt
|
||||
echo %RsToolchain% >> buildinfo.txt
|
||||
echo %RsCompiler% >> buildinfo.txt
|
||||
|
||||
call "%ToolsPath%\msys2-path.bat" "%SourcePath%" MSYS2SourcePath
|
||||
call "%ToolsPath%\msys2-path.bat" "%EnvMSYS2Path%" MSYS2EnvMSYS2Path
|
||||
if "%ClangCompiler%"=="1" (
|
||||
%EnvMSYS2Cmd% "%QMakeCmd% "%MSYS2SourcePath%/RetroShare.pro" -r -spec win32-clang-g++ %RS_QMAKE_CONFIG%"
|
||||
if "%ParamClang%"=="1" (
|
||||
%EnvMSYS2Cmd% "qmake "%MSYS2SourcePath%/RetroShare.pro" -r -spec win32-clang-g++ %RS_QMAKE_CONFIG%"
|
||||
) else (
|
||||
%EnvMSYS2Cmd% "%QMakeCmd% "%MSYS2SourcePath%/RetroShare.pro" -r -spec win32-g++ %RS_QMAKE_CONFIG%"
|
||||
%EnvMSYS2Cmd% "qmake "%MSYS2SourcePath%/RetroShare.pro" -r -spec win32-g++ %RS_QMAKE_CONFIG%"
|
||||
)
|
||||
if errorlevel 1 goto error
|
||||
|
||||
@ -95,11 +81,16 @@ echo.
|
||||
echo === make
|
||||
echo.
|
||||
|
||||
title Build - %SourceName%-%RsBuildConfig% Qt-%QtVersion% %RsToolchain% [make]
|
||||
title Build - %SourceName%-%RsBuildConfig% [make]
|
||||
|
||||
%EnvMSYS2Cmd% "make -j %CoreCount%"
|
||||
if errorlevel 1 goto error
|
||||
|
||||
:: Webui
|
||||
if "%ParamWebui%"=="1" (
|
||||
call "%~dp0..\tools\webui.bat"
|
||||
)
|
||||
|
||||
:error
|
||||
popd
|
||||
|
||||
|
||||
@ -1,56 +1,27 @@
|
||||
:: Process commandline parameter
|
||||
set Param32=0
|
||||
set Param64=0
|
||||
set ParamRelease=0
|
||||
set ParamDebug=0
|
||||
set ParamAutologin=0
|
||||
set ParamPlugins=0
|
||||
set ParamTor=0
|
||||
set ParamWebui=0
|
||||
set ClangCompiler=0
|
||||
set ParamClang=0
|
||||
set ParamIndexing=0
|
||||
set ParamFriendserver=0
|
||||
set ParamNoupdate=0
|
||||
set CoreCount=%NUMBER_OF_PROCESSORS%
|
||||
set RS_QMAKE_CONFIG=
|
||||
set RsToolchain=
|
||||
set ParamQtVersion=5
|
||||
set tcc=0
|
||||
set QtVersionCount=0
|
||||
|
||||
:parameter_loop
|
||||
if "%~1" NEQ "" (
|
||||
for /f "tokens=1,2 delims==" %%a in ("%~1") do (
|
||||
if "%%~a"=="32" (
|
||||
set RsToolchain=mingw32
|
||||
set /A tcc=tcc+1
|
||||
set Param32=1
|
||||
) else if "%%~a"=="64" (
|
||||
set RsToolchain=mingw64
|
||||
set /A tcc=tcc+1
|
||||
) else if "%%~a"=="mingw32" (
|
||||
set RsToolchain=mingw32
|
||||
set /A tcc=tcc+1
|
||||
) else if "%%~a"=="mingw64" (
|
||||
set RsToolchain=mingw64
|
||||
set /A tcc=tcc+1
|
||||
) else if "%%~a"=="ucrt64" (
|
||||
set RsToolchain=ucrt64
|
||||
set /A tcc=tcc+1
|
||||
) else if "%%~a"=="clang64" (
|
||||
set RsToolchain=clang64
|
||||
set /A tcc=tcc+1
|
||||
) else if "%%~a"=="clang32" (
|
||||
set RsToolchain=clang32
|
||||
set /A tcc=tcc+1
|
||||
) else if "%%~a"=="clangarm64" (
|
||||
set RsToolchain=clangarm64
|
||||
set /A tcc=tcc+1
|
||||
set Param64=1
|
||||
) else if "%%~a"=="release" (
|
||||
set ParamRelease=1
|
||||
) else if "%%~a"=="qt5" (
|
||||
set ParamQtVersion=5
|
||||
set /A QtVersionCount+=1
|
||||
) else if "%%~a"=="qt6" (
|
||||
set ParamQtVersion=6
|
||||
set /A QtVersionCount+=1
|
||||
) else if "%%~a"=="debug" (
|
||||
set ParamDebug=1
|
||||
) else if "%%~a"=="autologin" (
|
||||
@ -63,10 +34,10 @@ if "%~1" NEQ "" (
|
||||
set ParamWebui=1
|
||||
) else if "%%~a"=="singlethread" (
|
||||
set CoreCount=1
|
||||
) else if "%%~a"=="clang" (
|
||||
set ParamClang=1
|
||||
) else if "%%~a"=="indexing" (
|
||||
set ParamIndexing=1
|
||||
) else if "%%~a"=="friendserver" (
|
||||
set ParamFriendserver=1
|
||||
) else if "%%~a"=="noupdate" (
|
||||
set ParamNoupdate=1
|
||||
) else if "%%~a"=="CONFIG+" (
|
||||
@ -81,49 +52,32 @@ if "%~1" NEQ "" (
|
||||
goto parameter_loop
|
||||
)
|
||||
|
||||
if %tcc% NEQ 1 (
|
||||
echo Multiple or no toolchain specified
|
||||
goto :usage
|
||||
)
|
||||
if "%Param32%"=="1" (
|
||||
if "%Param64%"=="1" (
|
||||
echo.
|
||||
echo 32-bit or 64-bit?
|
||||
goto :usage
|
||||
)
|
||||
|
||||
if %QtVersionCount% GTR 1 (
|
||||
echo Multiple Qt versions specified
|
||||
goto :usage
|
||||
)
|
||||
|
||||
if "%ParamQtVersion%" NEQ "5" if "%ParamQtVersion%" NEQ "6" (
|
||||
echo Wrong Qt version specified
|
||||
goto :usage
|
||||
)
|
||||
|
||||
if "%RsToolchain%"=="mingw32" (
|
||||
set RsBit=32
|
||||
set RsArchitecture=x86
|
||||
set RsMSYS2Architecture=i686
|
||||
set MSYSTEM=MINGW32
|
||||
) else if "%RsToolchain%"=="mingw64" (
|
||||
)
|
||||
|
||||
if "%Param64%"=="1" (
|
||||
set RsBit=64
|
||||
set RsArchitecture=x64
|
||||
set RsMSYS2Architecture=x86_64
|
||||
set MSYSTEM=MINGW64
|
||||
) else if "%RsToolchain%"=="ucrt64" (
|
||||
set RsArchitecture=x64
|
||||
set RsMSYS2Architecture=ucrt-x86_64
|
||||
set MSYSTEM=UCRT64
|
||||
) else if "%RsToolchain%"=="clang64" (
|
||||
set RsArchitecture=x64
|
||||
set RsMSYS2Architecture=clang-x86_64
|
||||
set MSYSTEM=CLANG64
|
||||
set ClangCompiler=1
|
||||
) else if "%RsToolchain%"=="clang32" (
|
||||
set RsArchitecture=x86
|
||||
set RsMSYS2Architecture=clang-i686
|
||||
set MSYSTEM=CLANG32
|
||||
set ClangCompiler=1
|
||||
) else if "%RsToolchain%"=="clangarm64" (
|
||||
set RsArchitecture=arm64
|
||||
set RsMSYS2Architecture=clang-aarch64
|
||||
set MSYSTEM=CLANGARM64
|
||||
)
|
||||
|
||||
if "%ParamClang%"=="1" (
|
||||
set RsCompiler=Clang
|
||||
) else (
|
||||
set RsCompiler=GCC
|
||||
)
|
||||
|
||||
if "%RsBit%"=="" goto :usage
|
||||
|
||||
if "%ParamRelease%"=="1" (
|
||||
if "%ParamDebug%"=="1" (
|
||||
echo.
|
||||
@ -150,31 +104,23 @@ if "%ParamIndexing%"=="1" (
|
||||
set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% "CONFIG+=rs_deep_channels_index" "CONFIG+=rs_deep_files_index" "CONFIG+=rs_deep_files_index_ogg" "CONFIG+=rs_deep_files_index_flac" "CONFIG+=rs_deep_files_index_taglib"
|
||||
)
|
||||
|
||||
if "%ParamFriendserver%"=="1" (
|
||||
set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% "CONFIG+=rs_efs"
|
||||
)
|
||||
|
||||
exit /B 0
|
||||
|
||||
:usage
|
||||
echo.
|
||||
echo Usage: 32^|64^|other release^|debug qt5^|qt6 [autologin plugins webui singlethread clang indexing friendserver noupdate] ["CONFIG+=..."]
|
||||
echo Usage: 32^|64 release^|debug [autologin plugins webui singlethread clang indexing noupdate] ["CONFIG+=..."]
|
||||
echo.
|
||||
echo Mandatory parameter
|
||||
echo 32^|64 32-bit or 64-bit version (same as mingw32 or mingw64)
|
||||
echo Or you can specify any other toolchain supported by msys2:
|
||||
echo mingw32^|mingw64^|clang32^|clang64^|ucrt64^|clangarm64
|
||||
echo More info: https://www.msys2.org/docs/environments
|
||||
echo 32^|64 32-bit or 64-bit Version
|
||||
echo release^|debug Build release or debug version
|
||||
echo qt5^|qt6 Build with Qt 5 (default) or Qt 6
|
||||
echo.
|
||||
echo Optional parameter (need clean when changed)
|
||||
echo autologin Build with autologin
|
||||
echo plugins Build plugins
|
||||
echo webui Enable JsonAPI and pack webui files
|
||||
echo singlethread Use only 1 thread for building
|
||||
echo clang Use clang compiler instead of GCC
|
||||
echo indexing Build with deep channel and file indexing support
|
||||
echo friendserver Enable friendserver support
|
||||
echo noupdate Skip updating the libraries
|
||||
echo "CONFIG+=..." Enable some extra features, you can find the almost complete list in retroshare.pri
|
||||
echo.
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
call "%~dp0env-base.bat" %*
|
||||
if errorlevel 2 exit /B 2
|
||||
if errorlevel 1 exit /B 1
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
set MSYSTEM=MINGW%RsBit%
|
||||
|
||||
set BuildPath=%EnvRootPath%\builds
|
||||
set DeployPath=%EnvRootPath%\deploy
|
||||
@ -8,23 +10,17 @@ set DeployPath=%EnvRootPath%\deploy
|
||||
if not exist "%BuildPath%" mkdir "%BuildPath%"
|
||||
if not exist "%DeployPath%" mkdir "%DeployPath%"
|
||||
|
||||
set QMakeCmd=
|
||||
if "%ParamQtVersion%"=="5" set QMakeCmd=qmake-qt5
|
||||
if "%ParamQtVersion%"=="6" set QMakeCmd=qmake6
|
||||
if "%QMakeCmd%"=="" %cecho% error "Unknown Qt version %ParamQtVersion%." & exit /B 1
|
||||
|
||||
:: Get Qt version
|
||||
call "%ToolsPath%\get-qt-version.bat" QtVersion %QMakeCmd%
|
||||
if errorlevel 1 %cecho% error "Cannot get Qt version." & exit /B 1
|
||||
call "%ToolsPath%\get-qt-version.bat" QtVersion
|
||||
if "%QtVersion%"=="" %cecho% error "Cannot get Qt version." & exit /B 1
|
||||
|
||||
set RsMinGWPath=%EnvMSYS2BasePath%\%RsToolchain%
|
||||
set RsMinGWPath=%EnvMSYS2BasePath%\mingw%RsBit%
|
||||
|
||||
set RsBuildPath=%BuildPath%\Qt-%QtVersion%-%RsToolchain%-%RsBuildConfig%
|
||||
set RsDeployPath=%DeployPath%\Qt-%QtVersion%-%RsToolchain%%RsType%-%RsBuildConfig%
|
||||
set RsBuildPath=%BuildPath%\Qt-%QtVersion%-%RsArchitecture%-%RsCompiler%-%RsBuildConfig%
|
||||
set RsDeployPath=%DeployPath%\Qt-%QtVersion%%RsType%-%RsArchitecture%-%RsCompiler%-%RsBuildConfig%
|
||||
set RsPackPath=%DeployPath%
|
||||
set RsArchiveAdd=
|
||||
set RsWebuiBuildPath=%RsBuildPath%\retroshare-webui\webui
|
||||
set RsWebuiPath=%RootPath%\%SourceName%-webui
|
||||
|
||||
if not exist "%~dp0env-mod.bat" goto no_mod
|
||||
call "%~dp0env-mod.bat"
|
||||
|
||||
@ -55,28 +55,25 @@ set RsVersion=%RsVersion.Major%.%RsVersion.Minor%.%RsVersion.Mini%
|
||||
:: Check WMIC is available
|
||||
wmic.exe alias /? >nul 2>&1 || echo WMIC is not available.&& goto error
|
||||
|
||||
:: Get date
|
||||
call "%ToolsPath%\get-rs-date.bat" "%SourcePath%" RsDate
|
||||
if errorlevel 1 %cecho% error "Could not get date."& goto error
|
||||
|
||||
if "%RsDate%"=="" %cecho% error "Could not get date."& goto error
|
||||
:: Use WMIC to retrieve date in format YYYYMMDD
|
||||
set RsDate=
|
||||
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set RsDate=%%I
|
||||
set RsDate=%RsDate:~0,4%%RsDate:~4,2%%RsDate:~6,2%
|
||||
|
||||
set QtMainVersion=%QtVersion:~0,1%
|
||||
set QtSharePath=%RsMinGWPath%\share\qt%QtMainVersion%\
|
||||
|
||||
rem Qt 4 = QtSvg4.dll
|
||||
rem Qt 5 = Qt5Svg.dll
|
||||
rem Qt 6 = Qt6Svg.dll
|
||||
set QtMainVersion1=
|
||||
set QtMainVersion2=
|
||||
if "%QtMainVersion%"=="4" set QtMainVersion2=4
|
||||
if "%QtMainVersion%"=="5" set QtMainVersion1=5
|
||||
if "%QtMainVersion%"=="6" set QtMainVersion1=6
|
||||
|
||||
if "%RsBuildConfig%" NEQ "release" (
|
||||
set Archive=%RsPackPath%\RetroShare-%RsVersion%-Windows-Portable-%RsDate%-%RsVersion.Extra%-Qt-%QtVersion%-%RsToolchain%-msys2%RsType%%RsArchiveAdd%-%RsBuildConfig%.7z
|
||||
set Archive=%RsPackPath%\RetroShare-%RsVersion%-Windows-Portable-%RsDate%-%RsVersion.Extra%-%RsArchitecture%-msys2%RsType%%RsArchiveAdd%-%RsBuildConfig%.7z
|
||||
) else (
|
||||
set Archive=%RsPackPath%\RetroShare-%RsVersion%-Windows-Portable-%RsDate%-%RsVersion.Extra%-Qt-%QtVersion%-%RsToolchain%-msys2%RsType%%RsArchiveAdd%.7z
|
||||
set Archive=%RsPackPath%\RetroShare-%RsVersion%-Windows-Portable-%RsDate%-%RsVersion.Extra%-%RsArchitecture%-msys2%RsType%%RsArchiveAdd%.7z
|
||||
)
|
||||
|
||||
if exist "%Archive%" del /Q "%Archive%"
|
||||
@ -84,7 +81,7 @@ if exist "%Archive%" del /Q "%Archive%"
|
||||
:: Create deploy path
|
||||
mkdir "%RsDeployPath%"
|
||||
|
||||
title Pack - %SourceName%%RsType%-%RsBuildConfig% Qt-%QtVersion% %RsToolchain% [copy files]
|
||||
title Pack - %SourceName%%RsType%-%RsBuildConfig% [copy files]
|
||||
|
||||
set ExtensionsFile=%SourcePath%\libretroshare\src\rsserver\rsinit.cc
|
||||
set Extensions=
|
||||
@ -107,11 +104,6 @@ copy "%RsBuildPath%\retroshare-gui\src\%RsBuildConfig%\RetroShare*.exe" "%RsDepl
|
||||
copy "%RsBuildPath%\retroshare-nogui\src\%RsBuildConfig%\retroshare*-nogui.exe" "%RsDeployPath%" %Quite%
|
||||
copy "%RsBuildPath%\retroshare-service\src\%RsBuildConfig%\retroshare*-service.exe" "%RsDeployPath%" %Quite%
|
||||
copy "%RsBuildPath%\supportlibs\cmark\build\src\libcmark.dll" "%RsDeployPath%" %Quite%
|
||||
if exist "%RsBuildPath%\libretroshare\src\lib\retroshare.dll" copy "%RsBuildPath%\libretroshare\src\lib\retroshare.dll" "%RsDeployPath%" %Quite%
|
||||
if exist "%RsBuildPath%\supportlibs\librnp\Build\src\lib\librnp.dll" copy "%RsBuildPath%\supportlibs\librnp\Build\src\lib\librnp.dll" "%RsDeployPath%" %Quite%
|
||||
if exist "%RsBuildPath%\retroshare-friendserver\src\%RsBuildConfig%\retroshare-friendserver.exe" (
|
||||
copy "%RsBuildPath%\retroshare-friendserver\src\%RsBuildConfig%\retroshare-friendserver.exe" "%RsDeployPath%" %Quite%
|
||||
)
|
||||
|
||||
echo copy extensions
|
||||
for /D %%D in ("%RsBuildPath%\plugins\*") do (
|
||||
@ -121,38 +113,26 @@ for /D %%D in ("%RsBuildPath%\plugins\*") do (
|
||||
echo copy Qt DLL's
|
||||
copy "%RsMinGWPath%\bin\Qt%QtMainVersion1%Svg%QtMainVersion2%.dll" "%RsDeployPath%" %Quite%
|
||||
|
||||
if %QtMainVersion% GEQ 5 (
|
||||
if "%QtMainVersion%"=="5" (
|
||||
mkdir "%RsDeployPath%\platforms"
|
||||
copy "%QtSharePath%\plugins\platforms\qwindows.dll" "%RsDeployPath%\platforms" %Quite%
|
||||
)
|
||||
|
||||
if "%QtMainVersion%"=="5" (
|
||||
mkdir "%RsDeployPath%\audio"
|
||||
copy "%QtSharePath%\plugins\audio\qtaudio_windows.dll" "%RsDeployPath%\audio" %Quite%
|
||||
)
|
||||
|
||||
echo copy styles
|
||||
mkdir "%RsDeployPath%\styles" %Quite%
|
||||
if "%QtMainVersion%"=="5" (
|
||||
if exist "%QtSharePath%\plugins\styles\qwindowsvistastyle.dll" (
|
||||
echo copy styles
|
||||
mkdir "%RsDeployPath%\styles" %Quite%
|
||||
copy "%QtSharePath%\plugins\styles\qwindowsvistastyle.dll" "%RsDeployPath%\styles" %Quite%
|
||||
)
|
||||
if "%QtMainVersion%"=="6" (
|
||||
copy "%QtSharePath%\plugins\styles\qmodernwindowsstyle.dll" "%RsDeployPath%\styles" %Quite%
|
||||
)
|
||||
|
||||
copy "%QtSharePath%\plugins\imageformats\*.dll" "%RsDeployPath%\imageformats" %Quite%
|
||||
del /Q "%RsDeployPath%\imageformats\*d?.dll" %Quite%
|
||||
|
||||
if "%ParamTor%"=="1" (
|
||||
echo copy tor
|
||||
if not exist "%RsDeployPath%\tor" mkdir "%RsDeployPath%\tor"
|
||||
copy "%RsMinGWPath%\bin\tor.exe" "%RsDeployPath%\tor" %Quite%
|
||||
copy "%RsMinGWPath%\bin\tor-gencert.exe" "%RsDeployPath%\tor" %Quite%
|
||||
|
||||
echo copy tor dependencies
|
||||
for /R "%RsDeployPath%\tor" %%D in (*.exe) do (
|
||||
call :copy_dependencies "%%D" "%RsDeployPath%\tor"
|
||||
)
|
||||
copy "%RsMinGWPath%\bin\tor.exe" "%RsDeployPath%" %Quite%
|
||||
copy "%RsMinGWPath%\bin\tor-gencert.exe" "%RsDeployPath%" %Quite%
|
||||
)
|
||||
|
||||
echo copy dependencies
|
||||
@ -160,15 +140,14 @@ for /R "%RsDeployPath%" %%D in (*.dll, *.exe) do (
|
||||
call :copy_dependencies "%%D" "%RsDeployPath%"
|
||||
)
|
||||
|
||||
if exist "%SourcePath%\retroshare-gui\src\qss" (
|
||||
echo copy qss
|
||||
xcopy /S "%SourcePath%\retroshare-gui\src\qss" "%RsDeployPath%\qss" %Quite%
|
||||
)
|
||||
echo copy qss
|
||||
xcopy /S "%SourcePath%\retroshare-gui\src\qss" "%RsDeployPath%\qss" %Quite%
|
||||
|
||||
echo copy stylesheets
|
||||
xcopy /S "%SourcePath%\retroshare-gui\src\gui\qss\chat" "%RsDeployPath%\stylesheets" %Quite%
|
||||
rmdir /S /Q "%RsDeployPath%\stylesheets\compact" %Quite%
|
||||
rmdir /S /Q "%RsDeployPath%\stylesheets\standard" %Quite%
|
||||
rmdir /S /Q "%RsDeployPath%\stylesheets\__MACOSX__Bubble" %Quite%
|
||||
|
||||
echo copy sounds
|
||||
xcopy /S "%SourcePath%\retroshare-gui\src\sounds" "%RsDeployPath%\sounds" %Quite%
|
||||
@ -179,13 +158,11 @@ xcopy /S "%SourcePath%\retroshare-gui\src\license" "%RsDeployPath%\license" %Qui
|
||||
echo copy translation
|
||||
copy "%SourcePath%\retroshare-gui\src\translations\qt_tr.qm" "%RsDeployPath%\translations" %Quite%
|
||||
copy "%QtSharePath%\translations\qt_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
if "%QtMainVersion%"=="6" (
|
||||
if "%QtMainVersion%"=="5" (
|
||||
copy "%QtSharePath%\translations\qtbase_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
copy "%QtSharePath%\translations\qtscript_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
copy "%QtSharePath%\translations\qtquick1_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
copy "%QtSharePath%\translations\qtmultimedia_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
)
|
||||
if "%QtMainVersion%"=="5" (
|
||||
copy "%QtSharePath%\translations\qtscript_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
copy "%QtSharePath%\translations\qtxmlpatterns_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
)
|
||||
|
||||
@ -199,18 +176,18 @@ echo copy buildinfo.txt
|
||||
copy "%RsBuildPath%\buildinfo.txt" "%RsDeployPath%" %Quite%
|
||||
|
||||
if "%ParamWebui%"=="1" (
|
||||
if exist "%RsWebuiBuildPath%" (
|
||||
if exist "%RsWebuiPath%\webui" (
|
||||
echo copy webui
|
||||
mkdir "%RsDeployPath%\webui"
|
||||
xcopy /S "%RsWebuiBuildPath%" "%RsDeployPath%\webui" %Quite%
|
||||
xcopy /S "%RsWebuiPath%\webui" "%RsDeployPath%\webui" %Quite%
|
||||
) else (
|
||||
%cecho% error "Webui is enabled, but no webui data found at %RsWebuiBuildPath%"
|
||||
%cecho% error "Webui is enabled, but no webui data found at %RsWebuiPath%\webui"
|
||||
goto error
|
||||
)
|
||||
)
|
||||
|
||||
rem pack files
|
||||
title Pack - %SourceName%%RsType%-%RsBuildConfig% Qt-%QtVersion% %RsToolchain% [pack files]
|
||||
title Pack - %SourceName%%RsType%-%RsBuildConfig% [pack files]
|
||||
|
||||
"%EnvSevenZipExe%" a -mx=9 -t7z "%Archive%" "%RsDeployPath%\*"
|
||||
|
||||
@ -235,8 +212,8 @@ endlocal
|
||||
exit /B 1
|
||||
|
||||
:copy_extension
|
||||
if exist "%~1\lib\%~n1.dll" (
|
||||
copy "%~1\lib\%~n1.dll" %2 %Quite%
|
||||
if exist "%~1\%RsBuildConfig%\%~n1.dll" (
|
||||
copy "%~1\%RsBuildConfig%\%~n1.dll" %2 %Quite%
|
||||
)
|
||||
goto :EOF
|
||||
|
||||
|
||||
@ -1,374 +0,0 @@
|
||||
#!/bin/bash
|
||||
# ==============================================================================
|
||||
# RetroShare Windows Portability & Deployment Packaging Script
|
||||
# Designed for MSYS2 MinGW64 Shell environment
|
||||
# ------------------------------------------------------------------------------
|
||||
# Why this is more than a one-liner: windeployqt IS the standard tool and does the
|
||||
# heavy lifting (bundling Qt DLLs/plugins). The extra steps around it handle MSYS2
|
||||
# /MinGW + RetroShare specifics that windeployqt does not reliably cover:
|
||||
# - Manual fallback copy of the Qt 'platforms'/'styles'/'imageformats' plugins,
|
||||
# which windeployqt sometimes misses under MSYS2.
|
||||
# - Recursive ldd-based resolution of MinGW runtime DLLs (compiler runtime,
|
||||
# 3rd-party libs) into the portable folder.
|
||||
# - RetroShare's portable layout (Data/extensions6 for plugins, qss/stylesheets/
|
||||
# sounds/translations) and the 'portable' marker file.
|
||||
# ==============================================================================
|
||||
set -e
|
||||
|
||||
# Toujours travailler depuis la racine du dépôt (ce script vit sous
|
||||
# build_scripts/Windows-msys2/), sinon les chemins relatifs (retroshare-gui/src,
|
||||
# libbitdht, ...) sont muets et produisent un paquet incomplet sans erreur.
|
||||
cd "$(dirname "$0")/../.." || exit 1
|
||||
|
||||
# Build directory (override with: BUILD_DIR=mydir ./build_scripts/Windows-msys2/deploy-windows.sh)
|
||||
BUILD_DIR="${BUILD_DIR:-Build-cmake}"
|
||||
|
||||
# Préfixe de l'environnement MSYS2 utilisé pour la compilation
|
||||
# (mingw64 / ucrt64 / clang64). Indispensable pour retrouver le runtime
|
||||
# compilateur et les plugins Qt quel que soit l'environnement employé.
|
||||
MINGW_PREFIX="${MSYSTEM_PREFIX:-/mingw64}"
|
||||
|
||||
# 1. Vérifications initiales du dossier de build
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "ERROR: Build directory '$BUILD_DIR' not found. Please compile the project first!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "================================================================================"
|
||||
echo " RETROSHARE WINDOWS DEPLOYMENT GENERATOR"
|
||||
echo "================================================================================"
|
||||
|
||||
# 2. Détermination dynamique des variables de version (inspiré de qmake)
|
||||
echo ">>> Extracting versioning info from Git and environment..."
|
||||
|
||||
# Date au format YYYYMMDD
|
||||
DATE_STR=$(date +%Y%m%d)
|
||||
|
||||
# Récupération du describe de Git (ex: v0.6.7.2-892-g5341b777d-dirty)
|
||||
GIT_DESC=$(git describe --tags --always --dirty 2>/dev/null || echo "0.6.7-unknown")
|
||||
CLEAN_DESC=${GIT_DESC#v} # Enlève le 'v' initial
|
||||
|
||||
# Valeurs par défaut
|
||||
VERSION="$CLEAN_DESC"
|
||||
GIT_SUFFIX=""
|
||||
|
||||
if [[ "$CLEAN_DESC" == *-* ]]; then
|
||||
# Format: tag-commits-hash[-dirty] (ex: 0.6.7.2-892-g5341b777d-dirty)
|
||||
VERSION=$(echo "$CLEAN_DESC" | cut -d'-' -f1)
|
||||
COMMIT_INFO=$(echo "$CLEAN_DESC" | cut -d'-' -f2-)
|
||||
GIT_SUFFIX="-${DATE_STR}-${COMMIT_INFO}"
|
||||
else
|
||||
# Si on est pile sur un tag
|
||||
GIT_SUFFIX="-${DATE_STR}"
|
||||
fi
|
||||
|
||||
# Recherche de l'exécutable windeployqt adéquat
|
||||
WINDEPLOYQT_CMD=""
|
||||
for cmd in windeployqt windeployqt-qt5 windeployqt-qt6; do
|
||||
if command -v "$cmd" &> /dev/null; then
|
||||
WINDEPLOYQT_CMD="$cmd"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Détection de la version de Qt
|
||||
QT_VERSION=""
|
||||
if command -v qmake &> /dev/null; then
|
||||
QT_VERSION=$(qmake -query QT_VERSION 2>/dev/null)
|
||||
fi
|
||||
|
||||
# Si qmake n'a pas donné de version propre, on cherche avec windeployqt
|
||||
if [[ ! "$QT_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && [ -n "$WINDEPLOYQT_CMD" ]; then
|
||||
QT_VERSION=$("$WINDEPLOYQT_CMD" --version 2>/dev/null | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+' | head -n 1 || echo "")
|
||||
fi
|
||||
|
||||
# Valeur de secours si rien n'a été détecté ou si la version est invalide
|
||||
if [[ ! "$QT_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
QT_VERSION="5.15.18"
|
||||
fi
|
||||
|
||||
# Nom de base de l'archive finale
|
||||
ARCHIVE_BASE="RetroShare-${VERSION}-Windows-Portable${GIT_SUFFIX}-Qt-${QT_VERSION}-mingw64-msys2"
|
||||
DEPLOY_DIR="${BUILD_DIR}/${ARCHIVE_BASE}"
|
||||
|
||||
echo " Target Package Name: ${ARCHIVE_BASE}"
|
||||
echo " Deploy Directory: ${DEPLOY_DIR}"
|
||||
|
||||
# Nettoyage des anciennes générations de déploiement
|
||||
echo ">>> Cleaning up previous deployment directories..."
|
||||
# Ne supprimer que les anciens RÉPERTOIRES de déploiement, pas les archives
|
||||
# .7z / .zip produites lors des runs précédents (qui matchent le même motif).
|
||||
find "$BUILD_DIR" -maxdepth 1 -type d -name "RetroShare-*-Windows-Portable*" -exec rm -rf {} + 2>/dev/null || true
|
||||
mkdir -p "$DEPLOY_DIR"
|
||||
|
||||
# 3. Création de l'arborescence complète attendue par RetroShare
|
||||
echo ">>> Creating target directory layout..."
|
||||
mkdir -p "$DEPLOY_DIR/Data/extensions6" # Répertoire pour les plugins de RetroShare
|
||||
mkdir -p "$DEPLOY_DIR/qss" # Feuilles de style de l'interface
|
||||
mkdir -p "$DEPLOY_DIR/stylesheets" # Feuilles de style de la messagerie
|
||||
mkdir -p "$DEPLOY_DIR/sounds" # Sons système de l'interface
|
||||
mkdir -p "$DEPLOY_DIR/translations" # Fichiers de traductions (RetroShare + Qt)
|
||||
mkdir -p "$DEPLOY_DIR/license" # Fichiers de licences
|
||||
mkdir -p "$DEPLOY_DIR/log" # Dossier de logs de fonctionnement
|
||||
|
||||
# 4. Création du fichier témoin 'portable'
|
||||
echo ">>> Creating 'portable' mode indicator file..."
|
||||
touch "$DEPLOY_DIR/portable"
|
||||
|
||||
# 5. Copie des exécutables et DLL générées par la compilation
|
||||
echo ">>> Copying compiled binaries..."
|
||||
for exe in retroshare-gui.exe retroshare-service.exe retroshare-friendserver.exe; do
|
||||
found_exe=$(find "$BUILD_DIR" -path "$DEPLOY_DIR" -prune -o -name "$exe" -print | head -n 1)
|
||||
if [ -n "$found_exe" ]; then
|
||||
echo " Found and copying: $found_exe"
|
||||
cp "$found_exe" "$DEPLOY_DIR/"
|
||||
else
|
||||
echo " WARNING: Executable '$exe' not found. Skipping."
|
||||
fi
|
||||
done
|
||||
|
||||
echo ">>> Copying local build libraries (DLLs)..."
|
||||
# Recherche et copie des DLL compilées en interne dans le projet (RNP, CMark, RetroShare, Restbed)
|
||||
# NB: on élague "$DEPLOY_DIR" (situé sous "$BUILD_DIR") pour éviter de re-trouver
|
||||
# les DLL déjà copiées et de déployer par erreur une variante stale.
|
||||
find "$BUILD_DIR" -path "$DEPLOY_DIR" -prune -o -name "libcmark.dll" -exec cp {} "$DEPLOY_DIR/" \; 2>/dev/null || true
|
||||
find "$BUILD_DIR" -path "$DEPLOY_DIR" -prune -o -name "*retroshare.dll" -exec cp {} "$DEPLOY_DIR/" \; 2>/dev/null || true
|
||||
find "$BUILD_DIR" -path "$DEPLOY_DIR" -prune -o -name "*restbed*.dll" -exec cp {} "$DEPLOY_DIR/" \; 2>/dev/null || true
|
||||
if [ -d "supportlibs/librnp/Build" ]; then
|
||||
find "supportlibs/librnp/Build" -name "librnp.dll" -exec cp {} "$DEPLOY_DIR/" \; 2>/dev/null || true
|
||||
fi
|
||||
find "$BUILD_DIR" -path "$DEPLOY_DIR" -prune -o -name "librnp.dll" -exec cp {} "$DEPLOY_DIR/" \; 2>/dev/null || true
|
||||
|
||||
echo ">>> Copying RetroShare plugins..."
|
||||
if [ -d "$BUILD_DIR/plugins" ]; then
|
||||
find "$BUILD_DIR/plugins" -name "*.dll" -exec cp {} "$DEPLOY_DIR/Data/extensions6/" \; 2>/dev/null || true
|
||||
echo " Plugins copied to Data/extensions6."
|
||||
else
|
||||
echo " WARNING: Plugins directory not found. Skipping plugins."
|
||||
fi
|
||||
|
||||
# 6. Copie des ressources statiques de RetroShare (QSS, sons, etc.)
|
||||
echo ">>> Copying RetroShare static assets..."
|
||||
|
||||
if [ -d "retroshare-gui/src/qss" ]; then
|
||||
cp -r retroshare-gui/src/qss/* "$DEPLOY_DIR/qss/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -d "retroshare-gui/src/gui/qss/chat" ]; then
|
||||
cp -r retroshare-gui/src/gui/qss/chat/* "$DEPLOY_DIR/stylesheets/" 2>/dev/null || true
|
||||
# Supprime les répertoires inutiles d'après le pack.bat historique
|
||||
rm -rf "$DEPLOY_DIR/stylesheets/compact" "$DEPLOY_DIR/stylesheets/standard"
|
||||
fi
|
||||
|
||||
if [ -d "retroshare-gui/src/sounds" ]; then
|
||||
cp -r retroshare-gui/src/sounds/* "$DEPLOY_DIR/sounds/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -d "retroshare-gui/src/license" ]; then
|
||||
cp -r retroshare-gui/src/license/* "$DEPLOY_DIR/license/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -f "libbitdht/src/bitdht/bdboot.txt" ]; then
|
||||
cp "libbitdht/src/bitdht/bdboot.txt" "$DEPLOY_DIR/"
|
||||
echo " Copied bdboot.txt"
|
||||
fi
|
||||
|
||||
# 7. Copie des fichiers de traduction
|
||||
echo ">>> Copying translations (RetroShare + Qt system)..."
|
||||
if [ -d "retroshare-gui/src/translations" ]; then
|
||||
find "retroshare-gui/src/translations" -name "*.qm" -exec cp {} "$DEPLOY_DIR/translations/" \; 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Copie des traductions Qt de l'environnement MSYS2 MinGW64
|
||||
QT_TRANS_DIR="$MINGW_PREFIX/share/qt5/translations"
|
||||
if [ -d "$QT_TRANS_DIR" ]; then
|
||||
cp "$QT_TRANS_DIR"/qt_*.qm "$DEPLOY_DIR/translations/" 2>/dev/null || true
|
||||
fi
|
||||
QT6_TRANS_DIR="$MINGW_PREFIX/share/qt6/translations"
|
||||
if [ -d "$QT6_TRANS_DIR" ]; then
|
||||
cp "$QT6_TRANS_DIR"/qt_*.qm "$DEPLOY_DIR/translations/" 2>/dev/null || true
|
||||
cp "$QT6_TRANS_DIR"/qtbase_*.qm "$DEPLOY_DIR/translations/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# 8. Déploiement des dépendances Qt via windeployqt
|
||||
if [ -f "$DEPLOY_DIR/retroshare-gui.exe" ]; then
|
||||
if [ -n "$WINDEPLOYQT_CMD" ]; then
|
||||
echo ">>> Running $WINDEPLOYQT_CMD on retroshare-gui.exe..."
|
||||
# Convert path to Windows-style for the native windeployqt tool if cygpath is available
|
||||
if command -v cygpath &> /dev/null; then
|
||||
WIN_EXE_PATH=$(cygpath -w "$DEPLOY_DIR/retroshare-gui.exe")
|
||||
echo " Using Windows path: $WIN_EXE_PATH"
|
||||
"$WINDEPLOYQT_CMD" --no-compiler-runtime "$WIN_EXE_PATH" || true
|
||||
else
|
||||
"$WINDEPLOYQT_CMD" --no-compiler-runtime "$DEPLOY_DIR/retroshare-gui.exe" || true
|
||||
fi
|
||||
else
|
||||
echo " WARNING: windeployqt tool not found in PATH! Make sure Qt package is installed."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Fallback manuel pour les plugins Qt essentiels (comme 'platforms' et 'styles')
|
||||
# Indispensable si windeployqt a échoué ou n'était pas présent.
|
||||
if [ ! -d "$DEPLOY_DIR/platforms" ] || [ ! -f "$DEPLOY_DIR/platforms/qwindows.dll" ]; then
|
||||
echo ">>> Manual fallback: Copying Qt 'platforms' directory (qwindows.dll)..."
|
||||
mkdir -p "$DEPLOY_DIR/platforms"
|
||||
COPIED_PLATFORMS=false
|
||||
for path in \
|
||||
"$MINGW_PREFIX/share/qt6/plugins/platforms/qwindows.dll" \
|
||||
"$MINGW_PREFIX/share/qt5/plugins/platforms/qwindows.dll" \
|
||||
"$MINGW_PREFIX/lib/qt6/plugins/platforms/qwindows.dll" \
|
||||
"$MINGW_PREFIX/lib/qt5/plugins/platforms/qwindows.dll"; do
|
||||
if [ -f "$path" ]; then
|
||||
echo " Found platforms plugin at: $path"
|
||||
cp "$path" "$DEPLOY_DIR/platforms/"
|
||||
COPIED_PLATFORMS=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ "$COPIED_PLATFORMS" = false ]; then
|
||||
echo " WARNING: Could not find qwindows.dll in standard MSYS2 paths!"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -d "$DEPLOY_DIR/styles" ] || [ ! -f "$DEPLOY_DIR/styles/qwindowsvistastyle.dll" ]; then
|
||||
echo ">>> Manual fallback: Copying Qt 'styles' directory (qwindowsvistastyle.dll)..."
|
||||
mkdir -p "$DEPLOY_DIR/styles"
|
||||
for path in \
|
||||
"$MINGW_PREFIX/share/qt6/plugins/styles/qwindowsvistastyle.dll" \
|
||||
"$MINGW_PREFIX/share/qt5/plugins/styles/qwindowsvistastyle.dll" \
|
||||
"$MINGW_PREFIX/lib/qt6/plugins/styles/qwindowsvistastyle.dll" \
|
||||
"$MINGW_PREFIX/lib/qt5/plugins/styles/qwindowsvistastyle.dll"; do
|
||||
if [ -f "$path" ]; then
|
||||
echo " Found styles plugin at: $path"
|
||||
cp "$path" "$DEPLOY_DIR/styles/"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo ">>> Deploying Qt 'imageformats' directory (essential for SVG/ICO icons)..."
|
||||
mkdir -p "$DEPLOY_DIR/imageformats"
|
||||
COPIED_IMAGEFORMATS=false
|
||||
for path in \
|
||||
"$MINGW_PREFIX/share/qt6/plugins/imageformats" \
|
||||
"$MINGW_PREFIX/share/qt5/plugins/imageformats" \
|
||||
"$MINGW_PREFIX/lib/qt6/plugins/imageformats" \
|
||||
"$MINGW_PREFIX/lib/qt5/plugins/imageformats"; do
|
||||
if [ -d "$path" ]; then
|
||||
echo " Found imageformats plugin directory at: $path"
|
||||
cp -r "$path"/* "$DEPLOY_DIR/imageformats/" 2>/dev/null || true
|
||||
COPIED_IMAGEFORMATS=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ "$COPIED_IMAGEFORMATS" = false ]; then
|
||||
echo " WARNING: Could not find imageformats directory in standard MSYS2 paths!"
|
||||
fi
|
||||
|
||||
|
||||
# 9. Résolution dynamique des dépendances MinGW (ldd)
|
||||
echo ">>> Resolving system and 3rd party DLL dependencies using ldd..."
|
||||
TEMP_DEPENDENCY_LIST=$(mktemp)
|
||||
trap 'rm -f "$TEMP_DEPENDENCY_LIST"' EXIT
|
||||
|
||||
PREV_COUNT=0
|
||||
while true; do
|
||||
# Scanner tous les exe et dll présents dans le dossier de déploiement
|
||||
find "$DEPLOY_DIR" \( -name "*.exe" -o -name "*.dll" \) -exec ldd {} \; 2>/dev/null \
|
||||
| grep -i "$MINGW_PREFIX/bin" | awk '{print $3}' | sort -u > "$TEMP_DEPENDENCY_LIST"
|
||||
|
||||
CURR_COUNT=$(wc -l < "$TEMP_DEPENDENCY_LIST")
|
||||
if [ "$CURR_COUNT" -eq "$PREV_COUNT" ]; then
|
||||
break
|
||||
fi
|
||||
PREV_COUNT=$CURR_COUNT
|
||||
|
||||
while read -r dll_path; do
|
||||
if [ -f "$dll_path" ]; then
|
||||
dll_name=$(basename "$dll_path")
|
||||
# Ne pas écraser les DLL déjà présentes (Qt ou compilées localement)
|
||||
if [ ! -f "$DEPLOY_DIR/$dll_name" ]; then
|
||||
echo " Deploying dependency: $dll_name"
|
||||
cp "$dll_path" "$DEPLOY_DIR/"
|
||||
fi
|
||||
fi
|
||||
done < "$TEMP_DEPENDENCY_LIST"
|
||||
done
|
||||
rm -f "$TEMP_DEPENDENCY_LIST"
|
||||
|
||||
# Detect if we should strip debug symbols (only in explicit Release or MinSizeRel builds)
|
||||
IS_RELEASE_BUILD=false
|
||||
if [ -f "$BUILD_DIR/CMakeCache.txt" ]; then
|
||||
if grep -q "CMAKE_BUILD_TYPE:STRING=Release" "$BUILD_DIR/CMakeCache.txt" || grep -q "CMAKE_BUILD_TYPE:STRING=MinSizeRel" "$BUILD_DIR/CMakeCache.txt"; then
|
||||
IS_RELEASE_BUILD=true
|
||||
fi
|
||||
fi
|
||||
|
||||
# 9.5 Stripping debug symbols to reduce file sizes (shrinks exe from 91MB down to ~22MB)
|
||||
if [ "$IS_RELEASE_BUILD" = false ]; then
|
||||
echo ">>> Non-Release build detected (CMakeCache.txt). Skipping stripping of debug symbols to preserve GDB compatibility!"
|
||||
else
|
||||
echo ">>> Stripping debug symbols from our compiled binaries..."
|
||||
if command -v strip &> /dev/null; then
|
||||
# Strip main executables and core DLLs
|
||||
for binary in \
|
||||
"$DEPLOY_DIR"/retroshare-gui.exe \
|
||||
"$DEPLOY_DIR"/retroshare-service.exe \
|
||||
"$DEPLOY_DIR"/retroshare-friendserver.exe \
|
||||
"$DEPLOY_DIR"/retroshare.dll \
|
||||
"$DEPLOY_DIR"/libretroshare.dll \
|
||||
"$DEPLOY_DIR"/libcmark.dll \
|
||||
"$DEPLOY_DIR"/librestbed-shared.dll \
|
||||
"$DEPLOY_DIR"/librestbed.dll \
|
||||
"$DEPLOY_DIR"/librnp.dll; do
|
||||
if [ -f "$binary" ]; then
|
||||
echo " Stripping: $(basename "$binary")"
|
||||
strip "$binary" || true
|
||||
fi
|
||||
done
|
||||
# Strip plugins
|
||||
if [ -d "$DEPLOY_DIR/Data/extensions6" ]; then
|
||||
find "$DEPLOY_DIR/Data/extensions6" -name "*.dll" | while read -r plugin; do
|
||||
echo " Stripping plugin: $(basename "$plugin")"
|
||||
strip "$plugin" || true
|
||||
done
|
||||
fi
|
||||
else
|
||||
echo " WARNING: 'strip' tool not found. Skipping stripping of debug symbols."
|
||||
fi
|
||||
fi
|
||||
|
||||
# 10. Déploiement de la WebUI (si présente)
|
||||
echo ">>> Deploying WebUI static assets..."
|
||||
if [ -d "retroshare-webui/src" ]; then
|
||||
mkdir -p "$DEPLOY_DIR/webui"
|
||||
cp -r retroshare-webui/src/* "$DEPLOY_DIR/webui/" 2>/dev/null || true
|
||||
echo " WebUI copied to deployment folder."
|
||||
else
|
||||
echo " WebUI source folder not found. Skipping WebUI packaging."
|
||||
fi
|
||||
|
||||
# 11. Création de l'archive finale (7z en priorité, zip en fallback)
|
||||
echo ">>> Packaging final compressed archive..."
|
||||
(
|
||||
cd "$BUILD_DIR" || exit 1
|
||||
|
||||
if command -v 7z &> /dev/null; then
|
||||
echo " Using 7z for ultra high compression..."
|
||||
7z a -t7z -mx=9 "${ARCHIVE_BASE}.7z" "${ARCHIVE_BASE}"
|
||||
echo "================================================================================"
|
||||
echo "SUCCESS: Standalone package created at: ${BUILD_DIR}/${ARCHIVE_BASE}.7z"
|
||||
echo "================================================================================"
|
||||
elif command -v zip &> /dev/null; then
|
||||
echo " 7z not found. Falling back to standard zip..."
|
||||
zip -r "${ARCHIVE_BASE}.zip" "${ARCHIVE_BASE}"
|
||||
echo "================================================================================"
|
||||
echo "SUCCESS: Standalone package created at: ${BUILD_DIR}/${ARCHIVE_BASE}.zip"
|
||||
echo "================================================================================"
|
||||
else
|
||||
echo "================================================================================"
|
||||
echo "SUCCESS: Folder generated at: ${DEPLOY_DIR}"
|
||||
echo "NOTE: Neither '7z' nor 'zip' commands were found. Archive creation skipped."
|
||||
echo "================================================================================"
|
||||
fi
|
||||
)
|
||||
@ -16,13 +16,7 @@ if "%~1"=="clean" (
|
||||
goto exit
|
||||
)
|
||||
|
||||
set MSYS2Version=20250622
|
||||
|
||||
set MSYS2Install=msys2-base-x86_64-%MSYS2Version%.sfx.exe
|
||||
set MSYS2Url=https://github.com/msys2/msys2-installer/releases/download/%MSYS2Version:~0,4%-%MSYS2Version:~4,2%-%MSYS2Version:~6,2%/%MSYS2Install%
|
||||
set MSYS2UnpackPath=%EnvMSYS2Path%\msys64
|
||||
|
||||
if exist "%MSYS2UnpackPath%\usr\bin\pacman.exe" (
|
||||
if exist "%EnvMSYS2Path%\msys%MSYS2Base%\usr\bin\pacman.exe" (
|
||||
if "%~1"=="reinstall" (
|
||||
choice /M "Found existing MSYS2 version. Do you want to proceed?"
|
||||
if !ERRORLEVEL!==2 goto exit
|
||||
@ -31,26 +25,28 @@ if exist "%MSYS2UnpackPath%\usr\bin\pacman.exe" (
|
||||
)
|
||||
)
|
||||
|
||||
if exist "%MSYS2UnpackPath%" (
|
||||
%cecho% info "Remove previous MSYS2 version"
|
||||
call "%ToolsPath%\remove-dir.bat" "%MSYS2UnpackPath%"
|
||||
)
|
||||
set MSYS2Install=msys2-base-%MSYS2Architecture%-20200720.tar.xz
|
||||
set MSYS2Url=http://sourceforge.net/projects/msys2/files/Base/%MSYS2Architecture%/%MSYS2Install%/download
|
||||
|
||||
%cecho% info "Download MSYS2 installation files"
|
||||
%cecho% info "Remove previous MSYS2 version"
|
||||
call "%ToolsPath%\remove-dir.bat" "%EnvMSYS2Path%"
|
||||
|
||||
%cecho% info "Download installation files"
|
||||
if not exist "%EnvDownloadPath%\%MSYS2Install%" call "%ToolsPath%\download-file.bat" "%MSYS2Url%" "%EnvDownloadPath%\%MSYS2Install%"
|
||||
if not exist "%EnvDownloadPath%\%MSYS2Install%" %cecho% error "Cannot download MSYS" & goto error
|
||||
|
||||
%cecho% info "Unpack MSYS2"
|
||||
"%EnvDownloadPath%\%MSYS2Install%" -y -o"%EnvMSYS2Path%"
|
||||
"%EnvSevenZipExe%" x -so "%EnvDownloadPath%\%MSYS2Install%" | "%EnvSevenZipExe%" x -y -si -ttar -o"%EnvMSYS2Path%"
|
||||
|
||||
set MSYS2SH=%MSYS2UnpackPath%\usr\bin\sh
|
||||
set MSYS2SH=%EnvMSYS2Path%\msys%MSYS2Base%\usr\bin\sh
|
||||
|
||||
%cecho% info "Initialize MSYS2"
|
||||
"%MSYS2SH%" -lc "yes | pacman --noconfirm -Syuu msys2-keyring"
|
||||
"%MSYS2SH%" -lc "pacman --noconfirm -Sy"
|
||||
"%MSYS2SH%" -lc "pacman --noconfirm -Su"
|
||||
"%MSYS2SH%" -lc "pacman -Sy"
|
||||
"%MSYS2SH%" -lc "pacman --noconfirm --needed -S bash pacman pacman-mirrors msys2-runtime"
|
||||
|
||||
call "%MSYS2UnpackPath%\autorebase.bat"
|
||||
call "%EnvMSYS2Path%\msys%MSYS2Base%\autorebase.bat"
|
||||
call "%EnvRootPath%\update-msys2.bat"
|
||||
call "%EnvRootPath%\update-msys2.bat"
|
||||
|
||||
:exit
|
||||
endlocal
|
||||
|
||||
@ -4,8 +4,8 @@ if "%EnvRootPath%"=="" exit /B 1
|
||||
|
||||
set CEchoUrl=https://github.com/lordmulder/cecho/releases/download/2015-10-10/cecho.2015-10-10.zip
|
||||
set CEchoInstall=cecho.2015-10-10.zip
|
||||
set SevenZipUrl=https://www.7-zip.org/a/7z2600-x64.msi
|
||||
set SevenZipInstall=7z2600-x64.msi
|
||||
set SevenZipUrl=https://sourceforge.net/projects/sevenzip/files/7-Zip/18.05/7z1805.msi/download
|
||||
set SevenZipInstall=7z1805.msi
|
||||
|
||||
if not exist "%EnvToolsPath%\7z.exe" (
|
||||
call "%ToolsPath%\remove-dir.bat" "%EnvTempPath%"
|
||||
@ -34,7 +34,7 @@ if not exist "%EnvToolsPath%\cecho.exe" (
|
||||
if not exist "%EnvDownloadPath%\%cCEhoInstall%" echo Cannot download cecho installation& goto error
|
||||
|
||||
echo Unpack cecho
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%CEchoInstall%" -y -bso0
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%CEchoInstall%"
|
||||
copy "%EnvTempPath%\cecho.exe" "%EnvToolsPath%"
|
||||
|
||||
call "%ToolsPath%\remove-dir.bat" "%EnvTempPath%"
|
||||
|
||||
@ -2,13 +2,18 @@
|
||||
|
||||
setlocal
|
||||
|
||||
if not exist "%~dp0msys2\msys64" goto :EOF
|
||||
if exist "%~dp0msys2\msys32" call :update 32
|
||||
if exist "%~dp0msys2\msys64" call :update 64
|
||||
|
||||
set MSYS2SH=%~dp0msys2\msys64\usr\bin\sh
|
||||
goto :EOF
|
||||
|
||||
echo Update MSYS2
|
||||
"%MSYS2SH%" -lc "yes | pacman --noconfirm -Syuu msys2-keyring"
|
||||
"%MSYS2SH%" -lc "pacman --noconfirm -Su"
|
||||
:update
|
||||
set MSYSSH=%~dp0msys2\msys%~1\usr\bin\sh
|
||||
|
||||
echo Update MSYS2 %~1
|
||||
"%MSYSSH%" -lc "pacman -Sy"
|
||||
"%MSYSSH%" -lc "pacman --noconfirm -Su"
|
||||
|
||||
:exit
|
||||
endlocal
|
||||
goto :EOF
|
||||
|
||||
@ -9,7 +9,6 @@
|
||||
;!define REVISION ""
|
||||
;!define DEPLOYDIR ""
|
||||
;!define ARCHITECTURE ""
|
||||
;!define TOOLCHAIN ""
|
||||
|
||||
# Optional defines
|
||||
;!define OUTDIR ""
|
||||
@ -22,9 +21,6 @@
|
||||
!ifndef ARCHITECTURE
|
||||
!error "ARCHITECTURE is not defined"
|
||||
!endif
|
||||
!ifndef TOOLCHAIN
|
||||
!error "TOOLCHAIN is not defined"
|
||||
!endif
|
||||
|
||||
# Check optional defines
|
||||
!ifdef OUTDIR
|
||||
@ -76,7 +72,7 @@ ${!defineifexist} TOR_EXISTS "${DEPLOYDIR}\tor.exe"
|
||||
# Main Install settings
|
||||
Name "${APPNAMEANDVERSION}"
|
||||
InstallDirRegKey HKLM "Software\${APPNAME}" ""
|
||||
OutFile "${OUTDIR_}RetroShare-${VERSION}-${Date}-${REVISION}-Qt-${QTVERSION}-${TOOLCHAIN}-msys2${RSTYPE}${INSTALLERADD}-setup.exe"
|
||||
OutFile "${OUTDIR_}RetroShare-${VERSION}-${Date}-${REVISION}-${ARCHITECTURE}${RSTYPE}${INSTALLERADD}-setup.exe"
|
||||
BrandingText "${APPNAMEANDVERSION}"
|
||||
RequestExecutionlevel highest
|
||||
# Use compression
|
||||
@ -222,7 +218,7 @@ Section $(Section_Data) Section_Data
|
||||
|
||||
; Stylesheets
|
||||
SetOutPath "$INSTDIR\qss"
|
||||
File /nonfatal /r "${DEPLOYDIR}\qss\*.*"
|
||||
File /r "${DEPLOYDIR}\qss\*.*"
|
||||
SectionEnd
|
||||
|
||||
;Section $(Section_Link) Section_Link
|
||||
@ -44,9 +44,8 @@ Run the scripts in this order:
|
||||
**Always delete the build artifacts folder if you enable or disable extra features after the build command: <sourcefolder>-msys2\deploy\builds**
|
||||
|
||||
* Mandatory
|
||||
* 32, 64, mingw32, mingw64, ucrt64, clang32, clang64 or clangarm64: It sets the msys2 build environment to the selected value. 32 is a shortcut for mingw32, 64 is a shortcut for mingw64. Default in build.bat and buil-tor.bat is 64.
|
||||
* 32 or 64: 32 or 64 bit version
|
||||
* release or debug: normally you would like to use the release option
|
||||
* qt5 or qt6: build with Qt 5 (default) or Qt 6
|
||||
* Extra features (optional)
|
||||
* autologin: enable autologin
|
||||
* plugins: build plugins
|
||||
@ -56,6 +55,7 @@ Run the scripts in this order:
|
||||
* "CONFIG+=..." enable other extra compile time features, you can find the almost complete list in file *<sourcefolder>\retroshare.pri*
|
||||
* For fixing compile problems (optional)
|
||||
* singlethread: use only 1 thread for building, slow but useful if you don't find the error message in the console
|
||||
* clang: use clang compiler instead of GCC
|
||||
* noupdate: skip the msys2 update step, sometimes some msys2 packages are broken, you can manually switch back to the older package, and this option will prevent updating to the broken version again
|
||||
|
||||
Example:
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
:: Usage:
|
||||
:: call get-qt-version.bat variable qmake
|
||||
:: call get-qt-version.bat variable
|
||||
|
||||
setlocal
|
||||
|
||||
@ -10,16 +10,9 @@ if "%Var%"=="" (
|
||||
exit /B 1
|
||||
)
|
||||
|
||||
set QMakeCmd=%~2
|
||||
if "%QMakeCmd%"=="" (
|
||||
echo.
|
||||
echo Parameter error.
|
||||
exit /B 1
|
||||
)
|
||||
|
||||
set QtVersion=
|
||||
|
||||
%EnvMSYS2Cmd% "%QMakeCmd% -version" >"%~dp0qtversion.tmp"
|
||||
%EnvMSYS2Cmd% "qmake -version" >"%~dp0qtversion.tmp"
|
||||
for /F "tokens=1,2,3,4" %%A in (%~sdp0qtversion.tmp) do (
|
||||
if "%%A"=="Using" (
|
||||
set QtVersion=%%D
|
||||
|
||||
@ -1,32 +0,0 @@
|
||||
REM Usage:
|
||||
REM call get-rs-date.bat SourcePath Variable
|
||||
|
||||
setlocal
|
||||
|
||||
set SourcePath=%~1
|
||||
set Variable=%~2
|
||||
if "%Variable%"=="" (
|
||||
echo.
|
||||
echo Parameter error
|
||||
exit /B 1
|
||||
)
|
||||
|
||||
:: Check git executable
|
||||
set GitPath=
|
||||
call "%~dp0find-in-path.bat" GitPath git.exe
|
||||
if "%GitPath%"=="" (
|
||||
echo.
|
||||
echo Git executable not found in PATH.
|
||||
exit /B 1
|
||||
)
|
||||
|
||||
set Date=
|
||||
|
||||
pushd "%SourcePath%"
|
||||
rem This doesn't work: git log -1 --date=format:"%Y%m%d" --format="%ad"
|
||||
for /F "tokens=1,2,3* delims=-" %%A in ('git log -1 --date^=short --format^="%%ad"') do set Date=%%A%%B%%C
|
||||
popd
|
||||
|
||||
:exit
|
||||
endlocal & set %Variable%=%Date%
|
||||
exit /B 0
|
||||
22
build_scripts/Windows-msys2/tools/webui.bat
Normal file
22
build_scripts/Windows-msys2/tools/webui.bat
Normal file
@ -0,0 +1,22 @@
|
||||
setlocal
|
||||
|
||||
echo.
|
||||
echo === webui
|
||||
echo.
|
||||
title Build webui
|
||||
|
||||
if not exist "%RsWebuiPath%" (
|
||||
echo Checking out webui source into %RsWebuiPath%
|
||||
if not "%ParamNoupdate%"=="1" (
|
||||
%EnvMSYS2Cmd% "pacman --noconfirm --needed -S git"
|
||||
)
|
||||
git clone https://github.com/RetroShare/RSNewWebUI.git "%RsWebuiPath%"
|
||||
) else (
|
||||
echo Webui source found at %RsWebuiPath%
|
||||
)
|
||||
|
||||
pushd "%RsWebuiPath%\webui-src\make-src"
|
||||
%EnvMSYS2Cmd% "sh build.sh"
|
||||
popd
|
||||
|
||||
endlocal
|
||||
@ -1,35 +0,0 @@
|
||||
## Build Retroshare with QtCreator & Qt 6.9 on Windows
|
||||
|
||||
### Qt 6.9 Installation
|
||||
|
||||
Download Qt 6.9 from: https://www.qt.io/download-dev
|
||||
|
||||
Run the installer and install Qt 6.9
|
||||
|
||||
Add GCC.exe to Path
|
||||
|
||||
C:\Qt\Tools\mingw1310_64\bin
|
||||
|
||||
Compile the external libs start build-libs.bat:
|
||||
|
||||
Open Qt Command Prompt:
|
||||
|
||||
cd C:\Users\User\Documents\GitHub\RetroShare\build_scripts\Windows\build-libs
|
||||
|
||||
Type (this will take some time to build all libs):
|
||||
|
||||
build-libs.bat
|
||||
|
||||
Open Qt Creator
|
||||
|
||||
Open project -> RetroShare.pro
|
||||
|
||||
After Project loaded, go to:
|
||||
|
||||
Projects->Build->Build Steps->Additional arguments:
|
||||
|
||||
Add EXTERNAL_LIB_DIR:
|
||||
|
||||
"EXTERNAL_LIB_DIR=%{sourceDir}\..\RetroShare-env\build-libs\gcc-13.1.0\x64\libs"
|
||||
|
||||
After done, Build Project
|
||||
@ -1,32 +1,25 @@
|
||||
ZLIB_VERSION=1.2.11
|
||||
BZIP2_VERSION=1.0.8
|
||||
MINIUPNPC_VERSION=2.2.3
|
||||
OPENSSL_VERSION=1.1.1w
|
||||
SPEEX_VERSION=1.2.1
|
||||
SPEEXDSP_VERSION=1.2.1
|
||||
LIBXML2_MAIN_VERSION=2.14
|
||||
LIBXML2_VERSION=$(LIBXML2_MAIN_VERSION).5
|
||||
LIBXSLT_MAIN_VERSION=1.1
|
||||
LIBXSLT_VERSION=$(LIBXSLT_MAIN_VERSION).43
|
||||
CURL_VERSION=8.9.1
|
||||
ZLIB_VERSION=1.2.3
|
||||
BZIP2_VERSION=1.0.6
|
||||
MINIUPNPC_VERSION=2.0
|
||||
OPENSSL_VERSION=1.1.1g
|
||||
SPEEX_VERSION=1.2.0
|
||||
SPEEXDSP_VERSION=1.2rc3
|
||||
OPENCV_VERSION=3.4.11
|
||||
LIBXML2_VERSION=2.9.7
|
||||
LIBXSLT_VERSION=1.1.32
|
||||
CURL_VERSION=7.58.0
|
||||
TCL_VERSION=8.6.10
|
||||
SQLCIPHER_VERSION=4.5.0
|
||||
FFMPEG_VERSION=4.4.6
|
||||
SQLCIPHER_VERSION=4.4.0
|
||||
LIBMICROHTTPD_VERSION=0.9.59
|
||||
FFMPEG_VERSION=3.4
|
||||
RAPIDJSON_VERSION=1.1.0
|
||||
XAPIAN_VERSION=1.4.29
|
||||
ASIO_VERSION=1-34-2
|
||||
#RNP_VERSION=0.17.1
|
||||
|
||||
# libaries for rnp
|
||||
JSON_C_VERSION=0.18
|
||||
BOTAN_VERSION=2.19.5
|
||||
XAPIAN_VERSION=1.4.7
|
||||
|
||||
DOWNLOAD_PATH?=download
|
||||
BUILD_PATH=build
|
||||
LIBS_PATH?=libs
|
||||
|
||||
all: dirs zlib bzip2 miniupnpc openssl speex speexdsp libxml curl sqlcipher ffmpeg rapidjson xapian jsonc botan asio copylibs
|
||||
#rnp
|
||||
all: dirs zlib bzip2 miniupnpc openssl speex speexdsp opencv libxml2 libxslt curl sqlcipher libmicrohttpd ffmpeg rapidjson xapian copylibs
|
||||
|
||||
download: \
|
||||
$(DOWNLOAD_PATH)/zlib-$(ZLIB_VERSION).tar.gz \
|
||||
@ -35,12 +28,14 @@ download: \
|
||||
$(DOWNLOAD_PATH)/openssl-$(OPENSSL_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/speex-$(SPEEX_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/speexdsp-$(SPEEXDSP_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.xz \
|
||||
$(DOWNLOAD_PATH)/libxslt-$(LIBXSLT_VERSION).tar.xz \
|
||||
$(DOWNLOAD_PATH)/opencv-$(OPENCV_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/libxslt-$(LIBXSLT_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/curl-$(CURL_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/tcl$(TCL_VERSION)-src.tar.gz \
|
||||
$(DOWNLOAD_PATH)/sqlcipher-$(SQLCIPHER_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/ffmpeg-$(FFMPEG_VERSION).tar.xz \
|
||||
$(DOWNLOAD_PATH)/libmicrohttpd-$(LIBMICROHTTPD_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/ffmpeg-$(FFMPEG_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/rapidjson-$(RAPIDJSON_VERSION).tar.gz \
|
||||
$(DOWNLOAD_PATH)/xapian-core-$(XAPIAN_VERSION).tar.xz
|
||||
|
||||
@ -63,7 +58,9 @@ $(BUILD_PATH)/zlib-$(ZLIB_VERSION): $(DOWNLOAD_PATH)/zlib-$(ZLIB_VERSION).tar.gz
|
||||
rm -r -f $(BUILD_PATH)/zlib-*
|
||||
tar xvf $(DOWNLOAD_PATH)/zlib-$(ZLIB_VERSION).tar.gz
|
||||
# build
|
||||
cd zlib-$(ZLIB_VERSION) && make -j -f win32/Makefile.gcc libz.a
|
||||
cd zlib-$(ZLIB_VERSION) && ./configure
|
||||
#cd zlib-$(ZLIB_VERSION) && make install prefix="`pwd`/../$(BUILD_PATH)"
|
||||
cd zlib-$(ZLIB_VERSION) && make
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/zlib-$(ZLIB_VERSION).tmp/include
|
||||
cp zlib-$(ZLIB_VERSION)/zlib.h $(BUILD_PATH)/zlib-$(ZLIB_VERSION).tmp/include/
|
||||
@ -77,7 +74,7 @@ $(BUILD_PATH)/zlib-$(ZLIB_VERSION): $(DOWNLOAD_PATH)/zlib-$(ZLIB_VERSION).tar.gz
|
||||
bzip2: $(BUILD_PATH)/bzip2-$(BZIP2_VERSION)
|
||||
|
||||
$(DOWNLOAD_PATH)/bzip2-$(BZIP2_VERSION).tar.gz:
|
||||
wget https://www.sourceware.org/pub/bzip2/bzip2-$(BZIP2_VERSION).tar.gz -O $(DOWNLOAD_PATH)/bzip2-$(BZIP2_VERSION).tar.gz
|
||||
wget https://sourceforge.net/projects/bzip2/files/bzip2-$(BZIP2_VERSION).tar.gz/download -O $(DOWNLOAD_PATH)/bzip2-$(BZIP2_VERSION).tar.gz
|
||||
|
||||
$(BUILD_PATH)/bzip2-$(BZIP2_VERSION): $(DOWNLOAD_PATH)/bzip2-$(BZIP2_VERSION).tar.gz
|
||||
# prepare
|
||||
@ -85,7 +82,7 @@ $(BUILD_PATH)/bzip2-$(BZIP2_VERSION): $(DOWNLOAD_PATH)/bzip2-$(BZIP2_VERSION).ta
|
||||
tar xvf $(DOWNLOAD_PATH)/bzip2-$(BZIP2_VERSION).tar.gz
|
||||
# build
|
||||
#cd bzip2-$(BZIP2_VERSION) && make install PREFIX="`pwd`/../$(BUILD_PATH)"
|
||||
cd bzip2-$(BZIP2_VERSION) && make -j
|
||||
cd bzip2-$(BZIP2_VERSION) && make
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/bzip2-$(BZIP2_VERSION).tmp/include
|
||||
cp bzip2-$(BZIP2_VERSION)/bzlib.h $(BUILD_PATH)/bzip2-$(BZIP2_VERSION).tmp/include/
|
||||
@ -105,10 +102,10 @@ $(BUILD_PATH)/miniupnpc-$(MINIUPNPC_VERSION): $(DOWNLOAD_PATH)/miniupnpc-$(MINIU
|
||||
rm -r -f $(BUILD_PATH)/miniupnpc-*
|
||||
tar xvf $(DOWNLOAD_PATH)/miniupnpc-$(MINIUPNPC_VERSION).tar.gz
|
||||
# build
|
||||
cd miniupnpc-$(MINIUPNPC_VERSION) && export CC=gcc && export PATH=.:$$PATH && make -j -f Makefile.mingw libminiupnpc.a miniupnpc.dll
|
||||
cd miniupnpc-$(MINIUPNPC_VERSION) && export CC=gcc && export PATH=.:$$PATH && make -f Makefile.mingw init libminiupnpc.a miniupnpc.dll
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/miniupnpc-$(MINIUPNPC_VERSION).tmp/include/miniupnpc
|
||||
cp miniupnpc-$(MINIUPNPC_VERSION)/include/*.h $(BUILD_PATH)/miniupnpc-$(MINIUPNPC_VERSION).tmp/include/miniupnpc/
|
||||
cp miniupnpc-$(MINIUPNPC_VERSION)/*.h $(BUILD_PATH)/miniupnpc-$(MINIUPNPC_VERSION).tmp/include/miniupnpc/
|
||||
mkdir -p $(BUILD_PATH)/miniupnpc-$(MINIUPNPC_VERSION).tmp/lib
|
||||
cp miniupnpc-$(MINIUPNPC_VERSION)/miniupnpc.lib $(BUILD_PATH)/miniupnpc-$(MINIUPNPC_VERSION).tmp/lib/
|
||||
mkdir -p $(BUILD_PATH)/miniupnpc-$(MINIUPNPC_VERSION).tmp/bin
|
||||
@ -130,7 +127,7 @@ $(BUILD_PATH)/openssl-$(OPENSSL_VERSION): $(DOWNLOAD_PATH)/openssl-$(OPENSSL_VER
|
||||
#cd openssl-$(OPENSSL_VERSION) && ./config --prefix="`pwd`/../$(BUILD_PATH)"
|
||||
#cd openssl-$(OPENSSL_VERSION) && make install
|
||||
cd openssl-$(OPENSSL_VERSION) && ./config shared
|
||||
cd openssl-$(OPENSSL_VERSION) && make -j
|
||||
cd openssl-$(OPENSSL_VERSION) && make
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/openssl-$(OPENSSL_VERSION).tmp/include/openssl
|
||||
cp openssl-$(OPENSSL_VERSION)/include/openssl/*.h $(BUILD_PATH)/openssl-$(OPENSSL_VERSION).tmp/include/openssl/
|
||||
@ -159,7 +156,7 @@ $(BUILD_PATH)/speex-$(SPEEX_VERSION): $(DOWNLOAD_PATH)/speex-$(SPEEX_VERSION).ta
|
||||
# build
|
||||
cd speex-$(SPEEX_VERSION) && ./configure
|
||||
#cd speex-$(SPEEX_VERSION) && make install exec_prefix="`pwd`/../$(BUILD_PATH)"
|
||||
cd speex-$(SPEEX_VERSION) && make -j
|
||||
cd speex-$(SPEEX_VERSION) && make
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/speex-$(SPEEX_VERSION).tmp/include/speex
|
||||
cp speex-$(SPEEX_VERSION)/include/speex/*.h $(BUILD_PATH)/speex-$(SPEEX_VERSION).tmp/include/speex/
|
||||
@ -180,7 +177,7 @@ $(BUILD_PATH)/speexdsp-$(SPEEXDSP_VERSION): $(DOWNLOAD_PATH)/speexdsp-$(SPEEXDSP
|
||||
tar xvf $(DOWNLOAD_PATH)/speexdsp-$(SPEEXDSP_VERSION).tar.gz
|
||||
# build
|
||||
cd speexdsp-$(SPEEXDSP_VERSION) && ./configure
|
||||
cd speexdsp-$(SPEEXDSP_VERSION) && make -j
|
||||
cd speexdsp-$(SPEEXDSP_VERSION) && make
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/speexdsp-$(SPEEXDSP_VERSION).tmp/include/speex
|
||||
cp speexdsp-$(SPEEXDSP_VERSION)/include/speex/*.h $(BUILD_PATH)/speexdsp-$(SPEEXDSP_VERSION).tmp/include/speex/
|
||||
@ -190,52 +187,73 @@ $(BUILD_PATH)/speexdsp-$(SPEEXDSP_VERSION): $(DOWNLOAD_PATH)/speexdsp-$(SPEEXDSP
|
||||
rm -r -f speexdsp-$(SPEEXDSP_VERSION)
|
||||
mv $(BUILD_PATH)/speexdsp-$(SPEEXDSP_VERSION).tmp $(BUILD_PATH)/speexdsp-$(SPEEXDSP_VERSION)
|
||||
|
||||
libxml: \
|
||||
$(BUILD_PATH)/libxml2-$(LIBXML2_VERSION) \
|
||||
$(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION)
|
||||
opencv: $(BUILD_PATH)/opencv-$(OPENCV_VERSION)
|
||||
|
||||
$(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.xz:
|
||||
wget --no-check-certificate https://download.gnome.org/sources/libxml2/$(LIBXML2_MAIN_VERSION)/libxml2-$(LIBXML2_VERSION).tar.xz -O $(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.xz
|
||||
$(DOWNLOAD_PATH)/opencv-$(OPENCV_VERSION).tar.gz:
|
||||
wget --no-check-certificate https://github.com/opencv/opencv/archive/$(OPENCV_VERSION).tar.gz -O $(DOWNLOAD_PATH)/opencv-$(OPENCV_VERSION).tar.gz
|
||||
|
||||
$(DOWNLOAD_PATH)/libxslt-$(LIBXSLT_VERSION).tar.xz:
|
||||
wget --no-check-certificate https://download.gnome.org/sources/libxslt/$(LIBXSLT_MAIN_VERSION)/libxslt-$(LIBXSLT_VERSION).tar.xz -O $(DOWNLOAD_PATH)/libxslt-$(LIBXSLT_VERSION).tar.xz
|
||||
$(BUILD_PATH)/opencv-$(OPENCV_VERSION): $(DOWNLOAD_PATH)/opencv-$(OPENCV_VERSION).tar.gz
|
||||
# prepare
|
||||
rm -r -f $(BUILD_PATH)/opencv-*
|
||||
tar xvf $(DOWNLOAD_PATH)/opencv-$(OPENCV_VERSION).tar.gz
|
||||
# build
|
||||
mkdir -p opencv-$(OPENCV_VERSION)/build
|
||||
#cd opencv-$(OPENCV_VERSION)/build && cmake .. -G"MSYS Makefiles" -DCMAKE_BUILD_TYPE=Release -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX="`pwd`/../../build"
|
||||
cd opencv-$(OPENCV_VERSION)/build && cmake .. -G"MSYS Makefiles" -DCMAKE_BUILD_TYPE=Release -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DBUILD_SHARED_LIBS=OFF -DENABLE_CXX11=ON -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -DSTRSAFE_NO_DEPRECATE" -DCMAKE_INSTALL_PREFIX="`pwd`/install"
|
||||
cd opencv-$(OPENCV_VERSION)/build && make install
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/opencv-$(OPENCV_VERSION).tmp/include
|
||||
cp -r opencv-$(OPENCV_VERSION)/build/install/include/* $(BUILD_PATH)/opencv-$(OPENCV_VERSION).tmp/include/
|
||||
mkdir -p $(BUILD_PATH)/opencv-$(OPENCV_VERSION).tmp/lib/opencv
|
||||
cp -r opencv-$(OPENCV_VERSION)/build/install/x64/mingw/staticlib/* $(BUILD_PATH)/opencv-$(OPENCV_VERSION).tmp/lib/opencv/
|
||||
# cleanup
|
||||
rm -r -f opencv-$(OPENCV_VERSION)
|
||||
mv $(BUILD_PATH)/opencv-$(OPENCV_VERSION).tmp $(BUILD_PATH)/opencv-$(OPENCV_VERSION)
|
||||
|
||||
$(BUILD_PATH)/libxml2-$(LIBXML2_VERSION) $(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION): \
|
||||
$(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.xz \
|
||||
$(DOWNLOAD_PATH)/libxslt-$(LIBXSLT_VERSION).tar.xz
|
||||
# libxml2: prepare
|
||||
pacman --needed --noconfirm -S python3 pkg-config
|
||||
libxml2: $(BUILD_PATH)/libxml2-$(LIBXML2_VERSION)
|
||||
|
||||
$(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.gz:
|
||||
wget ftp://xmlsoft.org/libxml2/libxml2-$(LIBXML2_VERSION).tar.gz -O $(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.gz
|
||||
|
||||
$(BUILD_PATH)/libxml2-$(LIBXML2_VERSION): $(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.gz
|
||||
# prepare
|
||||
rm -r -f $(BUILD_PATH)/libxml2-*
|
||||
tar xvf $(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.xz
|
||||
# libxslt: prepare
|
||||
rm -r -f $(BUILD_PATH)/libxslt-*
|
||||
tar xvf $(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.xz
|
||||
tar xvf $(DOWNLOAD_PATH)/libxslt-$(LIBXSLT_VERSION).tar.xz
|
||||
# libxml2: build
|
||||
tar xvf $(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.gz
|
||||
# build
|
||||
cd libxml2-$(LIBXML2_VERSION) && ./configure --without-iconv -enable-shared=no
|
||||
#cd libxml2-$(LIBXML2_VERSION) && make install exec_prefix="`pwd`/../$(BUILD_PATH)"
|
||||
cd libxml2-$(LIBXML2_VERSION) && make -j libxml2.la
|
||||
# libxslt: build
|
||||
cd libxslt-$(LIBXSLT_VERSION) && ./configure --with-libxml-src=../libxml2-$(LIBXML2_VERSION) -enable-shared=no CFLAGS=-DLIBXML_STATIC
|
||||
cd libxslt-$(LIBXSLT_VERSION)/libxslt && make -j
|
||||
cd libxslt-$(LIBXSLT_VERSION)/libexslt && make -j
|
||||
# libxml2: copy files
|
||||
cd libxml2-$(LIBXML2_VERSION) && make
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/libxml2-$(LIBXML2_VERSION).tmp/include/libxml
|
||||
cp libxml2-$(LIBXML2_VERSION)/include/libxml/*.h $(BUILD_PATH)/libxml2-$(LIBXML2_VERSION).tmp/include/libxml/
|
||||
mkdir -p $(BUILD_PATH)/libxml2-$(LIBXML2_VERSION).tmp/lib
|
||||
cp libxml2-$(LIBXML2_VERSION)/.libs/libxml2.a $(BUILD_PATH)/libxml2-$(LIBXML2_VERSION).tmp/lib/
|
||||
# libxslt: copy files
|
||||
# cleanup
|
||||
#rm -r -f libxml2-$(LIBXML2_VERSION) # see libxslt
|
||||
mv $(BUILD_PATH)/libxml2-$(LIBXML2_VERSION).tmp $(BUILD_PATH)/libxml2-$(LIBXML2_VERSION)
|
||||
|
||||
libxslt: $(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION)
|
||||
|
||||
$(DOWNLOAD_PATH)/libxslt-$(LIBXSLT_VERSION).tar.gz:
|
||||
wget ftp://xmlsoft.org/libxml2/libxslt-$(LIBXSLT_VERSION).tar.gz -O $(DOWNLOAD_PATH)/libxslt-$(LIBXSLT_VERSION).tar.gz
|
||||
|
||||
$(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION): $(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.gz $(DOWNLOAD_PATH)/libxslt-$(LIBXSLT_VERSION).tar.gz
|
||||
# prepare
|
||||
rm -r -f $(BUILD_PATH)/libxslt-*
|
||||
tar xvf $(DOWNLOAD_PATH)/libxml2-$(LIBXML2_VERSION).tar.gz
|
||||
tar xvf $(DOWNLOAD_PATH)/libxslt-$(LIBXSLT_VERSION).tar.gz
|
||||
# build
|
||||
cd libxslt-$(LIBXSLT_VERSION) && ./configure --with-libxml-src=../libxml2-$(LIBXML2_VERSION) -enable-shared=no CFLAGS=-DLIBXML_STATIC
|
||||
cd libxslt-$(LIBXSLT_VERSION) && make
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION).tmp/include/libxslt
|
||||
cp libxslt-$(LIBXSLT_VERSION)/libxslt/*.h $(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION).tmp/include/libxslt/
|
||||
mkdir -p $(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION).tmp/lib
|
||||
cp libxslt-$(LIBXSLT_VERSION)/libxslt/.libs/libxslt.a $(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION).tmp/lib/
|
||||
cp libxslt-$(LIBXSLT_VERSION)/libexslt/.libs/libexslt.a $(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION).tmp/lib/
|
||||
# libxml2: cleanup
|
||||
# cleanup
|
||||
rm -r -f libxml2-$(LIBXML2_VERSION)
|
||||
# libxslt: cleanup
|
||||
rm -r -f libxslt-$(LIBXSLT_VERSION)
|
||||
# finish
|
||||
mv $(BUILD_PATH)/libxml2-$(LIBXML2_VERSION).tmp $(BUILD_PATH)/libxml2-$(LIBXML2_VERSION)
|
||||
mv $(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION).tmp $(BUILD_PATH)/libxslt-$(LIBXSLT_VERSION)
|
||||
|
||||
curl: $(BUILD_PATH)/curl-$(CURL_VERSION)
|
||||
@ -250,7 +268,7 @@ $(BUILD_PATH)/curl-$(CURL_VERSION): $(DOWNLOAD_PATH)/curl-$(CURL_VERSION).tar.gz
|
||||
# build
|
||||
cd curl-$(CURL_VERSION) && ./configure --disable-shared --with-ssl="`pwd`/../$(BUILD_PATH)/openssl-$(OPENSSL_VERSION)"
|
||||
#cd curl-$(CURL_VERSION) && make install exec_prefix="`pwd`/../$(BUILD_PATH)"
|
||||
cd curl-$(CURL_VERSION)/lib && make -j
|
||||
cd curl-$(CURL_VERSION) && make
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/curl-$(CURL_VERSION).tmp/include/curl
|
||||
cp curl-$(CURL_VERSION)/include/curl/*.h $(BUILD_PATH)/curl-$(CURL_VERSION).tmp/include/curl/
|
||||
@ -275,14 +293,14 @@ $(BUILD_PATH)/sqlcipher-$(SQLCIPHER_VERSION): $(DOWNLOAD_PATH)/tcl$(TCL_VERSION)
|
||||
tar xvf $(DOWNLOAD_PATH)/tcl$(TCL_VERSION)-src.tar.gz
|
||||
mkdir -p tcl$(TCL_VERSION)/build
|
||||
cd tcl$(TCL_VERSION)/build && ../win/configure
|
||||
cd tcl$(TCL_VERSION)/build && make -j
|
||||
cd tcl$(TCL_VERSION)/build && make
|
||||
#sqlcipher
|
||||
tar xvf $(DOWNLOAD_PATH)/sqlcipher-$(SQLCIPHER_VERSION).tar.gz
|
||||
cd sqlcipher-$(SQLCIPHER_VERSION) && ln -s ../tcl$(TCL_VERSION)/build/tclsh86.exe tclsh
|
||||
mkdir -p tcl$(TCL_VERSION)/lib
|
||||
ln -s `pwd`/tcl$(TCL_VERSION)/library `pwd`/tcl$(TCL_VERSION)/lib/tcl8.6
|
||||
# build
|
||||
cd sqlcipher-$(SQLCIPHER_VERSION) && PATH=.:$$PATH:`pwd`/../tcl$(TCL_VERSION)/build && export LIBS="-L`pwd`/../$(BUILD_PATH)/openssl-$(OPENSSL_VERSION)/lib -lgdi32 $$LIBS" && ./configure --disable-shared --enable-static --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC -I`pwd`/../$(BUILD_PATH)/openssl-$(OPENSSL_VERSION)/include -I`pwd`/../tcl$(TCL_VERSION)/generic" LDFLAGS="-L`pwd`/../$(BUILD_PATH)/openssl-$(OPENSSL_VERSION)/lib -lcrypto -lgdi32" --with-tcl="`pwd`/../tcl$(TCL_VERSION)/build" && make -j install prefix="`pwd`/install"
|
||||
cd sqlcipher-$(SQLCIPHER_VERSION) && PATH=.:$$PATH:`pwd`/../tcl$(TCL_VERSION)/build && export LIBS="-L`pwd`/../$(BUILD_PATH)/openssl-$(OPENSSL_VERSION)/lib -lgdi32 $$LIBS" && ./configure --disable-shared --enable-static --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC -I`pwd`/../$(BUILD_PATH)/openssl-$(OPENSSL_VERSION)/include -I`pwd`/../tcl$(TCL_VERSION)/generic" LDFLAGS="-L`pwd`/../$(BUILD_PATH)/openssl-$(OPENSSL_VERSION)/lib -lcrypto -lgdi32" --with-tcl="`pwd`/../tcl$(TCL_VERSION)/build" && make install prefix="`pwd`/install"
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/sqlcipher-$(SQLCIPHER_VERSION).tmp/include
|
||||
cp -r sqlcipher-$(SQLCIPHER_VERSION)/install/include/* $(BUILD_PATH)/sqlcipher-$(SQLCIPHER_VERSION).tmp/include/
|
||||
@ -295,18 +313,34 @@ $(BUILD_PATH)/sqlcipher-$(SQLCIPHER_VERSION): $(DOWNLOAD_PATH)/tcl$(TCL_VERSION)
|
||||
rm -r -f tcl$(TCL_VERSION)
|
||||
mv $(BUILD_PATH)/sqlcipher-$(SQLCIPHER_VERSION).tmp $(BUILD_PATH)/sqlcipher-$(SQLCIPHER_VERSION)
|
||||
|
||||
libmicrohttpd: $(BUILD_PATH)/libmicrohttpd-$(LIBMICROHTTPD_VERSION)
|
||||
|
||||
$(DOWNLOAD_PATH)/libmicrohttpd-$(LIBMICROHTTPD_VERSION).tar.gz:
|
||||
wget --no-check-certificate http://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-$(LIBMICROHTTPD_VERSION).tar.gz -O $(DOWNLOAD_PATH)/libmicrohttpd-$(LIBMICROHTTPD_VERSION).tar.gz
|
||||
|
||||
$(BUILD_PATH)/libmicrohttpd-$(LIBMICROHTTPD_VERSION): $(DOWNLOAD_PATH)/libmicrohttpd-$(LIBMICROHTTPD_VERSION).tar.gz
|
||||
# prepare
|
||||
rm -r -f $(BUILD_PATH)/libmicrohttpd-*
|
||||
tar xvf $(DOWNLOAD_PATH)/libmicrohttpd-$(LIBMICROHTTPD_VERSION).tar.gz
|
||||
# build
|
||||
cd libmicrohttpd-$(LIBMICROHTTPD_VERSION) && ./configure --disable-shared --enable-static --prefix="`pwd`/../$(BUILD_PATH)/libmicrohttpd-$(LIBMICROHTTPD_VERSION).tmp"
|
||||
cd libmicrohttpd-$(LIBMICROHTTPD_VERSION) && make install
|
||||
# cleanup
|
||||
rm -r -f libmicrohttpd-$(LIBMICROHTTPD_VERSION)
|
||||
mv $(BUILD_PATH)/libmicrohttpd-$(LIBMICROHTTPD_VERSION).tmp $(BUILD_PATH)/libmicrohttpd-$(LIBMICROHTTPD_VERSION)
|
||||
|
||||
ffmpeg: $(BUILD_PATH)/ffmpeg-$(FFMPEG_VERSION)
|
||||
|
||||
$(DOWNLOAD_PATH)/ffmpeg-$(FFMPEG_VERSION).tar.xz:
|
||||
wget --no-check-certificate https://ffmpeg.org/releases/ffmpeg-$(FFMPEG_VERSION).tar.xz -O $(DOWNLOAD_PATH)/ffmpeg-$(FFMPEG_VERSION).tar.xz
|
||||
$(DOWNLOAD_PATH)/ffmpeg-$(FFMPEG_VERSION).tar.gz:
|
||||
wget --no-check-certificate https://ffmpeg.org/releases/ffmpeg-$(FFMPEG_VERSION).tar.gz -O $(DOWNLOAD_PATH)/ffmpeg-$(FFMPEG_VERSION).tar.gz
|
||||
|
||||
$(BUILD_PATH)/ffmpeg-$(FFMPEG_VERSION): $(DOWNLOAD_PATH)/ffmpeg-$(FFMPEG_VERSION).tar.xz
|
||||
$(BUILD_PATH)/ffmpeg-$(FFMPEG_VERSION): $(DOWNLOAD_PATH)/ffmpeg-$(FFMPEG_VERSION).tar.gz
|
||||
# prepare
|
||||
rm -r -f $(BUILD_PATH)/ffmpeg-*
|
||||
tar xvf $(DOWNLOAD_PATH)/ffmpeg-$(FFMPEG_VERSION).tar.xz
|
||||
tar xvf $(DOWNLOAD_PATH)/ffmpeg-$(FFMPEG_VERSION).tar.gz
|
||||
# build
|
||||
cd ffmpeg-$(FFMPEG_VERSION) && ./configure --disable-shared --enable-static --disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-yasm --disable-everything --enable-encoder=mpeg4 --enable-decoder=mpeg4 --prefix="`pwd`/../$(BUILD_PATH)/ffmpeg-$(FFMPEG_VERSION).tmp"
|
||||
cd ffmpeg-$(FFMPEG_VERSION) && make -j install
|
||||
cd ffmpeg-$(FFMPEG_VERSION) && ./configure --disable-shared --enable-static --disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-yasm --disable-everything --enable-encoder=mpeg4 --enable-decoder=mpeg4 --prefix="`pwd`/../$(BUILD_PATH)/ffmpeg-$(FFMPEG_VERSION).tmp"
|
||||
cd ffmpeg-$(FFMPEG_VERSION) && make install
|
||||
# cleanup
|
||||
rm -r -f ffmpeg-$(FFMPEG_VERSION)
|
||||
mv $(BUILD_PATH)/ffmpeg-$(FFMPEG_VERSION).tmp $(BUILD_PATH)/ffmpeg-$(FFMPEG_VERSION)
|
||||
@ -344,7 +378,7 @@ $(BUILD_PATH)/xapian-core-$(XAPIAN_VERSION): $(DOWNLOAD_PATH)/xapian-core-$(XAPI
|
||||
#cd xapian-core-$(XAPIAN_VERSION) && ./configure --disable-shared --enable-static --prefix="`pwd`/../$(BUILD_PATH)/xapian-core-$(XAPIAN_VERSION).tmp"
|
||||
#cd xapian-core-$(XAPIAN_VERSION) && make install
|
||||
cd xapian-core-$(XAPIAN_VERSION) && ./configure --disable-shared --enable-static
|
||||
cd xapian-core-$(XAPIAN_VERSION) && make -j
|
||||
cd xapian-core-$(XAPIAN_VERSION) && make
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/xapian-core-$(XAPIAN_VERSION).tmp/include
|
||||
cp -r xapian-core-$(XAPIAN_VERSION)/include/* $(BUILD_PATH)/xapian-core-$(XAPIAN_VERSION).tmp/include/
|
||||
@ -355,73 +389,8 @@ $(BUILD_PATH)/xapian-core-$(XAPIAN_VERSION): $(DOWNLOAD_PATH)/xapian-core-$(XAPI
|
||||
rm -r -f xapian-core-$(XAPIAN_VERSION)
|
||||
mv $(BUILD_PATH)/xapian-core-$(XAPIAN_VERSION).tmp $(BUILD_PATH)/xapian-core-$(XAPIAN_VERSION)
|
||||
|
||||
jsonc: $(BUILD_PATH)/json-c-$(JSON_C_VERSION)
|
||||
|
||||
$(BUILD_PATH)/json-c-$(JSON_C_VERSION):
|
||||
# prepare
|
||||
rm -r -f $(BUILD_PATH)/json-c-*
|
||||
[ -d "json-c-$(JSON_C_VERSION)" ] || git clone https://github.com/json-c/json-c.git --depth=1 --branch json-c-$(JSON_C_VERSION) "json-c-$(JSON_C_VERSION)"
|
||||
# build
|
||||
mkdir -p json-c-$(JSON_C_VERSION)/build
|
||||
cd json-c-$(JSON_C_VERSION)/build && cmake .. -G"MSYS Makefiles" -Wno-dev -DCMAKE_BUILD_TYPE="release" -DBUILD_SHARED_LIBS=off -DBUILD_STATIC_LIBS=on -DBUILD_TESTING=off -DCMAKE_CXX_FLAGS="-D__MINGW_USE_VC2005_COMPAT" -DCMAKE_INSTALL_PREFIX="`pwd`/install" -DCMAKE_INSTALL_PREFIX="`pwd`/../../$(BUILD_PATH)/json-c-$(JSON_C_VERSION).tmp"
|
||||
cd json-c-$(JSON_C_VERSION)/build && make -j install
|
||||
# cleanup
|
||||
rm -r -f json-c-$(JSON_C_VERSION)
|
||||
mv $(BUILD_PATH)/json-c-$(JSON_C_VERSION).tmp $(BUILD_PATH)/json-c-$(JSON_C_VERSION)
|
||||
|
||||
botan: $(BUILD_PATH)/botan-$(BOTAN_VERSION)
|
||||
|
||||
$(BUILD_PATH)/botan-$(BOTAN_VERSION):
|
||||
# prepare
|
||||
pacman --needed --noconfirm -S python3
|
||||
rm -r -f $(BUILD_PATH)/botan-*
|
||||
[ -d "botan-$(BOTAN_VERSION)" ] || git clone https://github.com/randombit/botan.git --depth=1 --branch $(BOTAN_VERSION) "botan-$(BOTAN_VERSION)"
|
||||
# build
|
||||
if [ $(MSYSTEM) = "MINGW32" ] ; then cd botan-$(BOTAN_VERSION) && ./configure.py --os=mingw --cpu=x86_32 --disable-shared-library --enable-static-library --extra-cxxflags="-D__MINGW_USE_VC2005_COMPAT" --prefix="`pwd`/../$(BUILD_PATH)/botan-$(BOTAN_VERSION).tmp" ; fi
|
||||
if [ $(MSYSTEM) = "MINGW64" ] ; then cd botan-$(BOTAN_VERSION) && ./configure.py --os=mingw --cpu=x86_64 --disable-shared-library --enable-static-library --prefix="`pwd`/../$(BUILD_PATH)/botan-$(BOTAN_VERSION).tmp" ; fi
|
||||
cd botan-$(BOTAN_VERSION) && make -j install
|
||||
# cleanup
|
||||
rm -r -f botan-$(BOTAN_VERSION)
|
||||
mv $(BUILD_PATH)/botan-$(BOTAN_VERSION).tmp $(BUILD_PATH)/botan-$(BOTAN_VERSION)
|
||||
|
||||
asio: $(BUILD_PATH)/asio-$(ASIO_VERSION)
|
||||
|
||||
$(BUILD_PATH)/asio-$(ASIO_VERSION):
|
||||
# prepare
|
||||
rm -r -f $(BUILD_PATH)/asio-*
|
||||
[ -d "asio-$(ASIO_VERSION)" ] || git clone https://github.com/chriskohlhoff/asio.git --depth=1 --branch asio-$(ASIO_VERSION) "asio-$(ASIO_VERSION)"
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/asio-$(ASIO_VERSION).tmp/include/asio
|
||||
cp asio-$(ASIO_VERSION)/asio/include/*.hpp $(BUILD_PATH)/asio-$(ASIO_VERSION).tmp/include/
|
||||
cp -r asio-$(ASIO_VERSION)/asio/include/asio/* $(BUILD_PATH)/asio-$(ASIO_VERSION).tmp/include/asio/
|
||||
# cleanup
|
||||
rm -r -f asio-$(ASIO_VERSION)
|
||||
mv $(BUILD_PATH)/asio-$(ASIO_VERSION).tmp $(BUILD_PATH)/asio-$(ASIO_VERSION)
|
||||
|
||||
rnp: $(BUILD_PATH)/rnp-$(RNP_VERSION)
|
||||
|
||||
$(BUILD_PATH)/rnp-$(RNP_VERSION):
|
||||
# prepare
|
||||
rm -r -f $(BUILD_PATH)/rnp-*
|
||||
[ -d "rnp-$(RNP_VERSION)" ] || git clone https://github.com/rnpgp/rnp.git --depth=1 --branch v$(RNP_VERSION) --recurse-submodules --shallow-submodules "rnp-$(RNP_VERSION)"
|
||||
# build
|
||||
mkdir -p rnp-$(RNP_VERSION)/build
|
||||
cd rnp-$(RNP_VERSION)/build && cmake .. -G"MSYS Makefiles" -Wno-dev -DCMAKE_INSTALL_PREFIX="`pwd`/install" -DBUILD_SHARED_LIBS=yes -DBUILD_TESTING=off -DCMAKE_CXX_FLAGS="-D__MINGW_USE_VC2005_COMPAT -D__STDC_FORMAT_MACROS" -DBZIP2_INCLUDE_DIR="`pwd`/../../$(BUILD_PATH)/bzip2-$(BZIP2_VERSION)/include" -DBZIP2_LIBRARY_RELEASE="`pwd`/../../$(BUILD_PATH)/bzip2-$(BZIP2_VERSION)/lib/libbz2.a" -DBZIP2_LIBRARIES="`pwd`/../../$(BUILD_PATH)/bzip2-$(BZIP2_VERSION)/lib/libbz2.a" -DZLIB_INCLUDE_DIR="`pwd`/../../$(BUILD_PATH)/zlib-$(ZLIB_VERSION)/include" -DZLIB_LIBRARY="`pwd`/../../$(BUILD_PATH)/zlib-$(ZLIB_VERSION)/lib/libz.a" -DJSON-C_INCLUDE_DIR="`pwd`/../../$(BUILD_PATH)/json-c-$(JSON_C_VERSION)/include/json-c" -DJSON-C_LIBRARY="`pwd`/../../$(BUILD_PATH)/json-c-$(JSON_C_VERSION)/lib/libjson-c.a" -DBOTAN_INCLUDE_DIR="`pwd`/../../$(BUILD_PATH)/botan-$(BOTAN_VERSION)/include/botan-`echo $(BOTAN_VERSION) | cut -c1-1`" -DBOTAN_LIBRARY="`pwd`/../../$(BUILD_PATH)/botan-$(BOTAN_VERSION)/lib/libbotan-`echo $(BOTAN_VERSION) | cut -c1-1`.a"
|
||||
cmake --build rnp-$(RNP_VERSION)/build
|
||||
# copy files
|
||||
mkdir -p $(BUILD_PATH)/rnp-$(RNP_VERSION).tmp/include/rnp
|
||||
cp -r rnp-$(RNP_VERSION)/include/rnp/* $(BUILD_PATH)/rnp-$(RNP_VERSION).tmp/include/rnp/
|
||||
cp -r rnp-$(RNP_VERSION)/build/src/lib/rnp/* $(BUILD_PATH)/rnp-$(RNP_VERSION).tmp/include/rnp/
|
||||
mkdir -p $(BUILD_PATH)/rnp-$(RNP_VERSION).tmp/lib
|
||||
cp -r rnp-$(RNP_VERSION)/build/src/lib/librnp.dll.a $(BUILD_PATH)/rnp-$(RNP_VERSION).tmp/lib/
|
||||
mkdir -p $(BUILD_PATH)/rnp-$(RNP_VERSION).tmp/bin
|
||||
cp -r rnp-$(RNP_VERSION)/build/src/lib/librnp.dll $(BUILD_PATH)/rnp-$(RNP_VERSION).tmp/bin/
|
||||
# cleanup
|
||||
rm -r -f rnp-$(RNP_VERSION)
|
||||
mv $(BUILD_PATH)/rnp-$(RNP_VERSION).tmp $(BUILD_PATH)/rnp-$(RNP_VERSION)
|
||||
|
||||
copylibs:
|
||||
rm -r -f $(LIBS_PATH) ; \
|
||||
mkdir -p $(LIBS_PATH) ; \
|
||||
cp -p $(BUILD_PATH)/gcc-version $(LIBS_PATH) ; \
|
||||
find $(BUILD_PATH) -mindepth 1 -maxdepth 1 -type d -not -name "*.tmp" -print -exec cp -r -p {}/. $(LIBS_PATH) \; ; \
|
||||
cp $(BUILD_PATH)/gcc-version $(LIBS_PATH) ; \
|
||||
find $(BUILD_PATH) -mindepth 1 -maxdepth 1 -type d -not -name "*.tmp" -print -exec cp -r {}/. $(LIBS_PATH) \; ; \
|
||||
|
||||
@ -13,11 +13,12 @@ call "%~dp0build-libs\build-libs.bat"
|
||||
if errorlevel 1 %cecho% error "Failed to build libraries." & exit /B %ERRORLEVEL%
|
||||
|
||||
%cecho% info "Build %SourceName%"
|
||||
call "%~dp0build\build.bat" release autologin webui plugins nativedialogs service
|
||||
call "%~dp0build\build.bat" release autologin jsonapi
|
||||
rem plugins
|
||||
if errorlevel 1 %cecho% error "Failed to build %SourceName%." & exit /B %ERRORLEVEL%
|
||||
|
||||
%cecho% info "Pack %SourceName%"
|
||||
call "%~dp0build\pack.bat" release webui plugins service
|
||||
call "%~dp0build\pack.bat" release
|
||||
if errorlevel 1 %cecho% error "Failed to pack %SourceName%." & exit /B %ERRORLEVEL%
|
||||
|
||||
%cecho% info "Build installer"
|
||||
|
||||
@ -9,7 +9,7 @@ call "%EnvPath%\env.bat"
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
:: Initialize environment
|
||||
call "%~dp0env.bat" installer release
|
||||
call "%~dp0env.bat" release
|
||||
if errorlevel 2 exit /B 2
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
@ -40,7 +40,6 @@ set NSIS_PARAM=%NSIS_PARAM% /DARCHITECTURE="%GCCArchitecture%"
|
||||
set NSIS_PARAM=%NSIS_PARAM% /DDATE="%RsDate%"
|
||||
|
||||
if exist "%EnvTorPath%\Tor\tor.exe" set NSIS_PARAM=%NSIS_PARAM% /DTORDIR="%EnvTorPath%\Tor"
|
||||
if exist "%RsWebuiBuildPath%" set NSIS_PARAM=%NSIS_PARAM% /DWEBUIDIR="%RsWebuiBuildPath%"
|
||||
|
||||
:: Get compiled version
|
||||
call "%ToolsPath%\get-rs-version.bat" "%RsBuildPath%\retroshare-gui\src\%RsBuildConfig%\retroshare.exe" RsVersion
|
||||
|
||||
@ -9,7 +9,7 @@ call "%EnvPath%\env.bat"
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
:: Initialize environment
|
||||
call "%~dp0env.bat" build %*
|
||||
call "%~dp0env.bat" %*
|
||||
if errorlevel 2 exit /B 2
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
@ -33,7 +33,7 @@ echo.
|
||||
echo === Version
|
||||
echo.
|
||||
|
||||
title Build - %SourceName%-%RsBuildConfig% Qt-%QtVersion%-%GCCArchitecture% [Version]
|
||||
title Build - %SourceName%-%RsBuildConfig% [Version]
|
||||
|
||||
pushd "%SourcePath%\retroshare-gui\src\gui\images"
|
||||
:: Touch resource file
|
||||
@ -47,17 +47,12 @@ echo.
|
||||
echo === qmake
|
||||
echo.
|
||||
|
||||
title Build - %SourceName%-%RsBuildConfig% Qt-%QtVersion%-%GCCArchitecture% [qmake]
|
||||
title Build - %SourceName%-%RsBuildConfig% [qmake]
|
||||
|
||||
set RS_QMAKE_CONFIG=%RsBuildConfig%
|
||||
if "%ParamAutologin%"=="1" set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% rs_autologin
|
||||
if "%ParamJsonApi%"=="1" set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% rs_jsonapi
|
||||
if "%ParamWebui%"=="1" set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% rs_webui
|
||||
if "%ParamPlugins%"=="1" set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% retroshare_plugins
|
||||
if "%ParamUseNativeDialogs%"=="1" set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% rs_use_native_dialogs
|
||||
if "%ParamService%" NEQ "1" set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% no_retroshare_service
|
||||
if "%ParamFriendServer%" NEQ "1" set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% no_retroshare_friendserver
|
||||
if "%ParamEmbeddedFriendServer%"=="1" set RS_QMAKE_CONFIG=%RS_QMAKE_CONFIG% rs_efs
|
||||
|
||||
qmake "%SourcePath%\RetroShare.pro" -r -spec win32-g++ "CONFIG+=%RS_QMAKE_CONFIG%" "EXTERNAL_LIB_DIR=%BuildLibsPath%\libs"
|
||||
if errorlevel 1 goto error
|
||||
@ -66,7 +61,7 @@ echo.
|
||||
echo === make
|
||||
echo.
|
||||
|
||||
title Build - %SourceName%-%RsBuildConfig% Qt-%QtVersion%-%GCCArchitecture% [make]
|
||||
title Build - %SourceName%-%RsBuildConfig% [make]
|
||||
|
||||
mingw32-make -j %CoreCount%
|
||||
if errorlevel 1 goto error
|
||||
@ -75,7 +70,7 @@ echo.
|
||||
echo === Changelog
|
||||
echo.
|
||||
|
||||
title Build - %SourceName%-%RsBuildConfig% Qt-%QtVersion%-%GCCArchitecture% [changelog]
|
||||
title Build - %SourceName%-%RsBuildConfig% [changelog]
|
||||
call "%ToolsPath%\generate-changelog.bat" "%SourcePath%" "%RsBuildPath%\changelog.txt"
|
||||
|
||||
:error
|
||||
|
||||
@ -8,7 +8,7 @@ if errorlevel 1 goto error_env
|
||||
call "%EnvPath%\env.bat"
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
call "%~dp0env.bat" clean %*
|
||||
call "%~dp0env.bat" %*
|
||||
if errorlevel 2 exit /B 2
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
|
||||
@ -4,18 +4,10 @@ set ParamDebug=0
|
||||
set ParamAutologin=0
|
||||
set ParamPlugins=0
|
||||
set ParamJsonApi=0
|
||||
set ParamWebui=0
|
||||
set ParamService=0
|
||||
set ParamFriendServer=0
|
||||
set ParamEmbeddedFriendServer=0
|
||||
set ParamUseNativeDialogs=0
|
||||
set ParamTor=0
|
||||
set NonInteractive=0
|
||||
set CoreCount=%NUMBER_OF_PROCESSORS%
|
||||
|
||||
set Module=%~1
|
||||
shift /1
|
||||
|
||||
:parameter_loop
|
||||
if "%~1" NEQ "" (
|
||||
for /f "tokens=1,2 delims==" %%a in ("%~1") do (
|
||||
@ -27,15 +19,6 @@ if "%~1" NEQ "" (
|
||||
set ParamAutologin=1
|
||||
) else if "%%~a"=="jsonapi" (
|
||||
set ParamJsonApi=1
|
||||
) else if "%%~a"=="webui" (
|
||||
set ParamJsonApi=1
|
||||
set ParamWebui=1
|
||||
) else if "%%~a"=="service" (
|
||||
set ParamService=1
|
||||
) else if "%%~a"=="friendserver" (
|
||||
set ParamFriendServer=1
|
||||
) else if "%%~a"=="embedded-friendserver" (
|
||||
set ParamEmbeddedFriendServer=1
|
||||
) else if "%%~a"=="plugins" (
|
||||
set ParamPlugins=1
|
||||
) else if "%%~a"=="tor" (
|
||||
@ -44,11 +27,9 @@ if "%~1" NEQ "" (
|
||||
set NonInteractive=1
|
||||
) else if "%%~a"=="singlethread" (
|
||||
set CoreCount=1
|
||||
) else if "%%~a"=="nativedialogs" (
|
||||
set ParamUseNativeDialogs=1
|
||||
) else (
|
||||
echo.
|
||||
echo Unknown parameter %1 for %Module%
|
||||
echo Unknown parameter %1
|
||||
goto :usage
|
||||
)
|
||||
)
|
||||
@ -105,7 +86,6 @@ set RsBuildPath=%BuildPath%\Qt-%QtVersion%-%GCCArchitecture%-%RsBuildConfig%
|
||||
set RsDeployPath=%DeployPath%\Qt-%QtVersion%-%GCCArchitecture%%RsType%-%RsBuildConfig%
|
||||
set RsPackPath=%DeployPath%
|
||||
set RsArchiveAdd=
|
||||
set RsWebuiBuildPath=%RsBuildPath%\retroshare-webui\webui
|
||||
|
||||
if not exist "%~dp0env-mod.bat" goto no_mod
|
||||
call "%~dp0env-mod.bat"
|
||||
@ -116,36 +96,23 @@ exit /B 0
|
||||
|
||||
:usage
|
||||
echo.
|
||||
echo Usage: release^|debug [^<optional parameters^>]
|
||||
echo Usage: release^|debug [version autologin plugins]
|
||||
echo.
|
||||
echo Mandatory parameter
|
||||
echo release^|debug Build release or debug version
|
||||
echo release^|debug Build release or debug version
|
||||
echo.
|
||||
if "%Module%"=="build" (
|
||||
echo Optional parameter ^(need clean when changed^)
|
||||
echo autologin Build with autologin
|
||||
echo jsonapi Build with jsonapi
|
||||
echo webui Build with jsonapi and webui
|
||||
echo service Build service
|
||||
echo friendserver Build Friend Server
|
||||
echo embedded-friendserver Build with embedded Friend Server
|
||||
echo plugins Build plugins
|
||||
echo nativedialogs Build with native dialogs
|
||||
echo.
|
||||
echo Optional parameter
|
||||
echo singlethread Use only 1 thread for building
|
||||
)
|
||||
if "%Module%"=="pack" (
|
||||
echo Optional parameter
|
||||
echo webui Pack webui
|
||||
echo service Pack service
|
||||
echo friendserver Pack Friend Server ^(needs Tor^)
|
||||
echo tor Pack Tor version
|
||||
echo plugins Pack plugins
|
||||
)
|
||||
if "%Module%"=="git-log" (
|
||||
echo Optional parameter
|
||||
echo non-interactive Non-interactive mode
|
||||
)
|
||||
echo Optional parameter (need clean when changed)
|
||||
echo autologin Build with autologin
|
||||
echo jsonapi Build with jsonapi
|
||||
echo plugins Build plugins
|
||||
echo.
|
||||
echo Optional parameter
|
||||
echo singlethread Use only 1 thread for building
|
||||
echo.
|
||||
echo Parameter for pack
|
||||
echo tor Pack tor version
|
||||
echo.
|
||||
echo Parameter for git-log
|
||||
echo non-interactive Non-interactive mode
|
||||
echo.
|
||||
exit /B 2
|
||||
|
||||
@ -8,7 +8,7 @@ if errorlevel 1 goto error_env
|
||||
call "%EnvPath%\env.bat"
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
call "%~dp0env.bat" git-log %*
|
||||
call "%~dp0env.bat" %*
|
||||
if errorlevel 2 exit /B 2
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
@ -88,10 +88,6 @@ echo %RsRef%>"%RsLastRefFile%"
|
||||
|
||||
exit /B %ERRORLEVEL%
|
||||
|
||||
:error
|
||||
%cecho% error "\n%~n0 failed\n"
|
||||
exit /B 1
|
||||
|
||||
:error_env
|
||||
echo Failed to initialize environment.
|
||||
endlocal
|
||||
|
||||
@ -11,7 +11,7 @@ call "%EnvPath%\env.bat"
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
:: Initialize environment
|
||||
call "%~dp0env.bat" pack %*
|
||||
call "%~dp0env.bat" %*
|
||||
if errorlevel 2 exit /B 2
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
@ -59,12 +59,10 @@ set QtMainVersion=%QtVersion:~0,1%
|
||||
|
||||
rem Qt 4 = QtSvg4.dll
|
||||
rem Qt 5 = Qt5Svg.dll
|
||||
rem Qt 6 = Qt6Svg.dll
|
||||
set QtMainVersion1=
|
||||
set QtMainVersion2=
|
||||
if "%QtMainVersion%"=="4" set QtMainVersion2=4
|
||||
if "%QtMainVersion%"=="5" set QtMainVersion1=5
|
||||
if "%QtMainVersion%"=="6" set QtMainVersion1=6
|
||||
|
||||
if "%RsBuildConfig%" NEQ "release" (
|
||||
set Archive=%RsPackPath%\RetroShare-%RsVersion%-Windows-Portable-%RsDate%-%RsVersion.Extra%-Qt-%QtVersion%-%GCCArchitecture%%RsType%%RsArchiveAdd%-%RsBuildConfig%.7z
|
||||
@ -77,7 +75,7 @@ if exist "%Archive%" del /Q "%Archive%"
|
||||
:: Create deploy path
|
||||
mkdir "%RsDeployPath%"
|
||||
|
||||
title Pack - %SourceName%%RsType%-%RsBuildConfig% Qt-%QtVersion%-%GCCArchitecture% [copy files]
|
||||
title Pack - %SourceName%%RsType%-%RsBuildConfig% [copy files]
|
||||
|
||||
set ExtensionsFile=%SourcePath%\libretroshare\src\rsserver\rsinit.cc
|
||||
set Extensions=
|
||||
@ -97,30 +95,12 @@ copy nul "%RsDeployPath%\portable" %Quite%
|
||||
|
||||
echo copy binaries
|
||||
copy "%RsBuildPath%\retroshare-gui\src\%RsBuildConfig%\retroshare*.exe" "%RsDeployPath%" %Quite%
|
||||
if exist "%RsBuildPath%\libretroshare\src\lib\retroshare.dll" copy "%RsBuildPath%\libretroshare\src\lib\retroshare.dll" "%RsDeployPath%" %Quite%
|
||||
if exist "%RsBuildPath%\supportlibs\librnp\Build\src\lib\librnp.dll" copy "%RsBuildPath%\supportlibs\librnp\Build\src\lib\librnp.dll" "%RsDeployPath%" %Quite%
|
||||
|
||||
if "%ParamService%"=="1" (
|
||||
copy "%RsBuildPath%\retroshare-service\src\%RsBuildConfig%\retroshare*-service.exe" "%RsDeployPath%" %Quite%
|
||||
if errorlevel 1 %cecho% error "Service not found"& goto error
|
||||
)
|
||||
|
||||
if "%ParamFriendServer%"=="1" (
|
||||
if "%ParamTor%"=="1" (
|
||||
copy "%RsBuildPath%\retroshare-friendserver\src\%RsBuildConfig%\retroshare-friendserver.exe" "%RsDeployPath%" %Quite%
|
||||
if errorlevel 1 %cecho% error "Friend Server not found"& goto error
|
||||
) else (
|
||||
%cecho% error "Friend Server needs Tor"
|
||||
goto error
|
||||
)
|
||||
)
|
||||
copy "%RsBuildPath%\retroshare-service\src\%RsBuildConfig%\retroshare*-service.exe" "%RsDeployPath%" %Quite%
|
||||
|
||||
echo copy extensions
|
||||
if "%ParamPlugins%"=="1" (
|
||||
for /D %%D in ("%RsBuildPath%\plugins\*") do (
|
||||
call :copy_extension "%%D" "%RsDeployPath%\Data\%Extensions%"
|
||||
call :copy_dependencies "%RsDeployPath%\Data\%Extensions%\%%~nxD.dll" "%RsDeployPath%"
|
||||
)
|
||||
for /D %%D in ("%RsBuildPath%\plugins\*") do (
|
||||
call :copy_extension "%%D" "%RsDeployPath%\Data\%Extensions%"
|
||||
call :copy_dependencies "%RsDeployPath%\Data\%Extensions%\%%~nxD.dll" "%RsDeployPath%"
|
||||
)
|
||||
|
||||
echo copy external binaries
|
||||
@ -128,48 +108,37 @@ copy "%BuildLibsPath%\libs\bin\*.dll" "%RsDeployPath%" %Quite%
|
||||
|
||||
echo copy dependencies
|
||||
call :copy_dependencies "%RsDeployPath%\retroshare.exe" "%RsDeployPath%"
|
||||
if exist "%RsDeployPath%\retroshare.dll" call :copy_dependencies "%RsDeployPath%\retroshare.dll" "%RsDeployPath%"
|
||||
|
||||
echo copy Qt DLL's
|
||||
copy "%QtPath%\Qt%QtMainVersion1%Svg%QtMainVersion2%.dll" "%RsDeployPath%" %Quite%
|
||||
|
||||
if %QtMainVersion% GEQ 5 (
|
||||
if "%QtMainVersion%"=="5" (
|
||||
mkdir "%RsDeployPath%\platforms"
|
||||
copy "%QtPath%\..\plugins\platforms\qwindows.dll" "%RsDeployPath%\platforms" %Quite%
|
||||
)
|
||||
|
||||
if "%QtMainVersion%"=="5" (
|
||||
mkdir "%RsDeployPath%\audio"
|
||||
copy "%QtPath%\..\plugins\audio\qtaudio_windows.dll" "%RsDeployPath%\audio" %Quite%
|
||||
)
|
||||
|
||||
echo Copy styles
|
||||
mkdir "%RsDeployPath%\styles" %Quite%
|
||||
if "%QtMainVersion%"=="5" (
|
||||
if exist "%QtPath%\..\plugins\styles\qwindowsvistastyle.dll" (
|
||||
echo Copy styles
|
||||
mkdir "%RsDeployPath%\styles" %Quite%
|
||||
copy "%QtPath%\..\plugins\styles\qwindowsvistastyle.dll" "%RsDeployPath%\styles" %Quite%
|
||||
)
|
||||
if "%QtMainVersion%"=="6" (
|
||||
copy "%QtPath%\..\plugins\styles\qmodernwindowsstyle.dll" "%RsDeployPath%\styles" %Quite%
|
||||
)
|
||||
|
||||
copy "%QtPath%\..\plugins\imageformats\*.dll" "%RsDeployPath%\imageformats" %Quite%
|
||||
del /Q "%RsDeployPath%\imageformats\*d?.dll" %Quite%
|
||||
|
||||
if exist "%SourcePath%\retroshare-gui\src\qss" (
|
||||
echo copy qss
|
||||
xcopy /S "%SourcePath%\retroshare-gui\src\qss" "%RsDeployPath%\qss" %Quite%
|
||||
)
|
||||
echo copy qss
|
||||
xcopy /S "%SourcePath%\retroshare-gui\src\qss" "%RsDeployPath%\qss" %Quite%
|
||||
|
||||
echo copy stylesheets
|
||||
xcopy /S "%SourcePath%\retroshare-gui\src\gui\qss\chat" "%RsDeployPath%\stylesheets" %Quite%
|
||||
rmdir /S /Q "%RsDeployPath%\stylesheets\compact" %Quite%
|
||||
rmdir /S /Q "%RsDeployPath%\stylesheets\standard" %Quite%
|
||||
rmdir /S /Q "%RsDeployPath%\stylesheets\__MACOSX__Bubble" %Quite%
|
||||
|
||||
echo copy sounds
|
||||
xcopy /S "%SourcePath%\retroshare-gui\src\sounds" "%RsDeployPath%\sounds" %Quite%
|
||||
if "%ParamPlugins%"=="1" (
|
||||
xcopy /S "%SourcePath%\plugins\Voip\gui\sounds" "%RsDeployPath%\sounds" %Quite%
|
||||
)
|
||||
|
||||
echo copy license
|
||||
xcopy /S "%SourcePath%\retroshare-gui\src\license" "%RsDeployPath%\license" %Quite%
|
||||
@ -177,12 +146,10 @@ xcopy /S "%SourcePath%\retroshare-gui\src\license" "%RsDeployPath%\license" %Qui
|
||||
echo copy translation
|
||||
copy "%SourcePath%\retroshare-gui\src\translations\qt_tr.qm" "%RsDeployPath%\translations" %Quite%
|
||||
copy "%QtPath%\..\translations\qt_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
if %QtMainVersion% GEQ 5 (
|
||||
copy "%QtPath%\..\translations\qtbase_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
copy "%QtPath%\..\translations\qtmultimedia_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
)
|
||||
if "%QtMainVersion%"=="5" (
|
||||
copy "%QtPath%\..\translations\qtbase_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
copy "%QtPath%\..\translations\qtscript_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
copy "%QtPath%\..\translations\qtmultimedia_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
copy "%QtPath%\..\translations\qtxmlpatterns_*.qm" "%RsDeployPath%\translations" %Quite%
|
||||
)
|
||||
|
||||
@ -192,21 +159,19 @@ copy "%SourcePath%\libbitdht\src\bitdht\bdboot.txt" "%RsDeployPath%" %Quite%
|
||||
echo copy changelog.txt
|
||||
copy "%RsBuildPath%\changelog.txt" "%RsDeployPath%" %Quite%
|
||||
|
||||
if defined ParamWebui (
|
||||
if exist "%SourcePath%\libresapi\src\webui" (
|
||||
echo copy webui
|
||||
mkdir "%RsDeployPath%\webui"
|
||||
xcopy /S "%RsWebuiBuildPath%" "%RsDeployPath%\webui" %Quite%
|
||||
if errorlevel 1 %cecho% error "WebUi not found"& goto error
|
||||
xcopy /S "%SourcePath%\libresapi\src\webui" "%RsDeployPath%\webui" %Quite%
|
||||
)
|
||||
|
||||
if "%ParamTor%"=="1" (
|
||||
echo copy tor
|
||||
if not exist "%RsDeployPath%\tor" mkdir "%RsDeployPath%\tor"
|
||||
echo n | copy /-y "%EnvTorPath%\Tor\*.*" "%RsDeployPath%\tor" %Quite%
|
||||
echo n | copy /-y "%EnvTorPath%\Tor\*.*" "%RsDeployPath%" %Quite%
|
||||
)
|
||||
|
||||
rem pack files
|
||||
title Pack - %SourceName%%RsType%-%RsBuildConfig% Qt-%QtVersion%-%GCCArchitecture% [pack files]
|
||||
title Pack - %SourceName%%RsType%-%RsBuildConfig% [pack files]
|
||||
|
||||
"%EnvSevenZipExe%" a -mx=9 -t7z "%Archive%" "%RsDeployPath%\*"
|
||||
|
||||
@ -231,8 +196,8 @@ endlocal
|
||||
exit /B 1
|
||||
|
||||
:copy_extension
|
||||
if exist "%~1\lib\%~n1.dll" (
|
||||
copy "%~1\lib\%~n1.dll" %2 %Quite%
|
||||
if exist "%~1\%RsBuildConfig%\%~n1.dll" (
|
||||
copy "%~1\%RsBuildConfig%\%~n1.dll" %2 %Quite%
|
||||
)
|
||||
goto :EOF
|
||||
|
||||
|
||||
4
build_scripts/Windows/env/env-msys2.bat
vendored
4
build_scripts/Windows/env/env-msys2.bat
vendored
@ -5,6 +5,7 @@
|
||||
call "%~dp0env.bat"
|
||||
if errorlevel 1 goto error_env
|
||||
|
||||
rem openssl x86 doesn't compile with mingw64 x64
|
||||
:: Get gcc versions
|
||||
call "%ToolsPath%\get-gcc-version.bat" GCCVersion GCCArchitecture
|
||||
if "%GCCVersion%"=="" %cecho% error "Cannot get gcc version." & exit /B 1
|
||||
@ -22,12 +23,11 @@ if "%GCCArchitecture%"=="x64" (
|
||||
)
|
||||
|
||||
set EnvMSYS2Path=%EnvRootPath%\msys2
|
||||
set EnvMSYS2BasePath=%EnvMSYS2Path%\msys64
|
||||
|
||||
call "%~dp0tools\prepare-msys2.bat" %1
|
||||
if errorlevel 1 exit /B %ERRORLEVEL%
|
||||
|
||||
set EnvMSYS2SH=%EnvMSYS2BasePath%\usr\bin\sh.exe
|
||||
set EnvMSYS2SH=%EnvMSYS2Path%\msys%MSYS2Base%\usr\bin\sh.exe
|
||||
if not exist "%EnvMSYS2SH%" if errorlevel 1 goto error_env
|
||||
|
||||
set EnvMSYS2Cmd="%EnvMSYS2SH%" -lc
|
||||
|
||||
3
build_scripts/Windows/env/env.bat
vendored
3
build_scripts/Windows/env/env.bat
vendored
@ -28,9 +28,6 @@ if errorlevel 1 exit /B %ERRORLEVEL%
|
||||
set PATH=%EnvToolsPath%\MinGit\cmd;%EnvToolsPath%\cmake\bin;%PATH%
|
||||
set HOME=%EnvToolsPath%\MinGit\home
|
||||
|
||||
:: Add Doxygen to PATH
|
||||
set PATH=%EnvToolsPath%\doxygen;%PATH%
|
||||
|
||||
exit /B 0
|
||||
|
||||
:error_env
|
||||
|
||||
@ -16,15 +16,7 @@ if "%~1"=="clean" (
|
||||
goto exit
|
||||
)
|
||||
|
||||
set MSYS2Version=20250622
|
||||
|
||||
set MSYS2Install=msys2-base-x86_64-%MSYS2Version%.sfx.exe
|
||||
set MSYS2Url=https://github.com/msys2/msys2-installer/releases/download/%MSYS2Version:~0,4%-%MSYS2Version:~4,2%-%MSYS2Version:~6,2%/%MSYS2Install%
|
||||
set MSYS2UnpackPath=%EnvMSYS2Path%\msys64
|
||||
set CMakeInstall=cmake-3.31.3-windows-i386.zip
|
||||
set CMakeUrl=https://github.com/Kitware/CMake/releases/download/v3.31.3/%CMakeInstall%
|
||||
|
||||
if exist "%MSYS2UnpackPath%\usr\bin\pacman.exe" (
|
||||
if exist "%EnvMSYS2Path%\msys%MSYS2Base%\usr\bin\pacman.exe" (
|
||||
if "%~1"=="reinstall" (
|
||||
choice /M "Found existing MSYS2 version. Do you want to proceed?"
|
||||
if !ERRORLEVEL!==2 goto exit
|
||||
@ -33,12 +25,18 @@ if exist "%MSYS2UnpackPath%\usr\bin\pacman.exe" (
|
||||
)
|
||||
)
|
||||
|
||||
if exist "%MSYS2UnpackPath%" (
|
||||
set MSYS2Install=msys2-base-%MSYS2Architecture%-20190524.tar.xz
|
||||
set MSYS2Url=http://sourceforge.net/projects/msys2/files/Base/%MSYS2Architecture%/%MSYS2Install%/download
|
||||
set CMakeInstall=cmake-3.1.0-win32-x86.zip
|
||||
set CMakeUrl=http://www.cmake.org/files/v3.1/%CMakeInstall%
|
||||
set CMakeUnpackPath=%EnvMSYS2Path%\msys%MSYS2Base%
|
||||
|
||||
if exist "%EnvMSYS2Path%\msys%MSYS2Base%" (
|
||||
%cecho% info "Remove previous MSYS2 version"
|
||||
call "%ToolsPath%\remove-dir.bat" "%MSYS2UnpackPath%"
|
||||
call "%ToolsPath%\remove-dir.bat" "%EnvMSYS2Path%\msys%MSYS2Base%"
|
||||
)
|
||||
|
||||
%cecho% info "Download MSYS2 installation files"
|
||||
%cecho% info "Download installation files"
|
||||
if not exist "%EnvDownloadPath%\%MSYS2Install%" call "%ToolsPath%\download-file.bat" "%MSYS2Url%" "%EnvDownloadPath%\%MSYS2Install%"
|
||||
if not exist "%EnvDownloadPath%\%MSYS2Install%" %cecho% error "Cannot download MSYS" & goto error
|
||||
|
||||
@ -46,32 +44,37 @@ if not exist "%EnvDownloadPath%\%CMakeInstall%" call "%ToolsPath%\download-file.
|
||||
if not exist "%EnvDownloadPath%\%CMakeInstall%" %cecho% error "Cannot download CMake" & goto error
|
||||
|
||||
%cecho% info "Unpack MSYS2"
|
||||
"%EnvDownloadPath%\%MSYS2Install%" -y -o"%EnvMSYS2Path%"
|
||||
"%EnvSevenZipExe%" x -so "%EnvDownloadPath%\%MSYS2Install%" | "%EnvSevenZipExe%" x -y -si -ttar -o"%EnvMSYS2Path%"
|
||||
|
||||
%cecho% info "Unpack CMake"
|
||||
"%EnvSevenZipExe%" x -o"%MSYS2UnpackPath%" "%EnvDownloadPath%\%CMakeInstall%" -y -bso0
|
||||
"%EnvSevenZipExe%" x -o"%CMakeUnpackPath%" "%EnvDownloadPath%\%CMakeInstall%"
|
||||
|
||||
%cecho% info "Install CMake"
|
||||
set CMakeVersion=
|
||||
for /D %%F in (%MSYS2UnpackPath%\cmake*) do set CMakeVersion=%%~nxF
|
||||
for /D %%F in (%CMakeUnpackPath%\cmake*) do set CMakeVersion=%%~nxF
|
||||
if "%CMakeVersion%"=="" %cecho% error "CMake version not found." & goto :exit
|
||||
%cecho% info "Found CMake version %CMakeVersion%"
|
||||
|
||||
set FoundProfile=
|
||||
for /f "tokens=3" %%F in ('find /c /i "%CMakeVersion%" "%MSYS2UnpackPath%\etc\profile"') do set FoundProfile=%%F
|
||||
for /f "tokens=3" %%F in ('find /c /i "%CMakeVersion%" "%EnvMSYS2Path%\msys%MSYS2Base%\etc\profile"') do set FoundProfile=%%F
|
||||
|
||||
if "%FoundProfile%"=="0" (
|
||||
echo export PATH="${PATH}:/%CMakeVersion%/bin">>"%MSYS2UnpackPath%\etc\profile"
|
||||
echo export PATH="${PATH}:/%CMakeVersion%/bin">>"%EnvMSYS2Path%\msys%MSYS2Base%\etc\profile"
|
||||
)
|
||||
|
||||
set MSYS2SH=%MSYS2UnpackPath%\usr\bin\sh
|
||||
set MSYS2SH=%EnvMSYS2Path%\msys%MSYS2Base%\usr\bin\sh
|
||||
|
||||
%cecho% info "Update keyring"
|
||||
"%MSYS2SH%" -lc "curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz"
|
||||
"%MSYS2SH%" -lc "pacman --noconfirm -U msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz"
|
||||
|
||||
%cecho% info "Initialize MSYS2"
|
||||
"%MSYS2SH%" -lc "yes | pacman --noconfirm -Syuu msys2-keyring"
|
||||
"%MSYS2SH%" -lc "pacman --noconfirm -Sy"
|
||||
"%MSYS2SH%" -lc "pacman --noconfirm -Su"
|
||||
"%MSYS2SH%" -lc "pacman -Sy"
|
||||
"%MSYS2SH%" -lc "pacman --noconfirm --needed -S bash pacman pacman-mirrors msys2-runtime"
|
||||
|
||||
call "%MSYS2UnpackPath%\autorebase.bat"
|
||||
call "%EnvMSYS2Path%\msys%MSYS2Base%\autorebase.bat"
|
||||
call "%EnvRootPath%\update-msys2.bat"
|
||||
call "%EnvRootPath%\update-msys2.bat"
|
||||
|
||||
:exit
|
||||
endlocal
|
||||
|
||||
@ -4,8 +4,8 @@ if "%EnvRootPath%"=="" exit /B 1
|
||||
|
||||
set CEchoUrl=https://github.com/lordmulder/cecho/releases/download/2015-10-10/cecho.2015-10-10.zip
|
||||
set CEchoInstall=cecho.2015-10-10.zip
|
||||
set SevenZipUrl=https://www.7-zip.org/a/7z2600-x64.msi
|
||||
set SevenZipInstall=7z2600-x64.msi
|
||||
set SevenZipUrl=https://sourceforge.net/projects/sevenzip/files/7-Zip/19.00/7z1900.msi/download
|
||||
set SevenZipInstall=7z1900.msi
|
||||
set DependsUrl=http://www.dependencywalker.com/depends22_x86.zip
|
||||
set DependsInstall=depends22_x86.zip
|
||||
set UnixToolsUrl=http://unxutils.sourceforge.net/UnxUpdates.zip
|
||||
@ -16,12 +16,9 @@ set NSISInstallPath=%EnvToolsPath%\NSIS
|
||||
set MinGitInstall=MinGit-2.28.0-32-bit.zip
|
||||
set MinGitUrl=https://github.com/git-for-windows/git/releases/download/v2.28.0.windows.1/%MinGitInstall%
|
||||
set MinGitInstallPath=%EnvToolsPath%\MinGit
|
||||
set DoxygenInstall=doxygen-1.9.6.windows.x64.bin.zip
|
||||
set DoxygenUrl=https://github.com/doxygen/doxygen/releases/download/Release_1_9_6/%DoxygenInstall%
|
||||
set DoxygenInstallPath=%EnvToolsPath%\doxygen
|
||||
set CMakeVersion=cmake-3.31.3-windows-i386
|
||||
set CMakeVersion=cmake-3.1.0-win32-x86
|
||||
set CMakeInstall=%CMakeVersion%.zip
|
||||
set CMakeUrl=https://github.com/Kitware/CMake/releases/download/v3.31.3/%CMakeInstall%
|
||||
set CMakeUrl=http://www.cmake.org/files/v3.1/%CMakeInstall%
|
||||
set CMakeInstallPath=%EnvToolsPath%\cmake
|
||||
set TorProjectUrl=https://www.torproject.org
|
||||
set TorDownloadIndexUrl=%TorProjectUrl%/download/tor
|
||||
@ -53,7 +50,7 @@ if not exist "%EnvToolsPath%\cecho.exe" (
|
||||
if not exist "%EnvDownloadPath%\%cCEhoInstall%" echo Cannot download cecho installation& goto error
|
||||
|
||||
echo Unpack cecho
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%CEchoInstall%" -y -bso0
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%CEchoInstall%"
|
||||
copy "%EnvTempPath%\cecho.exe" "%EnvToolsPath%"
|
||||
|
||||
call "%ToolsPath%\remove-dir.bat" "%EnvTempPath%"
|
||||
@ -69,7 +66,7 @@ if not exist "%EnvToolsPath%\depends.exe" (
|
||||
if not exist "%EnvDownloadPath%\%DependsInstall%" %cecho% error "Cannot download Dependendy Walker installation" & goto error
|
||||
|
||||
%cecho% info "Unpack Dependency Walker"
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%DependsInstall%" -y -bso0
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%DependsInstall%"
|
||||
copy "%EnvTempPath%\*" "%EnvToolsPath%"
|
||||
|
||||
call "%ToolsPath%\remove-dir.bat" "%EnvTempPath%"
|
||||
@ -85,7 +82,7 @@ if not exist "%EnvToolsPath%\cut.exe" (
|
||||
if not exist "%EnvDownloadPath%\%UnixToolsInstall%" %cecho% error "Cannot download Unix Tools installation" & goto error
|
||||
|
||||
%cecho% info "Unpack Unix Tools"
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%UnixToolsInstall%" -y -bso0
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%UnixToolsInstall%"
|
||||
copy "%EnvTempPath%\cut.exe" "%EnvToolsPath%"
|
||||
|
||||
call "%ToolsPath%\remove-dir.bat" "%EnvTempPath%"
|
||||
@ -101,7 +98,7 @@ if not exist "%EnvToolsPath%\sed.exe" (
|
||||
if not exist "%EnvDownloadPath%\%UnixToolsInstall%" %cecho% error "Cannot download Unix Tools installation" & goto error
|
||||
|
||||
%cecho% info "Unpack Unix Tools"
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%UnixToolsInstall%" -y -bso0
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%UnixToolsInstall%"
|
||||
copy "%EnvTempPath%\sed.exe" "%EnvToolsPath%"
|
||||
|
||||
call "%ToolsPath%\remove-dir.bat" "%EnvTempPath%"
|
||||
@ -121,7 +118,7 @@ if not exist "%NSISInstallPath%\nsis.exe" (
|
||||
if not exist "%EnvDownloadPath%\%NSISInstall%" %cecho% error "Cannot download NSIS installation" & goto error
|
||||
|
||||
%cecho% info "Unpack NSIS"
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%NSISInstall%" -y -bso0
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%NSISInstall%"
|
||||
if not exist "%NSISInstallPath%" mkdir "%NSISInstallPath%"
|
||||
xcopy /s "%EnvTempPath%" "%NSISInstallPath%"
|
||||
|
||||
@ -135,20 +132,7 @@ if not exist "%MinGitInstallPath%\cmd\git.exe" (
|
||||
if not exist "%EnvDownloadPath%\%MinGitInstall%" %cecho% error "Cannot download MinGit installation" & goto error
|
||||
|
||||
%cecho% info "Unpack MinGit"
|
||||
"%EnvSevenZipExe%" x -o"%MinGitInstallPath%" "%EnvDownloadPath%\%MinGitInstall%" -y -bso0
|
||||
)
|
||||
|
||||
if not exist "%EnvDownloadPath%\%DoxygenInstall%" call "%ToolsPath%\remove-dir.bat" "%DoxygenInstallPath%"
|
||||
if not exist "%DoxygenInstallPath%\doxygen.exe" (
|
||||
if exist "%DoxygenInstallPath%" call "%ToolsPath%\remove-dir.bat" "%DoxygenInstallPath%"
|
||||
|
||||
%cecho% info "Download Doxygen installation"
|
||||
|
||||
if not exist "%EnvDownloadPath%\%DoxygenInstall%" call "%ToolsPath%\download-file.bat" "%DoxygenUrl%" "%EnvDownloadPath%\%DoxygenInstall%"
|
||||
if not exist "%EnvDownloadPath%\%DoxygenInstall%" %cecho% error "Cannot download doxygen installation" & goto error
|
||||
|
||||
%cecho% info "Unpack Doxygen"
|
||||
"%EnvSevenZipExe%" x -o"%DoxygenInstallPath%" "%EnvDownloadPath%\%DoxygenInstall%" -y -bso0
|
||||
"%EnvSevenZipExe%" x -o"%MinGitInstallPath%" "%EnvDownloadPath%\%MinGitInstall%"
|
||||
)
|
||||
|
||||
if not exist "%EnvDownloadPath%\%CMakeInstall%" call "%ToolsPath%\remove-dir.bat" "%CMakeInstallPath%"
|
||||
@ -163,7 +147,7 @@ if not exist "%CMakeInstallPath%\bin\cmake.exe" (
|
||||
if not exist "%EnvDownloadPath%\%CMakeInstall%" %cecho% error "Cannot download CMake installation" & goto error
|
||||
|
||||
%cecho% info "Unpack CMake"
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%CMakeInstall%" -y -bso0
|
||||
"%EnvSevenZipExe%" x -o"%EnvTempPath%" "%EnvDownloadPath%\%CMakeInstall%"
|
||||
|
||||
move "%EnvTempPath%\%CMakeVersion%" "%CMakeInstallPath%"
|
||||
|
||||
@ -176,7 +160,7 @@ mkdir "%EnvTempPath%"
|
||||
call "%ToolsPath%\download-file.bat" "%TorDownloadIndexUrl%" "%EnvTempPath%\index.html"
|
||||
if not exist "%EnvTempPath%\index.html" %cecho% error "Cannot download Tor installation" & goto error
|
||||
|
||||
for /F "tokens=1,2 delims= " %%A in ('%EnvSedExe% -r -n -e"s/.*href=\"^(.*^)^(tor-.*windows-i686.*\.tar\.gz^)\".*/\2 \1\2/p" "%EnvTempPath%\index.html"') do set TorInstall=%%A& set TorDownloadUrl=%%B
|
||||
for /F "tokens=1,2 delims= " %%A in ('%EnvSedExe% -r -n -e"s/.*href=\"^(.*^)^(tor-win32.*\.zip^)\".*/\2 \1\2/p" "%EnvTempPath%\index.html"') do set TorInstall=%%A& set TorDownloadUrl=%TorProjectUrl%%%B
|
||||
call "%ToolsPath%\remove-dir.bat" "%EnvTempPath%"
|
||||
if "%TorInstall%"=="" %cecho% error "Cannot download Tor installation" & goto error
|
||||
if "%TorDownloadUrl%"=="" %cecho% error "Cannot download Tor installation" & goto error
|
||||
@ -189,7 +173,7 @@ if not exist "%EnvTorPath%\Tor\tor.exe" (
|
||||
if not exist "%EnvDownloadPath%\%TorInstall%" %cecho% error "Cannot download Tor installation" & goto error
|
||||
|
||||
%cecho% info "Unpack Tor"
|
||||
"%EnvSevenZipExe%" x -so "%EnvDownloadPath%\%TorInstall%" | "%EnvSevenZipExe%" x -si -ttar -o"%EnvTorPath%" -y -bso0
|
||||
"%EnvSevenZipExe%" x -o"%EnvTorPath%" "%EnvDownloadPath%\%TorInstall%"
|
||||
)
|
||||
|
||||
:exit
|
||||
|
||||
@ -2,13 +2,18 @@
|
||||
|
||||
setlocal
|
||||
|
||||
if not exist "%~dp0msys2\msys64" goto :EOF
|
||||
if exist "%~dp0msys2\msys32" call :update 32
|
||||
if exist "%~dp0msys2\msys64" call :update 64
|
||||
|
||||
set MSYS2SH=%~dp0msys2\msys64\usr\bin\sh
|
||||
goto :EOF
|
||||
|
||||
echo Update MSYS2
|
||||
"%MSYS2SH%" -lc "yes | pacman --noconfirm -Syuu msys2-keyring"
|
||||
"%MSYS2SH%" -lc "pacman --noconfirm -Su"
|
||||
:update
|
||||
set MSYSSH=%~dp0msys2\msys%~1\usr\bin\sh
|
||||
|
||||
echo Update MSYS2 %~1
|
||||
"%MSYSSH%" -lc "pacman -Sy"
|
||||
"%MSYSSH%" -lc "pacman --noconfirm -Su"
|
||||
|
||||
:exit
|
||||
endlocal
|
||||
goto :EOF
|
||||
|
||||
@ -2,12 +2,6 @@
|
||||
!insertmacro LANG_STRING Section_Main_Desc "Instal·la ${APPNAME} i els components necessaris."
|
||||
!insertmacro LANG_STRING Section_Tor "Tor"
|
||||
!insertmacro LANG_STRING Section_Tor_Desc "Installs Tor."
|
||||
!insertmacro LANG_STRING Section_WebUI "WebUI"
|
||||
!insertmacro LANG_STRING Section_WebUI_Desc "Installs WebUI."
|
||||
!insertmacro LANG_STRING Section_Service "Service"
|
||||
!insertmacro LANG_STRING Section_Service_Desc "Installs Service."
|
||||
!insertmacro LANG_STRING Section_FriendServer "Friend Server"
|
||||
!insertmacro LANG_STRING Section_FriendServer_Desc "Installs Friend Server."
|
||||
!insertmacro LANG_STRING Section_Data "Pells"
|
||||
!insertmacro LANG_STRING Section_Data_Desc "Instal·la pells."
|
||||
!insertmacro LANG_STRING Section_Shortcuts "Icones d'accés directe"
|
||||
|
||||
@ -2,12 +2,6 @@
|
||||
!insertmacro LANG_STRING Section_Main_Desc "Installiert ${APPNAME} und die benötigten Komponenten."
|
||||
!insertmacro LANG_STRING Section_Tor "Tor"
|
||||
!insertmacro LANG_STRING Section_Tor_Desc "Installiert Tor."
|
||||
!insertmacro LANG_STRING Section_WebUI "WebUI"
|
||||
!insertmacro LANG_STRING Section_WebUI_Desc "Installiert WebUI."
|
||||
!insertmacro LANG_STRING Section_Service "Service"
|
||||
!insertmacro LANG_STRING Section_Service_Desc "Installiert Service."
|
||||
!insertmacro LANG_STRING Section_FriendServer "Friend Server"
|
||||
!insertmacro LANG_STRING Section_FriendServer_Desc "Installiert Friend Server."
|
||||
!insertmacro LANG_STRING Section_Data "Skins"
|
||||
!insertmacro LANG_STRING Section_Data_Desc "Skins installieren."
|
||||
!insertmacro LANG_STRING Section_Shortcuts "Verknüpfungssymbole"
|
||||
|
||||
@ -2,12 +2,6 @@
|
||||
!insertmacro LANG_STRING Section_Main_Desc "Installs ${APPNAME} and required components."
|
||||
!insertmacro LANG_STRING Section_Tor "Tor"
|
||||
!insertmacro LANG_STRING Section_Tor_Desc "Installs Tor."
|
||||
!insertmacro LANG_STRING Section_WebUI "WebUI"
|
||||
!insertmacro LANG_STRING Section_WebUI_Desc "Installs WebUI."
|
||||
!insertmacro LANG_STRING Section_Service "Service"
|
||||
!insertmacro LANG_STRING Section_Service_Desc "Installs Service."
|
||||
!insertmacro LANG_STRING Section_FriendServer "Friend Server"
|
||||
!insertmacro LANG_STRING Section_FriendServer_Desc "Installs Friend Server."
|
||||
!insertmacro LANG_STRING Section_Data "Skins"
|
||||
!insertmacro LANG_STRING Section_Data_Desc "Installs skins."
|
||||
!insertmacro LANG_STRING Section_Shortcuts "Shortcut icons"
|
||||
|
||||
@ -2,12 +2,6 @@
|
||||
!insertmacro LANG_STRING Section_Main_Desc "Instala ${APPNAME} y los componentes requeridos."
|
||||
!insertmacro LANG_STRING Section_Tor "Tor"
|
||||
!insertmacro LANG_STRING Section_Tor_Desc "Installs Tor."
|
||||
!insertmacro LANG_STRING Section_WebUI "WebUI"
|
||||
!insertmacro LANG_STRING Section_WebUI_Desc "Installs WebUI."
|
||||
!insertmacro LANG_STRING Section_Service "Service"
|
||||
!insertmacro LANG_STRING Section_Service_Desc "Installs Service."
|
||||
!insertmacro LANG_STRING Section_FriendServer "Friend Server"
|
||||
!insertmacro LANG_STRING Section_FriendServer_Desc "Installs Friend Server."
|
||||
!insertmacro LANG_STRING Section_Data "Coberturas (skins)"
|
||||
!insertmacro LANG_STRING Section_Data_Desc "Instalar coberturas"
|
||||
!insertmacro LANG_STRING Section_Shortcuts "Iconos de accesos directos"
|
||||
|
||||
@ -2,12 +2,6 @@
|
||||
!insertmacro LANG_STRING Section_Main_Desc "Installe ${APPNAME} et les composants requis."
|
||||
!insertmacro LANG_STRING Section_Tor "Tor"
|
||||
!insertmacro LANG_STRING Section_Tor_Desc "Installs Tor."
|
||||
!insertmacro LANG_STRING Section_WebUI "WebUI"
|
||||
!insertmacro LANG_STRING Section_WebUI_Desc "Installs WebUI."
|
||||
!insertmacro LANG_STRING Section_Service "Service"
|
||||
!insertmacro LANG_STRING Section_Service_Desc "Installs Service."
|
||||
!insertmacro LANG_STRING Section_FriendServer "Friend Server"
|
||||
!insertmacro LANG_STRING Section_FriendServer_Desc "Installs Friend Server."
|
||||
!insertmacro LANG_STRING Section_Data "Habillages"
|
||||
!insertmacro LANG_STRING Section_Data_Desc "Installe des habillages."
|
||||
!insertmacro LANG_STRING Section_Shortcuts "Icônes de raccourci"
|
||||
|
||||
@ -2,12 +2,6 @@
|
||||
!insertmacro LANG_STRING Section_Main_Desc "Instaluje ${APPNAME} oraz wymagane komponenty."
|
||||
!insertmacro LANG_STRING Section_Tor "Tor"
|
||||
!insertmacro LANG_STRING Section_Tor_Desc "Installs Tor."
|
||||
!insertmacro LANG_STRING Section_WebUI "WebUI"
|
||||
!insertmacro LANG_STRING Section_WebUI_Desc "Installs WebUI."
|
||||
!insertmacro LANG_STRING Section_Service "Service"
|
||||
!insertmacro LANG_STRING Section_Service_Desc "Installs Service."
|
||||
!insertmacro LANG_STRING Section_FriendServer "Friend Server"
|
||||
!insertmacro LANG_STRING Section_FriendServer_Desc "Installs Friend Server."
|
||||
!insertmacro LANG_STRING Section_Data "Skórki"
|
||||
!insertmacro LANG_STRING Section_Data_Desc "Instaluje skórki."
|
||||
!insertmacro LANG_STRING Section_Shortcuts "Ikony skrótów"
|
||||
|
||||
@ -2,12 +2,6 @@
|
||||
!insertmacro LANG_STRING Section_Main_Desc "Установка ${APPNAME} и необходимых компонентов."
|
||||
!insertmacro LANG_STRING Section_Tor "Tor"
|
||||
!insertmacro LANG_STRING Section_Tor_Desc "Installs Tor."
|
||||
!insertmacro LANG_STRING Section_WebUI "WebUI"
|
||||
!insertmacro LANG_STRING Section_WebUI_Desc "Installs WebUI."
|
||||
!insertmacro LANG_STRING Section_Service "Service"
|
||||
!insertmacro LANG_STRING Section_Service_Desc "Installs Service."
|
||||
!insertmacro LANG_STRING Section_FriendServer "Friend Server"
|
||||
!insertmacro LANG_STRING Section_FriendServer_Desc "Installs Friend Server."
|
||||
!insertmacro LANG_STRING Section_Data "Оболочки"
|
||||
!insertmacro LANG_STRING Section_Data_Desc "Установка оболочек."
|
||||
!insertmacro LANG_STRING Section_Shortcuts "Ярлыки"
|
||||
|
||||
@ -2,12 +2,6 @@
|
||||
!insertmacro LANG_STRING Section_Main_Desc "${APPNAME} ve gerekli bileşenleri kurar."
|
||||
!insertmacro LANG_STRING Section_Tor "Tor"
|
||||
!insertmacro LANG_STRING Section_Tor_Desc "Installs Tor."
|
||||
!insertmacro LANG_STRING Section_WebUI "WebUI"
|
||||
!insertmacro LANG_STRING Section_WebUI_Desc "Installs WebUI."
|
||||
!insertmacro LANG_STRING Section_Service "Service"
|
||||
!insertmacro LANG_STRING Section_Service_Desc "Installs Service."
|
||||
!insertmacro LANG_STRING Section_FriendServer "Friend Server"
|
||||
!insertmacro LANG_STRING Section_FriendServer_Desc "Installs Friend Server."
|
||||
!insertmacro LANG_STRING Section_Data "Temalar"
|
||||
!insertmacro LANG_STRING Section_Data_Desc "Tema yükleyin."
|
||||
!insertmacro LANG_STRING Section_Shortcuts "Kısayol simgeleri"
|
||||
|
||||
@ -22,48 +22,6 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Section_WebUI</name>
|
||||
<message>
|
||||
<source>WebUI</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Section_WebUI_Desc</name>
|
||||
<message>
|
||||
<source>Installs WebUI.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Section_Service</name>
|
||||
<message>
|
||||
<source>Service</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Section_Service_Desc</name>
|
||||
<message>
|
||||
<source>Installs Service.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Section_FriendServer</name>
|
||||
<message>
|
||||
<source>Friend Server</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Section_FriendServer_Desc</name>
|
||||
<message>
|
||||
<source>Installs Friend Server.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Section_Data</name>
|
||||
<message>
|
||||
|
||||
@ -2,12 +2,6 @@
|
||||
!insertmacro LANG_STRING Section_Main_Desc "Installs ${APPNAME} and required components."
|
||||
!insertmacro LANG_STRING Section_Tor "Tor"
|
||||
!insertmacro LANG_STRING Section_Tor_Desc "Installs Tor."
|
||||
!insertmacro LANG_STRING Section_WebUI "WebUI"
|
||||
!insertmacro LANG_STRING Section_WebUI_Desc "Installs WebUI."
|
||||
!insertmacro LANG_STRING Section_Service "Service"
|
||||
!insertmacro LANG_STRING Section_Service_Desc "Installs Service."
|
||||
!insertmacro LANG_STRING Section_FriendServer "Friend Server"
|
||||
!insertmacro LANG_STRING Section_FriendServer_Desc "Installs Friend Server."
|
||||
!insertmacro LANG_STRING Section_Data "皮肤"
|
||||
!insertmacro LANG_STRING Section_Data_Desc "安装皮肤"
|
||||
!insertmacro LANG_STRING Section_Shortcuts "快捷方式图标"
|
||||
|
||||
@ -60,9 +60,6 @@
|
||||
!define /date DATE "%Y%m%d"
|
||||
!endif
|
||||
|
||||
# Service
|
||||
${!defineifexist} SERVICE_EXISTS "${RELEASEDIR}\retroshare-service\src\release\retroshare-service.exe"
|
||||
|
||||
# Tor
|
||||
!ifdef TORDIR
|
||||
${!defineifexist} TOR_EXISTS "${TORDIR}\tor.exe"
|
||||
@ -71,20 +68,6 @@ ${!defineifexist} TOR_EXISTS "${TORDIR}\tor.exe"
|
||||
!endif
|
||||
!endif
|
||||
|
||||
# WebUI
|
||||
!ifdef WEBUIDIR
|
||||
${!defineifexist} WEBUI_EXISTS "${WEBUIDIR}\index.html"
|
||||
!ifndef WEBUI_EXISTS
|
||||
!error "WebUI files not found"
|
||||
!endif
|
||||
!endif
|
||||
|
||||
# Friend Server
|
||||
!ifdef TOR_EXISTS
|
||||
# Add Friend Server with Tor only
|
||||
#${!defineifexist} FRIENDSERVER_EXISTS "${RELEASEDIR}\retroshare-friendserver\src\release\retroshare-friendserver.exe"
|
||||
!endif
|
||||
|
||||
# Application name and version
|
||||
!define APPNAME "RetroShare"
|
||||
!define APPNAMEANDVERSION "${APPNAME} ${VERSION}"
|
||||
@ -209,8 +192,8 @@ Section $(Section_Main) Section_Main
|
||||
|
||||
; Main binaries
|
||||
SetOutPath "$INSTDIR"
|
||||
File "${RELEASEDIR}\retroshare-gui\src\release\retroshare.exe"
|
||||
File /nonfatal "${RELEASEDIR}\libretroshare\src\lib\retroshare.dll"
|
||||
File /oname=retroshare.exe "${RELEASEDIR}\retroshare-gui\src\release\retroshare.exe"
|
||||
File /oname=retroshare-service.exe "${RELEASEDIR}\retroshare-service\src\release\retroshare-service.exe"
|
||||
|
||||
; Qt binaries
|
||||
File "${QTDIR}\bin\Qt5Core.dll"
|
||||
@ -232,7 +215,7 @@ Section $(Section_Main) Section_Main
|
||||
|
||||
; Qt styles
|
||||
SetOutPath "$INSTDIR\styles"
|
||||
File "${QTDIR}\plugins\styles\qwindowsvistastyle.dll"
|
||||
File /NONFATAL "${QTDIR}\plugins\styles\qwindowsvistastyle.dll"
|
||||
|
||||
; MinGW binaries
|
||||
SetOutPath "$INSTDIR"
|
||||
@ -247,7 +230,6 @@ Section $(Section_Main) Section_Main
|
||||
|
||||
; External binaries
|
||||
File "${EXTERNAL_LIB_DIR}\bin\miniupnpc.dll"
|
||||
File "${RELEASEDIR}\supportlibs\librnp\Build\src\lib\librnp.dll"
|
||||
!if ${ARCHITECTURE} == "x86"
|
||||
File "${EXTERNAL_LIB_DIR}\bin\libcrypto-1_1.dll"
|
||||
File "${EXTERNAL_LIB_DIR}\bin\libssl-1_1.dll"
|
||||
@ -299,41 +281,17 @@ Section $(Section_Main) Section_Main
|
||||
File /r "${SOURCEDIR}\retroshare-gui\src\license\*.*"
|
||||
SectionEnd
|
||||
|
||||
# Service
|
||||
!ifdef SERVICE_EXISTS
|
||||
Section /o $(Section_Service) Section_Service
|
||||
SetOutPath "$INSTDIR"
|
||||
File "${RELEASEDIR}\retroshare-service\src\release\retroshare-service.exe"
|
||||
SectionEnd
|
||||
!endif
|
||||
|
||||
# Friend Server
|
||||
!ifdef FRIENDSERVER_EXISTS
|
||||
Section /o $(Section_FriendServer) Section_FriendServer
|
||||
SetOutPath "$INSTDIR"
|
||||
File "${RELEASEDIR}\retroshare-friendserver\src\release\retroshare-friendserver.exe"
|
||||
SectionEnd
|
||||
!endif
|
||||
|
||||
# Tor
|
||||
!ifdef TOR_EXISTS
|
||||
Section /o $(Section_Tor) Section_Tor
|
||||
SetOutPath "$INSTDIR\tor"
|
||||
File "${TORDIR}\*"
|
||||
SectionEnd
|
||||
!endif
|
||||
|
||||
# WebUI
|
||||
!ifdef WEBUI_EXISTS
|
||||
Section /o $(Section_WebUI) Section_WebUI
|
||||
SetOutPath "$INSTDIR\webui"
|
||||
File /r "${WEBUIDIR}\*"
|
||||
SetOutPath "$INSTDIR"
|
||||
File /r "${TORDIR}\*"
|
||||
SectionEnd
|
||||
!endif
|
||||
|
||||
# Plugins
|
||||
${!defineifexist} PLUGIN_FEEDREADER_EXISTS "${RELEASEDIR}\plugins\FeedReader\lib\FeedReader.dll"
|
||||
${!defineifexist} PLUGIN_VOIP_EXISTS "${RELEASEDIR}\plugins\VOIP\lib\VOIP.dll"
|
||||
${!defineifexist} PLUGIN_FEEDREADER_EXISTS "${RELEASEDIR}\plugins\FeedReader\release\FeedReader.dll"
|
||||
${!defineifexist} PLUGIN_VOIP_EXISTS "${RELEASEDIR}\plugins\VOIP\release\VOIP.dll"
|
||||
|
||||
!ifdef PLUGIN_FEEDREADER_EXISTS
|
||||
!define /ifndef PLUGIN_EXISTS
|
||||
@ -347,16 +305,14 @@ ${!defineifexist} PLUGIN_VOIP_EXISTS "${RELEASEDIR}\plugins\VOIP\lib\VOIP.dll"
|
||||
!ifdef PLUGIN_FEEDREADER_EXISTS
|
||||
Section $(Section_Plugin_FeedReader) Section_Plugin_FeedReader
|
||||
SetOutPath "$DataDir\extensions6"
|
||||
File "${RELEASEDIR}\plugins\FeedReader\lib\FeedReader.dll"
|
||||
File "${RELEASEDIR}\plugins\FeedReader\release\FeedReader.dll"
|
||||
SectionEnd
|
||||
!endif
|
||||
|
||||
!ifdef PLUGIN_VOIP_EXISTS
|
||||
Section $(Section_Plugin_VOIP) Section_Plugin_VOIP
|
||||
SetOutPath "$DataDir\extensions6"
|
||||
File "${RELEASEDIR}\plugins\VOIP\lib\VOIP.dll"
|
||||
SetOutPath "$INSTDIR\sounds"
|
||||
File /r "${SOURCEDIR}\plugins\VOIP\gui\sounds\*.*"
|
||||
File "${RELEASEDIR}\plugins\VOIP\release\VOIP.dll"
|
||||
SectionEnd
|
||||
!endif
|
||||
SectionGroupEnd
|
||||
@ -375,7 +331,7 @@ Section $(Section_Data) Section_Data
|
||||
|
||||
; Stylesheets
|
||||
SetOutPath "$INSTDIR\qss"
|
||||
File /nonfatal /r "${SOURCEDIR}\retroshare-gui\src\qss\*.*"
|
||||
File /r "${SOURCEDIR}\retroshare-gui\src\qss\*.*"
|
||||
SectionEnd
|
||||
|
||||
;Section $(Section_Link) Section_Link
|
||||
@ -396,22 +352,6 @@ Section $(Section_StartMenu) Section_StartMenu
|
||||
CreateDirectory "$SMPROGRAMS\${APPNAME}"
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\$(Link_Uninstall).lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk" "$INSTDIR\retroshare.exe" "" "$INSTDIR\retroshare.exe" 0
|
||||
|
||||
!ifdef SERVICE_EXISTS
|
||||
SectionGetFlags ${Section_Service} $0
|
||||
IntOp $0 $0 & ${SF_SELECTED}
|
||||
${If} $0 == ${SF_SELECTED}
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME} Service.lnk" "$INSTDIR\retroshare-service.exe" "" "$INSTDIR\retroshare-service.exe" 0
|
||||
${EndIf}
|
||||
!endif
|
||||
|
||||
!ifdef FRIENDSERVER_EXISTS
|
||||
SectionGetFlags ${Section_FriendServer} $0
|
||||
IntOp $0 $0 & ${SF_SELECTED}
|
||||
${If} $0 == ${SF_SELECTED}
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME} Friend Server.lnk" "$INSTDIR\retroshare-friendserver.exe" "" "$INSTDIR\retroshare-friendserver.exe" 0
|
||||
${EndIf}
|
||||
!endif
|
||||
SectionEnd
|
||||
|
||||
Section $(Section_Desktop) Section_Desktop
|
||||
@ -464,9 +404,6 @@ SectionEnd
|
||||
; !insertmacro MUI_DESCRIPTION_TEXT ${Section_Link} $(Section_Link_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_AutoStart} $(Section_AutoStart_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Tor} $(Section_Tor_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_WebUI} $(Section_WebUI_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Service} $(Section_Service_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_FriendServer} $(Section_FriendServer_Desc)
|
||||
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
||||
|
||||
# Uninstall
|
||||
@ -521,26 +458,6 @@ Function .onInit
|
||||
!insertmacro MUI_LANGDLL_DISPLAY
|
||||
FunctionEnd
|
||||
|
||||
!ifdef FRIENDSERVER_EXISTS
|
||||
Function .onSelChange
|
||||
SectionGetFlags ${Section_FriendServer} $0
|
||||
IntOp $0 $0 & ${SF_SELECTED}
|
||||
${If} $0 == ${SF_SELECTED}
|
||||
# Activate Tor and set readonly
|
||||
SectionGetFlags ${Section_Tor} $1
|
||||
IntOp $1 $1 | ${SF_SELECTED}
|
||||
IntOp $1 $1 | ${SF_RO}
|
||||
SectionSetFlags ${Section_Tor} $1
|
||||
${Else}
|
||||
# Remove readonly from Tor
|
||||
SectionGetFlags ${Section_Tor} $1
|
||||
IntOp $2 ${SF_RO} ~
|
||||
IntOp $1 $1 & $2
|
||||
SectionSetFlags ${Section_Tor} $1
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
!endif
|
||||
|
||||
# Installation mode
|
||||
|
||||
Function RequireAdmin
|
||||
|
||||
@ -1,622 +0,0 @@
|
||||
; Script generated with the Venis Install Wizard & modified by defnax
|
||||
; Reworked by Thunder
|
||||
|
||||
!include ifexist.nsh
|
||||
|
||||
# Needed defines
|
||||
;!define REVISION ""
|
||||
;!define RELEASEDIR ""
|
||||
;!define QTDIR ""
|
||||
;!define MINGWDIR ""
|
||||
|
||||
# Optional defines
|
||||
;!define OUTDIR ""
|
||||
|
||||
# Check needed defines
|
||||
!ifndef RELEASEDIR
|
||||
!error "RELEASEDIR is not defined"
|
||||
!endif
|
||||
!ifndef QTDIR
|
||||
!error "QTDIR is not defined"
|
||||
!endif
|
||||
!ifndef MINGWDIR
|
||||
!error "MINGWDIR is not defined"
|
||||
!endif
|
||||
!ifndef ARCHITECTURE
|
||||
!error "Architecture is not defined"
|
||||
!endif
|
||||
|
||||
# Check optional defines
|
||||
!ifdef OUTDIR
|
||||
!define OUTDIR_ "${OUTDIR}\"
|
||||
!else
|
||||
!define OUTDIR ""
|
||||
!define OUTDIR_ ""
|
||||
!endif
|
||||
|
||||
!ifndef INSTALLERADD
|
||||
!define INSTALLERADD ""
|
||||
!endif
|
||||
|
||||
# Source directory
|
||||
!define SOURCEDIR "..\..\.."
|
||||
|
||||
# Get version from executable
|
||||
!GetDllVersion "${RELEASEDIR}\retroshare-gui\src\release\retroshare.exe" VERSION_
|
||||
!define VERSION ${VERSION_1}.${VERSION_2}.${VERSION_3}
|
||||
;!define REVISION ${VERSION_4}
|
||||
|
||||
# Get version of Qt
|
||||
!GetDllVersion "${QTDIR}\bin\Qt6Core.dll" QTVERSION_
|
||||
!define QTVERSION ${QTVERSION_1}.${QTVERSION_2}.${QTVERSION_3}
|
||||
|
||||
# Check version
|
||||
!ifndef REVISION
|
||||
!error "REVISION is not defined"
|
||||
!endif
|
||||
|
||||
# Date
|
||||
!ifndef DATE
|
||||
!define /date DATE "%Y%m%d"
|
||||
!endif
|
||||
|
||||
# Service
|
||||
${!defineifexist} SERVICE_EXISTS "${RELEASEDIR}\retroshare-service\src\release\retroshare-service.exe"
|
||||
|
||||
# Tor
|
||||
!ifdef TORDIR
|
||||
${!defineifexist} TOR_EXISTS "${TORDIR}\tor.exe"
|
||||
!ifndef TOR_EXISTS
|
||||
!error "tor.exe not found"
|
||||
!endif
|
||||
!endif
|
||||
|
||||
# WebUI
|
||||
!ifdef WEBUIDIR
|
||||
${!defineifexist} WEBUI_EXISTS "${WEBUIDIR}\index.html"
|
||||
!ifndef WEBUI_EXISTS
|
||||
!error "WebUI files not found"
|
||||
!endif
|
||||
!endif
|
||||
|
||||
# Friend Server
|
||||
!ifdef TOR_EXISTS
|
||||
# Add Friend Server with Tor only
|
||||
#${!defineifexist} FRIENDSERVER_EXISTS "${RELEASEDIR}\retroshare-friendserver\src\release\retroshare-friendserver.exe"
|
||||
!endif
|
||||
|
||||
# Application name and version
|
||||
!define APPNAME "RetroShare"
|
||||
!define APPNAMEANDVERSION "${APPNAME} ${VERSION}"
|
||||
!define PUBLISHER "RetroShare Team"
|
||||
|
||||
# Install path
|
||||
!if ${ARCHITECTURE} == "x86"
|
||||
!define INSTDIR_NORMAL "$ProgramFiles32\${APPNAME}"
|
||||
!endif
|
||||
!if ${ARCHITECTURE} == "x64"
|
||||
!define INSTDIR_NORMAL "$ProgramFiles64\${APPNAME}"
|
||||
!endif
|
||||
!define INSTDIR_PORTABLE "$Desktop\${APPNAME}"
|
||||
|
||||
!define DATADIR_NORMAL "$APPDATA\${APPNAME}"
|
||||
!define DATADIR_PORTABLE "$INSTDIR\Data"
|
||||
|
||||
# Main Install settings
|
||||
Name "${APPNAMEANDVERSION}"
|
||||
InstallDirRegKey HKLM "Software\${APPNAME}" ""
|
||||
OutFile "${OUTDIR_}RetroShare-${VERSION}-${DATE}-${REVISION}-Qt-${QTVERSION}-${ARCHITECTURE}${INSTALLERADD}-setup.exe"
|
||||
BrandingText "${APPNAMEANDVERSION}"
|
||||
RequestExecutionlevel highest
|
||||
# Use compression
|
||||
SetCompressor /SOLID LZMA
|
||||
|
||||
# Global variables
|
||||
Var PortableMode
|
||||
Var InstDirNormal
|
||||
Var InstDirPortable
|
||||
Var DataDir
|
||||
Var StyleSheetDir
|
||||
|
||||
# Modern interface settings
|
||||
!include Sections.nsh
|
||||
!include nsDialogs.nsh
|
||||
!include "MUI.nsh"
|
||||
|
||||
# Interface Settings
|
||||
!define MUI_ABORTWARNING
|
||||
!define MUI_HEADERIMAGE
|
||||
!define MUI_HEADERIMAGE_BITMAP "${SOURCEDIR}\build_scripts\Windows\installer\HeaderImage.bmp"
|
||||
;!define MUI_WELCOMEFINISHPAGE_BITMAP "...bmp"
|
||||
|
||||
# MUI defines
|
||||
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"
|
||||
!define MUI_FINISHPAGE_NOAUTOCLOSE
|
||||
!define MUI_LICENSEPAGE_RADIOBUTTONS
|
||||
!define MUI_COMPONENTSPAGE_SMALLDESC
|
||||
!define MUI_FINISHPAGE_LINK "Visit the RetroShare forum for the latest news and support"
|
||||
!define MUI_FINISHPAGE_LINK_LOCATION "http://retroshare.sourceforge.net/forum/"
|
||||
!define MUI_FINISHPAGE_RUN "$INSTDIR\retroshare.exe"
|
||||
!define MUI_FINISHPAGE_SHOWREADME $INSTDIR\changelog.txt
|
||||
!define MUI_FINISHPAGE_SHOWREADME_TEXT changelog.txt
|
||||
;!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
|
||||
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"
|
||||
!define MUI_UNFINISHPAGE_NOAUTOCLOSE
|
||||
;!define MUI_LANGDLL_REGISTRY_ROOT HKLM
|
||||
;!define MUI_LANGDLL_REGISTRY_KEY ${REGKEY}
|
||||
;!define MUI_LANGDLL_REGISTRY_VALUENAME InstallerLanguage
|
||||
|
||||
# Defines the un-/installer logo of RetroShare
|
||||
!insertmacro MUI_DEFAULT MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
|
||||
!insertmacro MUI_DEFAULT MUI_UNWELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange-uninstall.bmp"
|
||||
|
||||
# Installer pages
|
||||
!insertmacro MUI_PAGE_WELCOME
|
||||
!insertmacro MUI_PAGE_LICENSE "$(myLicenseData)"
|
||||
Page Custom PortableModePageCreate PortableModePageLeave
|
||||
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE dir_leave
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
!insertmacro MUI_PAGE_COMPONENTS
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
|
||||
# Set languages (first is default language)
|
||||
!insertmacro MUI_RESERVEFILE_LANGDLL
|
||||
|
||||
# Installer languages
|
||||
!define MUI_LANGDLL_ALLLANGUAGES
|
||||
|
||||
# Translations
|
||||
!macro LANG_LOAD LANGUAGE LANGCODE LANGID LICENCEFILE
|
||||
!insertmacro MUI_LANGUAGE "${LANGUAGE}"
|
||||
; !verbose off
|
||||
!define LANG "${LANGUAGE}"
|
||||
!include "lang\${LANGCODE}.nsh"
|
||||
LangString LANGUAGEID "${LANG_${LANG}}" "1031"
|
||||
LicenseLangString myLicenseData ${LANGCODE} ${LICENCEFILE}
|
||||
; !verbose on
|
||||
!undef LANG
|
||||
!macroend
|
||||
|
||||
!macro LANG_STRING NAME VALUE
|
||||
LangString "${NAME}" "${LANG_${LANG}}" "${VALUE}"
|
||||
!macroend
|
||||
|
||||
!insertmacro LANG_LOAD "English" "en" "1033" "${SOURCEDIR}\retroshare-gui\src\license\license.txt"
|
||||
!insertmacro LANG_LOAD "French" "fr" "1036" "${SOURCEDIR}\retroshare-gui\src\license\license-FR.txt"
|
||||
!insertmacro LANG_LOAD "German" "de" "1031" "${SOURCEDIR}\retroshare-gui\src\license\license-GER.txt"
|
||||
!insertmacro LANG_LOAD "Turkish" "tr" "1055" "${SOURCEDIR}\retroshare-gui\src\license\license-TR.txt"
|
||||
!insertmacro LANG_LOAD "SimpChinese" "zh_CN" "2052" "${SOURCEDIR}\retroshare-gui\src\license\license.txt"
|
||||
!insertmacro LANG_LOAD "Polish" "pl" "1045" "${SOURCEDIR}\retroshare-gui\src\license\license.txt"
|
||||
!insertmacro LANG_LOAD "Spanish" "es" "1034" "${SOURCEDIR}\retroshare-gui\src\license\license.txt"
|
||||
!insertmacro LANG_LOAD "Russian" "ru" "1049" "${SOURCEDIR}\retroshare-gui\src\license\license.txt"
|
||||
!insertmacro LANG_LOAD "Catalan" "ca_ES" "1027" "${SOURCEDIR}\retroshare-gui\src\license\license.txt"
|
||||
|
||||
LicenseData $(myLicenseData)
|
||||
|
||||
# Main binaries
|
||||
Section $(Section_Main) Section_Main
|
||||
;Set Section required
|
||||
SectionIn RO
|
||||
|
||||
; Set Section properties
|
||||
SetOverwrite on
|
||||
|
||||
; Clears previous error logs
|
||||
; Delete "$INSTDIR\*.log"
|
||||
|
||||
; Main binaries
|
||||
SetOutPath "$INSTDIR"
|
||||
File "${RELEASEDIR}\retroshare-gui\src\release\retroshare.exe"
|
||||
File /nonfatal "${RELEASEDIR}\libretroshare\src\lib\retroshare.dll"
|
||||
|
||||
; Qt binaries
|
||||
File "${QTDIR}\bin\Qt6Core.dll"
|
||||
File "${QTDIR}\bin\Qt6Core5Compat.dll"
|
||||
File "${QTDIR}\bin\Qt6Gui.dll"
|
||||
File "${QTDIR}\bin\Qt6Multimedia.dll"
|
||||
File "${QTDIR}\bin\Qt6Network.dll"
|
||||
File "${QTDIR}\bin\Qt6PrintSupport.dll"
|
||||
File "${QTDIR}\bin\Qt6Svg.dll"
|
||||
File "${QTDIR}\bin\Qt6Widgets.dll"
|
||||
File "${QTDIR}\bin\Qt6Xml.dll"
|
||||
|
||||
; Qt platforms
|
||||
SetOutPath "$INSTDIR\platforms"
|
||||
File "${QTDIR}\plugins\platforms\qwindows.dll"
|
||||
|
||||
; Qt styles
|
||||
SetOutPath "$INSTDIR\styles"
|
||||
File "${QTDIR}\plugins\styles\qmodernwindowsstyle.dll"
|
||||
|
||||
; MinGW binaries
|
||||
SetOutPath "$INSTDIR"
|
||||
File "${MINGWDIR}\bin\libstdc++-6.dll"
|
||||
!if ${ARCHITECTURE} == "x86"
|
||||
File "${MINGWDIR}\bin\libgcc_s_dw2-1.dll"
|
||||
!endif
|
||||
!if ${ARCHITECTURE} == "x64"
|
||||
File "${MINGWDIR}\bin\libgcc_s_seh-1.dll"
|
||||
!endif
|
||||
File "${MINGWDIR}\bin\libwinpthread-1.dll"
|
||||
|
||||
; External binaries
|
||||
File "${EXTERNAL_LIB_DIR}\bin\miniupnpc.dll"
|
||||
File "${RELEASEDIR}\supportlibs\librnp\Build\src\lib\librnp.dll"
|
||||
!if ${ARCHITECTURE} == "x86"
|
||||
File "${EXTERNAL_LIB_DIR}\bin\libcrypto-1_1.dll"
|
||||
File "${EXTERNAL_LIB_DIR}\bin\libssl-1_1.dll"
|
||||
!endif
|
||||
!if ${ARCHITECTURE} == "x64"
|
||||
File "${EXTERNAL_LIB_DIR}\bin\libcrypto-1_1-x64.dll"
|
||||
File "${EXTERNAL_LIB_DIR}\bin\libssl-1_1-x64.dll"
|
||||
!endif
|
||||
|
||||
; Other files
|
||||
File "${RELEASEDIR}\changelog.txt"
|
||||
File "${SOURCEDIR}\libbitdht\src\bitdht\bdboot.txt"
|
||||
|
||||
; License
|
||||
SetOutPath "$INSTDIR\license"
|
||||
File "${SOURCEDIR}\retroshare-gui\src\license\*.*"
|
||||
|
||||
; Image formats
|
||||
SetOutPath "$INSTDIR\imageformats"
|
||||
File /r "${QTDIR}\plugins\imageformats\qgif.dll"
|
||||
File /r "${QTDIR}\plugins\imageformats\qicns.dll"
|
||||
File /r "${QTDIR}\plugins\imageformats\qico.dll"
|
||||
File /r "${QTDIR}\plugins\imageformats\qjpeg.dll"
|
||||
File /r "${QTDIR}\plugins\imageformats\qsvg.dll"
|
||||
File /r "${QTDIR}\plugins\imageformats\qtga.dll"
|
||||
File /r "${QTDIR}\plugins\imageformats\qtiff.dll"
|
||||
File /r "${QTDIR}\plugins\imageformats\qwbmp.dll"
|
||||
File /r "${QTDIR}\plugins\imageformats\qwebp.dll"
|
||||
|
||||
; Sounds
|
||||
SetOutPath "$INSTDIR\sounds"
|
||||
File /r "${SOURCEDIR}\retroshare-gui\src\sounds\*.*"
|
||||
|
||||
; Translations
|
||||
SetOutPath "$INSTDIR\translations"
|
||||
File /r "${SOURCEDIR}\retroshare-gui\src\translations\*.qm"
|
||||
File /r "${QTDIR}\translations\qt_*.qm"
|
||||
File /r "${QTDIR}\translations\qtbase_*.qm"
|
||||
File /r "${QTDIR}\translations\qtmultimedia_*.qm"
|
||||
|
||||
; WebUI
|
||||
; SetOutPath "$INSTDIR\webui"
|
||||
; File /r "${SOURCEDIR}\libresapi\src\webui\*.*"
|
||||
|
||||
; License
|
||||
SetOutPath "$INSTDIR\license"
|
||||
File /r "${SOURCEDIR}\retroshare-gui\src\license\*.*"
|
||||
SectionEnd
|
||||
|
||||
# Service
|
||||
!ifdef SERVICE_EXISTS
|
||||
Section /o $(Section_Service) Section_Service
|
||||
SetOutPath "$INSTDIR"
|
||||
File "${RELEASEDIR}\retroshare-service\src\release\retroshare-service.exe"
|
||||
SectionEnd
|
||||
!endif
|
||||
|
||||
# Friend Server
|
||||
!ifdef FRIENDSERVER_EXISTS
|
||||
Section /o $(Section_FriendServer) Section_FriendServer
|
||||
SetOutPath "$INSTDIR"
|
||||
File "${RELEASEDIR}\retroshare-friendserver\src\release\retroshare-friendserver.exe"
|
||||
SectionEnd
|
||||
!endif
|
||||
|
||||
# Tor
|
||||
!ifdef TOR_EXISTS
|
||||
Section /o $(Section_Tor) Section_Tor
|
||||
SetOutPath "$INSTDIR\tor"
|
||||
File "${TORDIR}\*"
|
||||
SectionEnd
|
||||
!endif
|
||||
|
||||
# WebUI
|
||||
!ifdef WEBUI_EXISTS
|
||||
Section /o $(Section_WebUI) Section_WebUI
|
||||
SetOutPath "$INSTDIR\webui"
|
||||
File /r "${WEBUIDIR}\*"
|
||||
SectionEnd
|
||||
!endif
|
||||
|
||||
# Plugins
|
||||
${!defineifexist} PLUGIN_FEEDREADER_EXISTS "${RELEASEDIR}\plugins\FeedReader\lib\FeedReader.dll"
|
||||
${!defineifexist} PLUGIN_VOIP_EXISTS "${RELEASEDIR}\plugins\VOIP\lib\VOIP.dll"
|
||||
|
||||
!ifdef PLUGIN_FEEDREADER_EXISTS
|
||||
!define /ifndef PLUGIN_EXISTS
|
||||
!endif
|
||||
!ifdef PLUGIN_VOIP_EXISTS
|
||||
!define /ifndef PLUGIN_EXISTS
|
||||
!endif
|
||||
|
||||
!ifdef PLUGIN_EXISTS
|
||||
SectionGroup $(Section_Plugins) Section_Plugins
|
||||
!ifdef PLUGIN_FEEDREADER_EXISTS
|
||||
Section $(Section_Plugin_FeedReader) Section_Plugin_FeedReader
|
||||
SetOutPath "$DataDir\extensions6"
|
||||
File "${RELEASEDIR}\plugins\FeedReader\lib\FeedReader.dll"
|
||||
SectionEnd
|
||||
!endif
|
||||
|
||||
!ifdef PLUGIN_VOIP_EXISTS
|
||||
Section $(Section_Plugin_VOIP) Section_Plugin_VOIP
|
||||
SetOutPath "$DataDir\extensions6"
|
||||
File "${RELEASEDIR}\plugins\VOIP\lib\VOIP.dll"
|
||||
SetOutPath "$INSTDIR\sounds"
|
||||
File /r "${SOURCEDIR}\plugins\VOIP\gui\sounds\*.*"
|
||||
SectionEnd
|
||||
!endif
|
||||
SectionGroupEnd
|
||||
!endif
|
||||
|
||||
# Data (Styles)
|
||||
Section $(Section_Data) Section_Data
|
||||
; Set Section properties
|
||||
SetOverwrite on
|
||||
|
||||
; Chat style
|
||||
SetOutPath "$StyleSheetDir\stylesheets\Bubble"
|
||||
File /r "${SOURCEDIR}\retroshare-gui\src\gui\qss\chat\Bubble\*.*"
|
||||
SetOutPath "$StyleSheetDir\stylesheets\Bubble_Compact"
|
||||
File /r "${SOURCEDIR}\retroshare-gui\src\gui\qss\chat\Bubble_Compact\*.*"
|
||||
|
||||
; Stylesheets
|
||||
SetOutPath "$INSTDIR\qss"
|
||||
File /nonfatal /r "${SOURCEDIR}\retroshare-gui\src\qss\*.*"
|
||||
SectionEnd
|
||||
|
||||
;Section $(Section_Link) Section_Link
|
||||
; Delete any existing keys
|
||||
|
||||
; Write the file association
|
||||
; WriteRegStr HKCR .pqi "" retroshare
|
||||
; WriteRegStr HKCR retroshare "" "PQI File"
|
||||
; WriteRegBin HKCR retroshare EditFlags 00000100
|
||||
; WriteRegStr HKCR "retroshare\shell" "" open
|
||||
; WriteRegStr HKCR "retroshare\shell\open\command" "" `"$INSTDIR\retroshare.exe" "%1"`
|
||||
;SectionEnd
|
||||
|
||||
# Shortcuts
|
||||
SectionGroup $(Section_Shortcuts) Section_Shortcuts
|
||||
Section $(Section_StartMenu) Section_StartMenu
|
||||
SetOutPath "$INSTDIR"
|
||||
CreateDirectory "$SMPROGRAMS\${APPNAME}"
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\$(Link_Uninstall).lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk" "$INSTDIR\retroshare.exe" "" "$INSTDIR\retroshare.exe" 0
|
||||
|
||||
!ifdef SERVICE_EXISTS
|
||||
SectionGetFlags ${Section_Service} $0
|
||||
IntOp $0 $0 & ${SF_SELECTED}
|
||||
${If} $0 == ${SF_SELECTED}
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME} Service.lnk" "$INSTDIR\retroshare-service.exe" "" "$INSTDIR\retroshare-service.exe" 0
|
||||
${EndIf}
|
||||
!endif
|
||||
|
||||
!ifdef FRIENDSERVER_EXISTS
|
||||
SectionGetFlags ${Section_FriendServer} $0
|
||||
IntOp $0 $0 & ${SF_SELECTED}
|
||||
${If} $0 == ${SF_SELECTED}
|
||||
CreateShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME} Friend Server.lnk" "$INSTDIR\retroshare-friendserver.exe" "" "$INSTDIR\retroshare-friendserver.exe" 0
|
||||
${EndIf}
|
||||
!endif
|
||||
SectionEnd
|
||||
|
||||
Section $(Section_Desktop) Section_Desktop
|
||||
CreateShortCut "$DESKTOP\${APPNAME}.lnk" "$INSTDIR\retroshare.exe" "" "$INSTDIR\retroshare.exe" 0
|
||||
SectionEnd
|
||||
|
||||
Section $(Section_QuickLaunch) Section_QuickLaunch
|
||||
CreateShortCut "$QUICKLAUNCH\${APPNAME}.lnk" "$INSTDIR\retroshare.exe" "" "$INSTDIR\retroshare.exe" 0
|
||||
SectionEnd
|
||||
SectionGroupEnd
|
||||
|
||||
Section $(Section_AutoStart) Section_AutoStart
|
||||
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "RetroShare" "$INSTDIR\retroshare.exe -m"
|
||||
SectionEnd
|
||||
|
||||
;Section $(Section_AutoStart) Section_AutoStart
|
||||
; CreateShortCut "$SMSTARTUP\${APPNAME}.lnk" "$INSTDIR\retroshare.exe" "" "$INSTDIR\retroshare.exe -m" 0
|
||||
;SectionEnd
|
||||
|
||||
Section -FinishSection
|
||||
${If} $PortableMode = 0
|
||||
WriteRegStr HKLM "Software\${APPNAME}" "" "$INSTDIR"
|
||||
WriteRegStr HKLM "Software\${APPNAME}" "Version" "${VERSION}"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayVersion" "${VERSION}"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayIcon" "$INSTDIR\retroshare.exe"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "Publisher" "${PUBLISHER}"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoModify" "1"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoRepair" "1"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$INSTDIR\uninstall.exe"
|
||||
WriteUninstaller "$INSTDIR\uninstall.exe"
|
||||
${Else}
|
||||
; Create the file the application uses to detect portable mode
|
||||
FileOpen $0 "$INSTDIR\portable" w
|
||||
FileClose $0
|
||||
${EndIf}
|
||||
SectionEnd
|
||||
|
||||
# Descriptions
|
||||
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Main} $(Section_Main_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Data} $(Section_Data_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Shortcuts} $(Section_Shortcuts_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_StartMenu} $(Section_StartMenu_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Desktop} $(Section_Desktop_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_QuickLaunch} $(Section_QuickLaunch_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Plugins} $(Section_Plugins_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Plugin_FeedReader} $(Section_Plugin_FeedReader_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Plugin_VOIP} $(Section_Plugin_VOIP_Desc)
|
||||
; !insertmacro MUI_DESCRIPTION_TEXT ${Section_Link} $(Section_Link_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_AutoStart} $(Section_AutoStart_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Tor} $(Section_Tor_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_WebUI} $(Section_WebUI_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_Service} $(Section_Service_Desc)
|
||||
!insertmacro MUI_DESCRIPTION_TEXT ${Section_FriendServer} $(Section_FriendServer_Desc)
|
||||
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
||||
|
||||
# Uninstall
|
||||
Section "Uninstall"
|
||||
; Remove file association registry keys
|
||||
; DeleteRegKey HKCR .pqi
|
||||
DeleteRegKey HKCR RetroShare
|
||||
|
||||
; Remove program/uninstall regsitry keys
|
||||
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"
|
||||
DeleteRegKey HKLM SOFTWARE\${APPNAME}
|
||||
|
||||
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "RetroShare"
|
||||
|
||||
; Remove shortcuts, if any
|
||||
Delete "$SMPROGRAMS\${APPNAME}\*.*"
|
||||
|
||||
; Remove desktop shortcut
|
||||
Delete "$DESKTOP\${APPNAME}.lnk"
|
||||
|
||||
; Remove Quicklaunch shortcut
|
||||
Delete "$QUICKLAUNCH\${APPNAME}.lnk"
|
||||
|
||||
; Remove Autstart
|
||||
Delete "$SMSTARTUP\${APPNAME}.lnk"
|
||||
|
||||
; Remove directories used
|
||||
RMDir "$SMPROGRAMS\${APPNAME}"
|
||||
RMDir /r "$INSTDIR"
|
||||
|
||||
; Don't remove the directory, otherwise
|
||||
; we lose the XPGP keys.
|
||||
; Should make this an option though...
|
||||
RMDir /r "${DATADIR_NORMAL}\extensions6"
|
||||
RMDir /r "${DATADIR_NORMAL}\stylesheets"
|
||||
SectionEnd
|
||||
|
||||
Function .onInit
|
||||
StrCpy $InstDirNormal "${INSTDIR_NORMAL}"
|
||||
StrCpy $InstDirPortable "${INSTDIR_PORTABLE}"
|
||||
|
||||
StrCpy $PortableMode 0
|
||||
StrCpy $INSTDIR "$InstDirNormal"
|
||||
StrCpy $DataDir "${DATADIR_NORMAL}"
|
||||
|
||||
InitPluginsDir
|
||||
Push $R1
|
||||
File /oname=$PLUGINSDIR\spltmp.bmp "${SOURCEDIR}\retroshare-gui\src\gui\images\logo\logo_splash.png"
|
||||
advsplash::show 1200 1000 1000 -1 $PLUGINSDIR\spltmp
|
||||
Pop $R1
|
||||
Pop $R1
|
||||
!insertmacro MUI_LANGDLL_DISPLAY
|
||||
FunctionEnd
|
||||
|
||||
!ifdef FRIENDSERVER_EXISTS
|
||||
Function .onSelChange
|
||||
SectionGetFlags ${Section_FriendServer} $0
|
||||
IntOp $0 $0 & ${SF_SELECTED}
|
||||
${If} $0 == ${SF_SELECTED}
|
||||
# Activate Tor and set readonly
|
||||
SectionGetFlags ${Section_Tor} $1
|
||||
IntOp $1 $1 | ${SF_SELECTED}
|
||||
IntOp $1 $1 | ${SF_RO}
|
||||
SectionSetFlags ${Section_Tor} $1
|
||||
${Else}
|
||||
# Remove readonly from Tor
|
||||
SectionGetFlags ${Section_Tor} $1
|
||||
IntOp $2 ${SF_RO} ~
|
||||
IntOp $1 $1 & $2
|
||||
SectionSetFlags ${Section_Tor} $1
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
!endif
|
||||
|
||||
# Installation mode
|
||||
|
||||
Function RequireAdmin
|
||||
UserInfo::GetAccountType
|
||||
Pop $8
|
||||
${If} $8 != "admin"
|
||||
MessageBox MB_ICONSTOP "You need administrator rights to install ${APPNAME}"
|
||||
SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
|
||||
Abort
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
Function SetModeDestinationFromInstdir
|
||||
${If} $PortableMode = 0
|
||||
StrCpy $InstDirNormal $INSTDIR
|
||||
${Else}
|
||||
StrCpy $InstDirPortable $INSTDIR
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
Function PortableModePageCreate
|
||||
Call SetModeDestinationFromInstdir ; If the user clicks BACK on the directory page we will remember their mode specific directory
|
||||
!insertmacro MUI_HEADER_TEXT $(Page_InstallMode) $(Page_InstallMode_Desc)
|
||||
nsDialogs::Create 1018
|
||||
Pop $0
|
||||
${NSD_CreateRadioButton} 5u 25u -10u 8u $(Page_InstallMode_Standard)
|
||||
Pop $1
|
||||
${NSD_CreateLabel} 18u 40u -10u 24u $(Page_InstallMode_Standard_Desc)
|
||||
Pop $0
|
||||
${NSD_CreateRadioButton} 5u 75u -10u 8u $(Page_InstallMode_Portable)
|
||||
Pop $2
|
||||
${NSD_CreateLabel} 18u 90u -10u 24u $(Page_InstallMode_Portable_Desc)
|
||||
Pop $0
|
||||
${If} $PortableMode = 0
|
||||
SendMessage $1 ${BM_SETCHECK} ${BST_CHECKED} 0
|
||||
${Else}
|
||||
SendMessage $2 ${BM_SETCHECK} ${BST_CHECKED} 0
|
||||
${EndIf}
|
||||
nsDialogs::Show
|
||||
FunctionEnd
|
||||
|
||||
Function PortableModePageLeave
|
||||
${NSD_GetState} $1 $0
|
||||
${If} $0 <> ${BST_UNCHECKED}
|
||||
StrCpy $PortableMode 0
|
||||
StrCpy $INSTDIR $InstDirNormal
|
||||
Call RequireAdmin
|
||||
; Enable sections
|
||||
SectionSetText ${Section_Shortcuts} $(Section_Shortcuts)
|
||||
SectionSetText ${Section_StartMenu} $(Section_StartMenu)
|
||||
SectionSetText ${Section_Desktop} $(Section_Desktop)
|
||||
SectionSetText ${Section_QuickLaunch} $(Section_QuickLaunch)
|
||||
SectionSetText ${Section_AutoStart} $(Section_AutoStart)
|
||||
!insertmacro SelectSection ${Section_Shortcuts}
|
||||
!insertmacro SelectSection ${Section_AutoStart}
|
||||
!insertmacro SelectSection ${Section_StartMenu}
|
||||
!insertmacro SelectSection ${Section_Desktop}
|
||||
!insertmacro SelectSection ${Section_QuickLaunch}
|
||||
${Else}
|
||||
StrCpy $PortableMode 1
|
||||
StrCpy $INSTDIR $InstDirPortable
|
||||
; Disable sections
|
||||
!insertmacro UnselectSection ${Section_Shortcuts}
|
||||
!insertmacro UnselectSection ${Section_AutoStart}
|
||||
!insertmacro UnselectSection ${Section_StartMenu}
|
||||
!insertmacro UnselectSection ${Section_Desktop}
|
||||
!insertmacro UnselectSection ${Section_QuickLaunch}
|
||||
SectionSetText ${Section_Shortcuts} ""
|
||||
SectionSetText ${Section_StartMenu} ""
|
||||
SectionSetText ${Section_Desktop} ""
|
||||
SectionSetText ${Section_QuickLaunch} ""
|
||||
SectionSetText ${Section_AutoStart} ""
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
Function dir_leave
|
||||
${If} $PortableMode = 0
|
||||
StrCpy $DataDir "${DATADIR_NORMAL}"
|
||||
StrCpy $StyleSheetDir $DataDir
|
||||
${Else}
|
||||
StrCpy $DataDir "${DATADIR_PORTABLE}"
|
||||
StrCpy $StyleSheetDir $INSTDIR
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
@ -18,8 +18,6 @@ copy nul %logfile% > nul
|
||||
|
||||
pushd %~1
|
||||
|
||||
set Percent=%%
|
||||
|
||||
set last=HEAD
|
||||
for /f %%t in ('git tag --sort=-taggerdate --merged ^| findstr v') do (
|
||||
echo generating changelog for !last!..%%t
|
||||
@ -32,7 +30,7 @@ for /f %%t in ('git tag --sort=-taggerdate --merged ^| findstr v') do (
|
||||
rem echo !last! ---^> %%t >> %logfile%
|
||||
echo ----------------------------------------------- >> %logfile%
|
||||
echo. >> %logfile%
|
||||
git log %%t..!last! --no-merges "--pretty=format:!Percent!h !Percent!ai !Percent!<(10,trunc)!Percent!an !Percent!s" >> %logfile%
|
||||
git log %%t..!last! --no-merges "--pretty=format:%%h %%ai %%<(10,trunc)%%an %%s" >> %logfile%
|
||||
echo. >> %logfile%
|
||||
echo. >> %logfile%
|
||||
set last=%%t
|
||||
|
||||
@ -1,20 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
function git_del_tag()
|
||||
{
|
||||
mTag=$1
|
||||
|
||||
for mRemote in $(git remote); do
|
||||
echo "Attempting tag $mTag removal from remote $mRemote"
|
||||
GIT_TERMINAL_PROMPT=0 git push $mRemote :$mTag || true
|
||||
done
|
||||
git tag --delete $mTag
|
||||
}
|
||||
|
||||
for mModule in . build_scripts/OBS/ libbitdht/ libretroshare/ openpgpsdk/ retroshare-webui/ ; do
|
||||
pushd $mModule
|
||||
git_del_tag v0.6.7a
|
||||
git tag --list | grep untagged | while read mTag; do git_del_tag $mTag ; done
|
||||
popd
|
||||
done
|
||||
|
||||
@ -4,8 +4,8 @@ Version=1.0
|
||||
Name=RetroShare
|
||||
Comment=Securely communicate with your friends
|
||||
Exec=/usr/bin/retroshare %U
|
||||
Icon=retroshare.xpm
|
||||
Icon=/usr/share/pixmaps/retroshare.xpm
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Network;Email;InstantMessaging;Chat;Feed;FileTransfer;P2P
|
||||
Categories=Application;Network;P2P;Feed;Chat;InstantMessaging
|
||||
MimeType=x-scheme-handler/retroshare;
|
||||
|
||||
@ -1,10 +1,389 @@
|
||||
// SPDX-FileCopyrightText: (C) 2021 Retroshare Team <contact@retroshare.cc>
|
||||
// SPDX-FileCopyrightText: (C) 2004-2019 Retroshare Team <contact@retroshare.cc>
|
||||
// SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
= Moved
|
||||
RetroShare JSON API
|
||||
===================
|
||||
|
||||
JSON API generator is now part of `libretroshare` look under `src/jsonapi/`
|
||||
directory in `libretroshare` repository.
|
||||
:Cxx: C++
|
||||
|
||||
This directory and all it's content is kept as is only for retro-compatibility
|
||||
with the old, deprecated `qmake` build system.
|
||||
== How to use RetroShare JSON API
|
||||
|
||||
Look for methods marked with +@jsonapi+ doxygen custom command into
|
||||
+libretroshare/src/retroshare+. The method path is composed by service instance
|
||||
pointer name like +rsGxsChannels+ for +RsGxsChannels+, and the method name like
|
||||
+createGroup+ and pass the input paramethers as a JSON object.
|
||||
|
||||
.Service instance pointer in rsgxschannels.h
|
||||
[source,cpp]
|
||||
--------------------------------------------------------------------------------
|
||||
/**
|
||||
* Pointer to global instance of RsGxsChannels service implementation
|
||||
* @jsonapi{development}
|
||||
*/
|
||||
extern RsGxsChannels* rsGxsChannels;
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
.Method declaration in rsgxschannels.h
|
||||
[source,cpp]
|
||||
--------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief Request channel creation.
|
||||
* The action is performed asyncronously, so it could fail in a subsequent
|
||||
* phase even after returning true.
|
||||
* @jsonapi{development}
|
||||
* @param[out] token Storage for RsTokenService token to track request
|
||||
* status.
|
||||
* @param[in] group Channel data (name, description...)
|
||||
* @return false on error, true otherwise
|
||||
*/
|
||||
virtual bool createGroup(uint32_t& token, RsGxsChannelGroup& group) = 0;
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
.paramethers.json
|
||||
[source,json]
|
||||
--------------------------------------------------------------------------------
|
||||
{
|
||||
"group":{
|
||||
"mMeta":{
|
||||
"mGroupName":"JSON test group",
|
||||
"mGroupFlags":4,
|
||||
"mSignFlags":520
|
||||
},
|
||||
"mDescription":"JSON test group description"
|
||||
},
|
||||
"caller_data":"Here can go any kind of JSON data (even objects) that the caller want to get back together with the response"
|
||||
}
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
.Calling the JSON API with curl on the terminal
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
curl -u $API_USER --data @paramethers.json http://127.0.0.1:9092/rsGxsChannels/createGroup
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
.JSON API call result
|
||||
[source,json]
|
||||
--------------------------------------------------------------------------------
|
||||
{
|
||||
"caller_data": "Here can go any kind of JSON data (even objects) that the caller want to get back together with the response",
|
||||
"retval": true,
|
||||
"token": 3
|
||||
}
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Even if it is less efficient because of URL encoding HTTP +GET+ method is
|
||||
supported too, so in cases where the client cannot use +POST+ she can still use
|
||||
+GET+ taking care of encoding the JSON data. With +curl+ this can be done at
|
||||
least in two different ways.
|
||||
|
||||
.Calling the JSON API with GET method with curl on the terminal
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
curl -u $API_USER --get --data-urlencode jsonData@paramethers.json \
|
||||
http://127.0.0.1:9092/rsGxsChannels/createGroup
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Letting +curl+ do the encoding is much more elegant but it is semantically
|
||||
equivalent to the following.
|
||||
|
||||
.Calling the JSON API with GET method and pre-encoded data with curl on the terminal
|
||||
--------------------------------------------------------------------------------
|
||||
curl -u $API_USER http://127.0.0.1:9092/rsGxsChannels/createGroup?jsonData=%7B%0A%20%20%20%20%22group%22%3A%7B%0A%20%20%20%20%20%20%20%20%22mMeta%22%3A%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mGroupName%22%3A%22JSON%20test%20group%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mGroupFlags%22%3A4%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mSignFlags%22%3A520%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22mDescription%22%3A%22JSON%20test%20group%20description%22%0A%20%20%20%20%7D%2C%0A%20%20%20%20%22caller_data%22%3A%22Here%20can%20go%20any%20kind%20of%20JSON%20data%20%28even%20objects%29%20that%20the%20caller%20want%20to%20get%20back%20together%20with%20the%20response%22%0A%7D
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Note that using +GET+ method +?jsonData=+ and then the JSON data URL encoded are
|
||||
added after the path in the HTTP request.
|
||||
|
||||
|
||||
== JSON API authentication
|
||||
|
||||
Most of JSON API methods require authentication as they give access to
|
||||
RetroShare user data, and we don't want any application running on the system
|
||||
eventually by other users be able to access private data indiscriminately.
|
||||
JSON API support HTTP Basic as authentication scheme, this is enough as JSON API
|
||||
server is intented for usage on the same system (127.0.0.1) not over an
|
||||
untrusted network.
|
||||
If you need to use JSON API over an untrusted network consider using a reverse
|
||||
proxy with HTTPS such as NGINX in front of JSON API server.
|
||||
If RetroShare login has been effectuated through the JSON API you can use your
|
||||
location SSLID as username and your PGP password as credential for the JSON API,
|
||||
but we suggests you use specific meaningful and human readable credentials for
|
||||
each JSON API client so the human user can have better control over which client
|
||||
can access the JSON API.
|
||||
|
||||
.NewToken.json
|
||||
[source,json]
|
||||
--------------------------------------------------------------------------------
|
||||
{
|
||||
"token": "myNewUser:myNewPassword"
|
||||
}
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
.An authenticated client can authorize new tokens like this
|
||||
--------------------------------------------------------------------------------
|
||||
curl -u $API_USER --data @NewToken.json http://127.0.0.1:9092/jsonApiServer/authorizeToken
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
.An unauthenticated JSON API client can request access with
|
||||
--------------------------------------------------------------------------------
|
||||
curl --data @NewToken.json http://127.0.0.1:9092/jsonApiServer/requestNewTokenAutorization
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
When an unauthenticated client request his token to be authorized, JSON API
|
||||
server will try to ask confirmation to the human user if possible through
|
||||
+mNewAccessRequestCallback+, if it is not possible or the user didn't authorized
|
||||
the token +false+ is returned.
|
||||
|
||||
|
||||
== Offer new RetroShare services through JSON API
|
||||
|
||||
To offer a retroshare service through the JSON API, first of all one need find
|
||||
the global pointer to the service instance and document it in doxygen syntax,
|
||||
plus marking with the custom doxygen command +@jsonapi{RS_VERSION}+ where
|
||||
+RS_VERSION+ is the retroshare version in which this service became available
|
||||
with the current semantic (major changes to the service semantic, changes the
|
||||
meaning of the service itself, so the version should be updated in the
|
||||
documentation in that case).
|
||||
|
||||
.Service instance pointer in rsgxschannels.h
|
||||
[source,cpp]
|
||||
--------------------------------------------------------------------------------
|
||||
/**
|
||||
* Pointer to global instance of RsGxsChannels service implementation
|
||||
* @jsonapi{development}
|
||||
*/
|
||||
extern RsGxsChannels* rsGxsChannels;
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
Once the service instance itself is known to the JSON API you need to document
|
||||
in doxygen syntax and mark with the custom doxygen command
|
||||
+@jsonapi{RS_VERSION}+ the methods of the service that you want to make
|
||||
available through JSON API.
|
||||
|
||||
.Offering RsGxsChannels::getChannelDownloadDirectory in rsgxschannels.h
|
||||
[source,cpp]
|
||||
--------------------------------------------------------------------------------
|
||||
/**
|
||||
* Get download directory for the given channel
|
||||
* @jsonapi{development}
|
||||
* @param[in] channelId id of the channel
|
||||
* @param[out] directory reference to string where to store the path
|
||||
* @return false on error, true otherwise
|
||||
*/
|
||||
virtual bool getChannelDownloadDirectory( const RsGxsGroupId& channelId,
|
||||
std::string& directory ) = 0;
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
For each paramether you must specify if it is used as input +@param[in]+ as
|
||||
output +@param[out]+ or both +@param[inout]+. Paramethers and return value
|
||||
types must be of a type supported by +RsTypeSerializer+ which already support
|
||||
most basic types (+bool+, +std::string+...), +RsSerializable+ and containers of
|
||||
them like +std::vector<std::string>+. Paramethers passed by value and by
|
||||
reference of those types are both supported, while passing by pointer is not
|
||||
supported. If your paramether or return +class+/+struct+ type is not supported
|
||||
yet by +RsTypeSerializer+ most convenient approach is to make it derive from
|
||||
+RsSerializable+ and implement +serial_process+ method like I did with
|
||||
+RsGxsChannelGroup+.
|
||||
|
||||
.Deriving RsGxsChannelGroup from RsSerializable in rsgxschannels.h
|
||||
[source,cpp]
|
||||
--------------------------------------------------------------------------------
|
||||
struct RsGxsChannelGroup : RsSerializable
|
||||
{
|
||||
RsGroupMetaData mMeta;
|
||||
std::string mDescription;
|
||||
RsGxsImage mImage;
|
||||
|
||||
bool mAutoDownload;
|
||||
|
||||
/// @see RsSerializable
|
||||
virtual void serial_process( RsGenericSerializer::SerializeJob j,
|
||||
RsGenericSerializer::SerializeContext& ctx )
|
||||
{
|
||||
RS_SERIAL_PROCESS(mMeta);
|
||||
RS_SERIAL_PROCESS(mDescription);
|
||||
RS_SERIAL_PROCESS(mImage);
|
||||
RS_SERIAL_PROCESS(mAutoDownload);
|
||||
}
|
||||
};
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
You can do the same recursively for any member of your +struct+ that is not yet
|
||||
supported by +RsTypeSerializer+.
|
||||
|
||||
Some Retroshare {Cxx} API functions are asyncronous, historically RetroShare
|
||||
didn't follow a policy on how to expose asyncronous API so differents services
|
||||
and some times even differents method of the same service follow differents
|
||||
asyncronous patterns, thus making automatic generation of JSON API wrappers for
|
||||
those methods impractical. Instead of dealing with all those differents patterns
|
||||
I have chosed to support only one new pattern taking advantage of modern {Cxx}11
|
||||
and restbed features. On the {Cxx}11 side lambdas and +std::function+s are used,
|
||||
on the restbed side Server Side Events are used to send asyncronous results.
|
||||
|
||||
Lets see an example so it will be much esier to understand.
|
||||
|
||||
.RsGxsChannels::turtleSearchRequest asyncronous API
|
||||
[source,cpp]
|
||||
--------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief Request remote channels search
|
||||
* @jsonapi{development}
|
||||
* @param[in] matchString string to look for in the search
|
||||
* @param multiCallback function that will be called each time a search
|
||||
* result is received
|
||||
* @param[in] maxWait maximum wait time in seconds for search results
|
||||
* @return false on error, true otherwise
|
||||
*/
|
||||
virtual bool turtleSearchRequest(
|
||||
const std::string& matchString,
|
||||
const std::function<void (const RsGxsGroupSummary& result)>& multiCallback,
|
||||
std::time_t maxWait = 300 ) = 0;
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
+RsGxsChannels::turtleSearchRequest(...)+ is an asyncronous method because it
|
||||
send a channel search request on turtle network and then everytime a result is
|
||||
received from the network +multiCallback+ is called and the result is passed as
|
||||
parameter. To be supported by the automatic JSON API wrappers generator an
|
||||
asyncronous method need a parameter of type +std::function<void (...)>+ called
|
||||
+callback+ if the callback will be called only once or +multiCallback+ if the
|
||||
callback is expected to be called more then once like in this case.
|
||||
A second mandatory parameter is +maxWait+ of type +std::time_t+ it indicates the
|
||||
maximum amount of time in seconds for which the caller is willing to wait for
|
||||
results, in case the timeout is reached the callback will not be called anymore.
|
||||
|
||||
[IMPORTANT]
|
||||
================================================================================
|
||||
+callback+ and +multiCallback+ parameters documentation must *not* specify
|
||||
+[in]+, +[out]+, +[inout]+, in Doxygen documentation as this would fool the
|
||||
automatic wrapper generator, and ultimately break the compilation.
|
||||
================================================================================
|
||||
|
||||
.RsFiles::turtleSearchRequest asyncronous JSON API usage example
|
||||
[source,bash]
|
||||
--------------------------------------------------------------------------------
|
||||
$ cat turtle_search.json
|
||||
{
|
||||
"matchString":"linux"
|
||||
}
|
||||
$ curl --data @turtle_search.json http://127.0.0.1:9092/rsFiles/turtleSearchRequest
|
||||
data: {"retval":true}
|
||||
|
||||
data: {"results":[{"size":157631,"hash":"69709b4d01025584a8def5cd78ebbd1a3cf3fd05","name":"kill_bill_linux_1024x768.jpg"},{"size":192560,"hash":"000000000000000000009a93e5be8486c496f46c","name":"coffee_box_linux2.jpg"},{"size":455087,"hash":"9a93e5be8486c496f46c00000000000000000000","name":"Linux.png"},{"size":182004,"hash":"e8845280912ebf3779e400000000000000000000","name":"Linux_2_6.png"}]}
|
||||
|
||||
data: {"results":[{"size":668,"hash":"e8845280912ebf3779e400000000000000000000","name":"linux.png"},{"size":70,"hash":"e8845280912ebf3779e400000000000000000000","name":"kali-linux-2016.2-amd64.txt.sha1sum"},{"size":3076767744,"hash":"e8845280912ebf3779e400000000000000000000","name":"kali-linux-2016.2-amd64.iso"},{"size":2780872,"hash":"e8845280912ebf3779e400000000000000000000","name":"openwrt-ar71xx-generic-vmlinux.bin"},{"size":917504,"hash":"e8845280912ebf3779e400000000000000000000","name":"openwrt-ar71xx-generic-vmlinux.lzma"},{"size":2278404096,"hash":"e8845280912ebf3779e400000000000000000000","name":"gentoo-linux-livedvd-amd64-multilib-20160704.iso"},{"size":151770333,"hash":"e8845280912ebf3779e400000000000000000000","name":"flashtool-0.9.23.0-linux.tar.7z"},{"size":2847372,"hash":"e8845280912ebf3779e400000000000000000000","name":"openwrt-ar71xx-generic-vmlinux.elf"},{"size":1310720,"hash":"e8845280912ebf3779e400000000000000000000","name":"openwrt-ar71xx-generic-vmlinux.gz"},{"size":987809,"hash":"e8845280912ebf3779e400000000000000000000","name":"openwrt-ar71xx-generic-vmlinux-lzma.elf"}]}
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
By default JSON API methods requires client authentication and their wrappers
|
||||
are automatically generated by +json-api-generator+.
|
||||
In some cases methods need do be accessible without authentication such as
|
||||
+rsLoginHelper/getLocations+ so in the doxygen documentaion they have the custom
|
||||
command +@jsonapi{RS_VERSION,unauthenticated}+.
|
||||
Other methods such as +/rsControl/rsGlobalShutDown+ need special care so they
|
||||
are marked with the custom doxygen command +@jsonapi{RS_VERSION,manualwrapper}+
|
||||
and their wrappers are not automatically generated but written manually into
|
||||
+JsonApiServer::JsonApiServer(...)+.
|
||||
|
||||
|
||||
== A bit of history
|
||||
|
||||
=== First writings about this
|
||||
|
||||
The previous attempt of exposing a RetroShare JSON API is called +libresapi+ and
|
||||
unfortunatley it requires a bunch of boilerplate code when we want to expose
|
||||
something present in the {Cxx} API in the JSON API.
|
||||
|
||||
As an example here you can see the libresapi that exposes part of the retroshare
|
||||
chat {Cxx} API and lot of boilerplate code just to convert {Cxx} objects to JSON
|
||||
|
||||
https://github.com/RetroShare/RetroShare/blob/v0.6.4/libresapi/src/api/ChatHandler.cpp#L44
|
||||
|
||||
To avoid the {Cxx} to JSON and back conversion boilerplate code I have worked out
|
||||
an extension to our {Cxx} serialization code so it is capable to serialize and
|
||||
deserialize to JSON you can see it in this pull request
|
||||
|
||||
https://github.com/RetroShare/RetroShare/pull/1155
|
||||
|
||||
So first step toward having a good API is to take advantage of the fact that RS
|
||||
is now capable of converting C++ objects from and to JSON.
|
||||
|
||||
The current API is accessible via HTTP and unix socket, there is no
|
||||
authentication in both of them, so anyone having access to the HTTP server or to
|
||||
the unix socket can access the API without extra restrictions.
|
||||
Expecially for the HTTP API this is a big risk because also if the http server
|
||||
listen on 127.0.0.1 every application on the machine (even rogue javascript
|
||||
running on your web browser) can access that and for example on android it is
|
||||
not safe at all (because of that I implemented the unix socket access so at
|
||||
least in android API was reasonably safe) because of this.
|
||||
|
||||
A second step to improve the API would be to implement some kind of API
|
||||
authentication mechanism (it would be nice that the mechanism is handled at API
|
||||
level and not at transport level so we can use it for any API trasport not just
|
||||
HTTP for example)
|
||||
|
||||
The HTTP server used by libresapi is libmicrohttpd server that is very minimal,
|
||||
it doesn't provide HTTPS nor modern HTTP goodies, like server notifications,
|
||||
websockets etc. because the lack of support we have a token polling mechanism in
|
||||
libresapi to avoid polling for every thing but it is still ugly, so if we can
|
||||
completely get rid of polling in the API that would be really nice.
|
||||
I have done a crawl to look for a replacement and briefly looked at
|
||||
|
||||
- https://www.gnu.org/software/libmicrohttpd/
|
||||
- http://wolkykim.github.io/libasyncd/
|
||||
- https://github.com/corvusoft/restbed
|
||||
- https://code.facebook.com/posts/1503205539947302/introducing-proxygen-facebook-s-c-http-framework/
|
||||
- https://github.com/cmouse/yahttp
|
||||
|
||||
taking in account a few metrics like modern HTTP goodies support, license,
|
||||
platform support, external dependencies and documentation it seemed to me that
|
||||
restbed is the more appropriate.
|
||||
|
||||
Another source of boilerplate code into libresapi is the mapping between JSON
|
||||
API requests and C++ API methods as an example you can look at this
|
||||
|
||||
https://github.com/RetroShare/RetroShare/blob/v0.6.4/libresapi/src/api/ChatHandler.cpp#L158
|
||||
|
||||
and this
|
||||
|
||||
https://github.com/RetroShare/RetroShare/blob/v0.6.4/libresapi/src/api/ApiServer.cpp#L253
|
||||
|
||||
The abstract logic of this thing is, when libreasapi get a request like
|
||||
+/chat/initiate_distant_chat+ then call
|
||||
+ChatHandler::handleInitiateDistantChatConnexion+ which in turn is just a
|
||||
wrapper of +RsMsgs::initiateDistantChatConnexion+ all this process is basically
|
||||
implemented as boilerplate code and would be unnecessary in a smarter design of
|
||||
the API because almost all the information needed is already present in the
|
||||
C++ API +libretroshare/src/retroshare+.
|
||||
|
||||
So a third step to improve the JSON API would be to remove this source of
|
||||
boilerplate code by automatizing the mapping between C++ and JSON API call.
|
||||
|
||||
This may result a little tricky as language parsing or other adevanced things
|
||||
may be required.
|
||||
|
||||
Hope this dive is useful for you +
|
||||
Cheers +
|
||||
G10h4ck
|
||||
|
||||
=== Second writings about this
|
||||
|
||||
I have been investigating a bit more about:
|
||||
[verse, G10h4ck]
|
||||
________________________________________________________________________________
|
||||
So a third step to improve the JSON API would be to remove this source of
|
||||
boilerplate code by automatizing the mapping between C++ and JSON API call
|
||||
________________________________________________________________________________
|
||||
|
||||
After spending some hours investigating this topic the most reasonable approach
|
||||
seems to:
|
||||
|
||||
1. Properly document headers in +libretroshare/src/retroshare/+ in doxygen syntax
|
||||
specifying wihich params are input and/or output (doxygen sysntax for this is
|
||||
+@param[in/out/inout]+) this will be the API documentation too.
|
||||
|
||||
2. At compile time use doxygen to generate XML description of the headers and use
|
||||
the XML to generate the JSON api server stub.
|
||||
http://www.stack.nl/~dimitri/doxygen/manual/customize.html#xmlgenerator
|
||||
|
||||
3. Enjoy
|
||||
|
||||
@ -1 +0,0 @@
|
||||
../../libretroshare/src/jsonapi/async-method-wrapper-template.cpp.tmpl
|
||||
80
jsonapi-generator/src/async-method-wrapper-template.cpp.tmpl
Normal file
80
jsonapi-generator/src/async-method-wrapper-template.cpp.tmpl
Normal file
@ -0,0 +1,80 @@
|
||||
/*******************************************************************************
|
||||
* RetroShare JSON API *
|
||||
* *
|
||||
* Copyright (C) 2018-2019 Gioacchino Mazzurco <gio@eigenlab.org> *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Affero General Public License version 3 as *
|
||||
* published by the Free Software Foundation. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU Affero General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Affero General Public License *
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
*******************************************************************************/
|
||||
|
||||
registerHandler( "$%apiPath%$",
|
||||
[this](const std::shared_ptr<rb::Session> session)
|
||||
{
|
||||
const std::multimap<std::string, std::string> headers
|
||||
{
|
||||
{ "Connection", "keep-alive" },
|
||||
{ "Content-Type", "text/event-stream" }
|
||||
};
|
||||
session->yield(rb::OK, headers);
|
||||
|
||||
size_t reqSize = session->get_request()->get_header("Content-Length", 0);
|
||||
session->fetch( reqSize, [this](
|
||||
const std::shared_ptr<rb::Session> session,
|
||||
const rb::Bytes& body )
|
||||
{
|
||||
INITIALIZE_API_CALL_JSON_CONTEXT;
|
||||
|
||||
if( !checkRsServicePtrReady(
|
||||
$%instanceName%$, "$%instanceName%$", cAns, session ) )
|
||||
return;
|
||||
|
||||
$%paramsDeclaration%$
|
||||
|
||||
$%inputParamsDeserialization%$
|
||||
|
||||
const std::weak_ptr<rb::Service> weakService(mService);
|
||||
const std::weak_ptr<rb::Session> weakSession(session);
|
||||
$%callbackName%$ = [weakService, weakSession]($%callbackParams%$)
|
||||
{
|
||||
auto session = weakSession.lock();
|
||||
if(!session || session->is_closed()) return;
|
||||
|
||||
auto lService = weakService.lock();
|
||||
if(!lService || lService->is_down()) return;
|
||||
|
||||
$%callbackParamsSerialization%$
|
||||
|
||||
std::stringstream sStream;
|
||||
sStream << "data: " << compactJSON << ctx.mJson << "\n\n";
|
||||
const std::string message = sStream.str();
|
||||
|
||||
lService->schedule( [weakSession, message]()
|
||||
{
|
||||
auto session = weakSession.lock();
|
||||
if(!session || session->is_closed()) return;
|
||||
session->yield(message);
|
||||
$%sessionEarlyClose%$
|
||||
} );
|
||||
};
|
||||
|
||||
$%functionCall%$
|
||||
|
||||
$%outputParamsSerialization%$
|
||||
|
||||
// return them to the API caller
|
||||
std::stringstream message;
|
||||
message << "data: " << compactJSON << cAns.mJson << "\n\n";
|
||||
session->yield(message.str());
|
||||
$%sessionDelayedClose%$
|
||||
} );
|
||||
}, $%requiresAuth%$ );
|
||||
@ -1 +0,0 @@
|
||||
../../libretroshare/src/jsonapi/jsonapi-generator-doxygen.conf
|
||||
230
jsonapi-generator/src/jsonapi-generator-doxygen.conf
Normal file
230
jsonapi-generator/src/jsonapi-generator-doxygen.conf
Normal file
@ -0,0 +1,230 @@
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = "libretroshare"
|
||||
|
||||
ALIASES += jsonapi{1}="\xmlonly<jsonapi minversion=\"\1\"/>\endxmlonly"
|
||||
ALIASES += jsonapi{2}="\xmlonly<jsonapi minversion=\"\1\" access=\"\2\"/>\endxmlonly"
|
||||
|
||||
# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
|
||||
# documentation from any documented member that it re-implements.
|
||||
# The default value is: YES.
|
||||
|
||||
INHERIT_DOCS = YES
|
||||
|
||||
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
|
||||
# according to the Markdown format, which allows for more readable
|
||||
# documentation. See http://daringfireball.net/projects/markdown/ for details.
|
||||
# The output of markdown processing is further processed by doxygen, so you can
|
||||
# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
|
||||
# case of backward compatibilities issues.
|
||||
# The default value is: YES.
|
||||
|
||||
MARKDOWN_SUPPORT = YES
|
||||
|
||||
# When enabled doxygen tries to link words that correspond to documented
|
||||
# classes, or namespaces to their corresponding documentation. Such a link can
|
||||
# be prevented in individual cases by putting a % sign in front of the word or
|
||||
# globally by setting AUTOLINK_SUPPORT to NO.
|
||||
# The default value is: YES.
|
||||
|
||||
AUTOLINK_SUPPORT = YES
|
||||
|
||||
|
||||
# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
|
||||
# documentation are documented, even if no documentation was available. Private
|
||||
# class members and static file members will be hidden unless the
|
||||
# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
|
||||
# Note: This will also disable the warnings about undocumented members that are
|
||||
# normally produced when WARNINGS is set to YES.
|
||||
# The default value is: NO.
|
||||
|
||||
EXTRACT_ALL = YES
|
||||
|
||||
|
||||
# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
|
||||
# undocumented members inside documented classes or files. If set to NO these
|
||||
# members will be included in the various overviews, but no documentation
|
||||
# section is generated. This option has no effect if EXTRACT_ALL is enabled.
|
||||
# The default value is: NO.
|
||||
|
||||
HIDE_UNDOC_MEMBERS = NO
|
||||
|
||||
# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
|
||||
# undocumented classes that are normally visible in the class hierarchy. If set
|
||||
# to NO, these classes will be included in the various overviews. This option
|
||||
# has no effect if EXTRACT_ALL is enabled.
|
||||
# The default value is: NO.
|
||||
|
||||
HIDE_UNDOC_CLASSES = NO
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The INPUT tag is used to specify the files and/or directories that contain
|
||||
# documented source files. You may enter file names like myfile.cpp or
|
||||
# directories like /usr/src/myproject. Separate the files or directories with
|
||||
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
|
||||
# Note: If this tag is empty the current directory is searched.
|
||||
|
||||
#INPUT =
|
||||
|
||||
# This tag can be used to specify the character encoding of the source files
|
||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
||||
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
|
||||
# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
|
||||
# possible encodings.
|
||||
# The default value is: UTF-8.
|
||||
|
||||
INPUT_ENCODING = UTF-8
|
||||
|
||||
# If the value of the INPUT tag contains directories, you can use the
|
||||
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
|
||||
# *.h) to filter out the source-files in the directories.
|
||||
#
|
||||
# Note that for custom extensions or not directly supported extensions you also
|
||||
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
|
||||
# read by doxygen.
|
||||
#
|
||||
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
|
||||
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
|
||||
# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
|
||||
# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
|
||||
# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
|
||||
|
||||
FILE_PATTERNS = *.c \
|
||||
*.cc \
|
||||
*.cxx \
|
||||
*.cpp \
|
||||
*.c++ \
|
||||
*.java \
|
||||
*.ii \
|
||||
*.ixx \
|
||||
*.ipp \
|
||||
*.i++ \
|
||||
*.inl \
|
||||
*.idl \
|
||||
*.ddl \
|
||||
*.odl \
|
||||
*.h \
|
||||
*.hh \
|
||||
*.hxx \
|
||||
*.hpp \
|
||||
*.h++ \
|
||||
*.cs \
|
||||
*.d \
|
||||
*.php \
|
||||
*.php4 \
|
||||
*.php5 \
|
||||
*.phtml \
|
||||
*.inc \
|
||||
*.m \
|
||||
*.markdown \
|
||||
*.md \
|
||||
*.mm \
|
||||
*.dox \
|
||||
*.py \
|
||||
*.pyw \
|
||||
*.f90 \
|
||||
*.f95 \
|
||||
*.f03 \
|
||||
*.f08 \
|
||||
*.f \
|
||||
*.for \
|
||||
*.tcl \
|
||||
*.vhd \
|
||||
*.vhdl \
|
||||
*.ucf \
|
||||
*.qsf
|
||||
|
||||
# The RECURSIVE tag can be used to specify whether or not subdirectories should
|
||||
# be searched for input files as well.
|
||||
# The default value is: NO.
|
||||
|
||||
RECURSIVE = YES
|
||||
|
||||
# The EXCLUDE tag can be used to specify files and/or directories that should be
|
||||
# excluded from the INPUT source files. This way you can easily exclude a
|
||||
# subdirectory from a directory tree whose root is specified with the INPUT tag.
|
||||
#
|
||||
# Note that relative paths are relative to the directory from which doxygen is
|
||||
# run.
|
||||
|
||||
EXCLUDE =
|
||||
|
||||
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
|
||||
# directories that are symbolic links (a Unix file system feature) are excluded
|
||||
# from the input.
|
||||
# The default value is: NO.
|
||||
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
|
||||
# If the value of the INPUT tag contains directories, you can use the
|
||||
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
|
||||
# certain files from those directories.
|
||||
#
|
||||
# Note that the wildcards are matched against the file with absolute path, so to
|
||||
# exclude all test directories for example use the pattern */test/*
|
||||
|
||||
EXCLUDE_PATTERNS =
|
||||
|
||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||
# output. The symbol name can be a fully qualified name, a word, or if the
|
||||
# wildcard * is used, a substring. Examples: ANamespace, AClass,
|
||||
# AClass::ANamespace, ANamespace::*Test
|
||||
#
|
||||
# Note that the wildcards are matched against the file with absolute path, so to
|
||||
# exclude all test directories use the pattern */test/*
|
||||
|
||||
EXCLUDE_SYMBOLS =
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the HTML output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
|
||||
# The default value is: YES.
|
||||
|
||||
GENERATE_HTML = NO
|
||||
|
||||
# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
|
||||
# The default value is: YES.
|
||||
|
||||
GENERATE_LATEX = NO
|
||||
|
||||
# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
|
||||
# captures the structure of the code including all documentation.
|
||||
# The default value is: NO.
|
||||
|
||||
GENERATE_XML = YES
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
|
||||
# C-preprocessor directives found in the sources and include files.
|
||||
# The default value is: YES.
|
||||
|
||||
ENABLE_PREPROCESSING = YES
|
||||
|
||||
# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
|
||||
# in the source code. If set to NO, only conditional compilation will be
|
||||
# performed. Macro expansion can be done in a controlled way by setting
|
||||
# EXPAND_ONLY_PREDEF to YES.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||
|
||||
MACRO_EXPANSION = NO
|
||||
|
||||
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
|
||||
# the macro expansion is limited to the macros specified with the PREDEFINED and
|
||||
# EXPAND_AS_DEFINED tags.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||
|
||||
EXPAND_ONLY_PREDEF = NO
|
||||
|
||||
@ -1 +0,0 @@
|
||||
../../libretroshare/src/jsonapi/method-wrapper-template.cpp.tmpl
|
||||
50
jsonapi-generator/src/method-wrapper-template.cpp.tmpl
Normal file
50
jsonapi-generator/src/method-wrapper-template.cpp.tmpl
Normal file
@ -0,0 +1,50 @@
|
||||
/*******************************************************************************
|
||||
* RetroShare JSON API *
|
||||
* *
|
||||
* Copyright (C) 2018-2019 Gioacchino Mazzurco <gio@eigenlab.org> *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Affero General Public License as *
|
||||
* published by the Free Software Foundation, either version 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU Affero General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Affero General Public License *
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
*******************************************************************************/
|
||||
|
||||
registerHandler( "$%apiPath%$",
|
||||
[](const std::shared_ptr<rb::Session> session)
|
||||
{
|
||||
size_t reqSize = session->get_request()->get_header("Content-Length", 0);
|
||||
session->fetch( reqSize, [](
|
||||
const std::shared_ptr<rb::Session> session,
|
||||
const rb::Bytes& body )
|
||||
{
|
||||
INITIALIZE_API_CALL_JSON_CONTEXT;
|
||||
|
||||
if( !checkRsServicePtrReady(
|
||||
$%instanceName%$, "$%instanceName%$", cAns, session ) )
|
||||
return;
|
||||
|
||||
$%paramsDeclaration%$
|
||||
|
||||
// deserialize input parameters from JSON
|
||||
$%inputParamsDeserialization%$
|
||||
|
||||
// call retroshare C++ API
|
||||
$%functionCall%$
|
||||
|
||||
// serialize out parameters and return value to JSON
|
||||
$%outputParamsSerialization%$
|
||||
|
||||
// return them to the API caller
|
||||
DEFAULT_API_CALL_JSON_RETURN(rb::OK);
|
||||
} );
|
||||
}, $%requiresAuth%$ );
|
||||
|
||||
@ -1 +0,0 @@
|
||||
Subproject commit d1af0a357a94c47d0e486bee1e5052df660cfa1f
|
||||
25
libbitdht/src/README.txt
Normal file
25
libbitdht/src/README.txt
Normal file
@ -0,0 +1,25 @@
|
||||
# SPDX-FileCopyrightText: (C) 2004-2019 Retroshare Team <contact@retroshare.cc>
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
What's in the Package
|
||||
---------------------------------------------------------------
|
||||
bitdht - base BitDHT Code.
|
||||
util - generic utils for networking and threading.
|
||||
udp - UDP interfacing code.
|
||||
lib - Where the library is created.
|
||||
tests - basic unit tests.
|
||||
example - example code of how to use libbitdht.
|
||||
libbitdht.pro - build script for Qt's qmake.
|
||||
README.txt - this file.
|
||||
|
||||
|
||||
HOWTO libbitdht.
|
||||
----------------------------------------------
|
||||
This version is build using Qt's qmake system.
|
||||
|
||||
1) Install Qt's qmake system: libqt-dev
|
||||
2) type ./qmake
|
||||
3) type ./make
|
||||
4) check out the example and tests to learn how to interface with libbitdht.
|
||||
|
||||
|
||||
133
libbitdht/src/bitdht/bdaccount.cc
Normal file
133
libbitdht/src/bitdht/bdaccount.cc
Normal file
@ -0,0 +1,133 @@
|
||||
/*******************************************************************************
|
||||
* bitdht/bdaccount.cc *
|
||||
* *
|
||||
* BitDHT: An Flexible DHT library. *
|
||||
* *
|
||||
* Copyright 2011 by Robert Fernie <bitdht@lunamutt.com> *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Affero General Public License as *
|
||||
* published by the Free Software Foundation, either version 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU Affero General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Affero General Public License *
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
*******************************************************************************/
|
||||
|
||||
#include "bitdht/bdaccount.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
|
||||
|
||||
#define LPF_FACTOR (0.90)
|
||||
|
||||
bdAccount::bdAccount()
|
||||
:mNoStats(BDACCOUNT_NUM_ENTRIES),
|
||||
mCountersOut(BDACCOUNT_NUM_ENTRIES), mCountersRecv(BDACCOUNT_NUM_ENTRIES),
|
||||
mLpfOut(BDACCOUNT_NUM_ENTRIES), mLpfRecv(BDACCOUNT_NUM_ENTRIES),
|
||||
mLabel(BDACCOUNT_NUM_ENTRIES)
|
||||
{
|
||||
|
||||
mLabel[BDACCOUNT_MSG_OUTOFDATEPING] = "OUTOFDATEPING ";
|
||||
mLabel[BDACCOUNT_MSG_PING] = "PING ";
|
||||
mLabel[BDACCOUNT_MSG_PONG] = "PONG ";
|
||||
mLabel[BDACCOUNT_MSG_QUERYNODE] = "QUERYNODE ";
|
||||
mLabel[BDACCOUNT_MSG_QUERYHASH] = "QUERYHASH ";
|
||||
mLabel[BDACCOUNT_MSG_REPLYFINDNODE] = "REPLYFINDNODE ";
|
||||
mLabel[BDACCOUNT_MSG_REPLYQUERYHASH] = "REPLYQUERYHASH ";
|
||||
|
||||
mLabel[BDACCOUNT_MSG_POSTHASH] = "POSTHASH ";
|
||||
mLabel[BDACCOUNT_MSG_REPLYPOSTHASH] = "REPLYPOSTHASH ";
|
||||
|
||||
mLabel[BDACCOUNT_MSG_CONNECTREQUEST] = "CONNECTREQUEST ";
|
||||
mLabel[BDACCOUNT_MSG_CONNECTREPLY] = "CONNECTREPLY ";
|
||||
mLabel[BDACCOUNT_MSG_CONNECTSTART] = "CONNECTSTART ";
|
||||
mLabel[BDACCOUNT_MSG_CONNECTACK] = "CONNECTACK ";
|
||||
|
||||
resetStats();
|
||||
}
|
||||
|
||||
|
||||
void bdAccount::incCounter(uint32_t idx, bool out)
|
||||
{
|
||||
if ((signed) idx > mNoStats-1)
|
||||
{
|
||||
std::cerr << "bdAccount::incCounter() Invalid Index";
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
|
||||
if (out)
|
||||
{
|
||||
mCountersOut[idx]++;
|
||||
}
|
||||
else
|
||||
{
|
||||
mCountersRecv[idx]++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void bdAccount::doStats()
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < mNoStats; i++)
|
||||
{
|
||||
mLpfOut[i] *= (LPF_FACTOR) ;
|
||||
mLpfOut[i] += (1.0 - LPF_FACTOR) * mCountersOut[i];
|
||||
|
||||
mLpfRecv[i] *= (LPF_FACTOR) ;
|
||||
mLpfRecv[i] += (1.0 - LPF_FACTOR) * mCountersRecv[i];
|
||||
}
|
||||
resetCounters();
|
||||
}
|
||||
|
||||
void bdAccount::printStats(std::ostream &out)
|
||||
{
|
||||
int i;
|
||||
out << " Send Recv: ";
|
||||
out << std::endl;
|
||||
for(i = 0; i < mNoStats; i++)
|
||||
{
|
||||
|
||||
out << "Send" << mLabel[i] << " : " << std::setw(10) << mLpfOut[i];
|
||||
out << " ";
|
||||
out << "Recv" << mLabel[i] << " : " << std::setw(10) << mLpfRecv[i];
|
||||
out << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void bdAccount::resetCounters()
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < mNoStats; i++)
|
||||
{
|
||||
mCountersOut[i] = 0;
|
||||
mCountersRecv[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void bdAccount::resetStats()
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < mNoStats; i++)
|
||||
{
|
||||
mLpfOut[i] = 0;
|
||||
mLpfRecv[i] = 0;
|
||||
}
|
||||
resetCounters();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
76
libbitdht/src/bitdht/bdaccount.h
Normal file
76
libbitdht/src/bitdht/bdaccount.h
Normal file
@ -0,0 +1,76 @@
|
||||
#ifndef BITDHT_ACCOUNT_H
|
||||
#define BITDHT_ACCOUNT_H
|
||||
|
||||
/*******************************************************************************
|
||||
* bitdht/bdaccount.h *
|
||||
* *
|
||||
* BitDHT: An Flexible DHT library. *
|
||||
* *
|
||||
* Copyright 2011 by Robert Fernie <bitdht@lunamutt.com> *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Affero General Public License as *
|
||||
* published by the Free Software Foundation, either version 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU Affero General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Affero General Public License *
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
*******************************************************************************/
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <inttypes.h>
|
||||
|
||||
#define BDACCOUNT_MSG_OUTOFDATEPING 0
|
||||
#define BDACCOUNT_MSG_PING 1
|
||||
#define BDACCOUNT_MSG_PONG 2
|
||||
#define BDACCOUNT_MSG_QUERYNODE 3
|
||||
#define BDACCOUNT_MSG_QUERYHASH 4
|
||||
#define BDACCOUNT_MSG_REPLYFINDNODE 5
|
||||
#define BDACCOUNT_MSG_REPLYQUERYHASH 6
|
||||
|
||||
#define BDACCOUNT_MSG_POSTHASH 7
|
||||
#define BDACCOUNT_MSG_REPLYPOSTHASH 8
|
||||
|
||||
#define BDACCOUNT_MSG_CONNECTREQUEST 9
|
||||
#define BDACCOUNT_MSG_CONNECTREPLY 10
|
||||
#define BDACCOUNT_MSG_CONNECTSTART 11
|
||||
#define BDACCOUNT_MSG_CONNECTACK 12
|
||||
|
||||
#define BDACCOUNT_NUM_ENTRIES 13
|
||||
|
||||
class bdAccount
|
||||
{
|
||||
public:
|
||||
|
||||
bdAccount();
|
||||
|
||||
void incCounter(uint32_t idx, bool out);
|
||||
void doStats();
|
||||
void printStats(std::ostream &out);
|
||||
void resetCounters();
|
||||
void resetStats();
|
||||
|
||||
private:
|
||||
|
||||
int mNoStats;
|
||||
|
||||
std::vector<double> mCountersOut;
|
||||
std::vector<double> mCountersRecv;
|
||||
|
||||
std::vector<double> mLpfOut;
|
||||
std::vector<double> mLpfRecv;
|
||||
|
||||
std::vector<std::string> mLabel;
|
||||
// Statistics.
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // BITDHT_ACCOUNT_H
|
||||
1004
libbitdht/src/bitdht/bdboot.txt
Normal file
1004
libbitdht/src/bitdht/bdboot.txt
Normal file
File diff suppressed because it is too large
Load Diff
55
libbitdht/src/bitdht/bdboot_generate.sh
Executable file
55
libbitdht/src/bitdht/bdboot_generate.sh
Executable file
@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
|
||||
<<LICENSE
|
||||
|
||||
Copyright (C) 2020 Gioacchino Mazzurco <gio@eigenlab.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
LICENSE
|
||||
|
||||
<<README
|
||||
Generate a clean DHT bootstrap node list.
|
||||
Feeds on previously known nodes from standard input and a few well known
|
||||
mainline DHT bootstrap nodes. Prints only nodes that appears to be active to a
|
||||
quick nmap check. Make sure your internet connection is working well before
|
||||
using this.
|
||||
|
||||
Example usage:
|
||||
--------------------------------
|
||||
cat bdboot.txt | bdboot_generate.sh | tee /tmp/bdboot_generated.txt
|
||||
cat /tmp/bdboot_generated.txt | sort -u > bdboot.txt
|
||||
--------------------------------
|
||||
README
|
||||
|
||||
function check_dht_host()
|
||||
{
|
||||
mHost="$1"
|
||||
mPort="$2"
|
||||
|
||||
sudo nmap -oG - -sU -p $mPort $mHost | grep open | \
|
||||
awk '{print $2" "$5}' | awk -F/ '{print $1}'
|
||||
}
|
||||
|
||||
cat | while read line; do
|
||||
hostIP="$(echo $line | awk '{print $1}')"
|
||||
hostPort="$(echo $line | awk '{print $2}')"
|
||||
check_dht_host $hostIP $hostPort
|
||||
done
|
||||
|
||||
check_dht_host router.utorrent.com 6881
|
||||
check_dht_host router.bittorrent.com 6881
|
||||
check_dht_host dht.libtorrent.org 25401
|
||||
check_dht_host dht.transmissionbt.com 6881
|
||||
|
||||
3528
libbitdht/src/bitdht/bdconnection.cc
Normal file
3528
libbitdht/src/bitdht/bdconnection.cc
Normal file
File diff suppressed because it is too large
Load Diff
314
libbitdht/src/bitdht/bdconnection.h
Normal file
314
libbitdht/src/bitdht/bdconnection.h
Normal file
@ -0,0 +1,314 @@
|
||||
/*******************************************************************************
|
||||
* bitdht/bdconnection.h *
|
||||
* *
|
||||
* BitDHT: An Flexible DHT library. *
|
||||
* *
|
||||
* Copyright 2011 by Robert Fernie <bitdht@lunamutt.com> *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Affero General Public License as *
|
||||
* published by the Free Software Foundation, either version 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU Affero General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Affero General Public License *
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef BITDHT_CONNECTION_H
|
||||
#define BITDHT_CONNECTION_H
|
||||
|
||||
#include "bitdht/bdiface.h"
|
||||
|
||||
class bdQueryManager;
|
||||
class bdNodePublisher;
|
||||
|
||||
/************************************************************************************************************
|
||||
************************************** ProxyTuple + Connection State ****************************************
|
||||
************************************************************************************************************/
|
||||
|
||||
#define BITDHT_CONNREQUEST_READY 1
|
||||
#define BITDHT_CONNREQUEST_PAUSED 2
|
||||
#define BITDHT_CONNREQUEST_INPROGRESS 3
|
||||
#define BITDHT_CONNREQUEST_EXTCONNECT 4
|
||||
#define BITDHT_CONNREQUEST_DONE 5
|
||||
|
||||
#define BITDHT_CONNREQUEST_TIMEOUT_CONNECT 300 // MAKE THIS LARGE - SHOULD NEVER HAPPEN.
|
||||
#define BITDHT_CONNREQUEST_TIMEOUT_INPROGRESS 30
|
||||
#define BITDHT_CONNREQUEST_MAX_AGE 60
|
||||
|
||||
|
||||
#define BITDHT_CONNECTION_WAITING_AUTH 1
|
||||
#define BITDHT_CONNECTION_WAITING_REPLY 2
|
||||
#define BITDHT_CONNECTION_WAITING_START 3
|
||||
#define BITDHT_CONNECTION_WAITING_ACK 4
|
||||
#define BITDHT_CONNECTION_COMPLETED 5
|
||||
|
||||
|
||||
#define BD_CONNECTION_START_RETRY_PERIOD 3 // Should only take a couple of seconds to get reply.
|
||||
#define BD_CONNECTION_START_MAX_RETRY 3
|
||||
#define BD_CONNECTION_MAX_TIMEOUT 20 /* should be quick */
|
||||
|
||||
|
||||
|
||||
class bdProxyTuple
|
||||
{
|
||||
public:
|
||||
bdProxyTuple() { return; }
|
||||
bdProxyTuple(bdNodeId *s, bdNodeId *p, bdNodeId *d)
|
||||
:srcId(*s), proxyId(*p), destId(*d) { return; }
|
||||
|
||||
bdNodeId srcId;
|
||||
bdNodeId proxyId;
|
||||
bdNodeId destId;
|
||||
};
|
||||
|
||||
std::ostream &operator<<(std::ostream &out, const bdProxyTuple &t);
|
||||
int operator<(const bdProxyTuple &a, const bdProxyTuple &b);
|
||||
int operator==(const bdProxyTuple &a, const bdProxyTuple &b);
|
||||
|
||||
|
||||
class bdConnection
|
||||
{
|
||||
public:
|
||||
bdConnection();
|
||||
|
||||
/** Functions to tweak the connection status */
|
||||
|
||||
// User initialised Connection.
|
||||
int ConnectionSetup(bdId *proxyId, bdId *srcConnAddr, bdId *destConnAddr, int mode, int delay);
|
||||
int ConnectionSetupDirect(bdId *destId, bdId *srcConnAddr);
|
||||
|
||||
// Initialise a new Connection. (receiving a Connection Request)
|
||||
int ConnectionRequestDirect(bdId *id, bdId *srcConnAddr, bdId *destConnAddr);
|
||||
int ConnectionRequestProxy(bdId *id, bdId *srcConnAddr, bdNodeId *ownId, bdId *destConnAddr, int mode, int delay);
|
||||
int ConnectionRequestEnd(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode);
|
||||
|
||||
// Setup Finishing Stage, (receiving a Connection Reply).
|
||||
int upgradeProxyConnectionToFinish(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int delay, int status);
|
||||
|
||||
int AuthoriseDirectConnection(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc);
|
||||
int AuthoriseProxyConnection(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc, int bandwidth);
|
||||
int AuthoriseEndConnection(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc, int delay);
|
||||
|
||||
int CompleteConnection(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int bandwidth, int delay);
|
||||
|
||||
int checkForDefaultConnectAddress();
|
||||
|
||||
/* Connection State, and TimeStamp of Update */
|
||||
int mState;
|
||||
time_t mLastEvent;
|
||||
|
||||
/* Addresses of Start/Proxy/End Nodes */
|
||||
bdId mSrcId;
|
||||
bdId mDestId;
|
||||
bdId mProxyId;
|
||||
|
||||
/* Where we are in the connection,
|
||||
* and what connection mode.
|
||||
*/
|
||||
int mPoint;
|
||||
int mMode;
|
||||
|
||||
/* must have ip:ports of connection ends (if proxied) */
|
||||
bdId mSrcConnAddr;
|
||||
bdId mDestConnAddr;
|
||||
|
||||
int mBandwidth;
|
||||
int mMaxDelay;
|
||||
time_t mConnectionStartTS;
|
||||
|
||||
/* START/ACK Finishing ****/
|
||||
time_t mLastStart; /* timer for retries */
|
||||
int mRetryCount; /* retry counter */
|
||||
|
||||
bool mSrcAck;
|
||||
bool mDestAck;
|
||||
|
||||
// Completion TS.
|
||||
time_t mCompletedTS;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#define BD_PI_SRC_UNKNOWN 0
|
||||
#define BD_PI_SRC_QUERYRESULT 1
|
||||
#define BD_PI_SRC_QUERYPROXY 2
|
||||
#define BD_PI_SRC_NODESPACE_FRIEND 3
|
||||
#define BD_PI_SRC_NODESPACE_SERVER 4
|
||||
#define BD_PI_SRC_NODESPACE_ENGINEVERSION 5
|
||||
#define BD_PI_SRC_ADDGOODPROXY 6
|
||||
|
||||
|
||||
class bdProxyId
|
||||
{
|
||||
public:
|
||||
bdProxyId(const bdId &in_id, uint32_t in_srctype, uint32_t in_errcode)
|
||||
:id(in_id), srcType(in_srctype), errcode(in_errcode) { return; }
|
||||
|
||||
bdProxyId() :srcType(BD_PI_SRC_UNKNOWN), errcode(0) { return; }
|
||||
|
||||
std::string proxySrcType() const;
|
||||
|
||||
bdId id;
|
||||
uint32_t srcType;
|
||||
uint32_t errcode;
|
||||
};
|
||||
|
||||
|
||||
class bdConnectionRequest
|
||||
{
|
||||
public:
|
||||
bdConnectionRequest() : mMode(0), mState(0), mStateTS(0), mPauseTS(0), mErrCode(0), mDelay(0), mRequestTS(0), mRecycled(0), mCurrentSrcType(0)
|
||||
{
|
||||
bdsockaddr_clear(&mLocalAddr);
|
||||
}
|
||||
|
||||
public:
|
||||
int setupDirectConnection(struct sockaddr_in *laddr, bdNodeId *target);
|
||||
int setupProxyConnection(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode, uint32_t delay);
|
||||
|
||||
int addGoodProxy(const bdId *srcId);
|
||||
int checkGoodProxyPeer(const bdId *Id);
|
||||
|
||||
bdNodeId mTarget;
|
||||
struct sockaddr_in mLocalAddr;
|
||||
int mMode;
|
||||
|
||||
int mState;
|
||||
time_t mStateTS;
|
||||
|
||||
time_t mPauseTS;
|
||||
uint32_t mErrCode;
|
||||
|
||||
int mDelay;
|
||||
time_t mRequestTS; // reference Time for mDelay.
|
||||
|
||||
std::list<bdProxyId> mGoodProxies;
|
||||
std::list<bdId> mPotentialProxies;
|
||||
//std::list<bdId> mGoodProxies;
|
||||
int mRecycled;
|
||||
|
||||
bdId mCurrentAttempt;
|
||||
uint32_t mCurrentSrcType;
|
||||
|
||||
std::list<bdProxyId> mPeersTried;
|
||||
//std::list<bdId> mPeersTried;
|
||||
};
|
||||
|
||||
std::ostream &operator<<(std::ostream &out, const bdConnectionRequest &req);
|
||||
std::ostream &operator<<(std::ostream &out, const bdConnection &conn);
|
||||
|
||||
|
||||
/*********
|
||||
* The Connection Management Class.
|
||||
* this encapsulates all of the functionality..
|
||||
* except for a couple of message in/outs + callback.
|
||||
*/
|
||||
|
||||
class bdConnectManager
|
||||
{
|
||||
public:
|
||||
|
||||
bdConnectManager(bdNodeId *ownid, bdSpace *space, bdQueryManager *qmgr, bdDhtFunctions *fns, bdNodePublisher *pub);
|
||||
|
||||
|
||||
/* connection functions */
|
||||
void requestConnection(bdNodeId *id, uint32_t modes);
|
||||
void allowConnection(bdNodeId *id, uint32_t modes);
|
||||
|
||||
|
||||
/* high level */
|
||||
|
||||
void shutdownConnections();
|
||||
void printConnections();
|
||||
|
||||
/* Connections: Configuration */
|
||||
void defaultConnectionOptions();
|
||||
virtual void setConnectionOptions(uint32_t allowedModes, uint32_t flags);
|
||||
|
||||
/* Connections: Initiation */
|
||||
|
||||
int requestConnection(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode, uint32_t delay, uint32_t start);
|
||||
int requestConnection_direct(struct sockaddr_in *laddr, bdNodeId *target);
|
||||
int requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode, uint32_t delay);
|
||||
|
||||
int killConnectionRequest(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode);
|
||||
|
||||
int checkExistingConnectionAttempt(bdNodeId *target);
|
||||
void addPotentialConnectionProxy(const bdId *srcId, const bdId *target);
|
||||
void updatePotentialConnectionProxy(const bdId *id, uint32_t mode);
|
||||
|
||||
int checkPeerForFlag(const bdId *id, uint32_t with_flag);
|
||||
|
||||
int tickConnections();
|
||||
void iterateConnectionRequests();
|
||||
int startConnectionAttempt(bdConnectionRequest *req);
|
||||
|
||||
// internal Callback -> normally continues to callbackConnect().
|
||||
void callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId,
|
||||
int mode, int point, int param, int cbtype, int errcode);
|
||||
|
||||
/* Connections: Outgoing */
|
||||
|
||||
int startConnectionAttempt(bdId *proxyId, bdId *srcConnAddr, bdId *destConnAddr, int mode, int delay);
|
||||
void AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc, int bandwidth, int delay);
|
||||
void AuthConnectionNo(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc, int errcode);
|
||||
void iterateConnections();
|
||||
|
||||
|
||||
/* Connections: Utility State */
|
||||
|
||||
bdConnection *findExistingConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId);
|
||||
bdConnection *newConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId);
|
||||
int cleanConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId);
|
||||
|
||||
int determinePosition(bdNodeId *sender, bdNodeId *src, bdNodeId *dest);
|
||||
int determineProxyId(bdNodeId *sender, bdNodeId *src, bdNodeId *dest, bdNodeId *proxyId);
|
||||
|
||||
bdConnection *findSimilarConnection(bdNodeId *srcId, bdNodeId *destId);
|
||||
bdConnection *findExistingConnectionBySender(bdId *sender, bdId *src, bdId *dest);
|
||||
bdConnection *newConnectionBySender(bdId *sender, bdId *src, bdId *dest);
|
||||
int cleanConnectionBySender(bdId *sender, bdId *src, bdId *dest);
|
||||
|
||||
// Overloaded Generalised Connection Callback.
|
||||
virtual void callbackConnect(bdId *srcId, bdId *proxyId, bdId *destId,
|
||||
int mode, int point, int param, int cbtype, int errcode);
|
||||
|
||||
/* Connections: */
|
||||
int recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int delay);
|
||||
int recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int delay, int status);
|
||||
int recvedConnectionStart(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int delayOrBandwidth);
|
||||
int recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode);
|
||||
|
||||
/* setup Relay Mode */
|
||||
void setRelayMode(uint32_t mode);
|
||||
|
||||
private:
|
||||
|
||||
std::map<bdProxyTuple, bdConnection> mConnections;
|
||||
std::map<bdNodeId, bdConnectionRequest> mConnectionRequests;
|
||||
|
||||
uint32_t mConfigAllowedModes;
|
||||
bool mConfigAutoProxy;
|
||||
|
||||
uint32_t mRelayMode;
|
||||
|
||||
/****************************** Connection Code (in bdconnection.cc) ****************************/
|
||||
|
||||
private:
|
||||
|
||||
bdNodeId mOwnId;
|
||||
bdSpace *mNodeSpace;
|
||||
bdQueryManager *mQueryMgr;
|
||||
bdDhtFunctions *mFns;
|
||||
bdNodePublisher *mPub;
|
||||
};
|
||||
|
||||
|
||||
#endif // BITDHT_CONNECTION_H
|
||||
318
libbitdht/src/bitdht/bdfilter.cc
Normal file
318
libbitdht/src/bitdht/bdfilter.cc
Normal file
@ -0,0 +1,318 @@
|
||||
/*******************************************************************************
|
||||
* bitdht/bdfilter.cc *
|
||||
* *
|
||||
* BitDHT: An Flexible DHT library. *
|
||||
* *
|
||||
* Copyright 2010 by Robert Fernie <bitdht@lunamutt.com> *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Affero General Public License as *
|
||||
* published by the Free Software Foundation, either version 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU Affero General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Affero General Public License *
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
*******************************************************************************/
|
||||
|
||||
#include "bitdht/bdfilter.h"
|
||||
#include "bitdht/bdmanager.h"
|
||||
#include "util/bdfile.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <iostream>
|
||||
#include <time.h>
|
||||
|
||||
/**
|
||||
* #define DEBUG_FILTER 1
|
||||
**/
|
||||
#define BDFILTER_ENTRY_DROP_PERIOD (7 * 24 * 3600)
|
||||
|
||||
bdFilter::bdFilter(const std::string &fname, const bdNodeId *ownid, uint32_t filterFlags, bdDhtFunctions *fns, bdNodeManager *manager)
|
||||
{
|
||||
/* */
|
||||
mOwnId = *ownid;
|
||||
mFns = fns;
|
||||
mFilename = fname ;
|
||||
|
||||
loadBannedIpFile() ;
|
||||
|
||||
mFilterFlags = filterFlags;
|
||||
mNodeManager = manager;
|
||||
}
|
||||
|
||||
void bdFilter::writeBannedIpFile()
|
||||
{
|
||||
std::string filetmp = mFilename + ".tmp" ;
|
||||
|
||||
FILE *fd = fopen(filetmp.c_str(), "w");
|
||||
|
||||
if (!fd)
|
||||
{
|
||||
std::cerr << "(EE) bdFilter::writeBannedIpFile() FAILED to Open File " << mFilename << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
for( std::map<uint32_t,bdFilteredPeer>::iterator it=mFiltered.begin();it!=mFiltered.end();++it)
|
||||
{
|
||||
fprintf(fd, "%s %u %lu %lu\n", bdnet_inet_ntoa(it->second.mAddr.sin_addr).c_str(), it->second.mFilterFlags, it->second.mFilterTS, it->second.mLastSeen) ;
|
||||
#ifdef DEBUG_FILTER
|
||||
fprintf(stderr, "Storing Peer Address: %s \n", bdnet_inet_ntoa(it->second.mAddr.sin_addr).c_str()) ;
|
||||
#endif
|
||||
|
||||
}
|
||||
fclose(fd);
|
||||
|
||||
if(!bdFile::renameFile(filetmp,mFilename))
|
||||
std::cerr << "Could not rename file !!" << std::endl;
|
||||
#ifdef DEBUG_FILTER
|
||||
else
|
||||
std::cerr << "Successfully renamed file " << filetmp << " to " << mFilename << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
void bdFilter::loadBannedIpFile()
|
||||
{
|
||||
char line[10240];
|
||||
char addr_str[10240];
|
||||
|
||||
struct sockaddr_in addr;
|
||||
memset(&addr, 0, sizeof(struct sockaddr_in));
|
||||
addr.sin_family = PF_INET;
|
||||
|
||||
FILE *fd = fopen(mFilename.c_str(),"r") ;
|
||||
|
||||
if(fd == NULL)
|
||||
{
|
||||
std::cerr << "(EE) Cannot load filter file " << mFilename << std::endl;
|
||||
return ;
|
||||
}
|
||||
|
||||
while(line == fgets(line, 10240, fd))
|
||||
{
|
||||
uint32_t filter_flags ;
|
||||
unsigned long long int filter_ts ;
|
||||
unsigned long long int last_seen ;
|
||||
|
||||
if (4 == sscanf(line, "%s %u %llu %llu", addr_str, &filter_flags,&filter_ts,&last_seen))
|
||||
{
|
||||
if (bdnet_inet_aton(addr_str, &(addr.sin_addr)))
|
||||
{
|
||||
addr.sin_port = 0;
|
||||
|
||||
bdFilteredPeer peer;
|
||||
|
||||
peer.mAddr = addr;
|
||||
peer.mFilterTS = filter_ts;
|
||||
peer.mLastSeen = last_seen;
|
||||
peer.mFilterFlags = filter_flags;
|
||||
|
||||
mFiltered[addr.sin_addr.s_addr] = peer ;
|
||||
#ifdef DEBUG_FILTER
|
||||
std::cerr << "Loaded filtered IP: " << std::string(addr_str) << " last seen: " << last_seen << ", TS=" << filter_ts << std::endl;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fclose(fd);
|
||||
}
|
||||
|
||||
//bool bdFilter::filtered(std::list<bdFilteredPeer> &answer)
|
||||
//{
|
||||
// answer = mFiltered;
|
||||
// return (answer.size() > 0);
|
||||
//}
|
||||
|
||||
bool bdFilter::filteredIPs(std::list<struct sockaddr_in> &answer)
|
||||
{
|
||||
std::map<uint32_t,bdFilteredPeer>::iterator it;
|
||||
for(it = mFiltered.begin(); it != mFiltered.end(); it++)
|
||||
{
|
||||
answer.push_back(it->second.mAddr);
|
||||
}
|
||||
return (answer.size() > 0);
|
||||
}
|
||||
|
||||
int bdFilter::checkPeer(const bdId *id, uint32_t mode)
|
||||
{
|
||||
bool add = false;
|
||||
uint32_t flags = 0;
|
||||
if ((mFilterFlags & BITDHT_FILTER_REASON_OWNID) &&
|
||||
isOwnIdWithoutBitDhtFlags(id, mode))
|
||||
{
|
||||
add = true;
|
||||
flags |= BITDHT_FILTER_REASON_OWNID;
|
||||
}
|
||||
|
||||
if (add)
|
||||
{
|
||||
bool isNew = addPeerToFilter(id->addr, flags);
|
||||
|
||||
if (isNew)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bdFilter::addPeerToFilter(const struct sockaddr_in& addr, uint32_t flags)
|
||||
{
|
||||
std::map<uint32_t,bdFilteredPeer>::iterator it = mFiltered.find(addr.sin_addr.s_addr) ;
|
||||
|
||||
if(it != mFiltered.end())
|
||||
{
|
||||
it->second.mLastSeen = time(NULL);
|
||||
it->second.mFilterFlags |= flags;
|
||||
}
|
||||
else
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
bdFilteredPeer fp;
|
||||
|
||||
fp.mAddr = addr;
|
||||
fp.mAddr.sin_port = 0;
|
||||
fp.mFilterFlags = flags;
|
||||
fp.mFilterTS = now;
|
||||
fp.mLastSeen = now;
|
||||
|
||||
uint32_t saddr = addr.sin_addr.s_addr;
|
||||
|
||||
mFiltered[saddr] = fp;
|
||||
|
||||
std::cerr << "Adding New Banned Ip Address: " << bdnet_inet_ntoa(addr.sin_addr);
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
writeBannedIpFile() ;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// void bdFilter::loadFilteredPeers(const std::list<bdFilteredPeer>& peers)
|
||||
// {
|
||||
// for(std::list<bdFilteredPeer>::iterator it = peers.begin(); it != peers.end();++it)
|
||||
// {
|
||||
// #ifdef DEBUG_FILTER
|
||||
// std::cerr << "Loading filtered peer " << inet_ntoa(it->mAddr.sin_addr) << " Flags: " << it->mFilterFlags << " FilterTS: "
|
||||
// << now - it->mFilterTS << " LastSeen: " << now - it->mLastSeen << std::endl;
|
||||
// #endif
|
||||
// uint32_t saddr = it->mAddr.sin_addr.s_addr;
|
||||
// mFiltered[saddr] = *it ;
|
||||
// }
|
||||
// }
|
||||
void bdFilter::getFilteredPeers(std::list<bdFilteredPeer>& peers)
|
||||
{
|
||||
for(std::map<uint32_t,bdFilteredPeer>::iterator it = mFiltered.begin(); it != mFiltered.end();++it)
|
||||
peers.push_back(it->second) ;
|
||||
}
|
||||
/* fast check if the addr is in the structure */
|
||||
int bdFilter::addrOkay(struct sockaddr_in *addr)
|
||||
{
|
||||
// first check upper layer
|
||||
bool isAvailable, isBanned;
|
||||
mNodeManager->doIsBannedCallback(addr, &isAvailable, &isBanned);
|
||||
|
||||
if(isAvailable) {
|
||||
#ifdef DEBUG_FILTER
|
||||
std::cerr << "bdFilter::addrOkay addr: " << inet_ntoa(addr->sin_addr) << " result from upper layer: " << (isBanned ? "banned" : "ok") << std::endl;
|
||||
#endif
|
||||
return !isBanned;
|
||||
} else {
|
||||
// fallback to own ban list
|
||||
|
||||
std::map<uint32_t,bdFilteredPeer>::const_iterator it = mFiltered.find(addr->sin_addr.s_addr);
|
||||
if (it == mFiltered.end())
|
||||
return 1; // Address is Okay
|
||||
}
|
||||
|
||||
#ifdef DEBUG_FILTER
|
||||
std::cerr << "Detected Packet From Banned Ip Address: " << inet_ntoa(addr->sin_addr);
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
bool bdFilter::isOwnIdWithoutBitDhtFlags(const bdId *id, uint32_t peerFlags)
|
||||
{
|
||||
if (peerFlags & BITDHT_PEER_STATUS_RECV_PONG)
|
||||
{
|
||||
if (peerFlags & BITDHT_PEER_STATUS_DHT_ENGINE)
|
||||
{
|
||||
/* okay! */
|
||||
return false;
|
||||
}
|
||||
|
||||
/* now check distance */
|
||||
bdMetric dist;
|
||||
mFns->bdDistance(&mOwnId, &(id->id), &dist);
|
||||
int bucket = mFns->bdBucketDistance(&dist);
|
||||
|
||||
/* if they match us... kill it */
|
||||
if (bucket == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* periodically we want to cleanup the filter....
|
||||
* if we haven't had an IP address reported as filtered for several hours.
|
||||
* remove it from the list.
|
||||
*/
|
||||
|
||||
bool bdFilter::cleanupFilter()
|
||||
{
|
||||
#ifdef DEBUG_FILTER
|
||||
std::cerr << "bdFilter: Checking current filter List:" << std::endl;
|
||||
#endif
|
||||
|
||||
time_t now = time(NULL);
|
||||
time_t dropTime = now - BDFILTER_ENTRY_DROP_PERIOD;
|
||||
|
||||
for(std::map<uint32_t,bdFilteredPeer>::iterator it = mFiltered.begin(); it != mFiltered.end();)
|
||||
{
|
||||
#ifdef DEBUG_FILTER
|
||||
std::cerr << "\t" << bdnet_inet_ntoa(it->second.mAddr.sin_addr);
|
||||
std::cerr << " Flags: " << it->second.mFilterFlags;
|
||||
std::cerr << " FilterTS: " << now - it->second.mFilterTS;
|
||||
std::cerr << " LastSeen: " << now - it->second.mLastSeen;
|
||||
#endif
|
||||
|
||||
if (it->second.mLastSeen < dropTime)
|
||||
{
|
||||
/* remove from filter */
|
||||
#ifdef DEBUG_FILTER
|
||||
std::cerr << " OLD DROPPING" << std::endl;
|
||||
#endif
|
||||
std::map<uint32_t,bdFilteredPeer>::iterator tmp(it) ;
|
||||
++tmp ;
|
||||
|
||||
mFiltered.erase(it);
|
||||
it = tmp ;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef DEBUG_FILTER
|
||||
std::cerr << " OK" << std::endl;
|
||||
#endif
|
||||
it++;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user