summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swift/Packaging/appimage')
-rw-r--r--Swift/Packaging/appimage/Dockerfile19
-rw-r--r--Swift/Packaging/appimage/build.sh26
-rw-r--r--Swift/Packaging/appimage/build_appimage.py167
-rw-r--r--Swift/Packaging/appimage/centos6.sh25
-rw-r--r--Swift/Packaging/appimage/config.py1
-rwxr-xr-xSwift/Packaging/appimage/run.sh2
-rw-r--r--Swift/Packaging/appimage/swift.yml12
7 files changed, 252 insertions, 0 deletions
diff --git a/Swift/Packaging/appimage/Dockerfile b/Swift/Packaging/appimage/Dockerfile
new file mode 100644
index 0000000..37530d1
--- /dev/null
+++ b/Swift/Packaging/appimage/Dockerfile
@@ -0,0 +1,19 @@
+FROM centos:6
+
+RUN yum -y install epel-release wget
+RUN wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo && yum -y upgrade
+RUN yum -y install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++ openssl-devel qt5-qtbase-devel qt5-qttools-libs-designercomponents qt5-qttools-devel qt5-qtwebkit-devel qt5-qtsvg-devel qt5-qttools-devel qt5-qttools-static qt5-qtmultimedia-devel qt5-qtwebchannel-devel qt5-qtimageformats-devel git patch qt5-qtmultimedia-devel qt5-qtx11extras-devel libtool
+RUN cd / && git clone https://github.com/swift/swift
+#RUN cd / && git clone --depth 1 https://github.com/probonopd/AppImageKit.git
+#RUN cd /AppImageKit && scl enable devtoolset-2 ./build.sh
+RUN cd / && wget https://github.com/probonopd/AppImageKit/releases/download/continuous/appimaged-x86_64.AppImage && chmod u+rx /appimaged-x86_64.AppImage
+RUN yum -y install fuse-libs libarchive
+RUN ln -s /usr/lib64/libarchive.so.2 /usr/lib64/libarchive.so.13
+RUN cd / && wget https://github.com/probonopd/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage && chmod u+x appimagetool-x86_64.AppImage
+RUN cd / && wget https://raw.githubusercontent.com/probonopd/AppImages/master/recipes/meta/Recipe
+RUN yum -y install desktop-file-utils
+ADD build.sh /build.sh
+RUN chmod u+x /build.sh
+#RUN cd /swift && scl enable devtoolset-2 './scons max_jobs=1'
+ADD swift.yml /swift.yml
+ADD config.py /swift/config.py
diff --git a/Swift/Packaging/appimage/build.sh b/Swift/Packaging/appimage/build.sh
new file mode 100644
index 0000000..53264fc
--- /dev/null
+++ b/Swift/Packaging/appimage/build.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+SIXTYFOUR=''
+cd /swift
+git pull --rebase
+mkdir -p /build
+#scl enable devtoolset-2 './scons max_jobs=1 SWIFT_INSTALLDIR=/build /build'
+./scons max_jobs=1 SWIFT_INSTALLDIR=/build /build
+cd /build
+ldd bin/swift-im | grep '=>' | awk '{print $3}' | xargs -I '{}' cp -v -L '{}' ./lib/ || true
+mkdir -p lib/qt5
+cp -r /usr/lib${SIXTYFOUR}/qt5/plugins ./lib/qt5/plugins
+cp -L /lib${SIXTYFOUR}/libudev.so.0 ./lib/
+cp /usr/lib${SIXTYFOUR}/libQt5XcbQpa.so* ./lib/
+cp -L /usr/local/gcc-4.9.4/lib/libstdc++.so.6 ./lib/
+mkdir -p /appstuff
+cd /appstuff
+bash -ex /Recipe /swift.yml
+cd /appstuff/Swift/Swift.AppDir
+rm AppRun
+wget -c https://github.com/probonopd/AppImageKit/releases/download/6/AppRun_6-i686 -O AppRun
+chmod +x AppRun
+cd ..
+rm appimagetool
+wget -c https://github.com/probonopd/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage -O appimagetool
+chmod +x appimagetool
+./appimagetool Swift.AppDir Swift-i686.AppImage
diff --git a/Swift/Packaging/appimage/build_appimage.py b/Swift/Packaging/appimage/build_appimage.py
new file mode 100644
index 0000000..b49ef7f
--- /dev/null
+++ b/Swift/Packaging/appimage/build_appimage.py
@@ -0,0 +1,167 @@
+#!/usr/bin/env python2
+#
+# This Python script builds self-contained Linux packages, i.e. AppImages ( http://appimage.org/ ), of Swift.
+# It downloads required appimage tool that is executed at the end and an exculde list from the internet.
+#
+# Non-standard dependencies:
+# * plumbum ( https://plumbum.readthedocs.io/en/latest/ )
+# * click ( http://click.pocoo.org/5/ )
+#
+# They can be installed via `pip install plumbum click`.
+#
+# The script requires git, wget, readelf and objcopy to work and will fail if
+# they are not present.
+#
+# Just run ./Swift/Packaging/appimage/build_appimage.py and after it executed
+# there should be .appimage and .debug files in Packages/Swift.
+#
+# The appimage will be for the same architecture as the host architecture.
+# Pass `--qt5=False` to the tool to build against legacy Qt4.
+#
+# To include newer libstdc++.so or similar libs in an AppImage, use -li parameters.
+
+from plumbum import local, FG, BG, RETCODE, colors, commands
+import click
+import os
+import re
+import time
+import sys
+
+git = local['git']
+
+def git_working_dir():
+ working_dir = git('rev-parse', '--show-toplevel').strip()
+ if not os.path.exists(working_dir):
+ working_dir = os.path.dirname(os.path.abspath(git('rev-parse', '--git-dir').strip()))
+ return working_dir
+
+git_working_dir = git_working_dir()
+resources_dir = os.path.join(git_working_dir, "Swift/resources/")
+
+@click.command()
+@click.option('--qt5', default=True, type=bool, help='Build with Qt5.')
+@click.option('--includelib', '-il', type=click.Path(), multiple=True, help='Copy extra library into AppImage.')
+def build_appimage(qt5, includelib):
+ print(colors.bold & colors.info | "Switch to git working directory root " + git_working_dir)
+ with local.cwd(git_working_dir):
+
+ def copy_dependencies_into_appdir(excludelist, binary_path, lib_path):
+ chain = local['ldd'][binary_path] | local['grep']["=> /"] | local['awk']['{print $3}']
+ for dynamic_lib in chain().strip().split('\n'):
+ if os.path.basename(dynamic_lib) in excludelist:
+ #print(colors.info | "Not including " + dynamic_lib + " as it is blacklisted.")
+ pass
+ else:
+ local['cp']('-v', '-L', dynamic_lib, lib_path)
+
+ scons = local['./scons']
+ print(colors.bold & colors.info | "Building Swift")
+ scons['qt5={0}'.format("1" if qt5 else "0"), 'Swift'] & FG
+
+ swift = local['./Swift/QtUI/swift-im']
+ swift_version = swift('--version').strip()
+ print(colors.bold & colors.info | "Successfully built " + swift_version)
+
+ swift_architecture_string = ""
+ try:
+ readelf_on_swift_im_output = local['readelf']('-h', './Swift/QtUI/swift-im').strip()
+ swift_architecture = re.search(r'Class:\s+([^\s]+)', readelf_on_swift_im_output, flags=re.I).group(1)
+ if swift_architecture == "ELF32":
+ swift_architecture_string = ".i386"
+ elif swift_architecture == "ELF64":
+ swift_architecture_string = ".amd64"
+ except:
+ pass
+
+ appdir_path = os.path.join(git_working_dir, 'Swift/Packaging/AppImage/Swift.AppDir')
+ print(colors.bold & colors.info | "Prepare AppDir structure at " + appdir_path)
+ local['mkdir']('-p', appdir_path)
+
+ swift_install_dir = os.path.join(appdir_path, 'usr')
+ print(colors.bold & colors.info | "Install Swift to AppDir")
+ scons['qt5={0}'.format("1" if qt5 else "0"), 'Swift', 'SWIFT_INSTALLDIR=' + swift_install_dir , swift_install_dir] & FG
+
+ print(colors.bold & colors.info | "Download dynamic lib exclude list from https://raw.githubusercontent.com/AppImage/AppImages/master/excludelist")
+ local['wget']['--no-check-certificate', '-O', '/tmp/excludelist', 'https://raw.githubusercontent.com/AppImage/AppImages/master/excludelist'] & FG
+
+ print(colors.bold & colors.info | "Load dynamic library exclude list")
+ excludelist = set()
+ with open('/tmp/excludelist') as f:
+ for line in f:
+ if line and "#" not in line:
+ excludelist.add(line.strip())
+
+ print(colors.bold & colors.info | "Copy dynamic library dependencies into AppDir")
+ local['mkdir']('-p', os.path.join(appdir_path, 'usr/lib'))
+ appdir_swift_im_binary = os.path.join(swift_install_dir, 'bin/swift-im')
+ copy_dependencies_into_appdir(excludelist, appdir_swift_im_binary, os.path.join(swift_install_dir, "lib"))
+
+ if qt5:
+ print(colors.bold & colors.info | "Analyze binary for Qt plugin paths")
+ # Run Swift binary and parse debug output to find plugin paths to copy.
+ swift_plugin_debug_output = ""
+ try:
+ process = local["env"]["QT_DEBUG_PLUGINS=1", './Swift/QtUI/swift-im'].popen()
+ time.sleep(2)
+ process.kill()
+ stdout, stderr = process.communicate()
+ swift_plugin_debug_output = stderr
+ except:
+ pass
+ if swift_plugin_debug_output:
+ matches = re.search(r"/.*/qt5/plugins", swift_plugin_debug_output)
+ if matches:
+ qt5_plugin_path = matches.group(0)
+ appdir_qt5_plugin_path = os.path.join(appdir_path, 'usr/lib/qt5')
+ local['mkdir']('-p', appdir_qt5_plugin_path)
+ local['cp']('-r', '-L', qt5_plugin_path, appdir_qt5_plugin_path)
+
+ print(colors.bold & colors.info | "Copy plugin dependencies into AppDir")
+ for plugin_path in local.path(appdir_qt5_plugin_path) // "plugins/*/*.so":
+ copy_dependencies_into_appdir(excludelist, plugin_path, os.path.join(swift_install_dir, "lib"))
+
+ if includelib:
+ for includelib_path in includelib:
+ print(colors.bold & colors.info | "Copy " + includelib_path + " to AppDir.")
+ local['cp']('-v', '-L', includelib_path, os.path.join(swift_install_dir, "lib"))
+
+ print(colors.bold & colors.info | "Download https://github.com/AppImage/AppImageKit/raw/appimagetool/master/resources/AppRun to " + os.path.join(appdir_path, 'AppRun'))
+ local['wget']('--no-check-certificate', '-O', os.path.join(appdir_path, 'AppRun'), "https://github.com/AppImage/AppImageKit/raw/appimagetool/master/resources/AppRun")
+ local['chmod']('+x', os.path.join(appdir_path, 'AppRun'))
+
+ print(colors.bold & colors.info | "Copy swift.desktop file")
+ source_desktop_file = os.path.join(resources_dir, "swift.desktop")
+ target_desktop_file = os.path.join(appdir_path, 'swift.desktop')
+ local['cp']('-v', '-L', source_desktop_file, target_desktop_file)
+
+ print(colors.bold & colors.info | "Copy logos to Swift.AppDir")
+ local['cp']('-v', '-L', os.path.join(resources_dir, "logo/logo-icon-512.png"), os.path.join(appdir_path, "swift.png"))
+ local['cp']('-v', '-L', os.path.join(resources_dir, "logo/logo-icon.svg"), os.path.join(appdir_path, "swift.svg"))
+ local['cp']('-v', '-L', os.path.join(resources_dir, "logo/logo-icon-32.xpm"), os.path.join(appdir_path, "swift.xpm"))
+
+ print(colors.bold & colors.info | "Download appimagetool to /tmp/appimagetool and make it executable")
+ appimage_url_suffix = ""
+ if swift_architecture_string == ".amd64":
+ appimage_url_suffix = "x86_64.AppImage"
+ else:
+ appimage_url_suffix = "i686.AppImage"
+ local['wget']['-O', '/tmp/appimagetool', 'https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-' + appimage_url_suffix] & FG
+ local['chmod']['a+x', '/tmp/appimagetool']()
+
+ local['mkdir']('-p', os.path.join(git_working_dir, "Packages/Swift"))
+ appimage_path = os.path.join(git_working_dir, "Packages/Swift/" + swift_version.replace(" ", "-") + swift_architecture_string + ".appimage")
+ debug_symbol_path = os.path.join(git_working_dir, "Packages/Swift/" + swift_version.replace(" ", "-") + swift_architecture_string + ".debug")
+
+ print(colors.bold & colors.info | "Extract debug information from swift-im")
+ local['objcopy']('--only-keep-debug', appdir_swift_im_binary, debug_symbol_path)
+ local['strip']('-g', appdir_swift_im_binary)
+ debuglink_retcode = local['objcopy']['--add-gnu-debuglink', debug_symbol_path, os.path.join(swift_install_dir, 'bin/swift-im')] & RETCODE
+ if debuglink_retcode != 0:
+ print(colors.bold & colors.warn | "Failed to create debuglink in binary.")
+
+ print(colors.bold & colors.info | "Generate AppImage from Swift.AppDir")
+ local['/tmp/appimagetool'][appdir_path, appimage_path] & FG
+
+
+if __name__ == '__main__':
+ build_appimage() \ No newline at end of file
diff --git a/Swift/Packaging/appimage/centos6.sh b/Swift/Packaging/appimage/centos6.sh
new file mode 100644
index 0000000..0f27819
--- /dev/null
+++ b/Swift/Packaging/appimage/centos6.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+yum -y install epel-release wget
+# devtools turns out not to work, but it's a step I did so I'm recording it.
+wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo && yum -y upgrade
+yum -y install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++ openssl-devel qt5-qtbase-devel qt5-qttools-libs-designercomponents qt5-qttools-devel qt5-qtwebkit-devel qt5-qtsvg-devel qt5-qttools-devel qt5-qttools-static qt5-qtmultimedia-devel qt5-qtwebchannel-devel qt5-qtimageformats-devel git patch qt5-qtmultimedia-devel qt5-qtx11extras-devel libtool fuse-libs libarchive desktop-file-utils gcc-c++
+cd /
+wget https://github.com/probonopd/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage
+chmod u+rx /appimagetool-i686.AppImage
+wget https://raw.githubusercontent.com/probonopd/AppImages/master/recipes/meta/Recipe
+yum -y install svn texinfo-tex flex zip libgcc.i686 glibc-devel.i686
+mkdir -p /usr/local/src
+cd /usr/local/src
+svn co svn://gcc.gnu.org/svn/gcc/tags/gcc_4_9_4_release/
+cd gcc_4_9_4_release
+./contrib/download_prerequisites
+mkdir release_build
+cd release_build
+../configure --prefix=/usr/local/gcc-4.9.4
+make
+make install
+echo "/usr/local/gcc-4.9.4/lib" > /etc/ld.so.conf.d/newgcc.conf
+echo 'export PATH=/usr/local/gcc-4.9.4/bin:$PATH' >> /etc/profile
+cd /
+git clone https://github.com/swift/swift
+# Run build.sh
diff --git a/Swift/Packaging/appimage/config.py b/Swift/Packaging/appimage/config.py
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Swift/Packaging/appimage/config.py
@@ -0,0 +1 @@
+
diff --git a/Swift/Packaging/appimage/run.sh b/Swift/Packaging/appimage/run.sh
new file mode 100755
index 0000000..2d90490
--- /dev/null
+++ b/Swift/Packaging/appimage/run.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+docker build -t swiftbuild .
diff --git a/Swift/Packaging/appimage/swift.yml b/Swift/Packaging/appimage/swift.yml
new file mode 100644
index 0000000..b873baf
--- /dev/null
+++ b/Swift/Packaging/appimage/swift.yml
@@ -0,0 +1,12 @@
+app: Swift
+
+# ingredients:
+# script:
+# - cp -r /build/* usr/
+script:
+ - cp -r /build/* usr/
+ - strip usr/bin/*
+ - cp /build/share/applications/swift.desktop .
+ - cp /build/share/pixmaps/swift.xpm .
+# post:
+# - cp -r /build/lib/* usr/lib/