1#!/usr/bin/env python3
2
3import os
4import sys
5import subprocess
6
7p = subprocess.Popen("file --dereference `which python3`",
8                     shell=True, stdout=subprocess.PIPE)
9exe_info = p.stdout.read().decode("UTF-8")
10if "386," in exe_info:
11    # arch = "i386"
12    arch = "x86"
13elif "x86-64," in exe_info:
14    # arch = "amd64"
15    arch = "x86-64"
16else:
17    raise Exception("unrecognized arch")
18
19# if os.environ.get("STEAM_RUNTIME", ""):
20if os.environ.get("STEAMOS", ""):
21    os_name = "steamos"
22    # if arch == "i386":
23    #     # steam runtime sdk compiles with -mtune=generic -march=i686
24    #     arch = "i686"
25else:
26    os_name = "linux"
27    os_name_pretty = "Linux"
28
29package_name = "fs-uae-launcher"
30package_version = sys.argv[1]
31dbg_package_dir = "{0}-dbg_{1}_{2}_{3}".format(
32    package_name, package_version, os_name, arch)
33
34package_dir = "../linux/Launcher/Linux//{}".format(arch)
35
36full_package_name = "{0}_{1}_{2}_{3}".format(
37    package_name, package_version, os_name, arch)
38full_package_name_2 = "Launcher_{}_{}_{}".format(
39    package_version, os_name_pretty, arch)
40
41
42def s(command):
43    c = command.format(**globals())
44    print(c)
45    assert os.system(c) == 0
46
47
48def wrap(name, target=None, args=None):
49    if target is None:
50        target = name + ".bin"
51        os.rename(os.path.join(package_dir, name),
52                  os.path.join(package_dir, target))
53    if args is None:
54        args = ["$@"]
55    path = os.path.join(package_dir, name)
56    with open(path, "w") as f:
57        f.write("#!/bin/sh\n")
58        f.write("MYDIR=$(dirname \"$0\")\n")
59        # f.write("export LD_LIBRARY_PATH=\"$MYDIR:$LD_LIBRARY_PATH\"\n")
60        command = "\"$MYDIR/{0}\"".format(target)
61        for arg in args:
62            command += " \"{0}\"".format(arg)
63        if os_name == "steamos":
64            # if arch == "i686":
65            if arch == "x86":
66                bin_dir = "bin32"
67            # elif arch == "amd64":
68            elif arch == "x86-64":
69                bin_dir = "bin32"
70            else:
71                raise Exception("unsupported steamos arch?")
72            f.write("if [ -e \"$HOME/.steam/{0}/steam-runtime/"
73                    "run.sh\" ]; then\n".format(bin_dir))
74            f.write("RUN_SH=\"$HOME/.steam/{0}/steam-runtime/"
75                    "run.sh\"\n".format(bin_dir))
76            f.write("else\n")
77            f.write("RUN_SH=\"/home/steam/.steam/{0}/steam-runtime/"
78                    "run.sh\"\n".format(bin_dir))
79            f.write("fi\n")
80            f.write("exec $RUN_SH {0}\n".format(command))
81        else:
82            f.write("exec {0}\n".format(command))
83    os.chmod(path, 0o755)
84
85
86s("rm -Rf Launcher")
87s("mkdir -p Launcher/Linux")
88# s("make -C ..")
89# s("rm -Rf ../build ../dist")
90
91# Trying to get deterministic .pyc creation
92s("cd ../.. && PYTHONHASHSEED=1 python3 setup.py build_exe")
93s("mv ../../build/exe.linux-*-3.6 {package_dir}")
94
95# we want to perform our own standalone/library management, so we remove the
96# libraries added by cx_Freeze
97s("rm -f {package_dir}/*.so.*")
98s("rm -f {package_dir}/imageformats/*.so.*")
99
100s("rm -f {package_dir}/platforms/libqdirectfb.so")
101s("rm -f {package_dir}/platforms/libqlinuxfb.so")
102s("rm -f {package_dir}/platforms/libqminimal.so")
103s("rm -f {package_dir}/platforms/libqoffscreen.so")
104s("./standalone-linux.py {package_dir}/platforms")
105s("mv {package_dir}/platforms/*.so.* {package_dir}")
106s("./standalone-linux.py --no-copy --strip --rpath='$ORIGIN/..' {package_dir}/platforms")
107# s("rm {package_dir}/platforms/*.so.*")
108
109s("rm -f {package_dir}/imageformats/libqdds.so")
110s("rm -f {package_dir}/imageformats/libqicns.so")
111s("rm -f {package_dir}/imageformats/libqjp2.so")
112s("rm -f {package_dir}/imageformats/libqmng.so")
113s("rm -f {package_dir}/imageformats/libqsvg.so")
114s("rm -f {package_dir}/imageformats/libqtga.so")
115s("rm -f {package_dir}/imageformats/libqtiff.so")
116s("rm -f {package_dir}/imageformats/libqwbmp.so")
117s("rm -f {package_dir}/imageformats/libqwebp.so")
118s("./standalone-linux.py {package_dir}/imageformats")
119s("mv {package_dir}/imageformats/*.so.* {package_dir}")
120s("./standalone-linux.py --no-copy --strip --rpath='$ORIGIN/..' {package_dir}/imageformats")
121# s("rm {package_dir}/imageformats/*.so.*")
122
123from PyQt5 import QtCore
124dir0 = os.path.join(os.path.dirname(QtCore.__file__), "plugins")
125for libpath in QtCore.QCoreApplication.libraryPaths() + [dir0]:
126    print(libpath)
127    p = os.path.join(libpath, "xcbglintegrations")
128    if os.path.exists(p):
129        s("cp -a \"{0}\" {{package_dir}}/".format(p))
130s("./standalone-linux.py {package_dir}/xcbglintegrations")
131s("mv {package_dir}/xcbglintegrations/*.so.* {package_dir}")
132s("./standalone-linux.py --no-copy --strip --rpath='$ORIGIN/..' {package_dir}/xcbglintegrations")
133# s("rm {package_dir}/xcbglintegrations/*.so.*")
134
135# s("mv {package_dir}/platforms/* {package_dir}")
136# s("mv {package_dir}/imageformats/* {package_dir}")
137# s("mv {package_dir}/xcbglintegrations/* {package_dir}")
138# s("rm -Rf {package_dir}/platforms")
139# s("rm -Rf {package_dir}/imageformats")
140# s("rm -Rf {package_dir}/xcbglintegrations")
141
142# s("./standalone-linux.py {package_dir}")
143# s("strip {package_dir}/*.so.*")
144# s("strip {package_dir}/*.so")
145
146# Must remove .standalone files to force processing the ones copied
147# from the Qt plugin dirs
148s("find {package_dir} -name '*.standalone' -delete")
149s("./standalone-linux.py --strip --rpath='$ORIGIN' {package_dir}")
150s("find {package_dir} -name '*.standalone' -delete")
151
152s("chmod a-x {package_dir}/*.so")
153s("cd ../.. && make")
154s("mkdir Launcher/Data")
155s("cp ../../cacert.pem Launcher/Data")
156s("cp -a ../../share/locale Launcher/Data/Locale")
157# s("cp -a ../../share {package_dir}")
158# s("rm -Rf {package_dir}/share/applications")
159# s("rm -Rf {package_dir}/share/icons")
160
161s("rm -Rf {package_dir}/amitools")
162s("rm -Rf {package_dir}/arcade")
163s("rm -Rf {package_dir}/fsbc")
164# s("rm -Rf {package_dir}/fsboot")
165s("rm -Rf {package_dir}/fsgs")
166s("rm -Rf {package_dir}/fspy")
167s("rm -Rf {package_dir}/fstd")
168s("rm -Rf {package_dir}/fsui")
169s("rm -Rf {package_dir}/launcher")
170s("rm -Rf {package_dir}/OpenGL")
171s("rm -Rf {package_dir}/oyoyo")
172s("rm -Rf {package_dir}/workspace")
173
174s("zip -d {package_dir}/library.zip amitools/\*")
175s("zip -d {package_dir}/library.zip arcade/\*")
176s("zip -d {package_dir}/library.zip fsbc/\*")
177# s("zip -d {package_dir}/library.zip fsboot/\*")
178s("zip -d {package_dir}/library.zip fsgs/\*")
179s("zip -d {package_dir}/library.zip fspy/\*")
180s("zip -d {package_dir}/library.zip fstd/\*")
181s("zip -d {package_dir}/library.zip fsui/\*")
182s("zip -d {package_dir}/library.zip launcher/\*")
183s("zip -d {package_dir}/library.zip OpenGL/\*")
184s("zip -d {package_dir}/library.zip oyoyo/\*")
185s("zip -d {package_dir}/library.zip workspace/\*")
186
187s("zip -d {package_dir}/library.zip BUILD_CONSTANTS.pyc")
188s("PYTHONPATH=../.. python3 -m fspy.zipfile deterministic "
189  "--fix-pyc-timestamps {package_dir}/library.zip")
190
191# s("cp -a ../python/*.zip {package_dir}")
192s("mkdir Launcher/Python")
193s("cp -a ../python/*.zip Launcher/Python")
194
195s("echo {package_version} > Launcher/Version.txt")
196s("echo {package_version} > {package_dir}/Version.txt")
197
198if os_name == "steamos":
199    # s("mv {package_dir}/fs-uae-launcher {package_dir}/fs-uae-launcher.bin")
200    wrap("fs-uae-launcher")
201    wrap("fs-uae-arcade", "fs-uae-launcher.bin", ["--fs-uae-arcade", "$@"])
202
203# s("cd {package_dir} && tar Jcfv ../../../{full_package_name}.tar.xz *")
204s("tar Jcfv ../../{full_package_name}.tar.xz Launcher")
205s("cp ../../{full_package_name}.tar.xz ../../{full_package_name_2}.tar.xz")
206
207# s("rm -Rf {dbg_package_dir}")
208# s("mkdir {dbg_package_dir}")
209# s("cp -a ../fs-uae.dbg {dbg_package_dir}/")
210# s("cp -a ../fs-uae-device-helper.dbg {dbg_package_dir}/")
211# s("cd {dbg_package_dir} && tar Jcfv ../../{dbg_package_dir}.tar.xz *")
212