summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author Lockywolf <lockywolf gmail.com>2023-09-23 13:10:28 +0900
committer Willy Sudiarto Raharjo <willysr@slackbuilds.org>2023-09-23 11:33:38 +0700
commite1d70078dc4c75fbadfe29d915da03b6fc41365a (patch)
treece5e3e5d571671e9a7df77c64cd42279b9f786c6
parentf8a76014b33cf6a01694ba10690963f1b7fb0b10 (diff)
downloadslackbuilds-e1d70078dc4c75fbadfe29d915da03b6fc41365a.tar.gz
slackbuilds-e1d70078dc4c75fbadfe29d915da03b6fc41365a.tar.xz
network/swift: Added (xmpp client).
Signed-off-by: Andrew Clemons <andrew.clemons@gmail.com> Signed-off-by: Willy Sudiarto Raharjo <willysr@slackbuilds.org>
-rw-r--r--network/swift/README6
-rw-r--r--network/swift/doinst.sh9
-rw-r--r--network/swift/slack-desc19
-rw-r--r--network/swift/swift-4.0.2-boost-1.69-compatibility.patch77
-rw-r--r--network/swift/swift-4.0.2-qt-5.11-compatibility.patch35
-rw-r--r--network/swift/swift-4.0.2-qt-5.15-compatibility.patch10
-rw-r--r--network/swift/swift-gcc11.patch13
-rw-r--r--network/swift/swift-python3.patch737
-rw-r--r--network/swift/swift.SlackBuild125
-rw-r--r--network/swift/swift.info10
10 files changed, 1041 insertions, 0 deletions
diff --git a/network/swift/README b/network/swift/README
new file mode 100644
index 0000000000..aa0f014bf6
--- /dev/null
+++ b/network/swift/README
@@ -0,0 +1,6 @@
+swift is a jabber client from the Isode company
+
+
+Maintainer: lockywolf gmail.com
+URL: https://swift.im/
+Repo: https://swift.im/git/swift/
diff --git a/network/swift/doinst.sh b/network/swift/doinst.sh
new file mode 100644
index 0000000000..65c7e2eeb9
--- /dev/null
+++ b/network/swift/doinst.sh
@@ -0,0 +1,9 @@
+if [ -x /usr/bin/update-desktop-database ]; then
+ /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
+fi
+
+if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
+ if [ -x /usr/bin/gtk-update-icon-cache ]; then
+ /usr/bin/gtk-update-icon-cache -f usr/share/icons/hicolor >/dev/null 2>&1
+ fi
+fi
diff --git a/network/swift/slack-desc b/network/swift/slack-desc
new file mode 100644
index 0000000000..d672a19e72
--- /dev/null
+++ b/network/swift/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description. Line
+# up the first '|' above the ':' following the base package name, and the '|'
+# on the right side marks the last column you can put a character in. You must
+# make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':'.
+
+ |-----handy-ruler------------------------------------------------------|
+swift: swift (a Jabber client from Isode)
+swift:
+swift: A jabber client from a commercial company also developing the Isode
+swift: Jabber Server.
+swift:
+swift:
+swift:
+swift:
+swift:
+swift: Homepage: https://swift.im
+swift:
diff --git a/network/swift/swift-4.0.2-boost-1.69-compatibility.patch b/network/swift/swift-4.0.2-boost-1.69-compatibility.patch
new file mode 100644
index 0000000000..a99dc10a2e
--- /dev/null
+++ b/network/swift/swift-4.0.2-boost-1.69-compatibility.patch
@@ -0,0 +1,77 @@
+From a21993d750396d755717df21e331df87af8a0c6a Mon Sep 17 00:00:00 2001
+From: Bruce Stephens <bruce.stephens@isode.com>
+Date: Wed, 9 Jan 2019 16:21:20 +0000
+Subject: [PATCH] Don't assume that tribool has an implicit bool conversion
+
+In boost 1.68.0 the conversion is implicit, but in 1.69.0 it's
+explicit and we must explicitly call it.
+
+Change-Id: I24eb78be7510c89b88342d28c539cad4977f99fd
+---
+ Swiften/Network/PlatformNATTraversalWorker.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/Swiften/Network/PlatformNATTraversalWorker.cpp b/Swiften/Network/PlatformNATTraversalWorker.cpp
+index f56de0b78b..eaa13b30d3 100644
+--- a/Swiften/Network/PlatformNATTraversalWorker.cpp
++++ b/Swiften/Network/PlatformNATTraversalWorker.cpp
+@@ -157,7 +157,7 @@ NATTraversalInterface* PlatformNATTraversalWorker::getNATTraversalInterface() co
+ miniUPnPInterface = new MiniUPnPInterface();
+ miniUPnPSupported = miniUPnPInterface->isAvailable();
+ }
+- SWIFT_LOG(debug) << "UPnP NAT traversal supported: " << miniUPnPSupported << std::endl;
++ SWIFT_LOG(debug) << "UPnP NAT traversal supported: " << static_cast<bool>(miniUPnPSupported) << std::endl;
+ if (miniUPnPSupported) {
+ return miniUPnPInterface;
+ }
+@@ -168,7 +168,7 @@ NATTraversalInterface* PlatformNATTraversalWorker::getNATTraversalInterface() co
+ natPMPInterface = new NATPMPInterface();
+ natPMPSupported = natPMPInterface->isAvailable();
+ }
+- SWIFT_LOG(debug) << "NAT-PMP NAT traversal supported: " << natPMPSupported << std::endl;
++ SWIFT_LOG(debug) << "NAT-PMP NAT traversal supported: " << static_cast<bool>(natPMPSupported) << std::endl;
+ if (natPMPSupported) {
+ return natPMPInterface;
+ }
+From bb3bd8a32b220b9c1ffd566da00bcd0ba546156c Mon Sep 17 00:00:00 2001
+From: Miroslaw Stein <miroslaw.stein@isode.com>
+Date: Fri, 18 Jan 2019 14:30:24 +0000
+Subject: [PATCH] Avoid deprecated boost endianess include
+
+As of Boost 1.69.0, boost/detail/endian.h is deprecated in favour of
+boost/predef/other/endian.h, and BOOST_(LITTLE|BIG)_ENDIAN by
+BOOST_ENDIAN_(LITTLE|BIG)_BYTE.
+
+Test-Information:
+
+Unit tests pass on Debian 9
+
+Change-Id: If7076c559a4e35219ff97603f50b80cfbe05b29b
+---
+ Swiften/Base/Platform.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/Swiften/Base/Platform.h b/Swiften/Base/Platform.h
+index 4deba2bdda..22dff30b14 100644
+--- a/Swiften/Base/Platform.h
++++ b/Swiften/Base/Platform.h
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2010 Isode Limited.
++ * Copyright (c) 2010-2019 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+@@ -43,9 +43,9 @@
+ #endif
+
+ // Endianness
+-#include <boost/detail/endian.hpp>
+-#if defined(BOOST_LITTLE_ENDIAN)
++#include <boost/predef/other/endian.h>
++#if defined(BOOST_ENDIAN_LITTLE_BYTE)
+ #define SWIFTEN_LITTLE_ENDIAN
+-#elif defined(BOOST_BIG_ENDIAN)
++#elif defined(BOOST_ENDIAN_BIG_BYTE)
+ #define SWIFTEN_BIG_ENDIAN
+ #endif
diff --git a/network/swift/swift-4.0.2-qt-5.11-compatibility.patch b/network/swift/swift-4.0.2-qt-5.11-compatibility.patch
new file mode 100644
index 0000000000..db633945b4
--- /dev/null
+++ b/network/swift/swift-4.0.2-qt-5.11-compatibility.patch
@@ -0,0 +1,35 @@
+From 1d18148c86377787a8c77042b12ea66f20cb2ca9 Mon Sep 17 00:00:00 2001
+From: Tobias Markmann <tm@ayena.de>
+Date: Thu, 21 Jun 2018 13:04:56 +0200
+Subject: Add missing include for QAbstractItemModel
+
+This fixes building Swift with Qt 5.11.
+
+Test-Information:
+
+Builds and tests pass on macOS 10.13.5 with Qt 5.11.0.
+
+Change-Id: I1be2cd081d8a520ec38ab7cca5ada0d7fc39b777
+
+diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.h b/Swift/QtUI/UserSearch/QtUserSearchWindow.h
+index 0714ac1..fe536ab 100644
+--- a/Swift/QtUI/UserSearch/QtUserSearchWindow.h
++++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.h
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2010-2016 Isode Limited.
++ * Copyright (c) 2010-2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+@@ -8,6 +8,7 @@
+
+ #include <set>
+
++#include <QAbstractItemModel>
+ #include <QWizard>
+
+ #include <Swiften/Base/Override.h>
+--
+cgit v0.10.2-6-g49f6
+
diff --git a/network/swift/swift-4.0.2-qt-5.15-compatibility.patch b/network/swift/swift-4.0.2-qt-5.15-compatibility.patch
new file mode 100644
index 0000000000..37918db198
--- /dev/null
+++ b/network/swift/swift-4.0.2-qt-5.15-compatibility.patch
@@ -0,0 +1,10 @@
+--- a/Swift/QtUI/Roster/GroupItemDelegate.cpp
++++ b/Swift/QtUI/Roster/GroupItemDelegate.cpp
+@@ -7,6 +7,7 @@
+ #include <Swift/QtUI/Roster/GroupItemDelegate.h>
+
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QPen>
+ #include <QtDebug>
+
diff --git a/network/swift/swift-gcc11.patch b/network/swift/swift-gcc11.patch
new file mode 100644
index 0000000000..4d94c2d105
--- /dev/null
+++ b/network/swift/swift-gcc11.patch
@@ -0,0 +1,13 @@
+diff --git a/Swift/Controllers/ShowProfileController.h b/Swift/Controllers/ShowProfileController.h
+index 0d01ba1a0..5dc7197ff 100644
+--- a/Swift/Controllers/ShowProfileController.h
++++ b/Swift/Controllers/ShowProfileController.h
+@@ -18,6 +18,8 @@
+
+ #include <Swift/Controllers/UIEvents/UIEvent.h>
+
++#include <map>
++
+ namespace Swift {
+ class VCardManager;
+ class ProfileWindow;
diff --git a/network/swift/swift-python3.patch b/network/swift/swift-python3.patch
new file mode 100644
index 0000000000..80580e7c93
--- /dev/null
+++ b/network/swift/swift-python3.patch
@@ -0,0 +1,737 @@
+diff --git a/3rdParty/LibIDN/SConscript b/3rdParty/LibIDN/SConscript
+index 90892b0f8..c99aff8ba 100644
+--- a/3rdParty/LibIDN/SConscript
++++ b/3rdParty/LibIDN/SConscript
+@@ -40,13 +40,13 @@ if env.get("LIBIDN_BUNDLED", False) :
+ if conf.CheckFunc("stricmp") :
+ myenv.Append(CPPDEFINES = [("strcasecmp", "stricmp")])
+ else :
+- print "Error: Cannot find strcasecmp() or stricmp()"
++ print("Error: Cannot find strcasecmp() or stricmp()")
+ Exit(1)
+ if not conf.CheckFunc('strncasecmp') :
+ if conf.CheckFunc("strnicmp") :
+ myenv.Append(CPPDEFINES = [("strncasecmp", "strnicmp")])
+ else :
+- print "Error: Cannot find strncasecmp() or strnicmp()"
++ print("Error: Cannot find strncasecmp() or strnicmp()")
+ Exit(1)
+ conf.Finish()
+
+diff --git a/BuildTools/CheckHeaders.py b/BuildTools/CheckHeaders.py
+index 79ff85c12..752d2573f 100755
+--- a/BuildTools/CheckHeaders.py
++++ b/BuildTools/CheckHeaders.py
+@@ -36,7 +36,7 @@ for line in file.readlines() :
+ continue
+ for forbiddenInclude, ignores in FORBIDDEN_INCLUDES :
+ if forbiddenInclude in line and len([x for x in ignores if x in filename]) == 0 :
+- print "Found " + forbiddenInclude + " include in " + filename
++ print("Found " + forbiddenInclude + " include in " + filename)
+ foundBadHeaders = True
+
+ sys.exit(foundBadHeaders)
+diff --git a/BuildTools/CheckTranslations.py b/BuildTools/CheckTranslations.py
+index 615f81f1e..0617fbac0 100755
+--- a/BuildTools/CheckTranslations.py
++++ b/BuildTools/CheckTranslations.py
+@@ -41,10 +41,10 @@ for filename in os.listdir("Swift/Translations") :
+ translationText = getText(translation.childNodes)
+ translationPlaceholders = set(re.findall("%\d+%?", translationText))
+ if translationPlaceholders != sourcePlaceholders :
+- print "[Error] " + filename + ": Placeholder mismatch in translation '" + sourceText + "'"
++ print("[Error] " + filename + ": Placeholder mismatch in translation '" + sourceText + "'")
+ if not finished :
+- print "[Warning] " + filename + ": Unfinished"
++ print("[Warning] " + filename + ": Unfinished")
+ if language not in desktop_generic_names and language != "en" :
+- print "[Warning] GenericName field missing in desktop entry for " + language
++ print("[Warning] GenericName field missing in desktop entry for " + language)
+ if language not in desktop_comments and language != "en" :
+- print "[Warning] Comment field missing in desktop entry for " + language
++ print("[Warning] Comment field missing in desktop entry for " + language)
+diff --git a/BuildTools/Copyright/find-contribs.py b/BuildTools/Copyright/find-contribs.py
+index ac30afb2b..799ae7b45 100755
+--- a/BuildTools/Copyright/find-contribs.py
++++ b/BuildTools/Copyright/find-contribs.py
+@@ -46,12 +46,12 @@ def print_log(full_log):
+
+ full_swiften_log = subprocess.check_output(["git", "log", "--", "Swiften"])
+
+-print "Contributors for Swiften/ subtree:\n"
++print("Contributors for Swiften/ subtree:\n")
+ print_log(full_swiften_log)
+
+ full_all_log = subprocess.check_output(["git", "log"])
+
+-print "\n\n\n\n"
++print("\n\n\n\n")
+
+-print "Contributors for full tree:\n"
++print("Contributors for full tree:\n")
+ print_log(full_all_log)
+diff --git a/BuildTools/Copyrighter.py b/BuildTools/Copyrighter.py
+index a16050cb1..cfde98f62 100755
+--- a/BuildTools/Copyrighter.py
++++ b/BuildTools/Copyrighter.py
+@@ -122,14 +122,14 @@ def check_copyright(filename, hints) :
+ return True
+ else :
+ if hints :
+- print "Copyright block for " + copyrightSetting.author + " does not cover current year in: " + filename
++ print("Copyright block for " + copyrightSetting.author + " does not cover current year in: " + filename)
+ return False
+ if hints :
+- print "Missing copyright block for " + copyrightSetting.author + " in: " + filename
++ print("Missing copyright block for " + copyrightSetting.author + " in: " + filename)
+ return False
+ else :
+ if hints :
+- print "No copyright found in: " + filename
++ print("No copyright found in: " + filename)
+ return False
+
+ def replace_data_in_file(filename, begin, end, replaceWith) :
+@@ -140,7 +140,7 @@ def replace_data_in_file(filename, begin, end, replaceWith) :
+
+ def set_or_update_copyright(filename) :
+ if check_copyright(filename, False) :
+- print "No update required for file: " + filename
++ print("No update required for file: " + filename)
+ else :
+ copyrightBlocks = parse_file_new(filename)
+ username, email = get_userinfo()
+@@ -161,7 +161,7 @@ def set_or_update_copyright(filename) :
+ replace_data_in_file(filename, lastBlock+1, lastBlock+1, "\n" + str(copyrightSetting))
+
+ def print_help() :
+- print """Usage:
++ print("""Usage:
+ Copyrighter.py check-copyright $filename
+ Cheks for the existence of a copyright comment block.
+
+@@ -172,7 +172,7 @@ def print_help() :
+ A users license configuration can be set via the SWIFT_LICENSE_CONFIG environment variable
+ in the format "$copyright holder|$license", e.g. "Jane Doe|mit". Possible values for
+ $license are default, mit and gpl.
+- """
++ """)
+
+ if sys.argv[1] == "check-copyright" :
+ file = sys.argv[2]
+@@ -183,6 +183,6 @@ elif sys.argv[1] == "set-copyright" :
+ file = sys.argv[2]
+ set_or_update_copyright(file)
+ else :
+- print "Unknown command: " + sys.argv[1]
++ print("Unknown command: " + sys.argv[1])
+ print_help()
+ sys.exit(-1)
+diff --git a/BuildTools/CrashReportAnalysis/WindowsMinidumpAnalyse.py b/BuildTools/CrashReportAnalysis/WindowsMinidumpAnalyse.py
+index dada92095..92f9b28f1 100644
+--- a/BuildTools/CrashReportAnalysis/WindowsMinidumpAnalyse.py
++++ b/BuildTools/CrashReportAnalysis/WindowsMinidumpAnalyse.py
+@@ -19,11 +19,11 @@ import time
+
+ swiftWindowBuildsPathPrefix = os.getenv("SWIFT_DIST")
+ if swiftWindowBuildsPathPrefix == None :
+- print "Please set the SWIFT_DIST environment variable to a location containing msi and pdb.gz files."
++ print("Please set the SWIFT_DIST environment variable to a location containing msi and pdb.gz files.")
+ sys.exit(1)
+
+ if len(sys.argv) != 3:
+- print "Usage: python WindowsMinidumpAnalyse.py VERSION MINIDUMP_FILE"
++ print("Usage: python WindowsMinidumpAnalyse.py VERSION MINIDUMP_FILE")
+ sys.exit(1)
+
+ version = sys.argv[1]
+@@ -93,7 +93,7 @@ def printHumanReadableReport():
+ try:
+ shutil.rmtree(working_folder)
+ except:
+- print ""
++ print("")
+
+ # clone local git repository into dedicated directory
+ call(["git", "clone", ".", working_folder], shell=True)
+@@ -120,7 +120,7 @@ assert(len(commit) > 0)
+ if not os.path.exists(symbol_cache_path):
+ os.makedirs(symbol_cache_path)
+
+-#print "Checking out commit {0}.".format(commit)
++#print("Checking out commit {0}.".format(commit))
+ call(["git", "-C", working_folder, "checkout", commit])
+
+ os.chdir(working_folder)
+diff --git a/BuildTools/DocBook/SCons/XSLT.py b/BuildTools/DocBook/SCons/XSLT.py
+index 38e36c533..6a40b62a8 100644
+--- a/BuildTools/DocBook/SCons/XSLT.py
++++ b/BuildTools/DocBook/SCons/XSLT.py
+@@ -8,7 +8,7 @@ import xml.dom.minidom, os, os.path
+ def generate(env) :
+ def generate_actions(source, target, env, for_signature) :
+ if not env.has_key("XSLTSTYLESHEET") :
+- raise SCons.Errors.UserError, "The XSLTSTYLESHEET construction variable must be defined"
++ raise SCons.Errors.UserError("The XSLTSTYLESHEET construction variable must be defined")
+
+ # Process the XML catalog files
+ # FIXME: It's probably not clean to do an ENV assignment globally
+diff --git a/BuildTools/FixIncludes.py b/BuildTools/FixIncludes.py
+index 898494473..e53246455 100755
+--- a/BuildTools/FixIncludes.py
++++ b/BuildTools/FixIncludes.py
+@@ -153,12 +153,12 @@ for line in content[headerStart:headerEnd]:
+ headerGroups[headerType] = [line]
+
+ if containsComplexPreprocessorDirectives:
+- print "Cannot format headers containing preprocessor #if, #pragma, #define or #undef statements!"
++ print("Cannot format headers containing preprocessor #if, #pragma, #define or #undef statements!")
+ exit(1)
+
+ if filename_base.endswith(".h"):
+ if not HeaderType.PRAGMA_ONCE in headerGroups:
+- print "Missing #pragma once!"
++ print("Missing #pragma once!")
+ exit(2)
+ cleanHeaderFile(content, headerStart, headerEnd, headerGroups)
+ elif filename_base.endswith(".cpp") or filename_base.endswith(".mm"):
+diff --git a/BuildTools/GetBuildVersion.py b/BuildTools/GetBuildVersion.py
+index 70fdc5ce5..be7cc03e6 100755
+--- a/BuildTools/GetBuildVersion.py
++++ b/BuildTools/GetBuildVersion.py
+@@ -16,6 +16,6 @@ if only_major :
+ if version_match :
+ print version_match.group(1)
+ else :
+- print "0"
++ print("0")
+ else :
+ print Version.getBuildVersion(os.path.dirname(sys.argv[0]) + "/..", sys.argv[1])
+diff --git a/BuildTools/Gource/GetGravatars.py b/BuildTools/Gource/GetGravatars.py
+index d1f40a4d6..17198aa13 100755
+--- a/BuildTools/Gource/GetGravatars.py
++++ b/BuildTools/Gource/GetGravatars.py
+@@ -5,7 +5,7 @@ import subprocess, os, sys, hashlib, urllib
+ GRAVATAR_URL = "http://www.gravatar.com/avatar/%(id)s?d=404"
+
+ if len(sys.argv) != 2 :
+- print "Usage: " + sys.argv[0] + " <output-dir>"
++ print("Usage: " + sys.argv[0] + " <output-dir>")
+ sys.exit(-1)
+
+ output_dir = sys.argv[1]
+@@ -18,32 +18,32 @@ for line in p.stdout.readlines() :
+ authors[author_components[0]] = author_components[1]
+ p.stdin.close()
+ if p.wait() != 0 :
+- print "Error"
++ print("Error")
+ sys.exit(-1)
+
+ # Get & save the avatars
+ if not os.path.isdir(output_dir) :
+ os.makedirs(output_dir)
+ for email, name in authors.items() :
+- print "Processing avatar for " + name + " <" + email + ">"
++ print("Processing avatar for " + name + " <" + email + ">")
+ filename = os.path.join(output_dir, name + ".png")
+ if os.path.isfile(filename) :
+- print "-> Already there. Skipping."
++ print("-> Already there. Skipping.")
+ continue
+
+ m = hashlib.md5()
+ m.update(email)
+ url = GRAVATAR_URL % {"id" : m.hexdigest()}
+- print "- Downloading " + url
++ print("- Downloading " + url)
+ f = urllib.urlopen(url)
+ input = None
+ if f.getcode() == 200 :
+ input = f.read()
+ f.close()
+ if input :
+- print "- Saving file " + filename
++ print("- Saving file " + filename)
+ f = open(filename, "w")
+ f.write(input)
+ f.close()
+ else :
+- print "- No Gravatar found"
++ print("- No Gravatar found")
+diff --git a/BuildTools/SCons/SConstruct b/BuildTools/SCons/SConstruct
+index 6d63d5bcf..e40bfb855 100644
+--- a/BuildTools/SCons/SConstruct
++++ b/BuildTools/SCons/SConstruct
+@@ -7,9 +7,9 @@ root = Dir("../..").abspath
+
+ # Override SConscript to handle tests
+ oldSConscript = SConscript
+-def SConscript(*arguments, **keywords) :
+- if not keywords.get("test_only", False) or env["TEST"] :
+- return apply(oldSConscript, arguments, keywords)
++def SConscript(*args, **kwargs) :
++ if not kwargs.get("test_only", False) or env["TEST"] :
++ return oldSConscript(*args, **kwargs)
+ env.SConscript = SConscript
+
+ ################################################################################
+@@ -142,11 +142,11 @@ conf = Configure(conf_env, custom_tests = {
+ })
+
+ if not conf.CheckCXX() or not conf.CheckCC() :
+- print "Error: You need a working compiler"
++ print("Error: You need a working compiler")
+ Exit(1)
+
+ if not conf.CheckCpp11Support() :
+- print "Error: You need a compiler with support for the C++11 standard"
++ print("Error: You need a compiler with support for the C++11 standard")
+ Exit(1)
+
+
+@@ -170,7 +170,7 @@ if (not zlib_okay) and conf.CheckLib("z") :
+ if zlib_okay :
+ env["ZLIB_FLAGS"] = zlib_flags
+ elif not env.get("zlib_bundled_enable", True) :
+- print "Error: Zlib not found and zlib_bundled_enable is false"
++ print("Error: Zlib not found and zlib_bundled_enable is false")
+ Exit(1)
+ else :
+ env["ZLIB_BUNDLED"] = True
+@@ -238,7 +238,7 @@ if not env.get("boost_force_bundled") and allLibsPresent :
+ # FIXME: Remove this workaround when UUID is available in most distros
+ env["BOOST_BUNDLED_UUID_ONLY"] = True
+ elif not env.get("boost_bundled_enable", True) :
+- print "Error: Boost not found and boost_bundled_enable is false"
++ print("Error: Boost not found and boost_bundled_enable is false")
+ Exit(1)
+ else :
+ env["BOOST_BUNDLED"] = True
+@@ -373,7 +373,7 @@ if env.get("try_expat", True) and not env.get("HAVE_LIBXML",0) :
+ # Bundled expat
+ bundledExpat = False
+ if not env.get("HAVE_EXPAT", 0) and not env.get("HAVE_LIBXML", 0) :
+- print "Expat or LibXML not found. Using bundled Expat"
++ print("Expat or LibXML not found. Using bundled Expat")
+ SConscript("#/3rdParty/Expat/SConscript")
+ env["HAVE_EXPAT"] = 1
+ env["EXPAT_BUNDLED"] = True
+@@ -424,10 +424,10 @@ if not env.get("HAVE_ICU", False) and not env.get("HAVE_LIBIDN", False) :
+ env["HAVE_LIBIDN"] = 1
+ env["LIBIDN_BUNDLED"] = 1
+ elif env.get("need_idn", True):
+- print "Error: ICU and LIBIDN not found, and libidn_bundled_enable is false"
++ print("Error: ICU and LIBIDN not found, and libidn_bundled_enable is false")
+ Exit(1)
+ else:
+- print "Proceeding without an IDN library because need_idn was false. This will break all internal binaries"
++ print("Proceeding without an IDN library because need_idn was false. This will break all internal binaries")
+
+ # Unbound
+ if env["unbound"] :
+@@ -514,7 +514,7 @@ if not env.get("lua_force_bundled", False) and conf.CheckLibWithHeader(env["lua_
+ if lua_version > 0 :
+ env["LUA_FLAGS"]["LUA_VERSION"] = str(lua_version // 100) + "." + str(lua_version % 100)
+ else :
+- print "Warning: Unable to determine Lua version. Not installing Lua libraries."
++ print("Warning: Unable to determine Lua version. Not installing Lua libraries.")
+ env["LUA_FLAGS"].update(lua_flags)
+ else :
+ env["LUA_BUNDLED"] = 1
+@@ -666,7 +666,7 @@ try :
+ except SCons.Errors.StopError:
+ env["HAVE_QT"] = False
+ except Exception as e:
+- print "Info: %s" % str(e)
++ print("Info: %s" % str(e))
+ env["HAVE_QT"] = False
+
+ ################################################################################
+@@ -688,7 +688,7 @@ try:
+ if not env.GetOption("clean") and env.get("install_git_hooks", True) :
+ env.Install("#/.git/hooks", Glob("#/BuildTools/Git/Hooks/*"))
+ except TypeError:
+- print "You seem to be using Swift in a Git submodule. Not installing hooks."
++ print("You seem to be using Swift in a Git submodule. Not installing hooks.")
+
+
+ ################################################################################
+@@ -752,7 +752,7 @@ modules.append("QA")
+ env["PROJECTS"] = [m for m in modules if m not in ["Documentation", "QA", "SwifTools"] and not m.startswith("3rdParty")]
+ for stage in ["flags", "build"] :
+ env["SCONS_STAGE"] = stage
+- SConscript(dirs = map(lambda x : root + "/" + x, modules))
++ SConscript(dirs = list(map(lambda x : root + "/" + x, modules)))
+
+ # SLOCCount
+ if ARGUMENTS.get("sloccount", False) :
+@@ -764,9 +764,9 @@ if ARGUMENTS.get("sloccount", False) :
+ # Print summary
+ ################################################################################
+
+-print
+-print " Build Configuration"
+-print " -------------------"
++print("")
++print(" Build Configuration")
++print(" -------------------")
+
+ parsers = []
+ if env.get("HAVE_LIBXML", 0):
+@@ -775,14 +775,14 @@ if env.get("HAVE_EXPAT", 0):
+ parsers.append("Expat")
+ if env.get("EXPAT_BUNDLED", False) :
+ parsers.append("(Bundled)")
+-print " Projects: " + ' '.join(env["PROJECTS"])
+-print ""
+-print " XML Parsers: " + ' '.join(parsers)
++print(" Projects: " + ' '.join(env["PROJECTS"]))
++print("")
++print(" XML Parsers: " + ' '.join(parsers))
+
+-print " TLS Support: " + (env.get("HAVE_OPENSSL",0) and "OpenSSL" or env.get("HAVE_SECURETRANSPORT",0) and "Secure Transport" or env.get("HAVE_SCHANNEL", 0) and "Schannel" or "Disabled")
+-print " DNSSD Support: " + (env.get("HAVE_BONJOUR") and "Bonjour" or (env.get("HAVE_AVAHI") and "Avahi" or "Disabled"))
+-print
++print(" TLS Support: " + (env.get("HAVE_OPENSSL",0) and "OpenSSL" or env.get("HAVE_SECURETRANSPORT",0) and "Secure Transport" or env.get("HAVE_SCHANNEL", 0) and "Schannel" or "Disabled"))
++print(" DNSSD Support: " + (env.get("HAVE_BONJOUR") and "Bonjour" or (env.get("HAVE_AVAHI") and "Avahi" or "Disabled")))
++print("")
+
+ if not GetOption("help") and not env.get("HAVE_OPENSSL", 0) and not env.get("HAVE_SCHANNEL", 0) and not env.get("HAVE_SECURETRANSPORT", 0):
+- print "Error: A working TLS backend is required. Please check the documentation for more information."
++ print("Error: A working TLS backend is required. Please check the documentation for more information.")
+ Exit(1)
+diff --git a/BuildTools/SCons/Tools/AppBundle.py b/BuildTools/SCons/Tools/AppBundle.py
+index 337e83f7c..31cfef109 100644
+--- a/BuildTools/SCons/Tools/AppBundle.py
++++ b/BuildTools/SCons/Tools/AppBundle.py
+@@ -34,7 +34,7 @@ def generate(env) :
+ """
+ for key, value in infoDict.items() :
+ plist += "<key>" + key + "</key>\n"
+- plist += "<string>" + value.encode("utf-8") + "</string>\n"
++ plist += "<string>" + value + "</string>\n"
+ if handlesXMPPURIs :
+ plist += """<key>CFBundleURLTypes</key>
+ <array>
+@@ -50,7 +50,7 @@ def generate(env) :
+
+ if sparklePublicDSAKey :
+ plist += "<key>SUPublicDSAKeyFile</key>"
+- plist += "<string>" + sparklePublicDSAKey.name.encode("utf-8") + "</string>"
++ plist += "<string>" + sparklePublicDSAKey.name + "</string>"
+ env.Install(resourcesDir, sparklePublicDSAKey)
+ plist += """</dict>
+ </plist>
+diff --git a/BuildTools/SCons/Tools/InstallWithSymLinks.py b/BuildTools/SCons/Tools/InstallWithSymLinks.py
+index 23d12ed80..495519210 100644
+--- a/BuildTools/SCons/Tools/InstallWithSymLinks.py
++++ b/BuildTools/SCons/Tools/InstallWithSymLinks.py
+@@ -74,21 +74,21 @@ def scons_copytree(src, dst, symlinks=False):
+ else:
+ shutil.copy2(srcname, dstname)
+ # XXX What about devices, sockets etc.?
+- except (IOError, os.error), why:
++ except (IOError, os.error) as why:
+ errors.append((srcname, dstname, str(why)))
+ # catch the CopytreeError from the recursive copytree so that we can
+ # continue with other files
+- except CopytreeError, err:
++ except CopytreeError as err:
+ errors.extend(err.args[0])
+ try:
+ shutil.copystat(src, dst)
+ except WindowsError:
+ # can't copy file access times on Windows
+ pass
+- except OSError, why:
++ except OSError as why:
+ errors.extend((src, dst, str(why)))
+ if errors:
+- raise CopytreeError, errors
++ raise CopytreeError(errors)
+
+
+ def symlinkBuilderImpl(target, source, env):
+diff --git a/BuildTools/SCons/Tools/qt4.py b/BuildTools/SCons/Tools/qt4.py
+index d5c14e20c..c97e751bc 100644
+--- a/BuildTools/SCons/Tools/qt4.py
++++ b/BuildTools/SCons/Tools/qt4.py
+@@ -137,23 +137,23 @@ class _Automoc:
+ out_sources = source[:]
+
+ for obj in source:
+- if isinstance(obj,basestring): # big kludge!
+- print "scons: qt4: '%s' MAYBE USING AN OLD SCONS VERSION AND NOT CONVERTED TO 'File'. Discarded." % str(obj)
++ if isinstance(obj,str): # big kludge!
++ print("scons: qt4: '%s' MAYBE USING AN OLD SCONS VERSION AND NOT CONVERTED TO 'File'. Discarded." % str(obj))
+ continue
+ if not obj.has_builder():
+ # binary obj file provided
+ if debug:
+- print "scons: qt: '%s' seems to be a binary. Discarded." % str(obj)
++ print("scons: qt: '%s' seems to be a binary. Discarded." % str(obj))
+ continue
+ cpp = obj.sources[0]
+ if not splitext(str(cpp))[1] in cxx_suffixes:
+ if debug:
+- print "scons: qt: '%s' is no cxx file. Discarded." % str(cpp)
++ print("scons: qt: '%s' is no cxx file. Discarded." % str(cpp) )
+ # c or fortran source
+ continue
+ #cpp_contents = comment.sub('', cpp.get_contents())
+ try:
+- cpp_contents = cpp.get_contents()
++ cpp_contents = str(cpp.get_contents())
+ except: continue # may be an still not generated source
+ h=None
+ for h_ext in header_extensions:
+@@ -163,12 +163,12 @@ class _Automoc:
+ h = find_file(hname, (cpp.get_dir(),), env.File)
+ if h:
+ if debug:
+- print "scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp))
++ print("scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp)))
+ #h_contents = comment.sub('', h.get_contents())
+- h_contents = h.get_contents()
++ h_contents = str(h.get_contents())
+ break
+ if not h and debug:
+- print "scons: qt: no header for '%s'." % (str(cpp))
++ print("scons: qt: no header for '%s'." % (str(cpp)))
+ if h and q_object_search.search(h_contents):
+ # h file with the Q_OBJECT macro found -> add moc_cpp
+ moc_cpp = env.Moc4(h)
+@@ -176,14 +176,14 @@ class _Automoc:
+ out_sources.append(moc_o)
+ #moc_cpp.target_scanner = SCons.Defaults.CScan
+ if debug:
+- print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp))
++ print("scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp)))
+ if cpp and q_object_search.search(cpp_contents):
+ # cpp file with Q_OBJECT macro found -> add moc
+ # (to be included in cpp)
+ moc = env.Moc4(cpp)
+ env.Ignore(moc, moc)
+ if debug:
+- print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc))
++ print("scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc)))
+ #moc.source_scanner = SCons.Defaults.CScan
+ # restore the original env attributes (FIXME)
+ objBuilder.env = objBuilderEnv
+@@ -344,7 +344,7 @@ def generate(env):
+ else:
+ result.append(itemPath)
+ return result
+- contents = node.get_contents()
++ contents = str(node.get_contents())
+ includes = [included[1] for included in qrcinclude_re.findall(contents)]
+ qrcpath = os.path.dirname(node.path)
+ dirs = [included for included in includes if os.path.isdir(os.path.join(qrcpath,included))]
+diff --git a/BuildTools/SCons/Tools/textfile.py b/BuildTools/SCons/Tools/textfile.py
+index cc5866693..c19bdf917 100644
+--- a/BuildTools/SCons/Tools/textfile.py
++++ b/BuildTools/SCons/Tools/textfile.py
+@@ -107,7 +107,7 @@ def _action(target, source, env):
+ # write the file
+ try:
+ fd = open(target[0].get_path(), "wb")
+- except (OSError,IOError), e:
++ except (OSError,IOError) as e:
+ raise SCons.Errors.UserError("Can't write target file %s" % target[0])
+ # separate lines by 'linesep' only if linesep is not empty
+ lsep = None
+diff --git a/BuildTools/SCons/Version.py b/BuildTools/SCons/Version.py
+index f215a5d6d..9021831f2 100644
+--- a/BuildTools/SCons/Version.py
++++ b/BuildTools/SCons/Version.py
+@@ -6,7 +6,7 @@ def getGitBuildVersion(root, project) :
+ return tag.rstrip()[len(project)+1:]
+ tag = git("describe --tags --match \"" + project + "-*\"", root)
+ if tag :
+- m = re.match(project + "-(.*)-(.*)-(.*)", tag)
++ m = re.match(project + "-(.*)-(.*)-(.*)", tag.decode('utf-8'))
+ if m :
+ return m.group(1) + "-dev" + m.group(2)
+ return None
+@@ -17,7 +17,7 @@ def git(cmd, root) :
+ gitVersion = p.stdout.read()
+ # error = p.stderr.read()
+ # if error:
+- # print "Git error: " + error
++ # print("Git error: " + error)
+ p.stdin.close()
+ if p.wait() == 0 :
+ return gitVersion
+@@ -163,7 +163,7 @@ class convertToWindowsVersionTest(unittest.TestCase):
+ ('3.0alpha-dev524', (3, 0, 524)),
+ ('3.0alpha-dev515', (3, 0, 515)),
+ ]
+- windowsVersionMapping = list(map(lambda (x,y): (x, convertToWindowsVersion(x)), versionStringsWithOldVersions))
++ windowsVersionMapping = list(map(lambda x,y: (x, convertToWindowsVersion(x)), versionStringsWithOldVersions))
+
+ def testThatBetaIsHigherThanAlpha(self):
+ self.assertTrue(convertToWindowsVersion("3.0beta0") > convertToWindowsVersion("3.0alpha0"))
+@@ -194,8 +194,8 @@ if __name__ == '__main__':
+ if len(sys.argv) == 1:
+ unittest.main()
+ elif len(sys.argv) == 2:
+- print convertToWindowsVersion(sys.argv[1])
++ print (convertToWindowsVersion(sys.argv[1]))
+ sys.exit(0)
+ else:
+- print "Error: Simply run the script without arguments or pass a single argument."
++ print ("Error: Simply run the script without arguments or pass a single argument.")
+ sys.exit(-1)
+diff --git a/BuildTools/scons2ninja.py b/BuildTools/scons2ninja.py
+index 6c77c8897..855a1339e 100755
+--- a/BuildTools/scons2ninja.py
++++ b/BuildTools/scons2ninja.py
+@@ -429,7 +429,7 @@ for line in f.stdout :
+ previous_filename = filename
+
+ if f.wait() != 0 :
+- print "Error calling '" + scons_generate_cmd + "'"
++ print("Error calling '" + scons_generate_cmd + "'")
+ print f.stderr.read()
+ exit(-1)
+
+diff --git a/Slimber/SConscript b/Slimber/SConscript
+index a41fe0b6d..fa5aa53b2 100644
+--- a/Slimber/SConscript
++++ b/Slimber/SConscript
+@@ -11,10 +11,10 @@ elif env["PLATFORM"] != "darwin" :
+ env["PROJECTS"].remove("Slimber")
+
+ if not "Slimber" in env["PROJECTS"] and env["SCONS_STAGE"] == "flags" :
+- print "Bonjour missing. Not building Slimber."
++ print("Bonjour missing. Not building Slimber.")
+
+ if not env.get("HAVE_QT", False) and "Slimber" in env["PROJECTS"] :
+- print "Qt missing. Not building Slimber."
++ print("Qt missing. Not building Slimber.")
+ env["PROJECTS"].remove("Slimber")
+
+ if "Slimber" in env["PROJECTS"] :
+diff --git a/Sluift/SConscript b/Sluift/SConscript
+index de9cab618..af54ece20 100644
+--- a/Sluift/SConscript
++++ b/Sluift/SConscript
+@@ -3,7 +3,7 @@ import Version, os.path
+ Import(["env"])
+
+ if env["SCONS_STAGE"] == "build" and not GetOption("help") and not env.get("HAVE_LUA", 0) :
+- print "Warning: Lua was not found. Sluift will not be built."
++ print("Warning: Lua was not found. Sluift will not be built.")
+ if "Sluift" in env["PROJECTS"] :
+ env["PROJECTS"].remove("Sluift")
+
+diff --git a/Swift/Packaging/SConscript b/Swift/Packaging/SConscript
+index 3aa791fa8..556c59652 100644
+--- a/Swift/Packaging/SConscript
++++ b/Swift/Packaging/SConscript
+@@ -25,5 +25,5 @@ if env["SCONS_STAGE"] == "build" :
+ target='$HELP2MAN_DEBIAN_DIR/swift-im.1', source='#/Swift/QtUI/swift-im',
+ action = Action('$HELP2MAN --no-discard-stderr -m "Swift Manual" -S "Swift" -n "swift-im" -N $SOURCE > $TARGET', cmdstr = "$HELP2MANSTR"))
+ else:
+- print "Enabled help2man but help2man is not in the PATH of the current environment."
++ print("Enabled help2man but help2man is not in the PATH of the current environment.")
+ Exit(1)
+diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript
+index 54f0450c0..cc51340b3 100644
+--- a/Swift/QtUI/SConscript
++++ b/Swift/QtUI/SConscript
+@@ -22,7 +22,7 @@ Import("env")
+ myenv = env.Clone()
+
+ # Disable warnings that affect Qt
+-myenv["CXXFLAGS"] = filter(lambda x : x != "-Wfloat-equal", myenv["CXXFLAGS"])
++myenv["CXXFLAGS"] = list(filter(lambda x : x != "-Wfloat-equal", myenv["CXXFLAGS"]))
+ if "clang" in env["CC"] :
+ myenv.Append(CXXFLAGS = ["-Wno-float-equal", "-Wno-shorten-64-to-32", "-Wno-missing-prototypes", "-Wno-unreachable-code", "-Wno-disabled-macro-expansion", "-Wno-unused-private-field", "-Wno-extra-semi", "-Wno-duplicate-enum", "-Wno-missing-variable-declarations", "-Wno-conversion", "-Wno-undefined-reinterpret-cast"])
+
+@@ -496,16 +496,16 @@ if env["PLATFORM"] == "win32" :
+ def signToolAction(target = None, source = None, env = None):
+ signresult = 0
+ for x in range (1, 4) :
+- print "Attemping to sign the packages [%s]" % x
++ print("Attemping to sign the packages [%s]" % x)
+ signresult = env.Execute('signtool.exe sign /fd SHA256 /f "${SIGNTOOL_KEY_PFX}" /t "${SIGNTOOL_TIMESTAMP_URL}" /d "Swift Installer" ' + str(target[0]))
+ if signresult != 1 :
+ break
+ #If all 3 attemps to sign the package failed, stop the build.
+ if signresult == 1 :
+- print "Error: The build has failed to sign the installer package"
++ print("Error: The build has failed to sign the installer package")
+ Exit(1)
+ if signresult == 2 :
+- print "Signing was completed with warnings."
++ print("Signing was completed with warnings.")
+
+ myenv.AddPostAction(lightTask, signToolAction)
+
+diff --git a/Swift/SConscript b/Swift/SConscript
+index b211435ac..30b09e008 100644
+--- a/Swift/SConscript
++++ b/Swift/SConscript
+@@ -7,17 +7,17 @@ SConscript("Controllers/SConscript")
+ if env["SCONS_STAGE"] == "build" :
+ if not GetOption("help") and not env.get("HAVE_QT", 0) :
+ if "Swift" in env["PROJECTS"] :
+- print "Warning: Swift requires Qt. Not building the Swift Qt application."
++ print("Warning: Swift requires Qt. Not building the Swift Qt application.")
+ env["PROJECTS"].remove("Swift")
+ elif not GetOption("help") and env["target"] == "native" and "Swift" in env["PROJECTS"] :
+ try :
+ SConscript("QtUI/SConscript")
+ except Exception as e:
+- print "Warning: %s" % str(e)
++ print("Warning: %s" % str(e))
+ env["PROJECTS"].remove("Swift")
+ if "Swift" in env["PROJECTS"] and env["BOOST_1_64_DETECTED"] and not env.get("allow_boost_1_64") and not env.GetOption("clean") :
+ #Version 1.64 has some issues with the serialization of boost::optional, see https://svn.boost.org/trac10/ticket/13050
+- print "Boost 1.64 has been detected. It is not recommended to use this version due to a regression within the library. Swift has been removed from the current build. You can still use this version by setting allow_boost_1_64 to true, but recent chats and highlighting rules will reset."
++ print("Boost 1.64 has been detected. It is not recommended to use this version due to a regression within the library. Swift has been removed from the current build. You can still use this version by setting allow_boost_1_64 to true, but recent chats and highlighting rules will reset.")
+ env["PROJECTS"].remove("Swift")
+ if env["help2man"]:
+ SConscript("Packaging/SConscript")
+\ No newline at end of file
+diff --git a/BuildTools/SCons/Tools/Flags.py b/BuildTools/SCons/Tools/Flags.py
+index fe0cfcc54..7e0a9723b 100644
+--- a/BuildTools/SCons/Tools/Flags.py
++++ b/BuildTools/SCons/Tools/Flags.py
+@@ -4,7 +4,7 @@ def generate(env) :
+ def useFlags(env, flags) :
+ for flag in flags :
+ if flag in env :
+- env[flag] = env[flag] + flags[flag]
++ env[flag] = list(env[flag]) + flags[flag]
+ else :
+ env[flag] = flags[flag]
+ env.AddMethod(useFlags, "UseFlags")
+diff --git a/BuildTools/SCons/Tools/qt4.py b/BuildTools/SCons/Tools/qt4.py
+index d5c14e20c..a19e35e2a 100644
+--- a/BuildTools/SCons/Tools/qt4.py
++++ b/BuildTools/SCons/Tools/qt4.py
+@@ -46,7 +47,7 @@ import SCons.Tool
+ import SCons.Util
+ import SCons.SConf
+
+-class ToolQtWarning(SCons.Warnings.Warning):
++class ToolQtWarning(SCons.Warnings.SConsWarning):
+ pass
+
+ class GeneratedMocFileNotIncluded(ToolQtWarning):
+diff --git a/BuildTools/SCons/Tools/textfile.py b/BuildTools/SCons/Tools/textfile.py
+index cc5866693..ac9b83f9f 100644
+--- a/BuildTools/SCons/Tools/textfile.py
++++ b/BuildTools/SCons/Tools/textfile.py
+@@ -106,7 +106,7 @@ def _action(target, source, env):
+
+ # write the file
+ try:
+- fd = open(target[0].get_path(), "wb")
++ fd = open(target[0].get_path(), "w")
+ except (OSError,IOError) as e:
+ raise SCons.Errors.UserError("Can't write target file %s" % target[0])
+ # separate lines by 'linesep' only if linesep is not empty
diff --git a/network/swift/swift.SlackBuild b/network/swift/swift.SlackBuild
new file mode 100644
index 0000000000..632f294eb2
--- /dev/null
+++ b/network/swift/swift.SlackBuild
@@ -0,0 +1,125 @@
+#!/bin/bash
+
+# Slackware build script for swift
+
+# Copyright 2023, Lockywolf
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cd $(dirname $0) ; CWD=$(pwd)
+
+PRGNAM=swift
+VERSION=${VERSION:-4.0.3}
+BUILD=${BUILD:-1}
+TAG=${TAG:-_SBo}
+PKGTYPE=${PKGTYPE:-tgz}
+
+if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i586 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+fi
+
+# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
+# the name of the created package would be, and then exit. This information
+# could be useful to other scripts.
+if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
+ echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
+ exit 0
+fi
+
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+if [ "$ARCH" = "i586" ]; then
+ SLKCFLAGS="-O2 -march=i586 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+ LIBDIRSUFFIX=""
+elif [ "$ARCH" = "x86_64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+elif [ "$ARCH" = "aarch64" ]; then
+ SLKCFLAGS="-O2 -fPIC"
+ LIBDIRSUFFIX="64"
+else
+ SLKCFLAGS="-O2"
+ LIBDIRSUFFIX=""
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf $PRGNAM-$VERSION
+tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2
+cd $PRGNAM-$VERSION
+chown -R root:root .
+find -L . \
+ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
+ -o -perm 511 \) -exec chmod 755 {} + -o \
+ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
+set -x
+patch -p1 -i $CWD/swift-4.0.2-boost-1.69-compatibility.patch
+#patch -p1 -i $CWD/swift-4.0.2-qt-5.11-compatibility.patch
+patch -p1 -i $CWD/swift-4.0.2-qt-5.15-compatibility.patch
+patch -p1 -i $CWD/swift-python3.patch
+patch -p1 -i $CWD/swift-gcc11.patch
+sed -i 's/fd.write(_do_subst(s, subs).encode("utf-8"))/fd.write(_do_subst(s, subs))/g' BuildTools/SCons/Tools/textfile.py
+scons \
+ max_jobs=1 \
+ optimize=1 \
+ debug=0 \
+ swiften_dll=1 \
+ cflags="${SLKCFLAGS} -fpermissive" \
+ cxxflags="${SLKCFLAGS} -fpermissive" \
+ install_root=$PKG/usr \
+ prefix=/usr \
+ SWIFT_INSTALLDIR=$PKG/usr \
+ SWIFTEN_INSTALLDIR=$PKG/usr \
+ $PKG \
+ Swift Swiften
+
+if [ -n "${LIBDIRSUFFIX}" ] ; then
+ mv $PKG/usr/lib $PKG/usr/lib${LIBDIRSUFFIX}
+fi
+
+rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
+
+find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
+ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
+cp -a \
+ COPYING COPYING.gpl DEVELOPMENT.md README.md COPYING.dependencies COPYING.thirdparty Documentation/ \
+ $PKG/usr/doc/$PRGNAM-$VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+cat $CWD/doinst.sh > $PKG/install/doinst.sh
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
diff --git a/network/swift/swift.info b/network/swift/swift.info
new file mode 100644
index 0000000000..5b7c64e4b1
--- /dev/null
+++ b/network/swift/swift.info
@@ -0,0 +1,10 @@
+PRGNAM="swift"
+VERSION="4.0.3"
+HOMEPAGE="https://swift.im"
+DOWNLOAD="https://swift.im/git/swift/snapshot/swift-4.0.3.tar.bz2"
+MD5SUM="a2e2f93c9b23f8af334910c42d519c7a"
+DOWNLOAD_x86_64=""
+MD5SUM_x86_64=""
+REQUIRES="avahi"
+MAINTAINER="Lockywolf"
+EMAIL="lockywolf gmail.com"