From fb737d87f375661953d35c25df31525f1117abfa Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 18 Jun 2024 16:28:56 +0300 Subject: [PATCH 01/11] Update osx build script. Update CMakeLists (APPLE cross-compile bug). --- CMakeLists.txt | 23 +++++ osx/build-nzbget-x64.sh | 95 -------------------- osx/build-nzbget.sh | 186 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 209 insertions(+), 95 deletions(-) delete mode 100644 osx/build-nzbget-x64.sh create mode 100755 osx/build-nzbget.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index aef1d7fc7..34b212ad5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,29 @@ project( LANGUAGES C CXX ) +if(APPLE) + # On macOS Cmake, when cross-compiling, sometimes CMAKE_SYSTEM_PROCESSOR wrongfully stays + # the same as CMAKE_HOST_SYSTEM_PROCESSOR regardless the target CPU. + # The manual call to set(CMAKE_SYSTEM_PROCESSOR) has to be set after the project() call. + # because project() might reset CMAKE_SYSTEM_PROCESSOR back to the value of CMAKE_HOST_SYSTEM_PROCESSOR. + # Check if CMAKE_SYSTEM_PROCESSOR is not equal to CMAKE_OSX_ARCHITECTURES + if(NOT CMAKE_OSX_ARCHITECTURES STREQUAL "") + if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_OSX_ARCHITECTURES) + # Split CMAKE_OSX_ARCHITECTURES into a list + string(REPLACE ";" " " ARCH_LIST ${CMAKE_OSX_ARCHITECTURES}) + separate_arguments(ARCH_LIST UNIX_COMMAND ${ARCH_LIST}) + # Count the number of architectures + list(LENGTH ARCH_LIST ARCH_COUNT) + # Ensure that exactly one architecture is specified + if(NOT ARCH_COUNT EQUAL 1) + message(FATAL_ERROR "CMAKE_OSX_ARCHITECTURES must have exactly one value. Current value: ${CMAKE_OSX_ARCHITECTURES}") + endif() + set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_OSX_ARCHITECTURES}) + message(STATUS "CMAKE_SYSTEM_PROCESSOR is manually set to ${CMAKE_SYSTEM_PROCESSOR}") + endif() + endif() +endif() + if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|AppleClang") set(CMAKE_CXX_FLAGS_DEBUG "-O0 -pthread -g -DDEBUG -Weverything -Wno-c++98-compat" CACHE STRING "" FORCE) diff --git a/osx/build-nzbget-x64.sh b/osx/build-nzbget-x64.sh deleted file mode 100644 index af6331e31..000000000 --- a/osx/build-nzbget-x64.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/sh - -# strict error handling for debugging -set -o nounset -set -o errexit - -# config variables -# urls -URL_UNRAR=https://www.rarlab.com/rar/rarmacos-x64-624.tar.gz -URL_7Z=https://www.7-zip.org/a/7z2301-mac.tar.xz -# use vcpkg libs for build and link daemon - install it via ./vcpkg install boost-json boost-optional libxml2 zlib openssl -LIB_PATH=$HOME/vcpkg/installed/x64-osx/lib -INCLUDE_PATH=$HOME/vcpkg/installed/x64-osx/include -# make jobs -JOBS=$(sysctl -n hw.ncpu) - -# create directories and cleanup -mkdir -p build -rm -rf build/* -NZBGET_PATH=build/nzbget -BUILD_PATH=build/release64 -mkdir $NZBGET_PATH -mkdir $BUILD_PATH - -export LIBS="-liconv -lncurses $LIB_PATH/libboost_json.a $LIB_PATH/libxml2.a $LIB_PATH/libz.a $LIB_PATH/libssl.a $LIB_PATH/libcrypto.a $LIB_PATH/liblzma.a" -export INCLUDES="$INCLUDE_PATH/;$INCLUDE_PATH/libxml2/" -VERSION=$(grep "set(VERSION " CMakeLists.txt | cut -d '"' -f 2) -VERSION_SUFFIX="" -if [ $# -gt 0 ]; then - if [ "$1" == "testing" ]; then - VERSION_SUFFIX="-testing-$(date '+%Y%m%d')" - fi -fi - -# copy macOS project to package -cp -r osx "$NZBGET_PATH/" -DAEMON_PATH=osx/Resources/daemon/usr/local - -# make static daemon binary -cd $BUILD_PATH -cmake ../.. -DENABLE_STATIC=ON -DCMAKE_INSTALL_PREFIX="$PWD/../../$NZBGET_PATH/$DAEMON_PATH" -DVERSION_SUFFIX="$VERSION_SUFFIX" -cmake --build . -j $JOBS -strip nzbget -cmake --install . -cd ../.. - -# fetch tools and root certificates -cd $NZBGET_PATH -mkdir -p $DAEMON_PATH/bin -rm -rf $DAEMON_PATH/etc - -# 7zip -curl -o 7z.tar.xz $URL_7Z -mkdir -p 7z -tar xf 7z.tar.xz -C 7z -cp 7z/7zz $DAEMON_PATH/bin/7za - -# unrar -curl -o unrar.tar.gz $URL_UNRAR -tar -xf unrar.tar.gz -cp rar/unrar $DAEMON_PATH/bin/unrar - -# root certificates -curl -o $DAEMON_PATH/bin/cacert.pem https://curl.se/ca/cacert.pem - -# adjust nzbget.conf -CONF_FILE=$DAEMON_PATH/share/nzbget/nzbget.conf -sed -i '' 's:^MainDir=.*:MainDir=~/Library/Application Support/NZBGet:' $CONF_FILE -sed -i '' 's:^DestDir=.*:DestDir=~/Downloads:' $CONF_FILE -sed -i '' 's:^InterDir=.*:InterDir=~/Downloads/Intermediate:' $CONF_FILE -sed -i '' 's:^WebDir=.*:# NOTE\: option WebDir cannot be changed because it is hardcoded in OSX version.:' $CONF_FILE -sed -i '' 's:^LockFile=.*:# NOTE\: option LockFile cannot be changed because it is hardcoded in OSX version.:' $CONF_FILE -sed -i '' 's:^LogFile=.*:LogFile=~/Library/Logs/NZBGet.log:' $CONF_FILE -sed -i '' '/# example configuration file (installed to/{N;s/.*/# example configuration file (installed to\n# \/usr\/local\/share\/nzbget\/nz bget.conf)./;}' $CONF_FILE -sed -i '' 's:^ConfigTemplate=.*:# NOTE\: option ConfigTemplate cannot be changed because it is hardcoded in OSX version.:' $CONF_FILE -sed -i '' 's:^DaemonUsername=.*:# NOTE\: option DaemonUsername cannot be changed because it is hardcoded in OSX version.:' $CONF_FILE -sed -i '' 's:^CertStore=.*:CertStore=${AppDir}/cacert.pem:' $CONF_FILE -sed -i '' 's:^CertCheck=.*:CertCheck=yes:' $CONF_FILE -sed -i '' 's:^AuthorizedIP=.*:AuthorizedIP=127.0.0.1:' $CONF_FILE -sed -i '' 's:^ArticleCache=.*:ArticleCache=700:' $CONF_FILE -sed -i '' 's:^DirectWrite=.*:DirectWrite=no:' $CONF_FILE -sed -i '' 's:^WriteBuffer=.*:WriteBuffer=1024:' $CONF_FILE -sed -i '' 's:^ParBuffer=.*:ParBuffer=500:' $CONF_FILE -sed -i '' 's:^DirectRename=.*:DirectRename=yes:' $CONF_FILE -sed -i '' 's:^DirectUnpack=.*:DirectUnpack=yes:' $CONF_FILE -sed -i '' 's:^UnrarCmd=.*:UnrarCmd=${AppDir}/unrar:' $CONF_FILE -sed -i '' 's:^SevenZipCmd=.*:SevenZipCmd=${AppDir}/7za:' $CONF_FILE - -# build macos frontend -xcodebuild -project osx/NZBGet.xcodeproj -configuration "Release" -destination "platform=macOS" build - -# create build archive -ARCHIVE_NAME=nzbget-$VERSION$VERSION_SUFFIX-bin-macos-x64.zip -(cd osx/build/Release/ && zip -r $ARCHIVE_NAME NZBGet.app) -mv osx/build/Release/$ARCHIVE_NAME .. diff --git a/osx/build-nzbget.sh b/osx/build-nzbget.sh new file mode 100755 index 000000000..f267aca7a --- /dev/null +++ b/osx/build-nzbget.sh @@ -0,0 +1,186 @@ +#!/bin/sh + +# strict error handling for debugging +set -o nounset +set -o errexit + +# config variables +# urls + +# unpackers versions +UNRAR_VERSION=701 +ZIP7_VERSION=2405 + +ALL_ARCHS="x64 arm64" +# make jobs +JOBS=$(sysctl -n hw.ncpu) + +ARCH_PARAM="" +if [ $# -gt 0 ]; then + ARCH_PARAM=$1 +fi + +case $ARCH_PARAM in + x64|arm64) + ARCHS=$ARCH_PARAM + ;; + universal) + ARCHS=$ALL_ARCHS + ;; + "") + echo "No architecture specified." + echo "Script usage: bash osx/build-nzbget.sh [testing]" + echo " can be: x64 arm64 universal" + exit 1 + ;; + *) + echo "Invalid architecture specified: $ARCH_PARAM" + exit 1 + ;; +esac + +# version handling +VERSION=$(grep "set(VERSION " CMakeLists.txt | cut -d '"' -f 2) +VERSION_SUFFIX="" +if [ $# -gt 1 ]; then + if [ "$2" == "testing" ]; then + VERSION_SUFFIX="-testing-$(date '+%Y%m%d')" + fi +fi + +# create directories and cleanup +mkdir -p build +rm -rf build/* + +for ARCH in $ARCHS; do + + echo "Make $ARCH nzbget package..." + + # use vcpkg libs for build and link daemon + LIB_PATH=$HOME/vcpkg/installed/$ARCH-osx/lib + INCLUDE_PATH=$HOME/vcpkg/installed/$ARCH-osx/include + + + NZBGET_PATH=build/nzbget-$ARCH + BUILD_PATH=build/release-$ARCH + mkdir $NZBGET_PATH + mkdir $BUILD_PATH + + export LIBS="-liconv -lncurses $LIB_PATH/libboost_json.a $LIB_PATH/libxml2.a $LIB_PATH/libz.a $LIB_PATH/libssl.a $LIB_PATH/libcrypto.a $LIB_PATH/liblzma.a" + export INCLUDES="$INCLUDE_PATH/;$INCLUDE_PATH/libxml2/" + + # copy macOS project to package + cp -r osx "$NZBGET_PATH/" + DAEMON_PATH=osx/Resources/daemon/usr/local + + # make static daemon binary + cd $BUILD_PATH + if [ "$ARCH" == "x64" ]; then + CMAKE_ARCH="x86_64" + else + CMAKE_ARCH=$ARCH + fi + + cmake ../.. \ + -DENABLE_STATIC=ON \ + -DCMAKE_INSTALL_PREFIX="$PWD/../../$NZBGET_PATH/$DAEMON_PATH" \ + -DVERSION_SUFFIX="$VERSION_SUFFIX" \ + -DCMAKE_SYSTEM_PROCESSOR=$CMAKE_ARCH \ + -DCMAKE_OSX_ARCHITECTURES=$CMAKE_ARCH + + BUILD_STATUS="" + cmake --build . -j $JOBS 2>build.log || BUILD_STATUS=$? + if [ ! -z $BUILD_STATUS ]; then + tail -20 build.log + exit 1 + fi + + strip nzbget + cmake --install . >/dev/null + cd ../.. + + # fetch tools and root certificates + cd $NZBGET_PATH + mkdir -p $DAEMON_PATH/bin + rm -rf $DAEMON_PATH/etc + + # 7zip + URL_7Z=https://www.7-zip.org/a/7z$ZIP7_VERSION-mac.tar.xz + curl -o 7z.tar.xz $URL_7Z + mkdir -p 7z + tar xf 7z.tar.xz -C 7z + cp 7z/7zz $DAEMON_PATH/bin/7za + + # unrar + if [ "$ARCH" == "arm64" ]; then + UNRAR_ARCH="arm" + else + UNRAR_ARCH=$ARCH + fi + URL_UNRAR=https://www.rarlab.com/rar/rarmacos-$UNRAR_ARCH-$UNRAR_VERSION.tar.gz + curl -o unrar.tar.gz $URL_UNRAR + tar -xf unrar.tar.gz + cp rar/unrar $DAEMON_PATH/bin/unrar + + # root certificates + curl -o $DAEMON_PATH/bin/cacert.pem https://curl.se/ca/cacert.pem + + # adjust nzbget.conf + CONF_FILE=$DAEMON_PATH/share/nzbget/nzbget.conf + sed -i '' 's:^MainDir=.*:MainDir=~/Library/Application Support/NZBGet:' $CONF_FILE + sed -i '' 's:^DestDir=.*:DestDir=~/Downloads:' $CONF_FILE + sed -i '' 's:^InterDir=.*:InterDir=~/Downloads/Intermediate:' $CONF_FILE + sed -i '' 's:^WebDir=.*:# NOTE\: option WebDir cannot be changed because it is hardcoded in OSX version.:' $CONF_FILE + sed -i '' 's:^LockFile=.*:# NOTE\: option LockFile cannot be changed because it is hardcoded in OSX version.:' $CONF_FILE + sed -i '' 's:^LogFile=.*:LogFile=~/Library/Logs/NZBGet.log:' $CONF_FILE + sed -i '' '/# example configuration file (installed to/{N;s/.*/# example configuration file (installed to\n# \/usr\/local\/share\/nzbget\/nz bget.conf)./;}' $CONF_FILE + sed -i '' 's:^ConfigTemplate=.*:# NOTE\: option ConfigTemplate cannot be changed because it is hardcoded in OSX version.:' $CONF_FILE + sed -i '' 's:^DaemonUsername=.*:# NOTE\: option DaemonUsername cannot be changed because it is hardcoded in OSX version.:' $CONF_FILE + sed -i '' 's:^CertStore=.*:CertStore=${AppDir}/cacert.pem:' $CONF_FILE + sed -i '' 's:^CertCheck=.*:CertCheck=yes:' $CONF_FILE + sed -i '' 's:^AuthorizedIP=.*:AuthorizedIP=127.0.0.1:' $CONF_FILE + sed -i '' 's:^ArticleCache=.*:ArticleCache=700:' $CONF_FILE + sed -i '' 's:^DirectWrite=.*:DirectWrite=no:' $CONF_FILE + sed -i '' 's:^WriteBuffer=.*:WriteBuffer=1024:' $CONF_FILE + sed -i '' 's:^ParBuffer=.*:ParBuffer=500:' $CONF_FILE + sed -i '' 's:^DirectRename=.*:DirectRename=yes:' $CONF_FILE + sed -i '' 's:^DirectUnpack=.*:DirectUnpack=yes:' $CONF_FILE + sed -i '' 's:^UnrarCmd=.*:UnrarCmd=${AppDir}/unrar:' $CONF_FILE + sed -i '' 's:^SevenZipCmd=.*:SevenZipCmd=${AppDir}/7za:' $CONF_FILE + + # build macos frontend + BUILD_STATUS="" + xcodebuild -project osx/NZBGet.xcodeproj -configuration "Release" -destination "platform=macOS" build >build.log 2>&1 + if [ ! -z $BUILD_STATUS ]; then + tail -20 build.log + exit 1 + fi + + # create build archive + ARCHIVE_NAME=nzbget-$VERSION$VERSION_SUFFIX-bin-macos-$ARCH.zip + (cd osx/build/Release/ && zip -r $ARCHIVE_NAME NZBGet.app >/dev/null) + mv osx/build/Release/$ARCHIVE_NAME .. + cd ../.. +done + +# make universal daemon binary and universal archive +if [ "$ARCH_PARAM" == "universal" ]; then + echo "Make universal nzbget package..." + cd build + for ARCH in $ALL_ARCHS; do + unzip nzbget-$VERSION$VERSION_SUFFIX-bin-macos-$ARCH.zip >/dev/null + mv NZBGet.app NZBGet.$ARCH.app + done + DAEMON_PATH=Contents/Resources/daemon/usr/local/bin/ + # nzbget universal binary + lipo -create NZBGet.x64.app/$DAEMON_PATH/nzbget NZBGet.arm64.app/$DAEMON_PATH/nzbget -output nzbget + # unrar universal binary + lipo -create NZBGet.x64.app/$DAEMON_PATH/unrar NZBGet.arm64.app/$DAEMON_PATH/unrar -output unrar + rm -rf NZBGet.x64.app + mv NZBGet.arm64.app NZBGet.app + mv nzbget NZBGet.app/$DAEMON_PATH/nzbget + mv unrar NZBGet.app/$DAEMON_PATH/unrar + zip -r nzbget-$VERSION$VERSION_SUFFIX-bin-macos-universal.zip NZBGet.app >/dev/null +fi + +echo "Done." From e611d2268fbadd1d27951ad53c35f3e371be7c18 Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 18 Jun 2024 16:31:55 +0300 Subject: [PATCH 02/11] Update osx workflow --- .github/workflows/osx.yml | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/.github/workflows/osx.yml b/.github/workflows/osx.yml index 87ff84e83..53a52c45e 100644 --- a/.github/workflows/osx.yml +++ b/.github/workflows/osx.yml @@ -18,9 +18,9 @@ jobs: - name: Build run: | if [ "$GITHUB_REF_NAME" != "main" ]; then - bash osx/build-nzbget-x64.sh testing + bash osx/build-nzbget.sh x64 testing else - bash osx/build-nzbget-x64.sh + bash osx/build-nzbget.sh x64 fi - name: Rename build artifacts @@ -51,26 +51,22 @@ jobs: with: fetch-depth: 0 - - name: Change version for non-release - if: github.ref_name != 'main' - run: | - VERSION=$(cat configure.ac | grep AC_INIT | cut -d , -f 2 | xargs) - NEW_VERSION="$VERSION-testing-$(date '+%Y%m%d')" - sed -e "s|AC_INIT(nzbget.*|AC_INIT(nzbget, $NEW_VERSION, https://github.com/nzbgetcom/nzbget/issues)|g" -i '' configure.ac - echo NEW_VERSION=$NEW_VERSION >> $GITHUB_ENV - - name: Build run: | - bash osx/build-nzbget-universal.sh + if [ "$GITHUB_REF_NAME" != "main" ]; then + bash osx/build-nzbget.sh universal testing + else + bash osx/build-nzbget.sh universal + fi - name: Rename build artifacts if: github.ref_name != 'main' && github.ref_name != 'develop' run: | - cd osx/build/Release - NEW_VERSION_FEATURE="$NEW_VERSION-${GITHUB_REF_NAME/\//-}" + cd build + SUFFIX="${GITHUB_REF_NAME/\//-}" for FILE in *.zip; do [ -f $FILE ] || continue - NEW_FILE=${FILE/$NEW_VERSION/$NEW_VERSION_FEATURE} + NEW_FILE=${FILE/-bin-macos-universal.zip/-$SUFFIX-bin-macos-universal.zip} mv $FILE $NEW_FILE done @@ -78,7 +74,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: nzbget-osx-installers-universal - path: osx/build/Release/*.zip + path: build/*-universal.zip retention-days: 5 combine-osx-artifacts: From b983a582a1065191e319765be098e7f25e222dd1 Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 18 Jun 2024 17:01:16 +0300 Subject: [PATCH 03/11] Update osx build info --- osx/build-info.md | 57 ++++++++++++++------------------------------- osx/build-nzbget.sh | 32 ++++++++++++++++++------- 2 files changed, 41 insertions(+), 48 deletions(-) diff --git a/osx/build-info.md b/osx/build-info.md index 8837a9782..1f79c2627 100644 --- a/osx/build-info.md +++ b/osx/build-info.md @@ -1,47 +1,21 @@ # About -"build-nzbget-*.sh" is a bash scripts which is used to build macOS nzbget binaries -- [build-nzbget-universal.sh](#build-nzbget-universalsh) - universal (Intel/Apple Silicon) application (macOS Monterey 12+) -- [build-macos-x64.sh](#build-nzbget-x64sh) - x64 application (macOS Mojave 10.14+) +`build-nzbget.sh` is a bash scripts which is used to build macOS nzbget binaries -## build-nzbget-universal.sh - -### Prerequisites -- Homebrew package manager (https://brew.sh/) and several dependencies: - -Install homebrew: -``` -/bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -``` -Install dependencies: -``` -brew install git zlib libxml2 ncurses openssl@3 pkg-config boost -``` - -- Xcode build tools -``` -xcode-select --install -``` - -### Building NZBGet -From cloned repository run -``` -bash osx/build-nzbget-universal.sh -``` - -### Output files -- osx/build/Release/NZBGet.app - application -- osx/build/Release/nzbget-$VERSION-bin-macos-universal.zip - release archive - -## build-nzbget-x64.sh - -### Prerequisites +## Prerequisites - vcpkg package manager (https://vcpkg.io/) and several dependencies: ``` cd $HOME git clone https://github.com/microsoft/vcpkg cd vcpkg ./bootstrap-vcpkg.sh -./vcpkg install boost-json boost-optional libxml2 zlib openssl +``` +For x64 builds: +``` +./vcpkg install boost-json:x64-osx boost-optional:x64-osx libxml2:x64-osx zlib:x64-osx openssl:x64-osx +``` +For arm64 builds: +``` +./vcpkg install boost-json:arm64-osx boost-optional:arm64-osx libxml2:arm64-osx zlib:arm64-osx openssl:arm64-osx ``` - Xcode build tools ``` @@ -50,12 +24,15 @@ xcode-select --install - cmake 3.13+ ### Building NZBGet -From cloned repository run +From the cloned repository, run: ``` -bash osx/build-nzbget-x64.sh [testing] +bash osx/build-nzbget.sh [arch] [testing] ``` +- `arch` - can be + - x64 + - arm64 + - universal (default value) - `testing` - build testing package (add VersionSuffix=`-testing-$yyyyMMdd` to package version) ### Output files -- build/nzbget/osx/build/Release/NZBGet.app - application -- build/nzbget-$VERSION-bin-macos-x64.zip - release archive +- build/nzbget-$VERSION-bin-macos-$ARCH.zip - release archive diff --git a/osx/build-nzbget.sh b/osx/build-nzbget.sh index f267aca7a..c18712dfc 100755 --- a/osx/build-nzbget.sh +++ b/osx/build-nzbget.sh @@ -1,20 +1,36 @@ #!/bin/sh +# +# This file is part of nzbget. See . +# +# Copyright (C) 2024 phnzb +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# # strict error handling for debugging set -o nounset set -o errexit -# config variables -# urls - # unpackers versions UNRAR_VERSION=701 ZIP7_VERSION=2405 -ALL_ARCHS="x64 arm64" # make jobs JOBS=$(sysctl -n hw.ncpu) +# command-line params handling +ALL_ARCHS="x64 arm64" ARCH_PARAM="" if [ $# -gt 0 ]; then ARCH_PARAM=$1 @@ -28,13 +44,13 @@ case $ARCH_PARAM in ARCHS=$ALL_ARCHS ;; "") - echo "No architecture specified." - echo "Script usage: bash osx/build-nzbget.sh [testing]" - echo " can be: x64 arm64 universal" - exit 1 + ARCH_PARAM="universal" + ARCHS=$ALL_ARCHS ;; *) echo "Invalid architecture specified: $ARCH_PARAM" + echo "Script usage: bash osx/build-nzbget.sh [arch] [testing]" + echo "arch can be: x64 arm64 universal" exit 1 ;; esac From adac2008a6ab46dc063ea13f9710387724b2be61 Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 18 Jun 2024 17:10:44 +0300 Subject: [PATCH 04/11] Remove qnap native and synology packages from build workflow --- .github/workflows/build.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a9895bf94..6b6c7172b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,12 +19,6 @@ jobs: permissions: actions: write - build-synology: - uses: ./.github/workflows/synology.yml - - build-qnap: - uses: ./.github/workflows/qnap.yml - build-linux-pkg: uses: ./.github/workflows/linux-pkg.yml with: @@ -59,9 +53,7 @@ jobs: mv nzbget-windows-installers/* builds || true mv nzbget-linux-installers/* builds || true mv nzbget-osx-installers/* builds || true - mv nzbget-synology-packages/* builds || true mv nzbget-qnap-packages/* builds || true - mv nzbget-qnap-native-packages/* builds || true mv nzbget-deb-packages/* builds || true mv nzbget-rpm-packages/* builds || true cd builds @@ -111,9 +103,7 @@ jobs: nzbget-windows-installers nzbget-linux-installers nzbget-osx-installers - nzbget-synology-packages nzbget-qnap-packages - nzbget-qnap-native-packages - name: Delete unneded linux packages artifacts uses: geekyeggo/delete-artifact@v4 From 8c0e30ac9eedad879c8178ef5a7858d57d776d79 Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 18 Jun 2024 17:11:53 +0300 Subject: [PATCH 05/11] Fix build workflow --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6b6c7172b..35aef5aab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,7 @@ jobs: env: PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} runs-on: ubuntu-latest - needs: [build-windows, build-linux, build-osx, build-synology, build-qnap, repack-qnap, build-linux-pkg] + needs: [build-windows, build-linux, build-osx, repack-qnap, build-linux-pkg] permissions: actions: write steps: From 92d991358cc25c942da2fbafa69141616d609384 Mon Sep 17 00:00:00 2001 From: phnzb Date: Tue, 18 Jun 2024 17:21:11 +0300 Subject: [PATCH 06/11] Fix CMakeLists identation --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 34b212ad5..8f9377e42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ if(APPLE) # because project() might reset CMAKE_SYSTEM_PROCESSOR back to the value of CMAKE_HOST_SYSTEM_PROCESSOR. # Check if CMAKE_SYSTEM_PROCESSOR is not equal to CMAKE_OSX_ARCHITECTURES if(NOT CMAKE_OSX_ARCHITECTURES STREQUAL "") - if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_OSX_ARCHITECTURES) + if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_OSX_ARCHITECTURES) # Split CMAKE_OSX_ARCHITECTURES into a list string(REPLACE ";" " " ARCH_LIST ${CMAKE_OSX_ARCHITECTURES}) separate_arguments(ARCH_LIST UNIX_COMMAND ${ARCH_LIST}) @@ -57,8 +57,8 @@ if(APPLE) endif() set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_OSX_ARCHITECTURES}) message(STATUS "CMAKE_SYSTEM_PROCESSOR is manually set to ${CMAKE_SYSTEM_PROCESSOR}") - endif() - endif() + endif() + endif() endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") From 98910fc0c3af056c433301e3b2d3ddfd0cb958db Mon Sep 17 00:00:00 2001 From: phnzb Date: Wed, 19 Jun 2024 15:43:59 +0300 Subject: [PATCH 07/11] Cleanup repo from oudated files. --- .github/workflows/qnap.yml | 49 - .github/workflows/synology.yml | 43 - Makefile.am | 434 ------- README.md | 4 +- configure.ac | 689 ----------- synology/README.md => docs/SYNOLOGY.md | 17 +- linux/build-info.md | 199 ---- linux/build-nzbget | 607 ---------- linux/build-toolchain-android | 197 ---- linux/build-toolchain-freebsd | 147 --- linux/build-unpack | 249 ---- linux/installer.sh | 1 + linux/pkg/build-info.md | 2 +- nzbget.vcxproj | 455 -------- posix/ax_boost_json.m4 | 123 -- posix/ax_cxx_compile_stdcxx.m4 | 1018 ----------------- qnap/README.md | 4 +- qnap/build-info.md | 43 - qnap/build-nzbget.sh | 251 ---- qnap/repack-info.md | 2 +- qnap/repack-nzbget.sh | 19 + synology/build-info.md | 44 - synology/build-nzbget.sh | 66 -- synology/package/INFO.sh | 22 - synology/package/PACKAGE_ICON.PNG | Bin 13154 -> 0 bytes synology/package/PACKAGE_ICON_256.PNG | Bin 37045 -> 0 bytes synology/package/README.md | 7 - synology/package/SynoBuildConf/build | 42 - synology/package/SynoBuildConf/depends | 4 - synology/package/SynoBuildConf/install | 56 - .../package/WIZARD_UIFILES/install_uifile | 80 -- .../package/WIZARD_UIFILES/uninstall_uifile | 16 - .../package/WIZARD_UIFILES/upgrade_uifile | 12 - synology/package/conf/privilege | 5 - synology/package/conf/resource | 19 - synology/package/nzbget.sc | 5 - synology/package/scripts/postinst | 32 - synology/package/scripts/postuninst | 9 - synology/package/scripts/postupgrade | 3 - synology/package/scripts/preinst | 3 - synology/package/scripts/preuninst | 3 - synology/package/scripts/preupgrade | 3 - synology/package/scripts/start-stop-status | 25 - synology/package/scripts/vars | 2 - windows/build-info.md | 2 +- windows/build-nzbget-vs22.bat | 252 ---- windows/build-nzbget.bat | 264 ----- windows/build-nzbget.ps1 | 19 + windows/nzbget-setup.nsi | 1 + 49 files changed, 56 insertions(+), 5493 deletions(-) delete mode 100644 .github/workflows/qnap.yml delete mode 100644 .github/workflows/synology.yml delete mode 100644 Makefile.am delete mode 100644 configure.ac rename synology/README.md => docs/SYNOLOGY.md (73%) delete mode 100644 linux/build-info.md delete mode 100755 linux/build-nzbget delete mode 100755 linux/build-toolchain-android delete mode 100755 linux/build-toolchain-freebsd delete mode 100755 linux/build-unpack delete mode 100755 nzbget.vcxproj delete mode 100644 posix/ax_boost_json.m4 delete mode 100644 posix/ax_cxx_compile_stdcxx.m4 delete mode 100644 qnap/build-info.md delete mode 100644 qnap/build-nzbget.sh delete mode 100644 synology/build-info.md delete mode 100644 synology/build-nzbget.sh delete mode 100755 synology/package/INFO.sh delete mode 100644 synology/package/PACKAGE_ICON.PNG delete mode 100644 synology/package/PACKAGE_ICON_256.PNG delete mode 100644 synology/package/README.md delete mode 100644 synology/package/SynoBuildConf/build delete mode 100644 synology/package/SynoBuildConf/depends delete mode 100644 synology/package/SynoBuildConf/install delete mode 100644 synology/package/WIZARD_UIFILES/install_uifile delete mode 100644 synology/package/WIZARD_UIFILES/uninstall_uifile delete mode 100644 synology/package/WIZARD_UIFILES/upgrade_uifile delete mode 100644 synology/package/conf/privilege delete mode 100644 synology/package/conf/resource delete mode 100644 synology/package/nzbget.sc delete mode 100755 synology/package/scripts/postinst delete mode 100755 synology/package/scripts/postuninst delete mode 100755 synology/package/scripts/postupgrade delete mode 100755 synology/package/scripts/preinst delete mode 100755 synology/package/scripts/preuninst delete mode 100755 synology/package/scripts/preupgrade delete mode 100755 synology/package/scripts/start-stop-status delete mode 100644 synology/package/scripts/vars delete mode 100644 windows/build-nzbget-vs22.bat delete mode 100644 windows/build-nzbget.bat diff --git a/.github/workflows/qnap.yml b/.github/workflows/qnap.yml deleted file mode 100644 index 258fb7029..000000000 --- a/.github/workflows/qnap.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: qnap build - -on: - workflow_call: - workflow_dispatch: - -jobs: - build: - runs-on: [self-hosted, nzbget-qnap] - - steps: - - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Save version for non-release to env - if: github.ref_name != 'main' - run: | - VERSION=$(cat configure.ac | grep AC_INIT | cut -d , -f 2 | xargs) - echo VERSION=$VERSION >> $GITHUB_ENV - - - name: Build - run: | - export PATH="$PATH:/usr/share/QDK/bin" - bash qnap/build-nzbget.sh - - - name: Rename build artifacts - if: github.ref_name != 'main' - run: | - cd /qnap/nzbget/build/ - NEW_VERSION="$VERSION-testing-$(date '+%Y%m%d')" - for FILE in *.qpkg; do - [ -f $FILE ] || continue - NEW_FILE=${FILE/$VERSION/$NEW_VERSION} - sudo mv $FILE $NEW_FILE - done - - - name: Upload build artifacts - uses: actions/upload-artifact@v4 - with: - name: nzbget-qnap-native-packages - path: /qnap/nzbget/build/*.qpkg - retention-days: 5 - - - name: Cleanup - run: | - rm -rf /qnap/nzbget/ diff --git a/.github/workflows/synology.yml b/.github/workflows/synology.yml deleted file mode 100644 index 1f996f3f3..000000000 --- a/.github/workflows/synology.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: synology build - -on: - workflow_call: - workflow_dispatch: - -jobs: - build: - runs-on: [self-hosted, nzbget-synology] - - steps: - - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Build - run: | - sudo -E bash synology/build-nzbget.sh - - - name: Rename build artifacts - if: github.ref_name != 'main' - run: | - cd /toolkit/result_spk/nzbget/ - VERSION=$(date '+%Y%m%d') - NEW_VERSION="$VERSION-testing" - for FILE in *.spk; do - [ -f $FILE ] || continue - NEW_FILE=${FILE/$VERSION/$NEW_VERSION} - sudo mv $FILE $NEW_FILE - done - - - name: Upload build artifacts - uses: actions/upload-artifact@v4 - with: - name: nzbget-synology-packages - path: /toolkit/result_spk/nzbget/*.spk - retention-days: 5 - - - name: Cleanup - run: | - sudo rm /toolkit/result_spk/nzbget/*.spk diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 1871a03fa..000000000 --- a/Makefile.am +++ /dev/null @@ -1,434 +0,0 @@ -# -# This file is part of nzbget. See . -# -# Copyright (C) 2008-2019 Andrey Prygunkov -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -bin_PROGRAMS = nzbget - -nzbget_SOURCES = \ - daemon/connect/Connection.cpp \ - daemon/connect/Connection.h \ - daemon/connect/TlsSocket.cpp \ - daemon/connect/TlsSocket.h \ - daemon/connect/WebDownloader.cpp \ - daemon/connect/WebDownloader.h \ - daemon/extension/FeedScript.cpp \ - daemon/extension/FeedScript.h \ - daemon/extension/CommandScript.cpp \ - daemon/extension/CommandScript.h \ - daemon/extension/NzbScript.cpp \ - daemon/extension/NzbScript.h \ - daemon/extension/PostScript.cpp \ - daemon/extension/PostScript.h \ - daemon/extension/QueueScript.cpp \ - daemon/extension/QueueScript.h \ - daemon/extension/ScanScript.cpp \ - daemon/extension/ScanScript.h \ - daemon/extension/SchedulerScript.cpp \ - daemon/extension/SchedulerScript.h \ - daemon/extension/ScriptConfig.cpp \ - daemon/extension/ScriptConfig.h \ - daemon/extension/Extension.cpp \ - daemon/extension/Extension.h \ - daemon/extension/ExtensionManager.cpp \ - daemon/extension/ExtensionManager.h \ - daemon/extension/ExtensionLoader.cpp \ - daemon/extension/ExtensionLoader.h \ - daemon/extension/ManifestFile.cpp \ - daemon/extension/ManifestFile.h \ - daemon/feed/FeedCoordinator.cpp \ - daemon/feed/FeedCoordinator.h \ - daemon/feed/FeedFile.cpp \ - daemon/feed/FeedFile.h \ - daemon/feed/FeedFilter.cpp \ - daemon/feed/FeedFilter.h \ - daemon/feed/FeedInfo.cpp \ - daemon/feed/FeedInfo.h \ - daemon/frontend/ColoredFrontend.cpp \ - daemon/frontend/ColoredFrontend.h \ - daemon/frontend/Frontend.cpp \ - daemon/frontend/Frontend.h \ - daemon/frontend/LoggableFrontend.cpp \ - daemon/frontend/LoggableFrontend.h \ - daemon/frontend/NCursesFrontend.cpp \ - daemon/frontend/NCursesFrontend.h \ - daemon/main/CommandLineParser.cpp \ - daemon/main/CommandLineParser.h \ - daemon/main/DiskService.cpp \ - daemon/main/DiskService.h \ - daemon/main/Maintenance.cpp \ - daemon/main/Maintenance.h \ - daemon/main/nzbget.cpp \ - daemon/main/nzbget.h \ - daemon/main/Options.cpp \ - daemon/main/Options.h \ - daemon/main/WorkState.cpp \ - daemon/main/WorkState.h \ - daemon/main/Scheduler.cpp \ - daemon/main/Scheduler.h \ - daemon/main/StackTrace.cpp \ - daemon/main/StackTrace.h \ - daemon/nntp/ArticleDownloader.cpp \ - daemon/nntp/ArticleDownloader.h \ - daemon/nntp/ArticleWriter.cpp \ - daemon/nntp/ArticleWriter.h \ - daemon/nntp/Decoder.cpp \ - daemon/nntp/Decoder.h \ - daemon/nntp/NewsServer.cpp \ - daemon/nntp/NewsServer.h \ - daemon/nntp/NntpConnection.cpp \ - daemon/nntp/NntpConnection.h \ - daemon/nntp/ServerPool.cpp \ - daemon/nntp/ServerPool.h \ - daemon/nntp/StatMeter.cpp \ - daemon/nntp/StatMeter.h \ - daemon/postprocess/Cleanup.cpp \ - daemon/postprocess/Cleanup.h \ - daemon/postprocess/DupeMatcher.cpp \ - daemon/postprocess/DupeMatcher.h \ - daemon/postprocess/ParChecker.cpp \ - daemon/postprocess/ParChecker.h \ - daemon/postprocess/ParParser.cpp \ - daemon/postprocess/ParParser.h \ - daemon/postprocess/ParRenamer.cpp \ - daemon/postprocess/ParRenamer.h \ - daemon/postprocess/PrePostProcessor.cpp \ - daemon/postprocess/PrePostProcessor.h \ - daemon/postprocess/RarRenamer.cpp \ - daemon/postprocess/RarRenamer.h \ - daemon/postprocess/RarReader.cpp \ - daemon/postprocess/RarReader.h \ - daemon/postprocess/Rename.cpp \ - daemon/postprocess/Rename.h \ - daemon/postprocess/Repair.cpp \ - daemon/postprocess/Repair.h \ - daemon/postprocess/Unpack.cpp \ - daemon/postprocess/Unpack.h \ - daemon/postprocess/DirectUnpack.cpp \ - daemon/postprocess/DirectUnpack.h \ - daemon/queue/DirectRenamer.cpp \ - daemon/queue/DirectRenamer.h \ - daemon/queue/DiskState.cpp \ - daemon/queue/DiskState.h \ - daemon/queue/DownloadInfo.cpp \ - daemon/queue/DownloadInfo.h \ - daemon/queue/DupeCoordinator.cpp \ - daemon/queue/DupeCoordinator.h \ - daemon/queue/HistoryCoordinator.cpp \ - daemon/queue/HistoryCoordinator.h \ - daemon/queue/NzbFile.cpp \ - daemon/queue/NzbFile.h \ - daemon/queue/QueueCoordinator.cpp \ - daemon/queue/QueueCoordinator.h \ - daemon/queue/QueueEditor.cpp \ - daemon/queue/QueueEditor.h \ - daemon/queue/Scanner.cpp \ - daemon/queue/Scanner.h \ - daemon/queue/UrlCoordinator.cpp \ - daemon/queue/UrlCoordinator.h \ - daemon/remote/BinRpc.cpp \ - daemon/remote/BinRpc.h \ - daemon/remote/MessageBase.h \ - daemon/remote/RemoteClient.cpp \ - daemon/remote/RemoteClient.h \ - daemon/remote/RemoteServer.cpp \ - daemon/remote/RemoteServer.h \ - daemon/remote/WebServer.cpp \ - daemon/remote/WebServer.h \ - daemon/remote/XmlRpc.cpp \ - daemon/remote/XmlRpc.h \ - daemon/util/Log.cpp \ - daemon/util/Log.h \ - daemon/util/NString.cpp \ - daemon/util/NString.h \ - daemon/util/Container.h \ - daemon/util/Observer.cpp \ - daemon/util/Observer.h \ - daemon/util/ScriptController.cpp \ - daemon/util/ScriptController.h \ - daemon/util/Thread.cpp \ - daemon/util/Thread.h \ - daemon/util/Service.cpp \ - daemon/util/Service.h \ - daemon/util/FileSystem.cpp \ - daemon/util/FileSystem.h \ - daemon/util/Json.cpp \ - daemon/util/Json.h \ - daemon/util/Xml.cpp \ - daemon/util/Xml.h \ - daemon/util/Util.cpp \ - daemon/util/Util.h \ - daemon/nserv/NServMain.h \ - daemon/nserv/NServMain.cpp \ - daemon/nserv/NServFrontend.h \ - daemon/nserv/NServFrontend.cpp \ - daemon/nserv/NntpServer.h \ - daemon/nserv/NntpServer.cpp \ - daemon/nserv/NzbGenerator.h \ - daemon/nserv/NzbGenerator.cpp \ - daemon/nserv/YEncoder.h \ - daemon/nserv/YEncoder.cpp - -if WITH_PAR2 -nzbget_SOURCES += \ - lib/par2/commandline.cpp \ - lib/par2/commandline.h \ - lib/par2/crc.cpp \ - lib/par2/crc.h \ - lib/par2/creatorpacket.cpp \ - lib/par2/creatorpacket.h \ - lib/par2/criticalpacket.cpp \ - lib/par2/criticalpacket.h \ - lib/par2/datablock.cpp \ - lib/par2/datablock.h \ - lib/par2/descriptionpacket.cpp \ - lib/par2/descriptionpacket.h \ - lib/par2/diskfile.cpp \ - lib/par2/diskfile.h \ - lib/par2/filechecksummer.cpp \ - lib/par2/filechecksummer.h \ - lib/par2/galois.cpp \ - lib/par2/galois.h \ - lib/par2/letype.h \ - lib/par2/mainpacket.cpp \ - lib/par2/mainpacket.h \ - lib/par2/md5.cpp \ - lib/par2/md5.h \ - lib/par2/par2cmdline.h \ - lib/par2/par2fileformat.cpp \ - lib/par2/par2fileformat.h \ - lib/par2/par2repairer.cpp \ - lib/par2/par2repairer.h \ - lib/par2/par2repairersourcefile.cpp \ - lib/par2/par2repairersourcefile.h \ - lib/par2/parheaders.cpp \ - lib/par2/parheaders.h \ - lib/par2/recoverypacket.cpp \ - lib/par2/recoverypacket.h \ - lib/par2/reedsolomon.cpp \ - lib/par2/reedsolomon.h \ - lib/par2/verificationhashtable.cpp \ - lib/par2/verificationhashtable.h \ - lib/par2/verificationpacket.cpp \ - lib/par2/verificationpacket.h -endif - -# Simd decoder and Crc32 -nzbget_SOURCES += \ - lib/yencode/YEncode.h \ - lib/yencode/SimdInit.cpp \ - lib/yencode/SimdDecoder.cpp \ - lib/yencode/ScalarDecoder.cpp \ - lib/yencode/Sse2Decoder.cpp \ - lib/yencode/Ssse3Decoder.cpp \ - lib/yencode/PclmulCrc.cpp \ - lib/yencode/NeonDecoder.cpp \ - lib/yencode/AcleCrc.cpp \ - lib/yencode/SliceCrc.cpp - -lib/yencode/Sse2Decoder.$(OBJEXT) : CXXFLAGS+=$(SSE2_CXXFLAGS) -lib/yencode/Ssse3Decoder.$(OBJEXT) : CXXFLAGS+=$(SSSE3_CXXFLAGS) -lib/yencode/PclmulCrc.$(OBJEXT) : CXXFLAGS+=$(PCLMUL_CXXFLAGS) -lib/yencode/NeonDecoder.$(OBJEXT) : CXXFLAGS+=$(NEON_CXXFLAGS) -lib/yencode/AcleCrc.$(OBJEXT) : CXXFLAGS+=$(ACLECRC_CXXFLAGS) - -AM_CPPFLAGS = \ - -I$(srcdir)/daemon/connect \ - -I$(srcdir)/daemon/extension \ - -I$(srcdir)/daemon/feed \ - -I$(srcdir)/daemon/frontend \ - -I$(srcdir)/daemon/main \ - -I$(srcdir)/daemon/nntp \ - -I$(srcdir)/daemon/postprocess \ - -I$(srcdir)/daemon/queue \ - -I$(srcdir)/daemon/remote \ - -I$(srcdir)/daemon/util \ - -I$(srcdir)/daemon/nserv \ - -I$(srcdir)/lib/par2 \ - -I$(srcdir)/lib/yencode - -EXTRA_DIST = \ - $(windows_FILES) \ - $(osx_FILES) \ - $(linux_FILES) \ - $(testdata_FILES) \ - $(par2doc_FILES) - -windows_FILES = \ - daemon/windows/StdAfx.cpp \ - daemon/windows/WinService.cpp \ - daemon/windows/WinService.h \ - daemon/windows/WinConsole.cpp \ - daemon/windows/WinConsole.h \ - nzbget.vcxproj \ - windows/nzbget-command-shell.bat \ - windows/install-update.bat \ - windows/README-WINDOWS.txt \ - windows/package-info.json \ - windows/resources/mainicon.ico \ - windows/resources/nzbget.rc \ - windows/resources/resource.h \ - windows/resources/trayicon_idle.ico \ - windows/resources/trayicon_paused.ico \ - windows/resources/trayicon_working.ico \ - windows/resources/install.bmp \ - windows/resources/uninstall.bmp \ - windows/nzbget-setup.nsi - -osx_FILES = \ - osx/App_Prefix.pch \ - osx/NZBGet-Info.plist \ - osx/DaemonController.h \ - osx/DaemonController.m \ - osx/MainApp.h \ - osx/MainApp.m \ - osx/MainApp.xib \ - osx/PFMoveApplication.h \ - osx/PFMoveApplication.m \ - osx/PreferencesDialog.h \ - osx/PreferencesDialog.m \ - osx/PreferencesDialog.xib \ - osx/RPC.h \ - osx/RPC.m \ - osx/WebClient.h \ - osx/WebClient.m \ - osx/WelcomeDialog.h \ - osx/WelcomeDialog.m \ - osx/WelcomeDialog.xib \ - osx/NZBGet.xcodeproj/project.pbxproj \ - osx/Resources/Images/mainicon.icns \ - osx/Resources/Images/statusicon.png \ - osx/Resources/Images/statusicon@2x.png \ - osx/Resources/licenses/license-bootstrap.txt \ - osx/Resources/licenses/license-jquery-GPL.txt \ - osx/Resources/licenses/license-jquery-MIT.txt \ - osx/Resources/Credits.rtf \ - osx/Resources/Localizable.strings \ - osx/Resources/Welcome.rtf - -linux_FILES = \ - linux/installer.sh \ - linux/install-update.sh \ - linux/package-info.json \ - linux/build-info.txt \ - linux/build-nzbget \ - linux/build-unpack \ - linux/build-toolchain-android \ - linux/build-toolchain-freebsd - -doc_FILES = \ - INSTALLATION.md \ - ChangeLog.md \ - COPYING - -par2doc_FILES = \ - lib/par2/AUTHORS \ - lib/par2/README - -exampleconf_FILES = \ - nzbget.conf - -webui_FILES = \ - webui/index.html \ - webui/index.js \ - webui/downloads.js \ - webui/edit.js \ - webui/fasttable.js \ - webui/history.js \ - webui/messages.js \ - webui/status.js \ - webui/style.css \ - webui/light-theme.css \ - webui/dark-theme.css \ - webui/upload.js \ - webui/util.js \ - webui/config.js \ - webui/feed.js \ - webui/lib/bootstrap.js \ - webui/lib/bootstrap.min.js \ - webui/lib/bootstrap.css \ - webui/lib/jquery.js \ - webui/lib/jquery.min.js \ - webui/lib/raphael.js \ - webui/lib/raphael.min.js \ - webui/lib/elycharts.js \ - webui/lib/elycharts.min.js \ - webui/lib/material-icons.woff2 \ - webui/img/icons.png \ - webui/img/icons-2x.png \ - webui/img/transmit.gif \ - webui/img/transmit-file.gif \ - webui/img/favicon.ico \ - webui/img/download-anim-green-2x.png \ - webui/img/download-anim-orange-2x.png \ - webui/img/transmit-reload-2x.gif \ - webui/img/favicon-256x256-opaque.png \ - webui/img/favicon-256x256.png - -# Install -dist_doc_DATA = $(doc_FILES) -exampleconfdir = $(datadir)/nzbget -dist_exampleconf_DATA = $(exampleconf_FILES) -webuidir = $(datadir)/nzbget -nobase_dist_webui_DATA = $(webui_FILES) -scriptsdir = $(datadir)/nzbget/scripts - -# Note about "sed": -# We need to make some changes in installed files. -# On Linux "sed" has option "-i" for in-place-edit. Unfortunateley the BSD version of "sed" -# has incompatible syntax. To solve the problem we perform in-place-edit in three steps: -# 1) copy the original file to original.temp (delete existing original.temp, if any); -# 2) sed < original.temp > original -# 3) delete original.temp -# These steps ensure that the output file has the same permissions as the original file. - -# Prepare example configuration file -install-data-hook: - mkdir -p "$(DESTDIR)$(scriptsdir)" - rm -f "$(DESTDIR)$(exampleconfdir)/nzbget.conf.temp" - cp "$(DESTDIR)$(exampleconfdir)/nzbget.conf" "$(DESTDIR)$(exampleconfdir)/nzbget.conf.temp" - sed 's:^ConfigTemplate=:ConfigTemplate=$(exampleconfdir)/nzbget.conf:' < "$(DESTDIR)$(exampleconfdir)/nzbget.conf.temp" > "$(DESTDIR)$(exampleconfdir)/nzbget.conf" - sed 's:configuration file (typically installed:configuration file (installed:' < "$(DESTDIR)$(exampleconfdir)/nzbget.conf" > "$(DESTDIR)$(exampleconfdir)/nzbget.conf.temp" - sed 's:/usr/local/share/nzbget/nzbget.conf):$(exampleconfdir)/nzbget.conf):' < "$(DESTDIR)$(exampleconfdir)/nzbget.conf.temp" > "$(DESTDIR)$(exampleconfdir)/nzbget.conf" - sed 's:^WebDir=:WebDir=$(webuidir)/webui:' < "$(DESTDIR)$(exampleconfdir)/nzbget.conf" > "$(DESTDIR)$(exampleconfdir)/nzbget.conf.temp" - sed 's:typically installed to /usr/local/share/nzbget/scripts:installed to $(scriptsdir)/scripts:' < "$(DESTDIR)$(exampleconfdir)/nzbget.conf.temp" > "$(DESTDIR)$(exampleconfdir)/nzbget.conf" - rm "$(DESTDIR)$(exampleconfdir)/nzbget.conf.temp" - -# Install configuration files into /etc -# (only if they do not exist there to prevent override by update) -install-conf: - if test ! -f "$(DESTDIR)$(sysconfdir)/nzbget.conf" ; then \ - $(mkinstalldirs) "$(DESTDIR)$(sysconfdir)" ; \ - cp "$(DESTDIR)$(exampleconfdir)/nzbget.conf" "$(DESTDIR)$(sysconfdir)/nzbget.conf" ; \ - fi - -uninstall-conf: - rm -f "$(DESTDIR)$(sysconfdir)/nzbget.conf" - -distcleancheck_listfiles = \ - find . -type f -exec sh -c 'test -f $(srcdir)/$$1 || echo $$1' \ - sh '{}' ';' - -clean-bak: rm *~ - -# Fix premissions -dist-hook: - find $(distdir)/daemon -type f -print -exec chmod -x {} \; - find $(distdir)/webui -type f -print -exec chmod -x {} \; - find $(distdir)/lib -type f -print -exec chmod -x {} \; - find $(distdir)/tests -type f -print -exec chmod -x {} \; - diff --git a/README.md b/README.md index 68810ded5..feac61fa7 100644 --- a/README.md +++ b/README.md @@ -43,9 +43,9 @@ macOS packages are available from [releases](https://github.com/nzbgetcom/nzbget Docker images are available for x86-64 / arm64 / armv7 architectures. [Docker readme](docker/README.md). LinuxServer.io version is also available: [docker-nzbget](https://github.com/linuxserver/docker-nzbget) -Synology packages are available as SynoCommunity packages and SPK packages. [Synology readme](synology/README.md) +Synology package are available as SynoCommunity package. [Synology readme](docs/SYNOLOGY.md) -QNAP packages are available as native / buildroot packages or via [sherpa](https://github.com/OneCDOnly/sherpa) package manager. [QNAP readme](qnap/README.md) +QNAP packages are available as buildroot packages or via [sherpa](https://github.com/OneCDOnly/sherpa) package manager. [QNAP readme](qnap/README.md) ## Migration from older NZBGet versions diff --git a/configure.ac b/configure.ac deleted file mode 100644 index e9dc0626a..000000000 --- a/configure.ac +++ /dev/null @@ -1,689 +0,0 @@ -# -# This file is part of nzbget. See . -# -# Copyright (C) 2008-2021 Andrey Prygunkov -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.65) -AC_INIT(nzbget, 24.2, https://github.com/nzbgetcom/nzbget/issues) -AC_CONFIG_AUX_DIR(posix) -AC_CANONICAL_TARGET -AM_INIT_AUTOMAKE([foreign subdir-objects]) -AC_CONFIG_SRCDIR([daemon/main/nzbget.cpp]) -AC_CONFIG_HEADERS([config.h]) -AC_DEFINE(HAVE_CONFIG_H, 1, [Define to 1 use config.h]) -AM_MAINTAINER_MODE - -m4_include([posix/ax_cxx_compile_stdcxx.m4]) -m4_include([posix/ax_boost_json.m4]) - -AX_BOOST_JSON - -dnl -dnl Check for programs. -dnl -AC_PROG_CXX -AC_PATH_PROG(TAR, tar, $FALSE) -AC_PATH_PROG(MAKE, make, $FALSE) -AC_PROG_INSTALL - - -dnl -dnl Do all tests with c++ compiler. -dnl -AC_LANG(C++) - -dnl -dnl Determine compiler switches to support C++14 standard. -dnl -AC_MSG_CHECKING(whether to test compiler features) -AC_ARG_ENABLE(cpp-check, - [AS_HELP_STRING([--disable-cpp-check], [disable check for C++14 compiler features])], - [ ENABLECPPCHECK=$enableval ], - [ ENABLECPPCHECK=yes] ) -AC_MSG_RESULT($ENABLECPPCHECK) -if test "$ENABLECPPCHECK" = "yes"; then - AX_CXX_COMPILE_STDCXX(14,,[optional]) - if test "$HAVE_CXX14" != "1"; then - AC_MSG_ERROR("A compiler with support for C++14 language features is required. For details visit https://nzbget.com/documentation/prerequisites-for-c++-compiler/") - fi -fi - -dnl -dnl Checks for header files. -dnl -AC_CHECK_HEADERS(sys/prctl.h regex.h endian.h getopt.h) - - -dnl -dnl Check for libs -dnl -AC_SEARCH_LIBS([pthread_create], [pthread]) -AC_SEARCH_LIBS([socket], [socket]) -AC_SEARCH_LIBS([inet_addr], [nsl]) -AC_SEARCH_LIBS([hstrerror], [resolv]) - -AC_CHECK_LIB([boost_json], [main], [], [AC_MSG_ERROR([Could not find Boost.JSON library])]) - -dnl -dnl Android NDK restrictions -dnl -AC_CHECK_FUNC(lockf, - [AC_CHECK_DECL(lockf, - [AC_DEFINE([HAVE_LOCKF], 1, [Define to 1 if lockf is supported])],, - [#include ])]) -AC_CHECK_FUNC(pthread_cancel, - [AC_CHECK_DECL(pthread_cancel, - [AC_DEFINE([HAVE_PTHREAD_CANCEL], 1, [Define to 1 if pthread_cancel is supported])],, - [#include ])]) - - -dnl -dnl Getopt -dnl -AC_CHECK_FUNC(getopt_long, - [AC_DEFINE([HAVE_GETOPT_LONG], 1, [Define to 1 if getopt_long is supported])],) - - -dnl -dnl fsync -dnl -AC_CHECK_FUNC(fdatasync, - [AC_DEFINE([HAVE_FDATASYNC], 1, [Define to 1 if fdatasync is supported])],) -AC_CHECK_DECL(F_FULLFSYNC, - [AC_DEFINE([HAVE_FULLFSYNC], 1, [Define to 1 if F_FULLFSYNC is supported])],,[#include ]) - -dnl -dnl use 64-Bits for file sizes -dnl -AC_SYS_LARGEFILE - - -dnl -dnl check ctime_r -dnl -AC_MSG_CHECKING(for ctime_r) -AC_TRY_COMPILE( - [#include ], - [ time_t clock; char buf[26]; ctime_r(&clock, buf, 26); ], - AC_MSG_RESULT([[yes, and it takes 3 arguments]]) - FOUND="yes" - AC_DEFINE([HAVE_CTIME_R_3], 1, [Define to 1 if ctime_r takes 3 arguments]), - FOUND="no") -if test "$FOUND" = "no"; then -AC_TRY_COMPILE( - [#include ], - [ time_t clock; char buf[26]; ctime_r(&clock, buf); ], - AC_MSG_RESULT([[yes, and it takes 2 arguments]]) - FOUND="yes" - AC_DEFINE([HAVE_CTIME_R_2], 1, [Define to 1 if ctime_r takes 2 arguments]), - FOUND="no") -fi -if test "$FOUND" = "no"; then - AC_MSG_RESULT([no]) - AC_MSG_ERROR("function ctime_r not found") -fi - - -dnl -dnl check getaddrinfo -dnl -AC_CHECK_FUNC(getaddrinfo, - FOUND="yes" - [AC_DEFINE([HAVE_GETADDRINFO], 1, [Define to 1 if getaddrinfo is supported])] - AC_SEARCH_LIBS([getaddrinfo], [nsl]), - FOUND="no") - - -dnl -dnl check gethostbyname_r, if getaddrinfo is not available -dnl -if test "$FOUND" = "no"; then - AC_MSG_CHECKING(for gethostbyname_r) - - AC_TRY_COMPILE( - [#include ], - [ char* szHost; struct hostent hinfobuf; char* strbuf; int h_errnop; - struct hostent* hinfo = gethostbyname_r(szHost, &hinfobuf, strbuf, 1024, &h_errnop); ], - AC_MSG_RESULT([[yes, and it takes 5 arguments]]) - FOUND="yes" - AC_DEFINE([HAVE_GETHOSTBYNAME_R_5], 1, [Define to 1 if gethostbyname_r takes 5 arguments]), - FOUND="no") - - if test "$FOUND" = "no"; then - AC_TRY_COMPILE( - [#include ], - [ char* szHost; struct hostent* hinfo; struct hostent hinfobuf; char* strbuf; int h_errnop; - int err = gethostbyname_r(szHost, &hinfobuf, strbuf, 1024, &hinfo, &h_errnop); ], - AC_MSG_RESULT([[yes, and it takes 6 arguments]]) - FOUND="yes" - AC_DEFINE([HAVE_GETHOSTBYNAME_R_6], 1, [Define to 1 if gethostbyname_r takes 6 arguments]), - FOUND="no") - fi - - if test "$FOUND" = "no"; then - AC_TRY_COMPILE( - [#include ], - [ char* szHost; struct hostent hinfo; struct hostent_data hinfobuf; - int err = gethostbyname_r(szHost, &hinfo, &hinfobuf); ], - AC_MSG_RESULT([[yes, and it takes 3 arguments]]) - FOUND="yes" - AC_DEFINE([HAVE_GETHOSTBYNAME_R_3], 1, [Define to 1 if gethostbyname_r takes 3 arguments]), - AC_MSG_RESULT([[no]]) - FOUND="no") - fi - - if test "$FOUND" = "yes"; then - AC_DEFINE([HAVE_GETHOSTBYNAME_R], 1, [Define to 1 if gethostbyname_r is supported]) - AC_SEARCH_LIBS([gethostbyname_r], [nsl]) - fi -fi - - -dnl -dnl Determine what socket length (socklen_t) data type is -dnl -AC_MSG_CHECKING([for type of socket length (socklen_t)]) -AC_TRY_COMPILE([ -#include -#include -#include ],[ -(void)getsockopt (1, 1, 1, NULL, (socklen_t*)NULL)],[ - AC_MSG_RESULT(socklen_t) - SOCKLEN_T=socklen_t],[ - AC_TRY_COMPILE([ -#include -#include -#include ],[ -(void)getsockopt (1, 1, 1, NULL, (size_t*)NULL)],[ - AC_MSG_RESULT(size_t) - SOCKLEN_T=size_t],[ - AC_TRY_COMPILE([ -#include -#include -#include ],[ -(void)getsockopt (1, 1, 1, NULL, (int*)NULL)],[ - AC_MSG_RESULT(int) - SOCKLEN_T=int],[ - AC_MSG_WARN(could not determine) - SOCKLEN_T=int])])]) -AC_DEFINE_UNQUOTED(SOCKLEN_T, $SOCKLEN_T, [Determine what socket length (socklen_t) data type is]) - - -dnl -dnl check cpu cores via sysconf -dnl -AC_MSG_CHECKING(for cpu cores via sysconf) -AC_TRY_COMPILE( - [#include ], - [ int a = _SC_NPROCESSORS_ONLN; ], - FOUND="yes" - AC_MSG_RESULT([[yes]]) - AC_DEFINE([HAVE_SC_NPROCESSORS_ONLN], 1, [Define to 1 if _SC_NPROCESSORS_ONLN is present in unistd.h]), - FOUND="no") - - -dnl -dnl checks for libxml2 includes and libraries. -dnl -AC_MSG_CHECKING(whether to use libxml2) -AC_ARG_ENABLE(libxml2, - [AS_HELP_STRING([--disable-libxml2], [do not use libxml2 (removes dependency from libxml2-library, only for development purposes)])], - [USELIBXML2=$enableval], - [USELIBXML2=yes] ) -AC_MSG_RESULT($USELIBXML2) -if test "$USELIBXML2" = "yes"; then - AC_ARG_WITH(libxml2_includes, - [AS_HELP_STRING([--with-libxml2-includes=DIR], [libxml2 include directory])], - [CPPFLAGS="${CPPFLAGS} -I${withval}"] - [INCVAL="yes"], - [INCVAL="no"]) - AC_ARG_WITH(libxml2_libraries, - [AS_HELP_STRING([--with-libxml2-libraries=DIR], [libxml2 library directory])], - [LDFLAGS="${LDFLAGS} -L${withval}"] - [LIBVAL="yes"], - [LIBVAL="no"]) - if test "$INCVAL" = "no" -o "$LIBVAL" = "no"; then - PKG_CHECK_MODULES(libxml2, libxml-2.0, - [LIBS="${LIBS} $libxml2_LIBS"] - [CPPFLAGS="${CPPFLAGS} $libxml2_CFLAGS"], - AC_MSG_ERROR("libxml2 library not found")) - fi - AC_CHECK_HEADER(libxml/tree.h,, - AC_MSG_ERROR("libxml2 header files not found")) - AC_SEARCH_LIBS([xmlNewNode], [xml2], , - AC_MSG_ERROR("libxml2 library not found")) -else - AC_DEFINE([DISABLE_LIBXML2],1,[Define to 1 to not use libxml2, only for development purposes]) -fi - - -dnl -dnl Use curses. Deafult: yes -dnl -AC_MSG_CHECKING(whether to use curses) -AC_ARG_ENABLE(curses, - [AS_HELP_STRING([--disable-curses], [do not use curses (removes dependency from curses-library)])], - [USECURSES=$enableval], - [USECURSES=yes] ) -AC_MSG_RESULT($USECURSES) -if test "$USECURSES" = "yes"; then - AC_ARG_WITH(libcurses_includes, - [AS_HELP_STRING([--with-libcurses-includes=DIR], [libcurses include directory])], - [CPPFLAGS="${CPPFLAGS} -I${withval}"] - [INCVAL="yes"], - [INCVAL="no"]) - AC_ARG_WITH(libcurses_libraries, - [AS_HELP_STRING([--with-libcurses-libraries=DIR], [libcurses library directory])], - [LDFLAGS="${LDFLAGS} -L${withval}"] - [LIBVAL="yes"], - [LIBVAL="no"]) - if test "$INCVAL" = "no" -o "$LIBVAL" = "no"; then - PKG_CHECK_MODULES(ncurses, ncurses, - [LIBS="${LIBS} $ncurses_LIBS"] - [CPPFLAGS="${CPPFLAGS} $ncurses_CFLAGS"], - AC_MSG_ERROR("ncurses library not found")) - fi - - AC_CHECK_HEADER(ncurses.h, - FOUND=yes - AC_DEFINE([HAVE_NCURSES_H],1,[Define to 1 if you have the header file.]), - FOUND=no) - if test "$FOUND" = "no"; then - AC_CHECK_HEADER(ncurses/ncurses.h, - FOUND=yes - AC_DEFINE([HAVE_NCURSES_NCURSES_H],1,[Define to 1 if you have the header file.]), - FOUND=no) - fi - if test "$FOUND" = "no"; then - AC_CHECK_HEADER(curses.h, - FOUND=yes - AC_DEFINE([HAVE_CURSES_H],1,[Define to 1 if you have the header file.]), - FOUND=no) - fi - if test "$FOUND" = "no"; then - AC_MSG_ERROR([Couldn't find curses headers (ncurses.h or curses.h)]) - fi - AC_SEARCH_LIBS([refresh], [ncurses curses],, - AC_ERROR([Couldn't find curses library])) - AC_SEARCH_LIBS([nodelay], [ncurses curses tinfo],, - AC_ERROR([Couldn't find curses library])) -else - AC_DEFINE([DISABLE_CURSES],1,[Define to 1 to not use curses]) -fi - - -dnl -dnl Use par-checking. Deafult: yes. -dnl -AC_MSG_CHECKING(whether to include code for par-checking) -AC_ARG_ENABLE(parcheck, - [AS_HELP_STRING([--disable-parcheck], [do not include par-check/-repair-support])], - [ ENABLEPARCHECK=$enableval ], - [ ENABLEPARCHECK=yes] ) -AC_MSG_RESULT($ENABLEPARCHECK) -if test "$ENABLEPARCHECK" = "yes"; then - dnl PAR2 checks. - dnl - dnl Checks for typedefs, structures, and compiler characteristics. - AC_TYPE_SIZE_T - AC_FUNC_FSEEKO - dnl Checks for library functions. - AC_CHECK_FUNCS([stricmp]) - AC_CHECK_FUNCS([getopt]) - AM_CONDITIONAL(WITH_PAR2, true) -else - AC_DEFINE([DISABLE_PARCHECK],1,[Define to 1 to disable par-verification and repair]) - AM_CONDITIONAL(WITH_PAR2, false) -fi - - -dnl -dnl Use TLS/SSL. Deafult: yes -dnl -AC_MSG_CHECKING(whether to use TLS/SSL) -AC_ARG_ENABLE(tls, - [AS_HELP_STRING([--disable-tls], [do not use TLS/SSL (removes dependency from TLS/SSL-libraries)])], - [ USETLS=$enableval ], - [ USETLS=yes] ) -AC_MSG_RESULT($USETLS) -if test "$USETLS" = "yes"; then - AC_ARG_WITH(tlslib, - [AS_HELP_STRING([--with-tlslib=(OpenSSL, GnuTLS)], [TLS/SSL library to use])], - [TLSLIB="$withval"]) - if test "$TLSLIB" != "GnuTLS" -a "$TLSLIB" != "OpenSSL" -a "$TLSLIB" != ""; then - AC_MSG_ERROR([Invalid argument for option --with-tlslib]) - fi - - if test "$TLSLIB" = "OpenSSL" -o "$TLSLIB" = ""; then - AC_ARG_WITH(openssl_includes, - [AS_HELP_STRING([--with-openssl-includes=DIR], [OpenSSL include directory])], - [CPPFLAGS="${CPPFLAGS} -I${withval}"] - [INCVAL="yes"], - [INCVAL="no"]) - AC_ARG_WITH(openssl_libraries, - [AS_HELP_STRING([--with-openssl-libraries=DIR], [OpenSSL library directory])], - [LDFLAGS="${LDFLAGS} -L${withval}"] - [LIBVAL="yes"], - [LIBVAL="no"]) - if test "$INCVAL" = "no" -o "$LIBVAL" = "no"; then - PKG_CHECK_MODULES([openssl], [openssl], - [LIBS="${LIBS} $openssl_LIBS"] - [CPPFLAGS="${CPPFLAGS} $openssl_CFLAGS"]) - fi - - AC_CHECK_HEADER(openssl/ssl.h, - FOUND=yes - TLSHEADERS=yes, - FOUND=no) - if test "$FOUND" = "no" -a "$TLSLIB" = "OpenSSL"; then - AC_MSG_ERROR([Couldn't find OpenSSL headers (ssl.h)]) - fi - if test "$FOUND" = "yes"; then - AC_SEARCH_LIBS([ASN1_OBJECT_free], [crypto], - AC_SEARCH_LIBS([SSL_CTX_new], [ssl], - FOUND=yes, - FOUND=no), - FOUND=no) - if test "$FOUND" = "no" -a "$TLSLIB" = "OpenSSL"; then - AC_MSG_ERROR([Couldn't find OpenSSL library]) - fi - if test "$FOUND" = "yes"; then - TLSLIB="OpenSSL" - AC_DEFINE([HAVE_OPENSSL],1,[Define to 1 to use OpenSSL library for TLS/SSL-support and decryption.]) - AC_SEARCH_LIBS([X509_check_host], [crypto], - AC_DEFINE([HAVE_X509_CHECK_HOST],1,[Define to 1 if OpenSSL supports function "X509_check_host".])) - fi - fi - fi - - if test "$TLSLIB" = "GnuTLS" -o "$TLSLIB" = ""; then - AC_ARG_WITH(libgnutls_includes, - [AS_HELP_STRING([--with-libgnutls-includes=DIR], [GnuTLS include directory])], - [CPPFLAGS="${CPPFLAGS} -I${withval}"] - [INCVAL="yes"], - [INCVAL="no"]) - AC_ARG_WITH(libgnutls_libraries, - [AS_HELP_STRING([--with-libgnutls-libraries=DIR], [GnuTLS library directory])], - [LDFLAGS="${LDFLAGS} -L${withval}"] - [LIBVAL="yes"], - [LIBVAL="no"]) - if test "$INCVAL" = "no" -o "$LIBVAL" = "no"; then - PKG_CHECK_MODULES([gnutls], [gnutls], - [LIBS="${LIBS} $gnutls_LIBS"] - [CPPFLAGS="${CPPFLAGS} $gnutls_CFLAGS"]) - fi - - AC_CHECK_HEADER(gnutls/gnutls.h, - FOUND=yes - TLSHEADERS=yes, - FOUND=no) - if test "$FOUND" = "no" -a "$TLSLIB" = "GnuTLS"; then - AC_MSG_ERROR([Couldn't find GnuTLS headers (gnutls.h)]) - fi - if test "$FOUND" = "yes"; then - AC_SEARCH_LIBS([gnutls_global_init], [gnutls], - FOUND=yes, - FOUND=no) - if test "$FOUND" = "yes"; then - dnl gcrypt is optional - AC_MSG_CHECKING([whether gcrypt is needed]) - AC_TRY_COMPILE( - [#include ] - [#if GNUTLS_VERSION_NUMBER <= 0x020b00] - [compile error] - [#endif], - [int a;], - AC_MSG_RESULT([no]) - GCRYPT=no, - AC_MSG_RESULT([yes]) - GCRYPT=yes) - if test "$GCRYPT" = "yes"; then - AC_CHECK_HEADER([gcrypt.h], - AC_SEARCH_LIBS([gcry_control], [gnutls gcrypt], - FOUND=yes, - FOUND=no), - FOUND=yes) - fi - fi - if test "$FOUND" = "no" -a "$TLSLIB" = "GnuTLS"; then - AC_MSG_ERROR([Couldn't find GnuTLS library]) - fi - if test "$FOUND" = "yes"; then - TLSLIB="GnuTLS" - AC_DEFINE([HAVE_LIBGNUTLS],1,[Define to 1 to use GnuTLS library for TLS/SSL-support.]) - fi - fi - - if test "$TLSLIB" = "GnuTLS"; then - AC_ARG_WITH(libnettle_includes, - [AS_HELP_STRING([--with-libnettle-includes=DIR], [Nettle include directory])], - [CPPFLAGS="${CPPFLAGS} -I${withval}"] - [INCVAL="yes"], - [INCVAL="no"]) - AC_ARG_WITH(libnettle_libraries, - [AS_HELP_STRING([--with-libnettle-libraries=DIR], [Nettle library directory])], - [LDFLAGS="${LDFLAGS} -L${withval}"] - [LIBVAL="yes"], - [LIBVAL="no"]) - if test "$INCVAL" = "no" -o "$LIBVAL" = "no"; then - PKG_CHECK_MODULES([nettle], [nettle], - [LIBS="${LIBS} $nettle_LIBS"] - [CPPFLAGS="${CPPFLAGS} $nettle_CFLAGS"]) - fi - AC_CHECK_HEADER(nettle/sha.h, - FOUND=yes, - FOUND=no) - if test "$FOUND" = "no"; then - AC_MSG_ERROR([Couldn't find Nettle headers (sha.h)]) - fi - AC_SEARCH_LIBS([nettle_pbkdf2_hmac_sha256], [nettle], - FOUND=yes, - FOUND=no) - if test "$FOUND" = "no"; then - AC_MSG_ERROR([Couldn't find Nettle library, required when using GnuTLS]) - fi - if test "$FOUND" = "yes"; then - AC_DEFINE([HAVE_NETTLE],1,[Define to 1 to use Nettle library for decryption.]) - fi - fi - fi - - if test "$TLSLIB" = ""; then - if test "$TLSHEADERS" = ""; then - AC_MSG_ERROR([Couldn't find neither OpenSSL nor GnuTLS headers (ssl.h or gnutls.h)]) - else - AC_MSG_ERROR([Couldn't find neither OpenSSL nor GnuTLS library]) - fi - fi -else - AC_DEFINE([DISABLE_TLS],1,[Define to 1 to not use TLS/SSL]) -fi - - -dnl -dnl checks for zlib includes and libraries. -dnl -AC_MSG_CHECKING(whether to use gzip) -AC_ARG_ENABLE(gzip, - [AS_HELP_STRING([--disable-gzip], [disable gzip-compression/decompression (removes dependency from zlib-library)])], - [USEZLIB=$enableval], - [USEZLIB=yes] ) -AC_MSG_RESULT($USEZLIB) -if test "$USEZLIB" = "yes"; then - AC_ARG_WITH(zlib_includes, - [AS_HELP_STRING([--with-zlib-includes=DIR], [zlib include directory])], - [CPPFLAGS="${CPPFLAGS} -I${withval}"] - [INCVAL="yes"], - [INCVAL="no"]) - AC_ARG_WITH(zlib_libraries, - [AS_HELP_STRING([--with-zlib-libraries=DIR], [zlib library directory])], - [LDFLAGS="${LDFLAGS} -L${withval}"] - [LIBVAL="yes"], - [LIBVAL="no"]) - if test "$INCVAL" = "no" -o "$LIBVAL" = "no"; then - PKG_CHECK_MODULES([zlib], [zlib], - [LIBS="${LIBS} $zlib_LIBS"] - [CPPFLAGS="${CPPFLAGS} $zlib_CFLAGS"]) - fi - - AC_CHECK_HEADER(zlib.h,, - AC_MSG_ERROR("zlib header files not found")) - AC_SEARCH_LIBS([deflateBound], [z], , - AC_MSG_ERROR("zlib library not found")) -else - AC_DEFINE([DISABLE_GZIP],1,[Define to 1 to disable gzip-support]) -fi - - -dnl -dnl Determine if CPU supports SIMD instructions -dnl -AC_MSG_CHECKING(whether to use SIMD-optimized routines) -USE_SIMD=no -case $host_cpu in - i?86|x86_64) - SSE2_CXXFLAGS="-msse2" - SSSE3_CXXFLAGS="-mssse3" - PCLMUL_CXXFLAGS="-msse4.1 -mpclmul" - USE_SIMD=yes - ;; - arm*) - NEON_CXXFLAGS="-mfpu=neon" - ACLECRC_CXXFLAGS="-march=armv8-a+crc -fpermissive" - USE_SIMD=yes - ;; - aarch64) - ACLECRC_CXXFLAGS="-march=armv8-a+crc -fpermissive" - USE_SIMD=yes - ;; -esac -AC_MSG_RESULT($USE_SIMD) -AC_SUBST([SSE2_CXXFLAGS]) -AC_SUBST([SSSE3_CXXFLAGS]) -AC_SUBST([PCLMUL_CXXFLAGS]) -AC_SUBST([NEON_CXXFLAGS]) -AC_SUBST([ACLECRC_CXXFLAGS]) - - -dnl -dnl Some Linux systems require an empty signal handler for SIGCHLD -dnl in order for exit codes to be correctly delivered to parent process. -dnl Some 32-Bit BSD systems however may not function properly if the handler is installed. -dnl The default behavior is to install the handler. -dnl -AC_MSG_CHECKING(whether to use an empty SIGCHLD handler) -AC_ARG_ENABLE(sigchld-handler, - [AS_HELP_STRING([--disable-sigchld-handler], [do not use sigchld-handler (the disabling may be neccessary on 32-Bit BSD)])], - [SIGCHLDHANDLER=$enableval], - [SIGCHLDHANDLER=yes]) -AC_MSG_RESULT($SIGCHLDHANDLER) -if test "$SIGCHLDHANDLER" = "yes"; then - AC_DEFINE([SIGCHLD_HANDLER], 1, [Define to 1 to install an empty signal handler for SIGCHLD]) -fi - - -dnl -dnl Debugging. Default: no -dnl -AC_MSG_CHECKING(whether to include all debugging code) -AC_ARG_ENABLE(debug, - [AS_HELP_STRING([--enable-debug], [enable debugging])], - [ ENABLEDEBUG=$enableval ], - [ ENABLEDEBUG=no] ) -AC_MSG_RESULT($ENABLEDEBUG) - - -if test "$ENABLEDEBUG" = "yes"; then - -dnl -dnl Begin of debugging code -dnl - -AC_DEFINE([DEBUG],1,Define to 1 to include debug-code) - - -dnl -dnl check for __FUNCTION__ or __func__ macro -dnl -AC_MSG_CHECKING(for macro returning current function name) -AC_TRY_COMPILE( - [#include ], [printf("%s\n", __FUNCTION__);], - AC_MSG_RESULT(__FUNCTION__) - FUNCTION_MACRO_NAME=__FUNCTION__, -AC_TRY_COMPILE([#include ], [printf("%s\n", __func__);], - AC_MSG_RESULT(__func__) - FUNCTION_MACRO_NAME=__func__, - AC_MSG_RESULT(none))) -if test "$FUNCTION_MACRO_NAME" != ""; then - AC_DEFINE_UNQUOTED(FUNCTION_MACRO_NAME, $FUNCTION_MACRO_NAME, [Define to the name of macro which returns the name of function being compiled]) -fi - - -dnl -dnl variadic macros -dnl -AC_MSG_CHECKING(for variadic macros) -AC_TRY_COMPILE( - [ #define macro(...) macrofunc(__VA_ARGS__) ] - [ int macrofunc(int a, int b) { return a + b; } ], - [ int a=macro(1, 2); ], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_VARIADIC_MACROS], 1, Define to 1 if variadic macros are supported), - AC_MSG_RESULT([no])) - - -dnl -dnl Backtracing on segmentation faults -dnl -AC_MSG_CHECKING(for backtrace) -AC_TRY_COMPILE( - [#include ] - [#include ] - [#include ], - [ void *array[100]; size_t size; char **strings; ] - [ size = backtrace(array, 100); ] - [ strings = backtrace_symbols(array, size); ], - FOUND=yes - AC_MSG_RESULT([[yes]]) - AC_DEFINE([HAVE_BACKTRACE], 1, [Define to 1 to create stacktrace on segmentation faults]), - FOUND=no - AC_MSG_RESULT([[no]])) - - -dnl -dnl "rdynamic" linker flag -dnl -AC_MSG_CHECKING(for rdynamic linker flag) - old_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -rdynamic" - AC_TRY_LINK([], [], - AC_MSG_RESULT([[yes]]), - AC_MSG_RESULT([[no]]) - [LDFLAGS="$old_LDFLAGS"]) - -dnl -dnl End of debugging code -dnl -else -AC_DEFINE([NDEBUG],1,Define to 1 to exclude debug-code) -fi - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT diff --git a/synology/README.md b/docs/SYNOLOGY.md similarity index 73% rename from synology/README.md rename to docs/SYNOLOGY.md index 47ce03987..2df96545d 100644 --- a/synology/README.md +++ b/docs/SYNOLOGY.md @@ -1,12 +1,11 @@ # Synology nzbget packages -We support Synology via SynoCommunity package (DSM 3.x / 6.x / 7.x) and native SPK package (DSM 7.x) for manual installation. +We support Synology via SynoCommunity package (DSM 3.x / 6.x / 7.x) * [SynoCommunity package (DSM 3.x / 6.x / 7.x)](#synocommunity-package) -* [SPK package (DSM 7.x)](#spk-package) +* [SPK package (DSM 7.x) (deprecated)](#spk-package-deprecated) * [Switch between SynoCommunity package and SPK](#switch-between-synocommunity-package-and-spk) - # SynoCommunity package DSM versions: 3.x / 6.x / 7.x @@ -19,13 +18,15 @@ If you have SynoCommunity added on your device - please simply install NZBGet un If you have installed original NZBGet version (package version `20220406-29` and below) - upgrade to nzbgetcom version (latest / `20240115-30`) -# SPK package +# SPK package (deprecated) DSM versions: 7.x +SPK packages is now deprecated and no longer supported due to old GCC in native Synology toolchains, which does not support C++17. Latest SPK packages release version: `24.1` + ## Package versions -We provide native packages for most Synology platforms (DSM 7.x). To select a correct package for yours platform please find Synology model in [Synology NAS list](https://kb.synology.com/en-us/DSM/tutorial/What_kind_of_CPU_does_my_NAS_have) and select package based on `Package Arch` field: +To select a correct package for yours platform please find Synology model in [Synology NAS list](https://kb.synology.com/en-us/DSM/tutorial/What_kind_of_CPU_does_my_NAS_have) and select package based on `Package Arch` field: | Package Arch | NZBGet package name |:---------------|:- @@ -61,7 +62,7 @@ We provide native packages for most Synology platforms (DSM 7.x). To select a co ## Installing / upgrading / uninstalling / reinstalling To install NZBGet package from Synology Package Center press Manual Install and select downloaded package -> Next -> Agree -> Select shared folder and download directory -> Credentials for web interface -> Done. -After installation NZBGet web interface will be availabe from http://[Synology NAS IP or Hostname]:6789 with provided during installation username/password (nzbget/nzbget by default). Also this link available from package center "Open" button on installed NZBGet package icon. +After installation NZBGet web interface will be available from http://[Synology NAS IP or Hostname]:6789 with provided during installation username/password (nzbget/nzbget by default). Also this link available from package center "Open" button on installed NZBGet package icon. To upgrade nzbget package - do the same thing with new package. NZBGet settings will be keeped. @@ -69,7 +70,7 @@ Uninstall - from Package center select NZBGet package and hit uninstall in actio ## Shared folders permissions and nzbget -When installed, the package adds all the necessary permissions for the selected Shared folder to work correcty. If you want to change the download path to another shared folder, you must manually add permissions for the nzbget user. For example - you changed MainDir to /volume2/some_shared_folder/some_download_directory. You must add r/w permission to `nzbget` user via Control Panel -> Shared Folder -> Select `some_shared_folder` -> Edit -> Permissions tab -> select from combobox `System internal user` -> nzbget -> Read/Write -> Save. +When installed, the package adds all the necessary permissions for the selected Shared folder to work correctly. If you want to change the download path to another shared folder, you must manually add permissions for the nzbget user. For example - you changed MainDir to /volume2/some_shared_folder/some_download_directory. You must add r/w permission to `nzbget` user via Control Panel -> Shared Folder -> Select `some_shared_folder` -> Edit -> Permissions tab -> select from combobox `System internal user` -> nzbget -> Read/Write -> Save. ## Extensions @@ -80,7 +81,7 @@ You can put custom extension in `ScriptDir` directory. During installation this - backup settings via WebUI - remove old package completely (with wipe settings) - install new version -- restore needeed settings +- restore needed settings - fix download directory permissions (if needed) ## Known issues: diff --git a/linux/build-info.md b/linux/build-info.md deleted file mode 100644 index ff767d45c..000000000 --- a/linux/build-info.md +++ /dev/null @@ -1,199 +0,0 @@ -About ------ -"build-nzbget" is a bash script which is used to build universal installer -for Linux and installer for FreeBSD. The script compiles NZBGet for each -supported platform and CPU-architecture and then packs all produced files -into two installer packages: one for Linux and another for FreeBSD. In -addition the packages with debug binaries are created too. - -Prerequisites -------------- -To use the script you need a Linux (virtual) machine. - -Script 'build-nzbget' supports two kind of toolchains: - - toolchain from uClibc's Buildroot-project; - - cross-compiling toolchain built with GCC. - - -Building toolchains -------------------- - -1. Create directory where you want to keep your files to compile NZBGet. Choose - the path wisely because it cannot be changed later without rebuilding all - toolchains again; - -2. Put the build script 'build-nzbget' into that directory; - -3. Create subdirectories: - - toolchain - for toolchains; - - nzbget - for source code of NZBGet; - - output - to store the results of build script; - - setup - for extra files required for installer; - -4. Build buildroot-toolchain for one CPU-architecture: - - Download Buildroot distribution archive 'buildroot-2015.08.01' from - http://buildroot.uclibc.org/download.html. - If you choose other version the instructions may not apply exactly; - - Unpack the tarball into 'toolchain'-directory; - - Rename the buildroot-directory according to the target CPU-architecture name, - for example 'x86_64' or 'armhf'; Be careful here, after the toolchain is - built the directory cannot be renamed or moved, you will have to rebuild - the toolchain if you want another name; - - Run 'make menuconfig'; - - Configure toolchain: - - Target architecture: - - choose your target architecture; - - Build options: - - libraries (both static and shared); - - Toolchain: - - Kernel Headers (Manually specified Linux version); - - (2.6.32) linux version; - - Custom kernel headers series (2.6.x); - - C library: glibc (for x86_64 and armhf) or uClibc (for all other architectures); - - uClibc library version (uClibc-ng); - - Enable large file (files > 2 GB) support; - - Enable IPv6 support; - - Enable toolchain locale/i18n support; - - GCC compiler Version (gcc 5.x); - - Enable C++ support; - - Build cross gdb for the host; - - Target packages: - - Libraries: - - Compression and decompression: zlib; - - Crypto: openssl; - - JSON/XML: libxml2; - - Text and terminal handling: ncurses; - - Save configuration and exit; - - Do few extra manual adjustments: - - in 'packages/ncurses/ncurses.mk' add extra configure parameters to - option 'NCURSES_CONF_OPTS‘ (with quotation marks): - "--with-fallbacks=xterm xterm-color xterm-256color xterm-16color linux vt100 vt200"; - - in 'packages/openssl/openssl.mk' replace 'zlib-dynamic' with 'zlib'; - - in 'packages/glibc/glibc.mk' add extra configure parameter - '--enable-static-nss'; - - in directory 'packages/glibc/2.20' create new file with name 'allocatestack-pax.patch' - with the following content; the patch fixes incompatibility with hardened kernels: - ``` - >>> START OF 'allocatestack-pax.patch' - this line marker is not part of the file >>> - --- a/nptl/allocatestack.c 2014-09-07 10:09:09.000000000 +0200 - +++ b/nptl/allocatestack.c 2017-11-02 18:02:47.165016000 +0100 - @@ -78,6 +78,7 @@ - #ifndef STACK_ALIGN - # define STACK_ALIGN __alignof__ (long double) - #endif - +#define PF_X 0 - - /* Default value for minimal stack size after allocating thread - descriptor and guard. */ - <<< END OF 'allocatestack-pax.patch' - this line marker is not part of the file <<< - ``` - - Run 'make' to build the toolchain. It may take an hour or less depending - on your hardware; - - If C library 'glibc' was chosen extra steps are needed to build proper - static libraries of OpenSSL in addition to already built dynamic - libraries (which are also required): - - delete directory 'output/build/openssl-x.x.x'; - - in 'packages/openssl/openssl.mk' replace - - `'$(if $(BR2_STATIC_LIBS),no-shared,shared)'` with - - `'$(if $(BR2_STATIC_LIBS),no-shared,no-shared)'` - - and replace - - `'$(if $(BR2_STATIC_LIBS),no-dso,dso)'` with - - `'$(if $(BR2_STATIC_LIBS),no-dso,no-dso)'` - - from root directory of toolchain run 'make' again; - - openssl will be rebuilt without shared libraries support; - - installation step of openssl fails with message: - - `"chmod: cannot access ‘../lib/engines/lib*.so’: No such file or directory";` - - - ignore the error, static libraries of openssl are already installed - and will be used by NZBGet; - -5. Now you should have a working toolchain for one CPU-architecture, let's - test it. - - Change to the ROOTBUILD-directory and run the build script: - ``` - ./build-nzbget release bin - ``` - - The script creates subdirectory 'nzbget/trunk' and checkouts the source - code of NZBGet from subversion repository; - - Then the source code is compiled for chosen CPU-architecture; - - After the compiling a distribution binary archive for the chosen - CPU-architecture is put into output-directory; - -6. Build unrar and 7za for the CPU-architecture: - - Download source of unrar; Compile for target, either manually or - using script 'build-unpack'; - - Put the compiled binaries of unrar and 7za into setup-directory, add - suffix '-arch' to unrar and 7za names, for example 'unrar-armel'; - - Copy license-files from unrar and 7-Zip projects using names - 'license-unrar.txt' and 'license-7zip.txt'; - -7. Now you can build installer for that one CPU-architecture: - - If you build for CPU-architecture which is not supported by NZBGet's - universal installer you have to edit the script 'build-nzbget' and - add the architecture name into variable 'ALLTARGETS'; - - Run the build script with: - ``` - ./build-nzbget release installer - ``` - - The created installer supports only one CPU-Architecture; - - Run the installer on the target machine (with target CPU-Architecture); - -8. Repeat step for each CPU-Architecture you intend to build the installer for; - -9. To build installer for FreeBSD we need a cross-compiling toolhcain: - - Create directory 'x86_64-bsd' inside your toolchain-directory; - - Copy file 'build-toolchain-freebsd' into that directory; - - Execute the script build script: - ``` - ./build-toolchain-freebsd - ``` - The script downloads and build the full cross-compiling toolchain. - - - To test the FreeBSD toolchain start 'build-nzbget' with following parameters: - ``` - ./build-nzbget x86_64-bsd release - ``` -10. To build installer for all CPU-Architectures listed in variable 'ALLTARGETS' - of the script run the script without choosing CPU-Architecture: - ``` - ./build-nzbget release - ``` -11. When the script is run without any parameters: - - NZBGet is compiled twice for each CPU-Architecture listed in - 'ALLTARGETS': once in release mode and once in debug mode; - - Four installers are built: one for release and another for debug for - each supported platform - Linux and FreeBSD. - - -Special functions ------------------ -By default the script builds from HEAD of develop branch. To specify another -tag or branch pass it to the script, for example to build a tagged version 14.2: - -``` -./build-nzbget release bin tags/v16.0 -``` - -Installers can be built only for version 15.0 and newer. Distribution archives -can be built for older versions too. - -To build on certain history point pass commit SHA to the script, for example -``` -./build-nzbget release bin 13f5ab738880671a8d8381ef0fabc625e269eeef -``` - -To cleanup the output directory before building pass parameter 'cleanup': -``` -./build-nzbget release cleanup -``` - -To improve compilation speed activate pre-compiled headers and multicore make: -``` -./build-nzbget release pch core4 -``` diff --git a/linux/build-nzbget b/linux/build-nzbget deleted file mode 100755 index 94253341f..000000000 --- a/linux/build-nzbget +++ /dev/null @@ -1,607 +0,0 @@ -#!/bin/bash -# -# This file is part of nzbget -# -# Copyright (C) 2015-2019 Andrey Prygunkov -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# Setup strict bash error handling -set -o nounset -set -o errexit - -# Uncomment next line for debuging -#set -x - -ALLTARGETS="dist i686 x86_64 armel armhf aarch64 mipsel mipseb ppc6xx ppc500 x86_64-bsd i686-ndk armhf-ndk aarch64-ndk" -ROOT=`pwd` -ROOTPATH=$PATH -OUTPUTDIR=$ROOT/output -CROSSCLANG="clang-4.0" - -# Configuration -BUILD=no -PLATFORMS="" -TARGETS="" -OUTPUTS="" -REVISION="" -BRANCH="" -CONFIGS="" -CLEAN=no -PCH=no -COREX="1" - -PrintUsage() -{ - echo "Usage:" - echo " $(basename $0) [targets] [output] [revision] [reppath] [configs] [cleanup] [pch] [corex]" - echo " targets : all (default) $ALLTARGETS" - echo " output : bin installer" - echo " revision : head (default) work " - echo " branch : develop (default) master tags/XXX branches/XXX" - echo " configs : release debug (default) release-nostrip debug-strip" - echo " cleanup : cleanup output directory before building" - echo " pch : create and use precompiled headers" - echo " corex : multicore make (x is a number of threads)" - echo -} - -ParseCommandLine() -{ - for PARAM in "$@" - do - case $PARAM in - release|release-nostrip|debug|debug-strip) - # using xargs to trim spaces - CONFIGS=`echo "$CONFIGS $PARAM" | xargs` - ;; - master|develop|tags/*) - BRANCH="$PARAM" - ;; - branches/*) - BRANCH="${PARAM:9}" - ;; - head|work|[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]*) - REVISION="$PARAM" - ;; - clean|cleanup) - CLEAN=yes - ;; - pch) - PCH=yes - ;; - core[1-9]) - COREX="${PARAM:4}" - ;; - bin|installer) - # using xargs to trim spaces - OUTPUTS=`echo "$OUTPUTS $PARAM" | xargs` - ;; - *) - if [[ " $ALLTARGETS " == *" $PARAM "* ]]; then - # using xargs to trim spaces - TARGETS=`echo "$TARGETS $PARAM" | xargs` - if [ "$PARAM" == "all" ]; then - PARAM=$ALLTARGETS - fi - elif [ -d toolchain/$PARAM ]; then - # non-standard target but the toolchain exist - # using xargs to trim spaces - TARGETS=`echo "$TARGETS $PARAM" | xargs` - else - echo "Invalid parameter: $PARAM" - exit 1 - fi - ;; - esac - - done - - if [ "$TARGETS" == "" ]; then - TARGETS="$ALLTARGETS" - fi - - if [ "$OUTPUTS" == "" ]; then - OUTPUTS="bin installer" - fi - - if [ "$REVISION" == "" ]; then - REVISION="head" - fi - - if [ "$BRANCH" == "" ]; then - BRANCH="develop" - fi - - if [ "$CONFIGS" == "" ]; then - CONFIGS="release debug" - fi - - for TARGET in $TARGETS - do - if [[ $TARGET == *-bsd ]]; then - PLATFORM="freebsd" - elif [[ $TARGET == *-ndk ]]; then - PLATFORM="android" - else - PLATFORM="linux" - fi - if [[ " $PLATFORMS " != *" $PLATFORM "* ]]; then - PLATFORMS=`echo "$PLATFORMS $PLATFORM" | xargs` - fi - done -} - -PrintConfig() -{ - echo "Active configuration:" - echo " platforms: $PLATFORMS" - echo " targets : $TARGETS" - echo " outputs : $OUTPUTS" - echo " revision : $REVISION" - echo " branch : $BRANCH" - echo " configs : $CONFIGS" - echo " cleanup : $CLEAN" - echo " pch : $PCH" - echo " cores : $COREX" - echo -} - -UpdateFromRepository() -{ - if [ ! -d nzbget ]; then - echo "Initial checkout" - git clone https://github.com/nzbget/nzbget.git - fi - - cd nzbget - - BUILDDIR=$ROOT/nzbget - - cd $BUILDDIR - - if [ $REVISION != "work" ]; then - echo "Updating to $REVISION" - git pull - git checkout $BRANCH - if [ $REVISION != "head" ]; then - git checkout $REVISION - fi - touch Makefile.in configure config.h.in - - echo "Updating root certificates" - cd ../setup - curl --remote-name --time-cond cacert.pem https://curl.se/ca/cacert.pem - # remove expired DST Root CA X3 certificate - sed '/^DST Root CA X3$/,/^-----END CERTIFICATE-----$/d;' -i cacert.pem - cd $BUILDDIR - fi -} - -DetectVersionRevision() -{ - VERSION=`grep "AC_INIT(nzbget, " configure.ac` - VERSION=`expr "$VERSION" : '.*, \(.*\),.*)'` - - # Building revision name - B=`git branch | sed -n -e 's/^\* \(.*\)/\1/p' | sed 's/ /-/g' | sed 's/(//g' | sed 's/)//g'` - M=`git status --porcelain` - if [ "$M" != "" ]; then - M="M" - fi - if [ "$B" == "master" ]; then - REVISION="$M" - elif [ "$B" == "develop" ]; then - REVISION=`git rev-list HEAD | wc -l | xargs` - REVISION="${REVISION}$M" - else - REVISION=`git rev-list HEAD | wc -l | xargs` - REVISION="${REVISION}$M-($B)" - fi -} - -ConstructOutputFilename() -{ - BASENAME="nzbget-$VERSION" - if [ `expr "$VERSION" : ".*-testing"` != 0 ]; then - BASENAME="$BASENAME-r$REVISION" - fi -} - -ConstructSuffix() -{ - case $CONFIG in - release) - SUFFIX="" - ;; - debug) - SUFFIX="-debug" - ;; - debug-strip) - SUFFIX="-debug-strip" - ;; - release-nostrip) - SUFFIX="-nostrip" - ;; - esac - - if [ $PLATFORM == "freebsd" ]; then - PLATSUFF="-bsd" - elif [ $PLATFORM == "android" ]; then - PLATSUFF="-ndk" - else - PLATSUFF="" - fi -} - -ConstructArchParams() -{ - ARCH=$TARGET - case $TARGET in - mipseb) - ARCH=mips - ;; - arm*) - ARCH=arm - ;; - ppc*) - ARCH=powerpc - ;; - esac - - TOOLCHAIN_ROOT=$ROOT/toolchain/$TARGET$PLATSUFF - TOOLPATH=$TOOLCHAIN_ROOT/output/host/usr/bin - PATH=$TOOLPATH:$ROOTPATH - STAGING="$TOOLCHAIN_ROOT/output/staging" - case $PLATFORM in - linux) - TOOLKIND=buildroot - ARCH=$ARCH-linux - ;; - android) - TOOLKIND=ndk - ARCH=$ARCH-linux-android - if [ "$ARCH" == "arm-linux-android" ]; then - ARCH="arm-linux-androideabi" - fi - ;; - freebsd) - TOOLKIND=crossclang - ARCH=$ARCH-pc-freebsd - SYSROOT="$TOOLCHAIN_ROOT/sysroot" - ;; - esac -} - -ConfigureTarget() -{ - STRIP="" - if [ $CONFIG == "debug-strip" -o $CONFIG == "release" ]; then - STRIP="-s" - fi - - DEBUG="" - if [ $CONFIG != "release" ]; then - DEBUG="-g" - fi - - LUBACKTRACE="" - if [ -f "$STAGING/lib/libubacktrace.so.1" ] ; then - LUBACKTRACE="-lubacktrace" - fi - - case "$TOOLKIND-$CONFIG" in - buildroot-debug|buildroot-debug-strip) - LDFLAGS="-static $STRIP" \ - CXXFLAGS="-std=c++14 -g -fasynchronous-unwind-tables" \ - LIBS="-lcrypto -ldl -lz -Wl,--whole-archive -lpthread -Wl,--no-whole-archive $LUBACKTRACE" \ - ./configure --disable-dependency-tracking --host=$ARCH --enable-debug - ;; - buildroot-release|buildroot-release-nostrip) - LDFLAGS="-static $STRIP" \ - CXXFLAGS="-std=c++14 -O2 $DEBUG" \ - LIBS="-lcrypto -ldl -lz -Wl,--whole-archive -lpthread -Wl,--no-whole-archive" \ - ./configure --disable-dependency-tracking --host=$ARCH - ;; - ndk-debug|ndk-debug-strip) - LDFLAGS="-static -static-libstdc++ $STRIP" \ - CXXFLAGS="-std=c++14 -g -fasynchronous-unwind-tables" \ - CXX="$ARCH-clang++" \ - PKG_CONFIG_LIBDIR="$STAGING/usr/lib/pkgconfig" \ - ./configure --disable-dependency-tracking --disable-largefile --host=$ARCH --enable-debug - ;; - ndk-release|ndk-release-nostrip) - LDFLAGS="-static -static-libstdc++ $STRIP" \ - CXXFLAGS="-std=c++14 -O2 $DEBUG" \ - CXX="$ARCH-clang++" \ - PKG_CONFIG_LIBDIR="$STAGING/usr/lib/pkgconfig" \ - ./configure --disable-dependency-tracking --disable-largefile --host=$ARCH - ;; - crossclang-debug|crossclang-debug-strip) - CXX="$CROSSCLANG" \ - LDFLAGS="-static $STRIP -fuse-ld=lld --target=$ARCH -lc++ -lm --sysroot=$SYSROOT" \ - CXXFLAGS="-g --target=$ARCH --sysroot=$SYSROOT -I$SYSROOT/usr/include/c++/v1" \ - PKG_CONFIG_LIBDIR="$STAGING/usr/lib/pkgconfig" \ - ./configure --disable-dependency-tracking --host=$ARCH --enable-debug - ;; - crossclang-release|crossclang-release-nostrip) - CXX="$CROSSCLANG" \ - LDFLAGS="-static $STRIP -fuse-ld=lld --target=$ARCH -lc++ -lm --sysroot=$SYSROOT" \ - CXXFLAGS="-O2 $DEBUG --target=$ARCH --sysroot=$SYSROOT -I$SYSROOT/usr/include/c++/v1" \ - PKG_CONFIG_LIBDIR="$STAGING/usr/lib/pkgconfig" \ - ./configure --disable-dependency-tracking --host=$ARCH --enable-debug - ;; - esac -} - -PrecompileHeaders() -{ - rm -f nzbget.h.* - - OPTIM="" - if [ $CONFIG == "release" -o $CONFIG == "release-nostrip" ]; then - OPTIM="-O2" - fi - - if [ $PCH == "yes" -a $TOOLKIND == "buildroot" ]; then - $ARCH-g++ -std=c++14 -DHAVE_CONFIG_H \ - -I. -I$STAGING/usr/include -I$STAGING/usr/include/libxml2 \ - -g $OPTIM daemon/main/nzbget.h -o nzbget.h.gch - fi - - if [ $PCH == "yes" -a $TOOLKIND == "ndk" ]; then - $ARCH-clang++ -std=c++14 -DHAVE_CONFIG_H \ - -I. -I$STAGING/usr/include -I$STAGING/usr/include/libxml2 \ - -g $OPTIM -x c++-header daemon/main/nzbget.h -o nzbget.h.pch - CXXFLAGS=`sed -n 's:^CXXFLAGS =.\(.*\):\1:p' Makefile` - sed 's:^CXXFLAGS = :CXXFLAGS = -include-pch nzbget.h.pch :' -i Makefile - sed "s: CXXFLAGS+=: CXXFLAGS=$CXXFLAGS :" -i Makefile - fi -} - -PackTarget() -{ - rm -r -f $OUTPUTDIR/install - make DESTDIR=$OUTPUTDIR/install install - - cd $OUTPUTDIR - rm -r -f nzbget - mkdir -p nzbget - mv install/usr/local/bin/nzbget nzbget - mv install/usr/local/share/doc/nzbget/* nzbget - mv install/usr/local/share/nzbget/webui nzbget - mv install/usr/local/share/nzbget/scripts nzbget - CONFTEMPLATE=nzbget/webui/nzbget.conf.template - mv install/usr/local/share/nzbget/nzbget.conf $CONFTEMPLATE - - rm -r -f $OUTPUTDIR/install - - # adjusting nzbget.conf - sed 's:^MainDir=.*:MainDir=${AppDir}/downloads:' -i $CONFTEMPLATE - sed 's:^DestDir=.*:DestDir=${MainDir}/completed:' -i $CONFTEMPLATE - sed 's:^InterDir=.*:InterDir=${MainDir}/intermediate:' -i $CONFTEMPLATE - sed 's:^WebDir=.*:WebDir=${AppDir}/webui:' -i $CONFTEMPLATE - sed 's:^ScriptDir=.*:ScriptDir=${AppDir}/scripts:' -i $CONFTEMPLATE - sed 's:^LogFile=.*:LogFile=${MainDir}/nzbget.log:' -i $CONFTEMPLATE - sed 's:^ConfigTemplate=.*:ConfigTemplate=${AppDir}/webui/nzbget.conf.template:' -i $CONFTEMPLATE - sed 's:^AuthorizedIP=.*:AuthorizedIP=127.0.0.1:' -i $CONFTEMPLATE - - tar -czf $BASENAME-bin-$PLATFORM-$TARGET$SUFFIX.tar.gz nzbget - - rm -r -f nzbget -} - -BuildTarget() -{ - echo "Building $TARGET ($PLATFORM $CONFIG)" - - cd $BUILDDIR - - ConstructArchParams - - ConfigureTarget - - make clean - - PrecompileHeaders - - make -j $COREX - - PackTarget - - echo "Completed build in `pwd` for $TARGET ($CONFIG)" -} - -BuildInstaller() -{ - echo "Creating installer for $PLATFORM $CONFIG..." - - cd $OUTPUTDIR - - # checking if all targets exists - for TARGET in $TARGETS - do - ALLEXISTS="yes" - if [ $TARGET != "dist" ]; then - if [ ! -f $BASENAME-bin-$PLATFORM-$TARGET$SUFFIX.tar.gz ]; then - echo "Could not find $BASENAME-bin-$PLATFORM-$TARGET$SUFFIX.tar.gz" - ALLEXISTS="no" - fi - fi - done - - if [ "$ALLEXISTS" == "no" ]; then - exit 1; - fi - - echo "Unpacking targets..." - rm -r -f nzbget - for TARGET in $TARGETS - do - ALLEXISTS="yes" - if [ "$TARGET" != "dist" ]; then - tar -xzf $BASENAME-bin-$PLATFORM-$TARGET$SUFFIX.tar.gz - mv nzbget/nzbget nzbget/nzbget-$TARGET - cp ../setup/unrar-$TARGET$PLATSUFF nzbget/unrar-$TARGET - cp ../setup/7za-$TARGET$PLATSUFF nzbget/7za-$TARGET - fi - done - - # adjusting nzbget.conf - sed 's:^UnrarCmd=unrar:UnrarCmd=${AppDir}/unrar:' -i nzbget/webui/nzbget.conf.template - sed 's:^SevenZipCmd=7z:SevenZipCmd=${AppDir}/7za:' -i nzbget/webui/nzbget.conf.template - sed 's:^CertStore=.*:CertStore=${AppDir}/cacert.pem:' -i nzbget/webui/nzbget.conf.template - sed 's:^CertCheck=.*:CertCheck=yes:' -i nzbget/webui/nzbget.conf.template - - INSTFILE=$BASENAME-bin-$PLATFORM$SUFFIX.run - - echo "Building installer package..." - cp $BUILDDIR/linux/installer.sh $INSTFILE - cp $BUILDDIR/linux/package-info.json nzbget/webui - cp $BUILDDIR/linux/install-update.sh nzbget - cp $BUILDDIR/pubkey.pem nzbget - cp ../setup/license-unrar.txt nzbget - cp ../setup/license-7zip.txt nzbget - cp ../setup/cacert.pem nzbget - - # adjusting update config file - sed "s:linux:$PLATFORM:" -i nzbget/webui/package-info.json - sed "s:linux:$PLATFORM:" -i nzbget/install-update.sh - - # creating payload - cd nzbget - tar czf - * > ../$INSTFILE.data - cd .. - - # creating installer script - sed "s:^TITLE=$:TITLE=\"$BASENAME$SUFFIX\":" -i $INSTFILE - sed "s:^PLATFORM=$:PLATFORM=\"$PLATFORM\":" -i $INSTFILE - DISTTARGETS="${TARGETS/dist/}" - DISTTARGETS=`echo "$DISTTARGETS" | xargs` - sed "s:^DISTARCHS=$:DISTARCHS=\"$DISTTARGETS\":" -i $INSTFILE - - MD5=`md5sum "$INSTFILE.data" | cut -b-32` - sed "s:^MD5=$:MD5=\"$MD5\":" -i $INSTFILE - - PAYLOAD=`stat -c%s "$INSTFILE.data"` - PAYLOADLEN=${#PAYLOAD} - - HEADER=`stat -c%s "$INSTFILE"` - HEADERLEN=${#HEADER} - HEADER=`expr $HEADER + $HEADERLEN + $PAYLOADLEN` - - TOTAL=`expr $HEADER + $PAYLOAD` - TOTALLEN=${#TOTAL} - - HEADER=`expr $HEADER - $PAYLOADLEN + $TOTALLEN` - TOTAL=`expr $TOTAL - $PAYLOADLEN + $TOTALLEN` - - sed "s:^HEADER=$:HEADER=$HEADER:" -i $INSTFILE - sed "s:^TOTAL=$:TOTAL=$TOTAL:" -i $INSTFILE - - # attaching payload - cat $INSTFILE.data >> $INSTFILE - rm $INSTFILE.data - chmod +x $INSTFILE - - rm -r nzbget -} - -BuildDist() -{ - echo "Building dist" - - cd $BUILDDIR - ./configure --disable-dependency-tracking --disable-cpp-check - make dist - cp nzbget-$VERSION.tar.gz $OUTPUTDIR/$BASENAME.tar.gz -} - -BuildConfig() -{ - ConstructSuffix - - for OUTPUT in $OUTPUTS; do - if [ $OUTPUT == "bin" ]; then - for TARGET in $TARGETS; do - if [ $TARGET == "dist" ]; then - if [ ! -f $OUTPUTDIR/$BASENAME.tar.gz ]; then - BuildDist - fi - else - BuildTarget - fi - done - elif [ $OUTPUT == "installer" ]; then - BuildInstaller - fi - done -} - -FilterTargets() -{ - TARGETS="" - for TARGET in $BUILDTARGETS - do - if [[ $TARGET == *-bsd ]]; then - PLAT="freebsd" - TARGET="${TARGET%-bsd}" - elif [[ $TARGET == *-ndk ]]; then - PLAT="android" - TARGET="${TARGET%-ndk}" - else - PLAT="linux" - fi - if [ $PLATFORM == $PLAT ]; then - TARGETS=`echo "$TARGETS $TARGET" | xargs` - fi - done -} - -CleanupIfNecessary() -{ - if [ $CLEAN == "yes" ]; then - rm -r -f $OUTPUTDIR/* - fi -} - -##### Main script body ##### - -# Parsing command line -PrintUsage -ParseCommandLine $@ -PrintConfig - -# Checkout and update from git -UpdateFromRepository - -# File name format for output files -DetectVersionRevision -ConstructOutputFilename - -# Building -mkdir -p $OUTPUTDIR -CleanupIfNecessary -autoreconf --install - -BUILDTARGETS=$TARGETS - -for PLATFORM in $PLATFORMS; do - FilterTargets - for CONFIG in $CONFIGS; do - BuildConfig - done -done - diff --git a/linux/build-toolchain-android b/linux/build-toolchain-android deleted file mode 100755 index 664736336..000000000 --- a/linux/build-toolchain-android +++ /dev/null @@ -1,197 +0,0 @@ -#!/bin/bash -# -# This file is part of nzbget. See . -# -# Copyright (C) 2018 Andrey Prygunkov -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# This script builds cross-compiling toolchain, which can compile NZBGet for Android. -# The toolchain itself runs on Linux. - -# Setup strict bash error handling -set -o nounset -set -o errexit - -# Uncomment next line for debuging -#set -x - - -# Android API level -APILEVEL=21 - -# Architecture -ARCH=$1 -case "$ARCH" in - i686) - NDK_ARCH="x86" - NDK_TARGET="i686-linux-android" - OPENSSL_TARGET="android-x86" - ;; - x86_64) - NDK_ARCH="x86_64" - NDK_TARGET="x86_64-linux-android" - OPENSSL_TARGET="android64" - ;; - armhf) - NDK_ARCH="arm" - NDK_TARGET="arm-linux-androideabi" - OPENSSL_TARGET="android-armeabi" - ;; - aarch64) - NDK_ARCH="arm64" - NDK_TARGET="aarch64-linux-android" - OPENSSL_TARGET="android64-aarch64" - ;; - *) - echo "Usage: $0 (i686|x86_64|armhf|aarch64)" - exit 1 - ;; -esac - -echo "Creating toolchain for $ARCH" - -# Android NDK -NDK_VERSION="r17" -NDK_DIRNAME="android-ndk-$NDK_VERSION" -NDK_ARCHIVE="$NDK_DIRNAME-linux-x86_64.zip" -NDK_URL="https://dl.google.com/android/repository/$NDK_ARCHIVE" - -# Libxml -LIBXML2_VERSION="2.9.4" -LIBXML2_ARCHIVE="libxml2-$LIBXML2_VERSION.tar.gz" -LIBXML2_URL="http://xmlsoft.org/sources/$LIBXML2_ARCHIVE" - -# OpenSSL -OPENSSL_VERSION="1.1.0h" -OPENSSL_ARCHIVE="openssl-$OPENSSL_VERSION.tar.gz" -OPENSSL_URL="https://www.openssl.org/source/$OPENSSL_ARCHIVE" - -# NCurses -NCURSES_VERSION="6.0" -NCURSES_ARCHIVE="ncurses-$NCURSES_VERSION.tar.gz" -NCURSES_URL="https://ftp.gnu.org/pub/gnu/ncurses/$NCURSES_ARCHIVE" - -### START OF THE SCRIPT - -ROOTDIR=`pwd` -ROOTDIR="$ROOTDIR/$ARCH-ndk" - -rm -rf $ROOTDIR -mkdir $ROOTDIR -cd $ROOTDIR - -# Download all required tools and libraries -cd .. -mkdir -p downloads -cd downloads -if [ ! -d $NDK_DIRNAME -a ! -f $NDK_ARCHIVE ]; then - wget $NDK_URL -fi -if [ ! -f $LIBXML2_ARCHIVE ]; then - wget $LIBXML2_URL -fi -if [ ! -f $OPENSSL_ARCHIVE ]; then - wget $OPENSSL_URL -fi -if [ ! -f $NCURSES_ARCHIVE ]; then - wget $NCURSES_URL -fi -cd .. - -# Unpack NDK -if [ ! -d ./$NDK_DIRNAME ]; then - echo "Unpacking NDK" - unzip ./downloads/$NDK_ARCHIVE -fi - -# Create toolchain for target -echo "Preparing standalone NDK toolchain" -./$NDK_DIRNAME/build/tools/make_standalone_toolchain.py --arch $NDK_ARCH --api $APILEVEL --install-dir $ROOTDIR/output/host/usr - -cd $ROOTDIR - -# Configure toolchain -export PATH=$PATH:$ROOTDIR/output/host/usr/bin -export CC=$NDK_TARGET-clang -export CXX=$NDK_TARGET-clang++ -export AS=$NDK_TARGET-clang -export AR=$NDK_TARGET-ar -export LD=$NDK_TARGET-ld -export RANLIB=$NDK_TARGET-ranlib -export CFLAGS="-fPIE -fPIC" -export CXXFLAGS=$CFLAGS -export LDFLAGS="" - -mkdir output/build -ln -s host/usr/sysroot output/staging - -cd $ROOTDIR/output/build - -# Build OpenSSL (5 minutes) -tar xf ../../../downloads/$OPENSSL_ARCHIVE -cd openssl-$OPENSSL_VERSION -./Configure --prefix=$ROOTDIR/output/staging/usr --sysroot=$ROOTDIR/output/staging no-shared no-dso no-hw no-zlib no-unit-test "$OPENSSL_TARGET" -sed 's:-mandroid::' -i Makefile -make -j2 -make install_sw -cd .. - -# Build libxml2 (2 minutes) -tar xf ../../../downloads/$LIBXML2_ARCHIVE -cd libxml2-$LIBXML2_VERSION -./configure --host=$NDK_TARGET -prefix=$ROOTDIR/output/staging/usr --disable-dependency-tracking --without-zlib --without-lzma --without-python --disable-shared -sed 's:^PROGRAMS =.*:PROGRAMS = :' -i Makefile -sed 's:^bin_PROGRAMS =.*:bin_PROGRAMS = :' -i Makefile -sed 's:^SUBDIRS =.*:SUBDIRS = include .:' -i Makefile -make -j2 -make install -cd .. - -# Build NCurses (2 minutes) -tar xf ../../../downloads/$NCURSES_ARCHIVE -cd ncurses-$NCURSES_VERSION -./configure --host=$NDK_TARGET -prefix=$ROOTDIR/output/staging/usr --disable-dependency-tracking --disable-largefile -make -j2 -make install -cd .. - -cd .. - -# Create missing package descriptions -echo "prefix=$ROOTDIR/output/staging/usr - -Name: zlib -Description: zlib -Version: 1 -Libs: -L\${prefix}/lib -lz -Cflags: -I\${prefix}/include -" > $ROOTDIR/output/staging/usr/lib/pkgconfig/zlib.pc - -echo "prefix=$ROOTDIR/output/staging/usr - -Name: ncurses -Description: ncurses -Version: 5 -Libs: -L\${prefix}/lib -lncurses -Cflags: -I\${prefix}/include -" > $ROOTDIR/output/staging/usr/lib/pkgconfig/ncurses.pc - -# Remove "-L${prefix}/lib" and "-L${libdir}" from all packages to fix strange linker error -find $ROOTDIR/output/staging/usr/lib/pkgconfig -type f -exec sed 's:-L\${prefix}/lib::' -i {} \; -find $ROOTDIR/output/staging/usr/lib/pkgconfig -type f -exec sed 's:-L\${libdir}::' -i {} \; - -echo "Toolchain creation completed for $ARCH" - diff --git a/linux/build-toolchain-freebsd b/linux/build-toolchain-freebsd deleted file mode 100755 index 47271d43b..000000000 --- a/linux/build-toolchain-freebsd +++ /dev/null @@ -1,147 +0,0 @@ -#!/bin/bash -# -# This file is part of nzbget. See . -# -# Copyright (C) 2015-2017 Andrey Prygunkov -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# This script builds cross-compiling toolchain, which can compile NZBGet for FreeBSD. -# The toolchain itself runs on Linux. - -# Setup strict bash error handling -set -o nounset -set -o errexit - -# Uncomment next line for debuging -#set -x - - -TARGET="x86_64-pc-freebsd" - -# FreeBSD -FREEBSDIMAGE_URL="https://download.freebsd.org/ftp/releases/amd64/10.1-RELEASE/base.txz" - -# CLANG (must be already installed) -CLANG="clang-4.0" - -# Libxml -LIBXML2_VERSION="2.9.2" -LIBXML2_ARCHIVE="libxml2-$LIBXML2_VERSION.tar.gz" -LIBXML2_URL="http://xmlsoft.org/sources/$LIBXML2_ARCHIVE" - -# OpenSSL -OPENSSL_VERSION="1.0.2d" -OPENSSL_ARCHIVE="openssl-$OPENSSL_VERSION.tar.gz" -OPENSSL_URL="ftp://ftp.openssl.org/source/old/1.0.2/$OPENSSL_ARCHIVE" - - -### START OF THE SCRIPT - -ROOTDIR=`pwd` - -rm -rf output -rm -rf sysroot - -# Download all required tools -mkdir -p downloads -cd downloads -if [ ! -f base.txz ]; then - wget $FREEBSDIMAGE_URL -fi -if [ ! -f $LIBXML2_ARCHIVE ]; then - wget $LIBXML2_URL -fi -if [ ! -f $OPENSSL_ARCHIVE ]; then - wget $OPENSSL_URL -fi -cd .. - -# Creating sysroot for FreeBSD from official FreeBSD installation image. -# Our sysroot contains only a small set of files needed to compile NZBGet and dependent libraries -mkdir -p sysroot -cd sysroot -tar xf ../downloads/base.txz \ - ./lib \ - ./usr/include \ - ./usr/lib/crt1.o \ - ./usr/lib/crtbegin.o \ - ./usr/lib/crtbeginS.o \ - ./usr/lib/crtbeginT.o \ - ./usr/lib/crtend.o \ - ./usr/lib/crtendS.o \ - ./usr/lib/crti.o \ - ./usr/lib/crtn.o \ - ./usr/lib/libc++.a \ - ./usr/lib/libc.a \ - ./usr/lib/libcompiler_rt.a \ - ./usr/lib/libgcc.a \ - ./usr/lib/libgcc_eh.a \ - ./usr/lib/libgcc_s.so \ - ./usr/lib/libm.a \ - ./usr/lib/libncurses.a \ - ./usr/lib/libpthread.a \ - ./usr/lib/libthr.a \ - ./usr/lib/libz.a -# fix bad symlink -ln -s -f ../../lib/libgcc_s.so.1 usr/lib/libgcc_s.so -cd .. - -mkdir -p output/build && cd output/build - -# Unpack everything -tar xf ../../downloads/$LIBXML2_ARCHIVE -tar xf ../../downloads/$OPENSSL_ARCHIVE - -# Build libxml2 (2 minutes) -cd libxml2-$LIBXML2_VERSION -CC="$CLANG" CFLAGS="--target=$TARGET --sysroot=$ROOTDIR/sysroot" LDFLAGS="-fuse-ld=lld -static --target=$TARGET --sysroot=$ROOTDIR/sysroot" ./configure --host=$TARGET --prefix=$ROOTDIR/output/staging/usr --disable-dependency-tracking --without-zlib --without-lzma --without-python --disable-shared -make -j2 -make install -cd .. - -# Build OpenSSL (5 minutes) -cd openssl-$OPENSSL_VERSION -CC="$CLANG --target=$TARGET --sysroot=$ROOTDIR/sysroot" LD="$CLANG -fuse-ld=lld --target=$TARGET --sysroot=$ROOTDIR/sysroot" ./Configure --prefix=$ROOTDIR/output/staging/usr no-shared no-dso no-hw no-zlib no-unit-test BSD-x86_64 -make -j2 -make install_sw -cd .. - -cd .. - -# Create missing package descriptions -echo "prefix=$ROOTDIR/output/staging/usr - -Name: zlib -Description: zlib -Version: 1 -Libs: -L\${prefix}/lib -lz -Cflags: -I\${prefix}/include -" > $ROOTDIR/output/staging/usr/lib/pkgconfig/zlib.pc - -echo "prefix=$ROOTDIR/output/staging/usr - -Name: ncurses -Description: ncurses -Version: 5 -Libs: -L\${prefix}/lib -lncurses -Cflags: -I\${prefix}/include -" > $ROOTDIR/output/staging/usr/lib/pkgconfig/ncurses.pc - -# Cleanup -rm -r staging/usr/bin -rm -r staging/usr/share -rm -r staging/usr/ssl - diff --git a/linux/build-unpack b/linux/build-unpack deleted file mode 100755 index 436c87b53..000000000 --- a/linux/build-unpack +++ /dev/null @@ -1,249 +0,0 @@ -#!/bin/bash -# -# This file is part of nzbget. See . -# -# Copyright (C) 2015-2019 Andrey Prygunkov -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# Setup strict bash error handling -set -o nounset -set -o errexit - -# Uncomment next line for debuging -#set -x - -ALLTARGETS="i686 x86_64 armel armhf aarch64 mipsel mipseb ppc6xx ppc500 x86_64-bsd i686-ndk x86_64-ndk armhf-ndk aarch64-ndk" -ROOT=`pwd` -OUTPUTDIR=$ROOT/setup -BUILDDIR=temp -CROSSCLANG="clang-4.0" - -echo "Usage:" -echo " $(basename $0) [targets] [clean] [unpacker]" -echo " unpacker - unrar, 7zip." -echo - - -# Parsing command line - -TARGETS="" -CLEAN=no -UNPACKERS="" -COREX="1" - -for PARAM in "$@" -do - case $PARAM in - clean|cleanup) - CLEAN=yes - ;; - unrar|7zip) - # using xargs to trim spaces - UNPACKERS=`echo "$UNPACKERS $PARAM" | xargs` - ;; - core[1-9]) - COREX="${PARAM:4}" - ;; - *) - if [ -d toolchain/$PARAM ]; then - TARGETS=`echo "$TARGETS $PARAM" | xargs` - else - echo "Invalid parameter: $PARAM" - exit 1 - fi - ;; - esac - -done - -if [ "$TARGETS" == "" ]; then - TARGETS="$ALLTARGETS" -fi - -if [ "$UNPACKERS" == "" ]; then - UNPACKERS="unrar 7zip" -fi - -echo "Active configuration:" -echo " targets : $TARGETS" -echo " unpackers : $UNPACKERS" -echo " cleanup : $CLEAN" -echo " cores : $COREX" -echo - - -# Building - -for UNPACKER in $UNPACKERS; do - -case $UNPACKER in - unrar) - EXENAME=unrar - ;; - 7zip) - EXENAME=7za - ;; -esac - -if [ "$CLEAN" == "yes" ]; then - rm -r -f $OUTPUTDIR/$EXENAME-* -fi - - -for TARGET in $TARGETS; do - - TOOLCHAIN_ROOT=$ROOT/toolchain/$TARGET - TOOLPATH=$TOOLCHAIN_ROOT/output/host/usr/bin - - if [[ $TARGET == *-bsd ]]; then - TARGET="${TARGET%-bsd}" - TOOLKIND=crossclang - elif [[ $TARGET == *-ndk ]]; then - TARGET="${TARGET%-ndk}" - TOOLKIND=ndk - else - TOOLKIND=buildroot - fi - - ARCH=$TARGET - ENDIAN=little - case $TARGET in - mipseb) - ARCH=mips - ENDIAN=big - ;; - arm*) - ARCH=arm - ;; - ppc*) - ARCH=powerpc - ENDIAN=big - ;; - esac - - case $TOOLKIND in - buildroot) - ARCH="$ARCH-linux" - PLATSUFF="" - ;; - ndk) - ARCH="$ARCH-linux-android" - if [ "$ARCH" == "arm-linux-android" ]; then - ARCH="arm-linux-androideabi" - fi - PLATSUFF="-ndk" - ;; - crossclang) - ARCH="$ARCH-pc-freebsd" - SYSROOT="$TOOLCHAIN_ROOT/sysroot" - PLATSUFF="-bsd" - ;; - esac - - rm -rf "$ROOT/$BUILDDIR/$UNPACKER" - cd $ROOT/$BUILDDIR - - case $UNPACKER in - unrar) - tar xzf unrarsrc-*.tar.gz - cd unrar - sed 's:^CXX=:#CXX=:' -i makefile - sed 's:^STRIP=strip:#STRIP=strip:' -i makefile - sed 's:^LDFLAGS=:#LDFLAGS=-static :' -i makefile - sed 's:^CXXFLAGS=-O2:#CXXFLAGS=-O2:' -i makefile - if [ "$ENDIAN" = "big" ]; then - sed 's:^DEFINES=:DEFINES=-DBIG_ENDIAN :' -i makefile - fi - if [ "$PLATSUFF" != "-bsd" ]; then - sed 's:^DEFINES=:DEFINES=-DUSE_FALLOCATE :' -i makefile - fi - sed 's:setlocale://setlocale:' -i rar.cpp - if [ "$TOOLKIND" == "ndk" ] ; then - sed 's:^#if defined(_EMX) || defined (__VMS)$:#if defined(_EMX) || defined (__VMS) || defined (__ANDROID__):' -i consio.cpp - sed 's:^#define USE_LUTIMES$:#undef USE_LUTIMES:' -i os.hpp - fi - - EXEDIR= - LICENSE=license.txt - BUILDTARGET= - ;; - 7zip) - tar xjf p7zip_*_src_all.tar.bz2 - rm -rf 7zip - mkdir 7zip - mv p7zip_*/* 7zip - find p7zip_* -maxdepth 0 -type d -exec rm -r {} \; - cd 7zip - rm makefile.machine - cp makefile.linux_any_cpu_gcc_4.X makefile.machine - sed 's:^CXX=g++:#CXX=g++:' -i makefile.machine - sed 's:^CC=gcc:#CC=gcc:' -i makefile.machine - if [ "$TOOLKIND" == "ndk" ] ; then - sed 's:-DENV_UNIX:-DENV_UNIX -DANDROID_NDK:' -i makefile.machine - sed 's:LOCAL_LIBS=-lpthread:LOCAL_LIBS=:' -i makefile.machine - fi - if [ "$TOOLKIND" != "buildroot" ] ; then - sed 's:^PRE_COMPILED_HEADER=:#PRE_COMPILED_HEADER=:' -i makefile.machine - sed 's:^ALLFLAGS=${OPTFLAGS} -pipe -s:ALLFLAGS=${OPTFLAGS} -pipe ${CPPFLAGS}:' -i makefile.machine - fi - sed 's:setlocale(LC_ALL,"")://setlocale(LC_ALL,""):' -i CPP/myWindows/mySplitCommandLine.cpp - - EXEDIR=bin/ - LICENSE=DOC/License.txt - BUILDTARGET=$EXENAME - ;; - esac - - cd $ROOT/$BUILDDIR/$UNPACKER - - make clean - - case $TOOLKIND in - buildroot) - CXX=$TOOLPATH/$ARCH-g++ \ - CC=$TOOLPATH/$ARCH-gcc \ - STRIP=$TOOLPATH/$ARCH-strip \ - CXXFLAGS=-O2 \ - LDFLAGS=-static \ - LIBS=-lpthread \ - make -j $COREX $BUILDTARGET - ;; - ndk) - CXX=$TOOLPATH/$ARCH-clang++ \ - CC=$TOOLPATH/$ARCH-clang \ - STRIP=$TOOLPATH/$ARCH-strip \ - CXXFLAGS=-O2 \ - LDFLAGS="-static -static-libstdc++" \ - make -j $COREX $BUILDTARGET - ;; - crossclang) - CXX="$CROSSCLANG" \ - CC="$CROSSCLANG" \ - LDFLAGS="-static -fuse-ld=lld -lc++ -lm -lpthread --sysroot=$SYSROOT" \ - CXXFLAGS="-O2 --target=$ARCH --sysroot=$SYSROOT -I$SYSROOT/usr/include/c++/v1" \ - CPPFLAGS="-O2 --target=$ARCH --sysroot=$SYSROOT -I$SYSROOT/usr/include/c++/v1" \ - STRIP=strip \ - make -j $COREX $BUILDTARGET - ;; - esac - - cp $EXEDIR$EXENAME ../../setup/$EXENAME-$TARGET$PLATSUFF - cp $LICENSE ../../setup/license-$UNPACKER.txt - - echo "Completed build for $TARGET$PLATSUFF ($UNPACKER)" -done -done - diff --git a/linux/installer.sh b/linux/installer.sh index 08655e9a6..1501aea90 100755 --- a/linux/installer.sh +++ b/linux/installer.sh @@ -3,6 +3,7 @@ # This file is part of nzbget. See . # # Copyright (C) 2015-2017 Andrey Prygunkov +# Copyright (C) 2024 phnzb # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/linux/pkg/build-info.md b/linux/pkg/build-info.md index b00d2e9be..a465a6258 100644 --- a/linux/pkg/build-info.md +++ b/linux/pkg/build-info.md @@ -1,6 +1,6 @@ # About -"build-pkg.sh" is a bash script which is used to build nzbget Linux DEB/RPM packages. +`build-pkg.sh` is a bash script which is used to build nzbget Linux DEB/RPM packages. # Prerequisites diff --git a/nzbget.vcxproj b/nzbget.vcxproj deleted file mode 100755 index b0cc88329..000000000 --- a/nzbget.vcxproj +++ /dev/null @@ -1,455 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 16.0 - {41BFB691-0127-4391-9629-F1BA6740DDFE} - nzbget - Win32Proj - 10.0 - - - - Application - v143 - true - - - Application - v143 - - - Application - v143 - true - - - Application - v143 - NotSet - true - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>14.0.23107.0 - - - ..\bin\ - ..\bin\Debug32\ - - - ..\bin\ - ..\bin\Debug64\ - - - ..\bin\ - ..\bin\Release32\ - - - ..\bin\ - ..\bin\Release64\ - - - - Disabled - C:\vcpkg\installed\x86-windows-static\include;..\bin\Debug32;.\daemon\connect;.\daemon\extension;.\daemon\feed;.\daemon\frontend;.\daemon\main;.\daemon\nserv;.\daemon\nntp;.\daemon\postprocess;.\daemon\queue;.\daemon\remote;.\daemon\util;.\daemon\windows;.\lib\par2;.\lib\yencode;.\windows\resources;.\lib\regex;%(AdditionalIncludeDirectories) - WIN32;PACKAGE="nzbget";VERSION="24.2";_DEBUG;_CONSOLE;DEBUG;_WIN32_WINNT=0x0403;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - 4996;%(DisableSpecificWarnings) - Use - nzbget.h - true - - - boost_json-vc140-mt-gd.lib;libcrypto.lib;libssl.lib;zlibd.lib;libxml2.lib;lzma.lib;iconv.lib;Dbghelp.lib;WS2_32.lib;ole32.lib;OleAut32.Lib;comsuppwd.lib;Advapi32.lib;gdi32.lib;shell32.lib;Winmm.lib;crypt32.lib;%(AdditionalDependencies) - true - Console - C:\vcpkg\installed\x86-windows-static\debug\lib;%(AdditionalLibraryDirectories) - msvcrt.lib; libcmt.lib; msvcrtd.lib - - - - - Disabled - C:\vcpkg\installed\x64-windows-static\include;..\bin\Debug64;.\daemon\connect;.\daemon\extension;.\daemon\feed;.\daemon\frontend;.\daemon\main;.\daemon\nserv;.\daemon\nntp;.\daemon\postprocess;.\daemon\queue;.\daemon\remote;.\daemon\util;.\daemon\windows;.\lib\regex;.\lib\par2;.\lib\yencode;.\windows\resources;%(AdditionalIncludeDirectories) - WIN32;PACKAGE="nzbget";VERSION="24.2";_DEBUG;_CONSOLE;DEBUG;_WIN32_WINNT=0x0403;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - 4996;%(DisableSpecificWarnings) - Use - nzbget.h - true - - - true - Console - C:\vcpkg\installed\x64-windows-static\debug\lib;%(AdditionalLibraryDirectories) - boost_json-vc140-mt-gd.lib;libcrypto.lib;libssl.lib;zlibd.lib;libxml2.lib;lzma.lib;iconv.lib;Dbghelp.lib;WS2_32.lib;ole32.lib;OleAut32.Lib;comsuppwd.lib;Advapi32.lib;gdi32.lib;shell32.lib;Winmm.lib;crypt32.lib;%(AdditionalDependencies) - false - msvcrt.lib; libcmt.lib; msvcrtd.lib - -s %(AdditionalOptions) - - - $(ProjectDir)windows\resources;%(AdditionalIncludeDirectories) - - - - - C:\vcpkg\installed\x86-windows-static\include;..\bin\Release32;.\daemon\connect;.\daemon\extension;.\daemon\feed;.\daemon\frontend;.\daemon\main;.\daemon\nserv;.\daemon\nntp;.\daemon\postprocess;.\daemon\queue;.\daemon\remote;.\daemon\util;.\daemon\windows;.\lib\par2;.\lib\yencode;.\windows\resources;.\lib\regex;%(AdditionalIncludeDirectories) - WIN32;PACKAGE="nzbget";VERSION="24.2";NDEBUG;_CONSOLE;_WIN32_WINNT=0x0403;%(PreprocessorDefinitions) - Sync - MultiThreaded - Use - Level3 - 4996;%(DisableSpecificWarnings) - nzbget.h - /MP %(AdditionalOptions) - true - MaxSpeed - Default - true - Neither - false - false - true - Precise - false - true - - - boost_json-vc140-mt.lib;libcrypto.lib;libssl.lib;zlib.lib;libxml2.lib;lzma.lib;iconv.lib;WS2_32.lib;ole32.lib;OleAut32.Lib;comsuppwd.lib;Advapi32.lib;gdi32.lib;shell32.lib;Winmm.lib;crypt32.lib;%(AdditionalDependencies) - true - Console - true - true - MachineX86 - UseFastLinkTimeCodeGeneration - C:\vcpkg\installed\x86-windows-static\lib;%(AdditionalLibraryDirectories) - NotSet - msvcrt.lib; libcmtd.lib; msvcrtd.lib - - - true - - - - - C:\vcpkg\installed\x64-windows-static\include;..\bin\Release64;.\daemon\connect;.\daemon\extension;.\daemon\feed;.\daemon\frontend;.\daemon\main;.\daemon\nserv;.\daemon\nntp;.\daemon\postprocess;.\daemon\queue;.\daemon\remote;.\daemon\util;.\daemon\windows;.\lib\par2;.\lib\yencode;.\windows\resources;.\lib\regex;%(AdditionalIncludeDirectories) - WIN32;PACKAGE="nzbget";VERSION="24.2";NDEBUG;_CONSOLE;_WIN32_WINNT=0x0403;%(PreprocessorDefinitions) - Sync - MultiThreaded - Use - Level3 - 4996;%(DisableSpecificWarnings) - nzbget.h - true - Full - AnySuitable - true - Speed - true - true - true - Fast - - - boost_json-vc140-mt.lib;libcrypto.lib;libssl.lib;zlib.lib;libxml2.lib;lzma.lib;iconv.lib;WS2_32.lib;ole32.lib;OleAut32.Lib;comsuppwd.lib;Advapi32.lib;gdi32.lib;shell32.lib;Winmm.lib;crypt32.lib;%(AdditionalDependencies) - false - Console - true - true - UseLinkTimeCodeGeneration - C:\vcpkg\installed\x64-windows-static\lib;%(AdditionalLibraryDirectories) - msvcrt.lib; libcmtd.lib; msvcrtd.lib - - - - - Use - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Use - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NotUsing - NotUsing - NotUsing - NotUsing - - - - - - Create - - - Create - Create - - - Use - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/posix/ax_boost_json.m4 b/posix/ax_boost_json.m4 deleted file mode 100644 index ac6677c53..000000000 --- a/posix/ax_boost_json.m4 +++ /dev/null @@ -1,123 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_boost_json.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_BOOST_JSON -# -# DESCRIPTION -# -# Test for the JSON library from the Boost C++ libraries. The macro -# requires a preceding call to AX_BOOST_BASE. Further documentation is -# available at . -# -# This macro calls: -# -# AC_SUBST(BOOST_JSON_LIB) -# -# And sets: -# -# HAVE_BOOST_JSON -# -# LICENSE -# -# Copyright (c) 2008 Thomas Porschberg -# Copyright (c) 2008 Michael Tindal -# Copyright (c) 2013 Daniel Casimiro -# Copyright (c) 2021 Richard Winters -# Copyright (c) 2022 Luke Mewburn -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 2 - -AC_DEFUN([AX_BOOST_JSON], [ - AC_ARG_WITH([boost-json], - AS_HELP_STRING([--with-boost-json@<:@=special-lib@:>@], - [use the JSON library from boost - it is possible to specify a certain library for the linker - e.g. --with-boost-json=boost_json-gcc-mt ] - ), [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ax_boost_user_json_lib="" - else - want_boost="yes" - ax_boost_user_json_lib="$withval" - fi - ], [want_boost="yes"] - ) - - if test "x$want_boost" = "xyes"; then - AC_REQUIRE([AC_PROG_CC]) - AC_REQUIRE([AC_CANONICAL_BUILD]) - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_CACHE_CHECK(whether the Boost::JSON library is available, - ax_cv_boost_json, [ - AC_LANG_PUSH([C++]) - CXXFLAGS_SAVE=$CXXFLAGS - - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([[@%:@include ]], -dnl XXXLUKEM - [[boost::json::object obj; obj["ax"] = 1; std::string s = boost::json::serialize(obj);]]) - ], - ax_cv_boost_json=yes, - ax_cv_boost_json=no - ) - CXXFLAGS=$CXXFLAGS_SAVE - AC_LANG_POP([C++]) - ]) - - if test "x$ax_cv_boost_json" = "xyes"; then - AC_SUBST(BOOST_CPPFLAGS) - - AC_DEFINE(HAVE_BOOST_JSON,,[define if the Boost::JSON library is available]) - BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` - - LDFLAGS_SAVE=$LDFLAGS - if test "x$ax_boost_user_json_lib" = "x"; then - for libextension in `ls $BOOSTLIBDIR/libboost_json*.so* $BOOSTLIBDIR/libboost_json*.dylib* $BOOSTLIBDIR/libboost_json*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_json.*\)\.so.*$;\1;' -e 's;^lib\(boost_json.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_json.*\)\.a.*$;\1;'` ; do - ax_lib=${libextension} - AC_CHECK_LIB($ax_lib, exit, - [BOOST_JSON_LIB="-l$ax_lib"; AC_SUBST(BOOST_JSON_LIB) link_json="yes"; break], - [link_json="no"] - ) - done - if test "x$link_json" != "xyes"; then - for libextension in `ls $BOOSTLIBDIR/boost_json*.dll* $BOOSTLIBDIR/boost_json*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_json.*\)\.dll.*$;\1;' -e 's;^\(boost_json.*\)\.a.*$;\1;'` ; do - ax_lib=${libextension} - AC_CHECK_LIB($ax_lib, exit, - [BOOST_JSON_LIB="-l$ax_lib"; AC_SUBST(BOOST_JSON_LIB) link_json="yes"; break], - [link_json="no"] - ) - done - fi - - else - for ax_lib in $ax_boost_user_json_lib boost_json-$ax_boost_user_json_lib; do - AC_CHECK_LIB($ax_lib, exit, - [BOOST_JSON_LIB="-l$ax_lib"; AC_SUBST(BOOST_JSON_LIB) link_json="yes"; break], - [link_json="no"] - ) - done - - fi - fi - - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" - fi -]) diff --git a/posix/ax_cxx_compile_stdcxx.m4 b/posix/ax_cxx_compile_stdcxx.m4 deleted file mode 100644 index 7c8e6123a..000000000 --- a/posix/ax_cxx_compile_stdcxx.m4 +++ /dev/null @@ -1,1018 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) -# -# DESCRIPTION -# -# Check for baseline language coverage in the compiler for the specified -# version of the C++ standard. If necessary, add switches to CXX and -# CXXCPP to enable support. VERSION may be '11', '14', '17', or '20' for -# the respective C++ standard version. -# -# The second argument, if specified, indicates whether you insist on an -# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. -# -std=c++11). If neither is specified, you get whatever works, with -# preference for no added switch, and then for an extended mode. -# -# The third argument, if specified 'mandatory' or if left unspecified, -# indicates that baseline support for the specified C++ standard is -# required and that the macro should error out if no mode with that -# support is found. If specified 'optional', then configuration proceeds -# regardless, after defining HAVE_CXX${VERSION} if and only if a -# supporting mode is found. -# -# LICENSE -# -# Copyright (c) 2008 Benjamin Kosnik -# Copyright (c) 2012 Zack Weinberg -# Copyright (c) 2013 Roy Stogner -# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov -# Copyright (c) 2015 Paul Norman -# Copyright (c) 2015 Moritz Klammler -# Copyright (c) 2016, 2018 Krzesimir Nowak -# Copyright (c) 2019 Enji Cooper -# Copyright (c) 2020 Jason Merrill -# Copyright (c) 2021 Jörn Heusipp -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 18 - -dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro -dnl (serial version number 13). - -AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl - m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], - [$1], [14], [ax_cxx_compile_alternatives="14 1y"], - [$1], [17], [ax_cxx_compile_alternatives="17 1z"], - [$1], [20], [ax_cxx_compile_alternatives="20"], - [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl - m4_if([$2], [], [], - [$2], [ext], [], - [$2], [noext], [], - [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl - m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], - [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], - [$3], [optional], [ax_cxx_compile_cxx$1_required=false], - [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) - AC_LANG_PUSH([C++])dnl - ac_success=no - - m4_if([$2], [], [dnl - AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, - ax_cv_cxx_compile_cxx$1, - [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [ax_cv_cxx_compile_cxx$1=yes], - [ax_cv_cxx_compile_cxx$1=no])]) - if test x$ax_cv_cxx_compile_cxx$1 = xyes; then - ac_success=yes - fi]) - - m4_if([$2], [noext], [], [dnl - if test x$ac_success = xno; then - for alternative in ${ax_cxx_compile_alternatives}; do - switch="-std=gnu++${alternative}" - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, - $cachevar, - [ac_save_CXX="$CXX" - CXX="$CXX $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXX="$ac_save_CXX"]) - if eval test x\$$cachevar = xyes; then - CXX="$CXX $switch" - if test -n "$CXXCPP" ; then - CXXCPP="$CXXCPP $switch" - fi - ac_success=yes - break - fi - done - fi]) - - m4_if([$2], [ext], [], [dnl - if test x$ac_success = xno; then - dnl HP's aCC needs +std=c++11 according to: - dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf - dnl Cray's crayCC needs "-h std=c++11" - dnl MSVC needs -std:c++NN for C++17 and later (default is C++14) - for alternative in ${ax_cxx_compile_alternatives}; do - for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do - if test x"$switch" = xMSVC; then - dnl AS_TR_SH maps both `:` and `=` to `_` so -std:c++17 would collide - dnl with -std=c++17. We suffix the cache variable name with _MSVC to - dnl avoid this. - switch=-std:c++${alternative} - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_${switch}_MSVC]) - else - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) - fi - AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, - $cachevar, - [ac_save_CXX="$CXX" - CXX="$CXX $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXX="$ac_save_CXX"]) - if eval test x\$$cachevar = xyes; then - CXX="$CXX $switch" - if test -n "$CXXCPP" ; then - CXXCPP="$CXXCPP $switch" - fi - ac_success=yes - break - fi - done - if test x$ac_success = xyes; then - break - fi - done - fi]) - AC_LANG_POP([C++]) - if test x$ax_cxx_compile_cxx$1_required = xtrue; then - if test x$ac_success = xno; then - AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) - fi - fi - if test x$ac_success = xno; then - HAVE_CXX$1=0 - AC_MSG_NOTICE([No compiler with C++$1 support was found]) - else - HAVE_CXX$1=1 - AC_DEFINE(HAVE_CXX$1,1, - [define if the compiler supports basic C++$1 syntax]) - fi - AC_SUBST(HAVE_CXX$1) -]) - - -dnl Test body for checking C++11 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 -) - -dnl Test body for checking C++14 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 -) - -dnl Test body for checking C++17 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 -) - -dnl Test body for checking C++20 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 -) - - -dnl Tests for new features in C++11 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ - -// If the compiler admits that it is not ready for C++11, why torture it? -// Hopefully, this will speed up the test. - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -// MSVC always sets __cplusplus to 199711L in older versions; newer versions -// only set it correctly if /Zc:__cplusplus is specified as well as a -// /std:c++NN switch: -// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ -#elif __cplusplus < 201103L && !defined _MSC_VER - -#error "This is not a C++11 compiler" - -#else - -namespace cxx11 -{ - - namespace test_static_assert - { - - template - struct check - { - static_assert(sizeof(int) <= sizeof(T), "not big enough"); - }; - - } - - namespace test_final_override - { - - struct Base - { - virtual ~Base() {} - virtual void f() {} - }; - - struct Derived : public Base - { - virtual ~Derived() override {} - virtual void f() override {} - }; - - } - - namespace test_double_right_angle_brackets - { - - template < typename T > - struct check {}; - - typedef check single_type; - typedef check> double_type; - typedef check>> triple_type; - typedef check>>> quadruple_type; - - } - - namespace test_decltype - { - - int - f() - { - int a = 1; - decltype(a) b = 2; - return a + b; - } - - } - - namespace test_type_deduction - { - - template < typename T1, typename T2 > - struct is_same - { - static const bool value = false; - }; - - template < typename T > - struct is_same - { - static const bool value = true; - }; - - template < typename T1, typename T2 > - auto - add(T1 a1, T2 a2) -> decltype(a1 + a2) - { - return a1 + a2; - } - - int - test(const int c, volatile int v) - { - static_assert(is_same::value == true, ""); - static_assert(is_same::value == false, ""); - static_assert(is_same::value == false, ""); - auto ac = c; - auto av = v; - auto sumi = ac + av + 'x'; - auto sumf = ac + av + 1.0; - static_assert(is_same::value == true, ""); - static_assert(is_same::value == true, ""); - static_assert(is_same::value == true, ""); - static_assert(is_same::value == false, ""); - static_assert(is_same::value == true, ""); - return (sumf > 0.0) ? sumi : add(c, v); - } - - } - - namespace test_noexcept - { - - int f() { return 0; } - int g() noexcept { return 0; } - - static_assert(noexcept(f()) == false, ""); - static_assert(noexcept(g()) == true, ""); - - } - - namespace test_constexpr - { - - template < typename CharT > - unsigned long constexpr - strlen_c_r(const CharT *const s, const unsigned long acc) noexcept - { - return *s ? strlen_c_r(s + 1, acc + 1) : acc; - } - - template < typename CharT > - unsigned long constexpr - strlen_c(const CharT *const s) noexcept - { - return strlen_c_r(s, 0UL); - } - - static_assert(strlen_c("") == 0UL, ""); - static_assert(strlen_c("1") == 1UL, ""); - static_assert(strlen_c("example") == 7UL, ""); - static_assert(strlen_c("another\0example") == 7UL, ""); - - } - - namespace test_rvalue_references - { - - template < int N > - struct answer - { - static constexpr int value = N; - }; - - answer<1> f(int&) { return answer<1>(); } - answer<2> f(const int&) { return answer<2>(); } - answer<3> f(int&&) { return answer<3>(); } - - void - test() - { - int i = 0; - const int c = 0; - static_assert(decltype(f(i))::value == 1, ""); - static_assert(decltype(f(c))::value == 2, ""); - static_assert(decltype(f(0))::value == 3, ""); - } - - } - - namespace test_uniform_initialization - { - - struct test - { - static const int zero {}; - static const int one {1}; - }; - - static_assert(test::zero == 0, ""); - static_assert(test::one == 1, ""); - - } - - namespace test_lambdas - { - - void - test1() - { - auto lambda1 = [](){}; - auto lambda2 = lambda1; - lambda1(); - lambda2(); - } - - int - test2() - { - auto a = [](int i, int j){ return i + j; }(1, 2); - auto b = []() -> int { return '0'; }(); - auto c = [=](){ return a + b; }(); - auto d = [&](){ return c; }(); - auto e = [a, &b](int x) mutable { - const auto identity = [](int y){ return y; }; - for (auto i = 0; i < a; ++i) - a += b--; - return x + identity(a + b); - }(0); - return a + b + c + d + e; - } - - int - test3() - { - const auto nullary = [](){ return 0; }; - const auto unary = [](int x){ return x; }; - using nullary_t = decltype(nullary); - using unary_t = decltype(unary); - const auto higher1st = [](nullary_t f){ return f(); }; - const auto higher2nd = [unary](nullary_t f1){ - return [unary, f1](unary_t f2){ return f2(unary(f1())); }; - }; - return higher1st(nullary) + higher2nd(nullary)(unary); - } - - } - - namespace test_variadic_templates - { - - template - struct sum; - - template - struct sum - { - static constexpr auto value = N0 + sum::value; - }; - - template <> - struct sum<> - { - static constexpr auto value = 0; - }; - - static_assert(sum<>::value == 0, ""); - static_assert(sum<1>::value == 1, ""); - static_assert(sum<23>::value == 23, ""); - static_assert(sum<1, 2>::value == 3, ""); - static_assert(sum<5, 5, 11>::value == 21, ""); - static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); - - } - - // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae - // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function - // because of this. - namespace test_template_alias_sfinae - { - - struct foo {}; - - template - using member = typename T::member_type; - - template - void func(...) {} - - template - void func(member*) {} - - void test(); - - void test() { func(0); } - - } - -} // namespace cxx11 - -#endif // __cplusplus >= 201103L - -]]) - - -dnl Tests for new features in C++14 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ - -// If the compiler admits that it is not ready for C++14, why torture it? -// Hopefully, this will speed up the test. - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -#elif __cplusplus < 201402L && !defined _MSC_VER - -#error "This is not a C++14 compiler" - -#else - -namespace cxx14 -{ - - namespace test_polymorphic_lambdas - { - - int - test() - { - const auto lambda = [](auto&&... args){ - const auto istiny = [](auto x){ - return (sizeof(x) == 1UL) ? 1 : 0; - }; - const int aretiny[] = { istiny(args)... }; - return aretiny[0]; - }; - return lambda(1, 1L, 1.0f, '1'); - } - - } - - namespace test_binary_literals - { - - constexpr auto ivii = 0b0000000000101010; - static_assert(ivii == 42, "wrong value"); - - } - - namespace test_generalized_constexpr - { - - template < typename CharT > - constexpr unsigned long - strlen_c(const CharT *const s) noexcept - { - auto length = 0UL; - for (auto p = s; *p; ++p) - ++length; - return length; - } - - static_assert(strlen_c("") == 0UL, ""); - static_assert(strlen_c("x") == 1UL, ""); - static_assert(strlen_c("test") == 4UL, ""); - static_assert(strlen_c("another\0test") == 7UL, ""); - - } - - namespace test_lambda_init_capture - { - - int - test() - { - auto x = 0; - const auto lambda1 = [a = x](int b){ return a + b; }; - const auto lambda2 = [a = lambda1(x)](){ return a; }; - return lambda2(); - } - - } - - namespace test_digit_separators - { - - constexpr auto ten_million = 100'000'000; - static_assert(ten_million == 100000000, ""); - - } - - namespace test_return_type_deduction - { - - auto f(int& x) { return x; } - decltype(auto) g(int& x) { return x; } - - template < typename T1, typename T2 > - struct is_same - { - static constexpr auto value = false; - }; - - template < typename T > - struct is_same - { - static constexpr auto value = true; - }; - - int - test() - { - auto x = 0; - static_assert(is_same::value, ""); - static_assert(is_same::value, ""); - return x; - } - - } - -} // namespace cxx14 - -#endif // __cplusplus >= 201402L - -]]) - - -dnl Tests for new features in C++17 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ - -// If the compiler admits that it is not ready for C++17, why torture it? -// Hopefully, this will speed up the test. - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -#elif __cplusplus < 201703L && !defined _MSC_VER - -#error "This is not a C++17 compiler" - -#else - -#include -#include -#include - -namespace cxx17 -{ - - namespace test_constexpr_lambdas - { - - constexpr int foo = [](){return 42;}(); - - } - - namespace test::nested_namespace::definitions - { - - } - - namespace test_fold_expression - { - - template - int multiply(Args... args) - { - return (args * ... * 1); - } - - template - bool all(Args... args) - { - return (args && ...); - } - - } - - namespace test_extended_static_assert - { - - static_assert (true); - - } - - namespace test_auto_brace_init_list - { - - auto foo = {5}; - auto bar {5}; - - static_assert(std::is_same, decltype(foo)>::value); - static_assert(std::is_same::value); - } - - namespace test_typename_in_template_template_parameter - { - - template typename X> struct D; - - } - - namespace test_fallthrough_nodiscard_maybe_unused_attributes - { - - int f1() - { - return 42; - } - - [[nodiscard]] int f2() - { - [[maybe_unused]] auto unused = f1(); - - switch (f1()) - { - case 17: - f1(); - [[fallthrough]]; - case 42: - f1(); - } - return f1(); - } - - } - - namespace test_extended_aggregate_initialization - { - - struct base1 - { - int b1, b2 = 42; - }; - - struct base2 - { - base2() { - b3 = 42; - } - int b3; - }; - - struct derived : base1, base2 - { - int d; - }; - - derived d1 {{1, 2}, {}, 4}; // full initialization - derived d2 {{}, {}, 4}; // value-initialized bases - - } - - namespace test_general_range_based_for_loop - { - - struct iter - { - int i; - - int& operator* () - { - return i; - } - - const int& operator* () const - { - return i; - } - - iter& operator++() - { - ++i; - return *this; - } - }; - - struct sentinel - { - int i; - }; - - bool operator== (const iter& i, const sentinel& s) - { - return i.i == s.i; - } - - bool operator!= (const iter& i, const sentinel& s) - { - return !(i == s); - } - - struct range - { - iter begin() const - { - return {0}; - } - - sentinel end() const - { - return {5}; - } - }; - - void f() - { - range r {}; - - for (auto i : r) - { - [[maybe_unused]] auto v = i; - } - } - - } - - namespace test_lambda_capture_asterisk_this_by_value - { - - struct t - { - int i; - int foo() - { - return [*this]() - { - return i; - }(); - } - }; - - } - - namespace test_enum_class_construction - { - - enum class byte : unsigned char - {}; - - byte foo {42}; - - } - - namespace test_constexpr_if - { - - template - int f () - { - if constexpr(cond) - { - return 13; - } - else - { - return 42; - } - } - - } - - namespace test_selection_statement_with_initializer - { - - int f() - { - return 13; - } - - int f2() - { - if (auto i = f(); i > 0) - { - return 3; - } - - switch (auto i = f(); i + 4) - { - case 17: - return 2; - - default: - return 1; - } - } - - } - - namespace test_template_argument_deduction_for_class_templates - { - - template - struct pair - { - pair (T1 p1, T2 p2) - : m1 {p1}, - m2 {p2} - {} - - T1 m1; - T2 m2; - }; - - void f() - { - [[maybe_unused]] auto p = pair{13, 42u}; - } - - } - - namespace test_non_type_auto_template_parameters - { - - template - struct B - {}; - - B<5> b1; - B<'a'> b2; - - } - - namespace test_structured_bindings - { - - int arr[2] = { 1, 2 }; - std::pair pr = { 1, 2 }; - - auto f1() -> int(&)[2] - { - return arr; - } - - auto f2() -> std::pair& - { - return pr; - } - - struct S - { - int x1 : 2; - volatile double y1; - }; - - S f3() - { - return {}; - } - - auto [ x1, y1 ] = f1(); - auto& [ xr1, yr1 ] = f1(); - auto [ x2, y2 ] = f2(); - auto& [ xr2, yr2 ] = f2(); - const auto [ x3, y3 ] = f3(); - - } - - namespace test_exception_spec_type_system - { - - struct Good {}; - struct Bad {}; - - void g1() noexcept; - void g2(); - - template - Bad - f(T*, T*); - - template - Good - f(T1*, T2*); - - static_assert (std::is_same_v); - - } - - namespace test_inline_variables - { - - template void f(T) - {} - - template inline T g(T) - { - return T{}; - } - - template<> inline void f<>(int) - {} - - template<> int g<>(int) - { - return 5; - } - - } - -} // namespace cxx17 - -#endif // __cplusplus < 201703L && !defined _MSC_VER - -]]) - - -dnl Tests for new features in C++20 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[ - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -#elif __cplusplus < 202002L && !defined _MSC_VER - -#error "This is not a C++20 compiler" - -#else - -#include - -namespace cxx20 -{ - -// As C++20 supports feature test macros in the standard, there is no -// immediate need to actually test for feature availability on the -// Autoconf side. - -} // namespace cxx20 - -#endif // __cplusplus < 202002L && !defined _MSC_VER - -]]) \ No newline at end of file diff --git a/qnap/README.md b/qnap/README.md index a70463457..5920f1eaf 100644 --- a/qnap/README.md +++ b/qnap/README.md @@ -1,12 +1,12 @@ # QNAP nzbget packages -We support QNAP via native qpkg packages, built with QNAP toolchains (only x86/x86_64/arm_64 QNAP architectures) and buildroot qpkg, repacked from linux installer (all QNAP architectures) +We support QNAP via buildroot qpkg, repacked from linux installer. ## Installing ### Manual install -Prerequsites: Enable installation of applications without digital signature (`AppCenter` - `Settings` - `Allow installation of applications without a valid digital signature`) +Prerequisites: Enable installation of applications without digital signature (`AppCenter` - `Settings` - `Allow installation of applications without a valid digital signature`) To install nzbget for QNAP download qpkg for your architecture, then from QNAP AppCenter select `Install Manually` - browse for downloaded qpkg and press `Install` For digital signature warning select `I understand the risks and want to install this application` and press `Install`. diff --git a/qnap/build-info.md b/qnap/build-info.md deleted file mode 100644 index 2ac8d5778..000000000 --- a/qnap/build-info.md +++ /dev/null @@ -1,43 +0,0 @@ -# About - -"build-nzbget.sh" is a bash script which is used to build nzbget QNAP packages. - - -# Prerequisites - -- linux x86_64 host (Ubuntu 22.04 LTS for example) - -We support building nzbget for QNAP for x86 / x86_64 / arm_64 architectures only, because other platforms toolchains is too old (nzbget need gcc 4.9+ for building). - -- download x86/x86_64 toolchains from http://download.qnap.com/dev/Toolchain/QNAP_cross_toolchains_64.20160606.tar -- download arm_64 toolchain from http://download.qnap.com/dev/Toolchain/aarch64-QNAP-linux-gnu.tgz -- extract toolchains to $QNAP_ROOT/toolchain (default - /qnap/toolchain), needed directory structure for script: -``` -/qnap/toolchain -├── aarch64 -│   └── cross-tools -├── i686 -│   ├── cross-tools -│   └── fs -└── x86_64 - ├── cross-tools - └── fs -``` -- install QDK from `https://github.com/qnap-dev/QDK` -``` -git clone https://github.com/qnap-dev/QDK -cd QDK -sed 's|python|python3|' -i InstallToUbuntu.sh -sudo ./InstallToUbuntu.sh install -``` - -# Building NZBGet - -From cloned repository run -``` -bash qnap/build-nzbget.sh -``` - -# Output files - -- /qnap/nzbget/build/*.qpkg - one file per platform diff --git a/qnap/build-nzbget.sh b/qnap/build-nzbget.sh deleted file mode 100644 index 3eee6311e..000000000 --- a/qnap/build-nzbget.sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/bash -set -e - -# config variables -QNAP_ROOT=/qnap -TOOLCHAIN_PATH=$QNAP_ROOT/toolchain -LIB_SRC_PATH=$QNAP_ROOT/source -LIB_PATH=$QNAP_ROOT/lib -ALL_ARCHS="i686 x86_64 aarch64" -UNRAR_VERSION=6.2.12 -P7ZIP_VERSION=16.02 -COREX=4 - -download_lib_source() -{ - LIB=$1 - URL=$2 - LIB_SRC_FILE=${URL##*/} - if [ ! -f "$LIB_SRC_PATH/$LIB_SRC_FILE" ]; then - echo "Downloading $LIB_SRC_FILE ..." - mkdir -p "$LIB_SRC_PATH" - curl -o "$LIB_SRC_PATH/$LIB_SRC_FILE" -lL $URL - fi -} - -build_lib() -{ - URL=$1 - LIB_SRC_FILE=${URL##*/} - LIB=$(echo $LIB_SRC_FILE | cut -d- -f 1) - download_lib_source $LIB $URL - if [ ! -d "$LIB_PATH/$ARCH/$LIB" ]; then - mkdir -p "$LIB_PATH/$ARCH" - cp "$LIB_SRC_PATH/$LIB_SRC_FILE" "$LIB_PATH/$ARCH" - cd "$LIB_PATH/$ARCH" - tar zxf "$LIB_SRC_FILE" - rm $LIB_SRC_FILE - cd ${LIB_SRC_FILE/.tar.gz/} - case $LIB in - "ncurses") - export > /tmp/export.txt - ./configure --with-termlib --without-progs --host=$HOST --prefix="$PWD/../$LIB" - ;; - "zlib") - ./configure --static --prefix="$PWD/../$LIB" - ;; - "libxml2") - ./autogen.sh --host=$HOST --enable-static --disable-shared --without-python --prefix="$PWD/../$LIB" - ;; - "musl") - ./configure --prefix="$PWD/../$LIB" - ;; - "openssl") - case $ARCH in - "i686") - OPENSSL_ARCH=generic32 - ;; - *) - OPENSSL_ARCH=$ARCH - ;; - esac - perl Configure linux-$OPENSSL_ARCH no-shared --prefix="$PWD/../$LIB" - ;; - "boost") - ./bootstrap.sh --with-libraries=json --prefix="$PWD/../$LIB" - echo "using gcc : qnap : $CXX ; " >> project-config.jam - ./b2 --toolset=gcc-qnap cxxstd=14 link=static runtime-link=static install - ;; - esac - if [ "$LIB" != "boost" ]; then - make -j $COREX - make install - fi - cd .. - rm -rf ${LIB_SRC_FILE/.tar.gz/} - fi - if [ "$LIB" == "libxml2" ]; then - export CXXFLAGS="$CXXFLAGS -I$LIB_PATH/$ARCH/$LIB/include/libxml2" - else - export CXXFLAGS="$CXXFLAGS -I$LIB_PATH/$ARCH/$LIB/include" - fi - export CPPFLAGS="$CXXFLAGS" - if [ "$LIB" == "openssl" ]; then - export LDFLAGS="$LDFLAGS -L$LIB_PATH/$ARCH/$LIB/lib -L$LIB_PATH/$ARCH/$LIB/lib64" - else - export LDFLAGS="$LDFLAGS -L$LIB_PATH/$ARCH/$LIB/lib" - fi - cd $NZBGET_ROOT -} - -build_unrar() -{ - if [ ! -d "$LIB_PATH/$ARCH/unrar" ]; then - curl -o /tmp/unrar.tar.gz https://www.rarlab.com/rar/unrarsrc-$UNRAR_VERSION.tar.gz - cd /tmp - tar zxf unrar.tar.gz - rm unrar.tar.gz - cd unrar - sed "s|^CXX=.*|CXX=$CXX|" -i makefile - sed "s|^AR=.*|AR=$AR|" -i makefile - sed "s|^STRIP=.*|STRIP=$STRIP|" -i makefile - sed "s|^LDFLAGS=.*|LDFLAGS=-lm -lpthread|" -i makefile - sed "s|^CXXFLAGS=.*|CXXFLAGS=-std=c++11 -O2|" -i makefile - make clean - make -j $COREX - mkdir -p $LIB_PATH/$ARCH/unrar - cp unrar $LIB_PATH/$ARCH/unrar/unrar - cp license.txt $LIB_PATH/$ARCH/unrar/license-unrar.txt - rm -rf /tmp/unrar - cd $NZBGET_ROOT - fi -} - -build_7zip() -{ - if [ ! -d "$LIB_PATH/$ARCH/7zip" ]; then - curl -o /tmp/p7zip.tar.bz2 -lL https://sourceforge.net/projects/p7zip/files/p7zip/${P7ZIP_VERSION}/p7zip_${P7ZIP_VERSION}_src_all.tar.bz2 - cd /tmp - tar jxf p7zip.tar.bz2 - rm p7zip.tar.bz2 - cd p7zip_$P7ZIP_VERSION - rm makefile.machine - cp makefile.linux_any_cpu_gcc_4.X makefile.machine - sed "s|^CXX=.*|CXX=$CXX|" -i makefile.machine - sed "s|^CC=.*|CC=$CC|" -i makefile.machine - make clean - make -j $COREX - mkdir -p $LIB_PATH/$ARCH/7zip - cp bin/7za $LIB_PATH/$ARCH/7zip/7za - cp DOC/License.txt $LIB_PATH/$ARCH/7zip/license-7zip.txt - rm -rf /tmp/p7zip_$P7ZIP_VERSION - cd $NZBGET_ROOT - fi -} - -# cleanup shared and build directories -rm -rf $QNAP_ROOT/nzbget -cp -r qnap/package $QNAP_ROOT/nzbget -NZBGET_ROOT=$PWD - -# extract version and correct version in qpkg.cfg -VERSION=$(cat configure.ac | grep AC_INIT | cut -d , -f 2 | xargs) -sed "s|^QPKG_VER=.*|QPKG_VER=\"$VERSION\"|" -i $QNAP_ROOT/nzbget/qpkg.cfg -# if running from CI/CD, add testing to builds from non-main branch -if [ -n "$GITHUB_REF_NAME" ]; then - if [ "$GITHUB_REF_NAME" != "main" ]; then - NEW_VERSION="$VERSION-testing-$(date '+%Y%m%d')" - sed -e "s|AC_INIT(nzbget.*|AC_INIT(nzbget, $NEW_VERSION, https://github.com/nzbgetcom/nzbget/issues)|g" -i configure.ac - fi -fi - -for ARCH in $ALL_ARCHS; do - - # toolchain variables - export ARCH=$ARCH - export HOST="$ARCH-QNAP-linux-gnu" - export CC="$TOOLCHAIN_PATH/$ARCH/cross-tools/bin/$HOST-gcc" - export CPP="$TOOLCHAIN_PATH/$ARCH/cross-tools/bin/$HOST-cpp" - export CXX="$TOOLCHAIN_PATH/$ARCH/cross-tools/bin/$HOST-g++" - export AR="$TOOLCHAIN_PATH/$ARCH/cross-tools/bin/$HOST-ar" - export STRIP="$TOOLCHAIN_PATH/$ARCH/cross-tools/bin/$HOST-strip" - - # clean build flags - export CXXFLAGS="" - export CPPFLAGS="" - export LDFLAGS="" - export LIBS="" - - case $ARCH in - "i686") - QPKG_ARCH=x86 - ;; - "aarch64") - QPKG_ARCH=arm_64 - ;; - *) - QPKG_ARCH=$ARCH - ;; - esac - - build_lib "https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.4.tar.gz" - build_lib "https://zlib.net/zlib-1.3.1.tar.gz" - build_lib "https://gitlab.gnome.org/GNOME/libxml2/-/archive/v2.12.4/libxml2-v2.12.4.tar.gz" - build_lib "https://github.com/openssl/openssl/releases/download/openssl-3.1.2/openssl-3.1.2.tar.gz" - build_lib "https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.gz" - - build_7zip - build_unrar - - autoreconf --install - - # we want to static link to all libs except libc - export CXXFLAGS="$CXXFLAGS -std=c++14 -O2" - export LIBS="-lncurses -lxml2 -lz -lm -lcrypto -ldl -Wl,--whole-archive -lpthread -Wl,--no-whole-archive" - ./configure --disable-cpp-check --disable-dependency-tracking --host=$HOST - make clean - make -j $COREX - - SHARED=$QNAP_ROOT/nzbget/shared - if [ ! -d "$SHARED/nzbget" ]; then - # populate shared folder - rm -rf $SHARED/install - make install DESTDIR=$SHARED/install - cd $SHARED - rm -rf nzbget - mkdir -p nzbget - mv install/usr/local/share/doc/nzbget/* nzbget - mv install/usr/local/share/nzbget/webui nzbget - mv install/usr/local/share/nzbget/scripts nzbget - CONFTEMPLATE=nzbget/webui/nzbget.conf.template - mv install/usr/local/share/nzbget/nzbget.conf $CONFTEMPLATE - - rm -rf install - - # adjusting nzbget.conf - sed 's|^MainDir=.*|MainDir=${AppDir}/downloads|' -i $CONFTEMPLATE - sed 's|^DestDir=.*|DestDir=${MainDir}/completed|' -i $CONFTEMPLATE - sed 's|^InterDir=.*|InterDir=${MainDir}/intermediate|' -i $CONFTEMPLATE - sed 's|^WebDir=.*|WebDir=${AppDir}/webui|' -i $CONFTEMPLATE - sed 's|^ScriptDir=.*|ScriptDir=${AppDir}/scripts|' -i $CONFTEMPLATE - sed 's|^LogFile=.*|LogFile=${MainDir}/nzbget.log|' -i $CONFTEMPLATE - sed 's|^ConfigTemplate=.*|ConfigTemplate=${AppDir}/webui/nzbget.conf.template|' -i $CONFTEMPLATE - sed 's|^AuthorizedIP=.*|AuthorizedIP=127.0.0.1|' -i $CONFTEMPLATE - sed 's|^CertCheck=.*|CertCheck=yes|' -i $CONFTEMPLATE - sed 's|^CertStore=.*|CertStore=${AppDir}/cacert.pem|' -i $CONFTEMPLATE - sed 's|^UnrarCmd=.*|UnrarCmd=${AppDir}/unrar|' -i $CONFTEMPLATE - sed 's|^SevenZipCmd=.*|SevenZipCmd=${AppDir}/7za|' -i $CONFTEMPLATE - - cp $CONFTEMPLATE nzbget/nzbget.conf - curl -o nzbget/cacert.pem -L "https://curl.se/ca/cacert.pem" - fi - - cd $NZBGET_ROOT - mkdir -p $QNAP_ROOT/nzbget/$QPKG_ARCH/nzbget - # copy main executable - cp nzbget $QNAP_ROOT/nzbget/$QPKG_ARCH/nzbget/ - # copy unrar / 7zip - cp nzbget $QNAP_ROOT/nzbget/$QPKG_ARCH/nzbget/ - cp $LIB_PATH/$ARCH/7zip/* $QNAP_ROOT/nzbget/$QPKG_ARCH/nzbget/ - cp $LIB_PATH/$ARCH/unrar/* $QNAP_ROOT/nzbget/$QPKG_ARCH/nzbget/ - cd $QNAP_ROOT/nzbget - qbuild --build-arch $QPKG_ARCH - cd $NZBGET_ROOT -done - -# rename qpkgs -for FILE in $QNAP_ROOT/nzbget/build/*.qpkg; do - [ -f $FILE ] || continue - NEW_FILE=${FILE/.qpkg/_native.qpkg} - mv $FILE $NEW_FILE -done diff --git a/qnap/repack-info.md b/qnap/repack-info.md index 2afa7a56c..9fafedb79 100644 --- a/qnap/repack-info.md +++ b/qnap/repack-info.md @@ -1,6 +1,6 @@ # About -"repack-nzbget.sh" is a bash script which is used to repack nzbget linux installer to QNAP packages (all platforms). +`repack-nzbget.sh` is a bash script which is used to repack nzbget linux installer to QNAP packages. # Prerequisites diff --git a/qnap/repack-nzbget.sh b/qnap/repack-nzbget.sh index 2ca6282a6..58e6d5af0 100644 --- a/qnap/repack-nzbget.sh +++ b/qnap/repack-nzbget.sh @@ -1,4 +1,23 @@ #!/bin/bash +# +# This file is part of nzbget. See . +# +# Copyright (C) 2024 phnzb +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + set -e # config variables diff --git a/synology/build-info.md b/synology/build-info.md deleted file mode 100644 index 5f1330a1b..000000000 --- a/synology/build-info.md +++ /dev/null @@ -1,44 +0,0 @@ -# About - -"build-nzbget.sh" is a bash script which is used to build nzbget Synology packages. - -# Prerequisites - -## Synology toolkit and environments - -Basic setup (assuming have Debian/Ubuntu host): - -1. Install Synology toolkit (reference - https://help.synology.com/developer-guide/getting_started/prepare_environment.html) -``` -sudo apt-get install git cifs-utils python3 python3-pip -sudo mkdir -p /toolkit -sudo chmod 777 /toolkit -cd /toolkit -git clone https://github.com/SynologyOpenSource/pkgscripts-ng -cd /toolkit/pkgscripts-ng/ -git checkout DSM7.0 -``` - -2. Install needed environments (please note - user must have sudo access) - -- according to https://help.synology.com/developer-guide/appendix/platarchs.html - one per architecture, and specific separately -- we exclude `comcerto2k` - toolchain for this platform does not support C++14 - -``` -cd /toolkit/pkgscripts-ng/ -for PLATFORM in alpine armada370 armada375 armada37xx armada38x armadaxp avoton evansport monaco; do sudo ./EnvDeploy -v 7.0 -p $PLATFORM; done -``` - - -## Building NZBGet - -From cloned repository run -``` -sudo bash synology/build-nzbget.sh [platform] -``` -Please note - user must have sudo access. Synology toolkit requires root access to build packages. - - -## Output files - -- /toolkit/result_spk/nzbget/*.spk - one file per platform diff --git a/synology/build-nzbget.sh b/synology/build-nzbget.sh deleted file mode 100644 index f4f4b038e..000000000 --- a/synology/build-nzbget.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -# synology toolkit path -TOOLKIT=/toolkit - -# parameter can be build platform -BUILD_PLATFORM=$1 -if [ ! -z "$BUILD_PLATFORM" ]; then BUILD_PARAM="-p $BUILD_PLATFORM"; fi - -# clean up -rm -rf $TOOLKIT/source/nzbget -rm -rf $TOOLKIT/result_spk/ -if [ ! -z "$BUILD_PLATFORM" ]; then - PLATFORMS=$BUILD_PLATFORM -else - PLATFORMS="alpine armada370 armada375 armada37xx armada38x armadaxp avoton evansport monaco" -fi -for PLATFORM in $PLATFORMS; do - echo "Cleanup $PLATFORM environment ..." - rm -rf $TOOLKIT/build_env/ds.$PLATFORM-7.0/image/packages -done - -# copy source and prepare package structure -mkdir -p $TOOLKIT/source/nzbget -cp -r . $TOOLKIT/source/nzbget -cp -r synology/package/* $TOOLKIT/source/nzbget/ -cd $TOOLKIT/source/nzbget/ -chmod +x scripts/* -chmod -x scripts/vars -chmod +x SynoBuildConf/* -chmod -x SynoBuildConf/depends -chmod +x INFO.sh - -# correct build version in INFO.sh -VERSION=$(grep "AC_INIT(nzbget, " configure.ac | cut -d "," -f 2 | xargs) -SPK_VERSION=$(date '+%Y%m%d')-${VERSION//./} -# if running from CI/CD, add testing to builds from non-main branch -if [ -n "$GITHUB_REF_NAME" ]; then - if [ "$GITHUB_REF_NAME" != "main" ]; then - NEW_VERSION="$VERSION-testing-$(date '+%Y%m%d')" - sed -e "s|AC_INIT(nzbget.*|AC_INIT(nzbget, $NEW_VERSION, https://github.com/nzbgetcom/nzbget/issues)|g" -i configure.ac - fi -fi -sed -e "s|version=.*$|version=\"$SPK_VERSION\"|g" -i INFO.sh - -# download boost sources or take it locally -mkdir -p tmp -cd tmp -BOOST="boost-1.84.0" -if [ -f /toolkit/source/$BOOST.tar.gz ]; then - cp /toolkit/source/$BOOST.tar.gz . -else - wget https://github.com/boostorg/boost/releases/download/$BOOST/$BOOST.tar.gz -fi -tar zxf $BOOST.tar.gz -mv $BOOST boost -rm $BOOST.tar.gz -cd .. - -# build -$TOOLKIT/pkgscripts-ng/PkgCreate.py -v 7.0 -c -P 1 nzbget $BUILD_PARAM - -# remove debug packages and set user perms on packages -mv $TOOLKIT/result_spk/nzbget-$SPK_VERSION/ $TOOLKIT/result_spk/nzbget/ -rm $TOOLKIT/result_spk/nzbget/*_debug.spk -chmod 666 $TOOLKIT/result_spk/nzbget/* diff --git a/synology/package/INFO.sh b/synology/package/INFO.sh deleted file mode 100755 index 621e84365..000000000 --- a/synology/package/INFO.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -source /pkgscripts/include/pkg_util.sh - -package="nzbget" -version="yyyymmdd-version" -displayname="NZBGet" -os_min_ver="7.0-41201" -maintainer="nzbget@nzbget.com" -adminport="6789" -description="NZBGet is a binary downloader, which downloads files from Usenet based on information given in nzb-files." - -# populate arch -BUILD_ARCH="$(pkg_get_platform)" -arch=$BUILD_ARCH -if [ "$BUILD_ARCH" == "alpine" ]; then arch="alpine alpine4k"; fi -if [ "$BUILD_ARCH" == "armada37xx" ]; then arch="armada37xx rtd1296 rtd1619 aarch64"; fi -if [ "$BUILD_ARCH" == "avoton" ]; then arch="apollolake avoton braswell broadwell broadwellnk broadwellntb broadwellntbap bromolow cedarview coffeelake denverton geminilake grantley kvmx64 purley skylaked v1000 x86_64"; fi -if [ "$BUILD_ARCH" == "evansport" ]; then arch="evansport x86 i686"; fi - -[ "$(caller)" != "0 NULL" ] && return 0 -pkg_dump_info diff --git a/synology/package/PACKAGE_ICON.PNG b/synology/package/PACKAGE_ICON.PNG deleted file mode 100644 index 93a07e852f53071bc9ffc11935d11ba5818b5a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13154 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 IM6N<$g1F7`z5oCK diff --git a/synology/package/PACKAGE_ICON_256.PNG b/synology/package/PACKAGE_ICON_256.PNG deleted file mode 100644 index 6e1397828625e90c07e21769adf7762e33170bb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37045 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 project-config.jam -./b2 --toolset=gcc-synology cxxstd=14 link=static runtime-link=static install -cd ../.. - -autoreconf --install - -# prefix with /usr/local, all files will be installed into /usr/local -export CXXFLAGS="$CXXFLAGS -I$(pwd)/tmp/boost/build/include" -export LDFLAGS="$LDFLAGS -L$(pwd)/tmp/boost/build/lib" -./configure $ConfigOpt --prefix=/usr/local --program-prefix="" --program-suffix="" - -make -j 4 ${MAKE_FLAGS} - -make install diff --git a/synology/package/SynoBuildConf/depends b/synology/package/SynoBuildConf/depends deleted file mode 100644 index ecf796c91..000000000 --- a/synology/package/SynoBuildConf/depends +++ /dev/null @@ -1,4 +0,0 @@ -[BuildDependent] - -[default] -all="7.0" diff --git a/synology/package/SynoBuildConf/install b/synology/package/SynoBuildConf/install deleted file mode 100644 index 3da9ff836..000000000 --- a/synology/package/SynoBuildConf/install +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -### Use PKG_DIR as working directory. -PKG_DIR=/tmp/_spk -rm -rf $PKG_DIR -mkdir -p $PKG_DIR - -### get spk packing functions -source /pkgscripts/include/pkg_util.sh - -create_package_tgz() { - - local package_tgz_dir=/tmp/_package_tgz - local binary_dir=$package_tgz_dir/usr/local/bin - - ### clear destination directory - rm -rf $package_tgz_dir && mkdir -p $package_tgz_dir - - ### install needed file into PKG_DIR - mkdir -p $binary_dir - cp -av nzbget $binary_dir - cp -av nzbget.sc $binary_dir - curl --insecure -o $binary_dir/cacert.pem https://curl.se/ca/cacert.pem - - make install DESTDIR="$package_tgz_dir" - - ### create package.tgz $1: source_dir $2: dest_dir - pkg_make_package $package_tgz_dir $PKG_DIR -} - -create_spk(){ - - cp -av scripts $PKG_DIR/scripts - rm -rf $PKG_DIR/scripts/Email - rm -rf $PKG_DIR/scripts/Logger - cp -av PACKAGE_ICON*.PNG $PKG_DIR - cp -av WIZARD_UIFILES $PKG_DIR - cp -av conf $PKG_DIR - - ./INFO.sh > INFO - cp INFO $PKG_DIR/INFO - - ### Create the final spk. - # pkg_make_spk - # Please put the result spk into /image/packages - # spk name functions: pkg_get_spk_name pkg_get_spk_unified_name pkg_get_spk_family_name - mkdir -p /image/packages - pkg_make_spk $PKG_DIR "/image/packages" $(pkg_get_spk_family_name) -} - -main() { - create_package_tgz - create_spk -} - -main "$@" diff --git a/synology/package/WIZARD_UIFILES/install_uifile b/synology/package/WIZARD_UIFILES/install_uifile deleted file mode 100644 index 7d3658640..000000000 --- a/synology/package/WIZARD_UIFILES/install_uifile +++ /dev/null @@ -1,80 +0,0 @@ -[{ - "step_title": "Shared folder configuration", - "items": [{ - "desc": "Shared folder for downloaded files." - }, { - "type": "combobox", - "desc": "Please select a shared folder", - "subitems": [{ - "key": "wizard_download_folder", - "desc": "Shared folder", - "mode": "remote", - "displayField": "name", - "valueField": "name", - "api_store": { - "api": "SYNO.Core.Share", - "method": "list", - "version": 1, - "baseParams": { - "limit": -1, - "offset": 0 - }, - "root": "shares", - "idProperty": "name", - "fields": ["name"] - }, - "validator": { - "allowBlank": false - } - } - ] - }, { - "type": "textfield", - "desc": "Download directory (shared folder sub-folder) - optional", - "subitems": [{ - "key": "wizard_download_subfolder", - "desc": "Download directory", - "defaultValue": "nzbget", - "validator": { - "allowBlank": true, - "regex": { - "expr": "/^[^<>: */?\"]*/", - "errorText": "Directory must be a folder name only. Path separators, spaces and other special chars are not allowed." - } - } - } - ] - } - ] - }, { - "step_title": "User configuration", - "items": [{ - "desc": "User Credentials for the web interface." - }, { - "type": "textfield", - "desc": "Username for web interface", - "subitems": [{ - "key": "wizard_username", - "desc": "Username. Defaults to nzbget", - "defaultValue": "nzbget", - "validator": { - "allowBlank": false - } - } - ] - }, { - "type": "password", - "desc": "Password for web interface", - "subitems": [{ - "key": "wizard_password", - "desc": "Password. Defaults to nzbget", - "defaultValue": "nzbget", - "validator": { - "allowBlank": false - } - } - ] - } - ] - } -] diff --git a/synology/package/WIZARD_UIFILES/uninstall_uifile b/synology/package/WIZARD_UIFILES/uninstall_uifile deleted file mode 100644 index f8f022099..000000000 --- a/synology/package/WIZARD_UIFILES/uninstall_uifile +++ /dev/null @@ -1,16 +0,0 @@ -[{ - "step_title": "Uninstall package", - "items": [{ - "type": "singleselect", - "desc": "Keep/delete package settings.", - "subitems": [{ - "key": "wizard_keep_data", - "desc": "Uninstall only. Keep existing config files.", - "defaultValue": true - }, { - "key": "", - "desc": "Erase all of the package data files.", - "defaultValue": false - }] - }] -}] diff --git a/synology/package/WIZARD_UIFILES/upgrade_uifile b/synology/package/WIZARD_UIFILES/upgrade_uifile deleted file mode 100644 index 6ad34b37e..000000000 --- a/synology/package/WIZARD_UIFILES/upgrade_uifile +++ /dev/null @@ -1,12 +0,0 @@ -[{ - "step_title": "Upgrade package", - "items": [{ - "type": "singleselect", - "desc": "Keep package settings.", - "subitems": [{ - "key": "wizard_keep_data", - "desc": "Keep existing config files.", - "defaultValue": true - }] - }] -}] diff --git a/synology/package/conf/privilege b/synology/package/conf/privilege deleted file mode 100644 index 2aafe2347..000000000 --- a/synology/package/conf/privilege +++ /dev/null @@ -1,5 +0,0 @@ -{ - "defaults": { - "run-as": "package" - } -} diff --git a/synology/package/conf/resource b/synology/package/conf/resource deleted file mode 100644 index ebe6f568c..000000000 --- a/synology/package/conf/resource +++ /dev/null @@ -1,19 +0,0 @@ -{ - "usr-local-linker": { - "bin": ["usr/local/bin/nzbget"] - }, - "port-config": { - "protocol-file": "usr/local/bin/nzbget.sc" - }, - "data-share": { - "shares": [{ - "name": "{{wizard_download_folder}}", - "permission": { - "rw": [ - "nzbget" - ] - } - } - ] - } -} diff --git a/synology/package/nzbget.sc b/synology/package/nzbget.sc deleted file mode 100644 index 00f1772d5..000000000 --- a/synology/package/nzbget.sc +++ /dev/null @@ -1,5 +0,0 @@ -[nzbget] -title="NZBGet (HTTP)" -desc="NZBGet" -port_forward="yes" -dst.ports="6789/tcp" diff --git a/synology/package/scripts/postinst b/synology/package/scripts/postinst deleted file mode 100755 index 1c5337249..000000000 --- a/synology/package/scripts/postinst +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh -. `dirname $0`/vars - -# check conf file location, copy if not exist -# and populate from synology defaults -if [ ! -f $CFG ]; then - cp $SYNOPKG_PKGDEST/usr/local/share/nzbget/nzbget.conf $CFG - if [ -z "$wizard_download_subfolder" ]; then - DOWNLOAD_PATH=$wizard_download_folder - else - DOWNLOAD_PATH=$wizard_download_folder/$wizard_download_subfolder - fi - sed -e "s|MainDir=.*$|MainDir=/var/packages/nzbget/shares/$DOWNLOAD_PATH|g" \ - -e "s/ControlUsername=.*$/ControlUsername=$wizard_username/g" \ - -e "s/ControlPassword=.*$/ControlPassword=$wizard_password/g" \ - -e "s|WebDir=.*$|WebDir=$SYNOPKG_PKGDEST/usr/local/share/nzbget/webui|g" \ - -e "s|LogFile=.*$|LogFile=$SYNOPKG_PKGVAR/nzbget.log|g" \ - -e "s|LockFile=.*$|LockFile=$SYNOPKG_PKGVAR/nzbget.lock|g" \ - -e "s|ConfigTemplate=.*$|ConfigTemplate=$SYNOPKG_PKGDEST/usr/local/share/nzbget/nzbget.conf|g" \ - -e 's|DestDir=.*$|DestDir=${MainDir}/completed|g' \ - -e 's|InterDir=.*$|InterDir=${MainDir}/intermediate|g' \ - -e 's|UnrarCmd=.*$|UnrarCmd=unrar|g' \ - -e 's|SevenZipCmd=.*$|SevenZipCmd=7z|g' \ - -e 's|UpdateCheck=.*$|UpdateCheck=none|g' \ - -e "s|CertStore=.*$|CertStore=$SYNOPKG_PKGDEST/usr/local/bin/cacert.pem|g" \ - -i $CFG - # copy bundled scripts - mkdir -p /var/packages/nzbget/shares/$DOWNLOAD_PATH/scripts/ - cp $SYNOPKG_PKGDEST/usr/local/share/nzbget/scripts/* /var/packages/nzbget/shares/$DOWNLOAD_PATH/scripts/ -fi - -exit 0 diff --git a/synology/package/scripts/postuninst b/synology/package/scripts/postuninst deleted file mode 100755 index 6511a1d22..000000000 --- a/synology/package/scripts/postuninst +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -. `dirname $0`/vars - -if [ "$wizard_keep_data" != "true" ]; then - rm $CFG - rm $SYNOPKG_PKGVAR/* -fi - -exit 0 diff --git a/synology/package/scripts/postupgrade b/synology/package/scripts/postupgrade deleted file mode 100755 index c52d3c26b..000000000 --- a/synology/package/scripts/postupgrade +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -exit 0 diff --git a/synology/package/scripts/preinst b/synology/package/scripts/preinst deleted file mode 100755 index c52d3c26b..000000000 --- a/synology/package/scripts/preinst +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -exit 0 diff --git a/synology/package/scripts/preuninst b/synology/package/scripts/preuninst deleted file mode 100755 index c52d3c26b..000000000 --- a/synology/package/scripts/preuninst +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -exit 0 diff --git a/synology/package/scripts/preupgrade b/synology/package/scripts/preupgrade deleted file mode 100755 index c52d3c26b..000000000 --- a/synology/package/scripts/preupgrade +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -exit 0 diff --git a/synology/package/scripts/start-stop-status b/synology/package/scripts/start-stop-status deleted file mode 100755 index 2e7452847..000000000 --- a/synology/package/scripts/start-stop-status +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -. `dirname $0`/vars - -case $1 in - start) - ### Start this package. - $NZBGET -D -c $CFG - echo "nzbget has been started" > $SYNOPKG_TEMP_LOGFILE - exit 0 - ;; - stop) - ### Stop this package. - $NZBGET -Q -c $CFG - echo "nzbget has been stopped" > $SYNOPKG_TEMP_LOGFILE - exit 0 - ;; - status) - ### Check package alive. - if [ -z $(ps aux | grep $NZBGET | grep -v "grep $NZBGET") ]; then - exit 1; - else - exit 0; - fi - ;; -esac diff --git a/synology/package/scripts/vars b/synology/package/scripts/vars deleted file mode 100644 index 863498aec..000000000 --- a/synology/package/scripts/vars +++ /dev/null @@ -1,2 +0,0 @@ -CFG=/usr/syno/etc/packages/nzbget/nzbget.conf -NZBGET=/usr/local/bin/nzbget diff --git a/windows/build-info.md b/windows/build-info.md index 755c7dac2..817ab23ef 100644 --- a/windows/build-info.md +++ b/windows/build-info.md @@ -1,5 +1,5 @@ # About -"build-nzbget.ps1" is a PowerShell script which is used to build Windows nzbget binaries and installer +`build-nzbget.ps1` is a PowerShell script which is used to build Windows nzbget binaries and installer # Prerequisites diff --git a/windows/build-nzbget-vs22.bat b/windows/build-nzbget-vs22.bat deleted file mode 100644 index a266c3e63..000000000 --- a/windows/build-nzbget-vs22.bat +++ /dev/null @@ -1,252 +0,0 @@ -@echo off - -rem -rem This file is part of nzbget -rem -rem Copyright (C) 2013-2019 Andrey Prygunkov -rem -rem This program is free software; you can redistribute it and/or modify -rem it under the terms of the GNU General Public License as published by -rem the Free Software Foundation; either version 2 of the License, or -rem (at your option) any later version. -rem -rem This program is distributed in the hope that it will be useful, -rem but WITHOUT ANY WARRANTY; without even the implied warranty of -rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -rem GNU General Public License for more details. -rem -rem You should have received a copy of the GNU General Public License -rem along with this program. If not, see . -rem - -rem ####################### CONFIG SECTION ####################### - -set BUILD_DEBUG=1 -set BUILD_RELEASE=1 -set BUILD_32=1 -set BUILD_64=1 - -rem expression "%~dp0" means the location of an executing batch file -set SRCDIR=%cd% -rem set ROOTDIR=%~dp0 -set ROOTDIR=C:\nzbget\build\ -rem remove trailing slash from ROOTDIR -set ROOTDIR=%ROOTDIR:~0,-1% -set LIBDIR=%ROOTDIR%\lib -set ZIP=%ROOTDIR%\tools\7-Zip\7z.exe -set SED=%ROOTDIR%\tools\sed\sed.exe -set CURL=%ROOTDIR%\tools\curl\src\curl.exe -set NSIS=%ROOTDIR%\tools\nsis -set VCVARS="C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" -set BUILD_SETUP=1 - -rem ####################### END OF CONFIG SECTION ####################### - -title Building NZBGet - -rem Try to detect version from nzbget.vcxproj -for /f "tokens=3 delims=;" %%n in ('findstr VERSION nzbget.vcxproj') do ( - for /f "tokens=2 delims==" %%m in ("%%n") do ( - set "VERSION=%%~m" - ) -) -set FULLVERSION=%VERSION% - -cd %ROOTDIR% -set UseEnv=true -echo Building nzbget - -if exist tmp (rmdir /S /Q tmp) -if errorlevel 1 goto BUILD_FAILED -mkdir tmp -if errorlevel 1 goto BUILD_FAILED - -echo Version: [%VERSION%]/[%FULLVERSION%] - -if not exist image ( - echo Cannot find extra files for setup. Create directory '%ROOTDIR%\image' and put all extra files there: unrar.exe, etc. - goto BUILD_FAILED -) - -rem Prepare output directory -if exist output (rmdir /S /Q output) -if errorlevel 1 goto BUILD_FAILED -mkdir output -if errorlevel 1 goto BUILD_FAILED - -rem Copy source tree to build -robocopy %SRCDIR% %ROOTDIR%\tmp\nzbget-%VERSION% /MIR /NFL /NDL /NJH /NJS /NC /NS /NP - -rem Update ca root certificates -echo Updating root certificates -cd image -%CURL% --remote-name --time-cond cacert.pem https://curl.se/ca/cacert.pem -if errorlevel 1 goto BUILD_FAILED -rem remove expired DST Root CA X3 certificate -%SED% -e "/^DST Root CA X3$/,/^-----END CERTIFICATE-----$/d;" -i cacert.pem -cd .. - -cd tmp\nzbget-%VERSION% - -:TARGET_DEBUG -rem Build debug binaries -if %BUILD_DEBUG%==0 goto TARGET_RELEASE -cd nzbget-%VERSION% -call:PrepareFiles -if %BUILD_32%==1 ( call:BuildTarget Debug x86 x86 32 ) -if %BUILD_64%==1 ( call:BuildTarget Debug x64 amd64 64 ) -cd .. - -if %BUILD_SETUP%==1 ( - rem Build debug setup - cd distrib - call:BuildSetup - if errorlevel 1 goto BUILD_FAILED - move nzbget-setup.exe ..\..\output\nzbget-%FULLVERSION%-bin-windows-debug-setup.exe - cd .. -) - -:TARGET_RELEASE -rem Build release binaries -if %BUILD_RELEASE%==0 goto END -cd nzbget-%VERSION% -call:PrepareFiles -if %BUILD_32%==1 ( call:BuildTarget Release x86 x86 32 ) -if %BUILD_64%==1 ( call:BuildTarget Release x64 amd64 64 ) -cd .. - -if %BUILD_SETUP%==1 ( - rem Build release setup - cd distrib - call:BuildSetup - if errorlevel 1 goto BUILD_FAILED - move nzbget-setup.exe ..\..\output\nzbget-%FULLVERSION%-bin-windows-setup.exe - cd .. -) - -goto END - - -:BUILD_FAILED -echo ******************************** -echo Build failed -echo ******************************** -exit 1 - -:END -exit 0 - -rem END OF SCRIPT - - -rem Build one binary (for specified configuration and platofrm) -:BuildTarget -echo ***** Building %~1 %~2 (%~3 %~4) -if exist ..\bin (rmdir /S /Q ..\bin) -set INCLUDE= -set LIB= -call %VCVARS% %~3 -set INCLUDE=%LIBDIR%\include;%INCLUDE% -set LIB=%LIBDIR%\%~2;%LIB% -msbuild.exe nzbget.vcxproj /t:Rebuild /p:Configuration=%~1 /p:Platform=%~2 -if errorlevel 1 goto BUILD_FAILED -copy ..\bin\nzbget.exe ..\distrib\NZBGet\%~4 -if errorlevel 1 goto BUILD_FAILED -if %~1==Debug ( - copy ..\bin\nzbget.pdb ..\distrib\NZBGet\%~4 - if errorlevel 1 goto BUILD_FAILED -) -GOTO:EOF - - -rem Prepare files for setup -:PrepareFiles -if exist ..\distrib (rmdir /S /Q ..\distrib) -mkdir ..\distrib\NZBGet - -mkdir ..\distrib\NZBGet\32 -mkdir ..\distrib\NZBGet\64 -if %BUILD_32%==0 ( - echo This test setup doesn't include binaries for 32 bit platform > ..\distrib\NZBGet\32\README-WARNING.txt -) -if %BUILD_64%==0 ( - echo This test setup doesn't include binaries for 64 bit platform > ..\distrib\NZBGet\64\README-WARNING.txt -) - -copy windows\nzbget-command-shell.bat ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy windows\install-update.bat ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy windows\README-WINDOWS.txt ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy ChangeLog.md ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy INSTALLATION.md ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy COPYING ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy pubkey.pem ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED - -mkdir ..\distrib\NZBGet\webui -xcopy /E webui ..\distrib\NZBGet\webui -if errorlevel 1 goto BUILD_FAILED - -copy windows\package-info.json ..\distrib\NZBGet\webui -if errorlevel 1 goto BUILD_FAILED - -rem Adjust config file -set CONFFILE=..\distrib\NZBGet\nzbget.conf.template -copy nzbget.conf %CONFFILE% -if errorlevel 1 goto BUILD_FAILED -%SED% -e "s|MainDir=.*|MainDir=${AppDir}\\downloads|" -i %CONFFILE% -%SED% -e "s|DestDir=.*|DestDir=${MainDir}\\complete|" -i %CONFFILE% -%SED% -e "s|InterDir=.*|InterDir=${MainDir}\\intermediate|" -i %CONFFILE% -%SED% -e "s|ScriptDir=.*|ScriptDir=${MainDir}\\scripts|" -i %CONFFILE% -%SED% -e "s|LogFile=.*|LogFile=${MainDir}\\nzbget.log|" -i %CONFFILE% -%SED% -e "s|AuthorizedIP=.*|AuthorizedIP=127.0.0.1|" -i %CONFFILE% -%SED% -e "s|UnrarCmd=.*|UnrarCmd=${AppDir}\\unrar.exe|" -i %CONFFILE% -%SED% -e "s|SevenZipCmd=.*|SevenZipCmd=${AppDir}\\7za.exe|" -i %CONFFILE% -%SED% -e "s|ArticleCache=.*|ArticleCache=250|" -i %CONFFILE% -%SED% -e "s|ParBuffer=.*|ParBuffer=250|" -i %CONFFILE% -%SED% -e "s|WriteBuffer=.*|WriteBuffer=1024|" -i %CONFFILE% -%SED% -e "s|CertStore=.*|CertStore=${AppDir}\\cacert.pem|" -i %CONFFILE% -%SED% -e "s|CertCheck=.*|CertCheck=yes|" -i %CONFFILE% -%SED% -e "s|DirectRename=.*|DirectRename=yes|" -i %CONFFILE% -%SED% -e "s|DirectUnpack=.*|DirectUnpack=yes|" -i %CONFFILE% -rem Hide certain options from web-interface settings page -%SED% -e "s|WebDir=.*|# WebDir=${AppDir}\\webui|" -i %CONFFILE% -%SED% -e "s|LockFile=.*|# LockFile=|" -i %CONFFILE% -%SED% -e "s|ConfigTemplate=.*|# ConfigTemplate=${AppDir}\\nzbget.conf.template|" -i %CONFFILE% -%SED% -e "s|DaemonUsername=.*|# DaemonUsername=|" -i %CONFFILE% -%SED% -e "s|UMask=.*|# UMask=|" -i %CONFFILE% - -mkdir ..\distrib\NZBGet\scripts -xcopy /E scripts ..\distrib\NZBGet\scripts -if errorlevel 1 goto BUILD_FAILED - -copy ..\..\image\* ..\distrib\NZBGet -copy ..\..\image\32\* ..\distrib\NZBGet\32 -copy ..\..\image\64\* ..\distrib\NZBGet\64 -if errorlevel 1 goto BUILD_FAILED - -del /S ..\distrib\NZBGet\_*.* - -GOTO:EOF - - -rem Build one setup for current configuration (debug or release) -:BuildSetup -if not exist resources ( - mkdir resources - xcopy /E ..\nzbget-%VERSION%\windows\resources resources - if errorlevel 1 goto BUILD_FAILED -) - -copy ..\nzbget-%VERSION%\windows\nzbget-setup.nsi . -if errorlevel 1 goto BUILD_FAILED - -%NSIS%\makensis.exe nzbget-setup.nsi -if errorlevel 1 goto BUILD_FAILED - -GOTO:EOF diff --git a/windows/build-nzbget.bat b/windows/build-nzbget.bat deleted file mode 100644 index 586b5f3df..000000000 --- a/windows/build-nzbget.bat +++ /dev/null @@ -1,264 +0,0 @@ -@echo OFF - -rem -rem This file is part of nzbget -rem -rem Copyright (C) 2013-2019 Andrey Prygunkov -rem -rem This program is free software; you can redistribute it and/or modify -rem it under the terms of the GNU General Public License as published by -rem the Free Software Foundation; either version 2 of the License, or -rem (at your option) any later version. -rem -rem This program is distributed in the hope that it will be useful, -rem but WITHOUT ANY WARRANTY; without even the implied warranty of -rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -rem GNU General Public License for more details. -rem -rem You should have received a copy of the GNU General Public License -rem along with this program. If not, see . -rem - -rem ####################### CONFIG SECTION ####################### - -set BUILD_DEBUG=1 -set BUILD_RELEASE=1 -set BUILD_32=1 -set BUILD_64=1 - -rem expression "%~dp0" means the location of an executing batch file -set ROOTDIR=%~dp0 -rem remove trailing slash from ROOTDIR -set ROOTDIR=%ROOTDIR:~0,-1% -set LIBDIR=%ROOTDIR%\lib -set ZIP=%ROOTDIR%\tools\7-Zip\7z.exe -set SED=%ROOTDIR%\tools\GnuWin32\bin\sed.exe -set CURL=%ROOTDIR%\tools\curl\src\curl.exe -set NSIS=%ROOTDIR%\tools\nsis -set VCVARS="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" -set BUILD_SETUP=1 - -rem ####################### END OF CONFIG SECTION ####################### - -title Building NZBGet -cd %ROOTDIR% -set UseEnv=true -echo Building nzbget - -if exist tmp (rmdir /S /Q tmp) -if errorlevel 1 goto BUILD_FAILED -mkdir tmp -if errorlevel 1 goto BUILD_FAILED - -rem Search source distribution archive - -set SRCTAR= -for /R "%ROOTDIR%" %%f in (nzbget-*.tar.gz) do ( - set SRCTAR=%%~nf -) - -if not exist %SRCTAR%.gz ( - echo Cannot find NZBGet source code archive. Put nzbget-version-src.tar.gz into '%ROOTDIR%' and retry - goto BUILD_FAILED -) - -rem Determine program version (from source distribution archive file name) - -echo Using source file: %SRCTAR%.gz - -set FULLVERSION=%SRCTAR:~7,-4% -if [%FULLVERSION:~-4%]==[-src] (set FULLVERSION=%FULLVERSION:~0,-4%) -set VERSION=%FULLVERSION% -if [%VERSION:~12,2%]==[-r] (set VERSION=%VERSION:~0,-6%) - -echo Version: [%VERSION%]/[%FULLVERSION%] - -if not exist image ( - echo Cannot find extra files for setup. Create directory '%ROOTDIR%\image' and put all extra files there: unrar.exe, etc. - goto BUILD_FAILED -) - -rem Unpack source distribution archive -%ZIP% x -otmp %SRCTAR%.gz -if errorlevel 1 goto BUILD_FAILED -%ZIP% x -otmp tmp\%SRCTAR% -if errorlevel 1 goto BUILD_FAILED - -rem Prepare output directory -if exist output (rmdir /S /Q output) -if errorlevel 1 goto BUILD_FAILED -mkdir output -if errorlevel 1 goto BUILD_FAILED - -rem Update ca root certificates -echo Updating root certificates -cd image -%CURL% --remote-name --time-cond cacert.pem https://curl.se/ca/cacert.pem -if errorlevel 1 goto BUILD_FAILED -rem remove expired DST Root CA X3 certificate -%SED% -e "/^DST Root CA X3$/,/^-----END CERTIFICATE-----$/d;" -i cacert.pem -cd .. - -cd tmp\nzbget-%VERSION% - -:TARGET_DEBUG -rem Build debug binaries -if %BUILD_DEBUG%==0 goto TARGET_RELEASE -cd nzbget-%VERSION% -call:PrepareFiles -if %BUILD_32%==1 ( call:BuildTarget Debug x86 x86 32 ) -if %BUILD_64%==1 ( call:BuildTarget Debug x64 amd64 64 ) -cd .. - -if %BUILD_SETUP%==1 ( - rem Build debug setup - cd distrib - call:BuildSetup - if errorlevel 1 goto BUILD_FAILED - move nzbget-setup.exe ..\..\output\nzbget-%FULLVERSION%-bin-windows-debug-setup.exe - cd .. -) - -:TARGET_RELEASE -rem Build release binaries -if %BUILD_RELEASE%==0 goto END -cd nzbget-%VERSION% -call:PrepareFiles -if %BUILD_32%==1 ( call:BuildTarget Release x86 x86 32 ) -if %BUILD_64%==1 ( call:BuildTarget Release x64 amd64 64 ) -cd .. - -if %BUILD_SETUP%==1 ( - rem Build release setup - cd distrib - call:BuildSetup - if errorlevel 1 goto BUILD_FAILED - move nzbget-setup.exe ..\..\output\nzbget-%FULLVERSION%-bin-windows-setup.exe - cd .. -) - -goto END - - -:BUILD_FAILED -echo ******************************** -echo Build failed -echo ******************************** - -:END - -pause -exit 1 - -rem END OF SCRIPT - - -rem Build one binary (fro specified configuration and platofrm) -:BuildTarget -echo ***** Building %~1 %~2 (%~3 %~4) -if exist ..\bin (rmdir /S /Q ..\bin) -set INCLUDE= -set LIB= -call %VCVARS% %~3 -set INCLUDE=%LIBDIR%\include;%INCLUDE% -set LIB=%LIBDIR%\%~2;%LIB% -msbuild.exe nzbget.vcxproj /t:Rebuild /p:Configuration=%~1 /p:Platform=%~2 -if errorlevel 1 goto BUILD_FAILED -copy ..\bin\nzbget.exe ..\distrib\NZBGet\%~4 -if errorlevel 1 goto BUILD_FAILED -if %~1==Debug ( - copy ..\bin\nzbget.pdb ..\distrib\NZBGet\%~4 - if errorlevel 1 goto BUILD_FAILED -) -GOTO:EOF - - -rem Prepare files for setup -:PrepareFiles -if exist ..\distrib (rmdir /S /Q ..\distrib) -mkdir ..\distrib\NZBGet - -mkdir ..\distrib\NZBGet\32 -mkdir ..\distrib\NZBGet\64 -if %BUILD_32%==0 ( - echo This test setup doesn't include binaries for 32 bit platform > ..\distrib\NZBGet\32\README-WARNING.txt -) -if %BUILD_64%==0 ( - echo This test setup doesn't include binaries for 64 bit platform > ..\distrib\NZBGet\64\README-WARNING.txt -) - -copy windows\nzbget-command-shell.bat ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy windows\install-update.bat ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy windows\README-WINDOWS.txt ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy ChangeLog.md ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy INSTALLATION.md ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED -copy COPYING ..\distrib\NZBGet -if errorlevel 1 goto BUILD_FAILED - -mkdir ..\distrib\NZBGet\webui -xcopy /E webui ..\distrib\NZBGet\webui -if errorlevel 1 goto BUILD_FAILED - -copy windows\package-info.json ..\distrib\NZBGet\webui -if errorlevel 1 goto BUILD_FAILED - -rem Adjust config file -set CONFFILE=..\distrib\NZBGet\nzbget.conf.template -copy nzbget.conf %CONFFILE% -if errorlevel 1 goto BUILD_FAILED -%SED% -e "s|MainDir=.*|MainDir=${AppDir}\\downloads|" -i %CONFFILE% -%SED% -e "s|DestDir=.*|DestDir=${MainDir}\\complete|" -i %CONFFILE% -%SED% -e "s|InterDir=.*|InterDir=${MainDir}\\intermediate|" -i %CONFFILE% -%SED% -e "s|ScriptDir=.*|ScriptDir=${MainDir}\\scripts|" -i %CONFFILE% -%SED% -e "s|LogFile=.*|LogFile=${MainDir}\\nzbget.log|" -i %CONFFILE% -%SED% -e "s|AuthorizedIP=.*|AuthorizedIP=127.0.0.1|" -i %CONFFILE% -%SED% -e "s|UnrarCmd=.*|UnrarCmd=${AppDir}\\unrar.exe|" -i %CONFFILE% -%SED% -e "s|SevenZipCmd=.*|SevenZipCmd=${AppDir}\\7za.exe|" -i %CONFFILE% -%SED% -e "s|ArticleCache=.*|ArticleCache=250|" -i %CONFFILE% -%SED% -e "s|ParBuffer=.*|ParBuffer=250|" -i %CONFFILE% -%SED% -e "s|WriteBuffer=.*|WriteBuffer=1024|" -i %CONFFILE% -%SED% -e "s|CertStore=.*|CertStore=${AppDir}\\cacert.pem|" -i %CONFFILE% -%SED% -e "s|CertCheck=.*|CertCheck=yes|" -i %CONFFILE% -%SED% -e "s|DirectRename=.*|DirectRename=yes|" -i %CONFFILE% -%SED% -e "s|DirectUnpack=.*|DirectUnpack=yes|" -i %CONFFILE% -rem Hide certain options from web-interface settings page -%SED% -e "s|WebDir=.*|# WebDir=${AppDir}\\webui|" -i %CONFFILE% -%SED% -e "s|LockFile=.*|# LockFile=|" -i %CONFFILE% -%SED% -e "s|ConfigTemplate=.*|# ConfigTemplate=${AppDir}\\nzbget.conf.template|" -i %CONFFILE% -%SED% -e "s|DaemonUsername=.*|# DaemonUsername=|" -i %CONFFILE% -%SED% -e "s|UMask=.*|# UMask=|" -i %CONFFILE% - -mkdir ..\distrib\NZBGet\scripts -xcopy /E scripts ..\distrib\NZBGet\scripts -if errorlevel 1 goto BUILD_FAILED - -copy ..\..\image\* ..\distrib\NZBGet -copy ..\..\image\32\* ..\distrib\NZBGet\32 -copy ..\..\image\64\* ..\distrib\NZBGet\64 -if errorlevel 1 goto BUILD_FAILED - -del /S ..\distrib\NZBGet\_*.* - -GOTO:EOF - - -rem Build one setup for current configuration (debug or release) -:BuildSetup -if not exist resources ( - mkdir resources - xcopy /E ..\nzbget-%VERSION%\windows\resources resources - if errorlevel 1 goto BUILD_FAILED -) - -copy ..\nzbget-%VERSION%\windows\nzbget-setup.nsi . -if errorlevel 1 goto BUILD_FAILED - -%NSIS%\makensis.exe nzbget-setup.nsi -if errorlevel 1 goto BUILD_FAILED - -GOTO:EOF diff --git a/windows/build-nzbget.ps1 b/windows/build-nzbget.ps1 index c07f745db..c75db0b67 100644 --- a/windows/build-nzbget.ps1 +++ b/windows/build-nzbget.ps1 @@ -1,3 +1,22 @@ +# +# This file is part of nzbget. See . +# +# Copyright (C) 2024 phnzb +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + # build params Param ( [switch]$BuildDebug=$False, diff --git a/windows/nzbget-setup.nsi b/windows/nzbget-setup.nsi index b1f31a59b..faf0ebada 100644 --- a/windows/nzbget-setup.nsi +++ b/windows/nzbget-setup.nsi @@ -2,6 +2,7 @@ * This file is part of nzbget. See . * * Copyright (C) 2014-2017 Andrey Prygunkov + * Copyright (C) 2024 phnzb * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by From 3fb3bbd2960258dc876f0a52f203bc493590b6bb Mon Sep 17 00:00:00 2001 From: phnzb Date: Wed, 19 Jun 2024 16:12:08 +0300 Subject: [PATCH 08/11] Fix qnap workflow --- .github/workflows/qnap-repack.yml | 2 +- docs/CONTRIBUTING.md | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/qnap-repack.yml b/.github/workflows/qnap-repack.yml index 091385628..357e92231 100644 --- a/.github/workflows/qnap-repack.yml +++ b/.github/workflows/qnap-repack.yml @@ -40,7 +40,7 @@ jobs: - name: Rename build artifacts if: github.ref_name != 'main' run: | - VERSION=$(cat configure.ac | grep AC_INIT | cut -d , -f 2 | xargs) + VERSION=$(grep "set(VERSION " CMakeLists.txt | cut -d '"' -f 2) NEW_VERSION="$VERSION-testing-$(date '+%Y%m%d')" cd /qnap/nzbget/build/ for FILE in *.qpkg; do diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 4e08674e6..7ee7a106e 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -44,6 +44,5 @@ After the release has been published (from the `main` branch), the minor version List of files to change version: -1. configure.ac - "AC_INIT" macro -2. CMakeLists.txt - "project" block -3. nzbget.vcxproj - "PreprocessorDefinitions" blocks - 4 matches +1. CMakeLists.txt - `project` block +2. osx/NZBGet-Info.plist - `CFBundleShortVersionString` block From dff5df1549509c56dbb5fa27142a075526c072ec Mon Sep 17 00:00:00 2001 From: phnzb Date: Wed, 19 Jun 2024 16:43:02 +0300 Subject: [PATCH 09/11] C++17 switch --- CMakeLists.txt | 4 ++-- daemon/extension/ExtensionManager.cpp | 8 ++++---- daemon/extension/ExtensionManager.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f9377e42..872294a3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,8 @@ set_property(GLOBAL PROPERTY INCLUDES) set(VERSION "24.2") set(PACKAGE "nzbget") set(PACKAGE_BUGREPORT "https://github.com/nzbgetcom/nzbget/issues") -set(CMAKE_CXX_STANDARD 14) -set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_C_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) diff --git a/daemon/extension/ExtensionManager.cpp b/daemon/extension/ExtensionManager.cpp index 550ff4def..20012d8db 100644 --- a/daemon/extension/ExtensionManager.cpp +++ b/daemon/extension/ExtensionManager.cpp @@ -31,7 +31,7 @@ namespace ExtensionManager { const Extensions& Manager::GetExtensions() const & { - std::shared_lock lock{m_mutex}; + std::shared_lock lock{m_mutex}; return m_extensions; } @@ -58,7 +58,7 @@ namespace ExtensionManager boost::optional Manager::UpdateExtension(const std::string& filename, const std::string& extName) { - std::unique_lock lock{m_mutex}; + std::unique_lock lock{m_mutex}; auto extensionIt = GetByName(extName); if (extensionIt == std::end(m_extensions)) @@ -135,7 +135,7 @@ namespace ExtensionManager boost::optional Manager::DeleteExtension(const std::string& name) { - std::unique_lock lock{m_mutex}; + std::unique_lock lock{m_mutex}; auto extensionIt = GetByName(name); if (extensionIt == std::end(m_extensions)) @@ -167,7 +167,7 @@ namespace ExtensionManager return std::string("\"ScriptDir\" is not specified"); } - std::unique_lock lock{m_mutex}; + std::unique_lock lock{m_mutex}; m_extensions.clear(); diff --git a/daemon/extension/ExtensionManager.h b/daemon/extension/ExtensionManager.h index f0c1c61d3..f02cea7a9 100644 --- a/daemon/extension/ExtensionManager.h +++ b/daemon/extension/ExtensionManager.h @@ -73,7 +73,7 @@ namespace ExtensionManager DeleteExtension(const Extension::Script& ext); Extensions m_extensions; - mutable std::shared_timed_mutex m_mutex; + mutable std::shared_mutex m_mutex; }; } From 4816eb201fe7e9da71a33ef3b4c07b69600d3615 Mon Sep 17 00:00:00 2001 From: phnzb Date: Wed, 19 Jun 2024 16:50:53 +0300 Subject: [PATCH 10/11] Update badges and releases links in README --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index feac61fa7..226d26021 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,7 @@ [![windows build](https://github.com/nzbgetcom/nzbget/actions/workflows/windows.yml/badge.svg?branch=main)](https://github.com/nzbgetcom/nzbget/actions/workflows/windows.yml) [![osx build](https://github.com/nzbgetcom/nzbget/actions/workflows/osx.yml/badge.svg)](https://github.com/nzbgetcom/nzbget/actions/workflows/osx.yml) [![docker build](https://github.com/nzbgetcom/nzbget/actions/workflows/docker.yml/badge.svg)](https://github.com/nzbgetcom/nzbget/actions/workflows/docker.yml) -[![synology build](https://github.com/nzbgetcom/nzbget/actions/workflows/synology.yml/badge.svg)](https://github.com/nzbgetcom/nzbget/actions/workflows/synology.yml) -[![qnap build](https://github.com/nzbgetcom/nzbget/actions/workflows/qnap.yml/badge.svg)](https://github.com/nzbgetcom/nzbget/actions/workflows/qnap.yml) +[![qnap repack](https://github.com/nzbgetcom/nzbget/actions/workflows/qnap-repack.yml/badge.svg)](https://github.com/nzbgetcom/nzbget/actions/workflows/qnap-repack.yml) ![Contributions welcome](https://img.shields.io/badge/contributions-welcome-blue.svg) @@ -33,11 +32,11 @@ More information available at https://nzbget.com ## Installation and Documentation -We provide an easy-to-use installer for each platform we support. Please download binaries from our [releases](https://github.com/nzbgetcom/nzbget/tags) page. +We provide an easy-to-use installer for each platform we support. Please download binaries from our [releases](https://github.com/nzbgetcom/nzbget/releases) page. Windows packages are also available via `winget` and `chocolatey` package managers. Package managers [readme](windows/pkgs-info.md) -Linux DEB/RPM packages are available from [releases](https://github.com/nzbgetcom/nzbget/tags) page or from DEB/RPM [repositories](https://nzbgetcom.github.io). +Linux DEB/RPM packages are available from [releases](https://github.com/nzbgetcom/nzbget/releases) page or from DEB/RPM [repositories](https://nzbgetcom.github.io). macOS packages are available from [releases](https://github.com/nzbgetcom/nzbget/releases) page or via [Homebrew](https://brew.sh) package manager. [Homebrew readme](osx/brew-info.md) From a82afe8e2dd99ec5267e166fde93797be822d05c Mon Sep 17 00:00:00 2001 From: phnzb Date: Wed, 19 Jun 2024 17:24:11 +0300 Subject: [PATCH 11/11] Fix typo in syno readme --- docs/SYNOLOGY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/SYNOLOGY.md b/docs/SYNOLOGY.md index 2df96545d..a7869df56 100644 --- a/docs/SYNOLOGY.md +++ b/docs/SYNOLOGY.md @@ -22,7 +22,7 @@ If you have installed original NZBGet version (package version `20220406-29` and DSM versions: 7.x -SPK packages is now deprecated and no longer supported due to old GCC in native Synology toolchains, which does not support C++17. Latest SPK packages release version: `24.1` +SPK packages are now deprecated and no longer supported due to old GCC in native Synology toolchains. Latest SPK packages release version: `24.1` ## Package versions