looper/build-appimage.py

124 lines
4.5 KiB
Python
Raw Normal View History

2024-09-16 15:05:53 -07:00
#!/usr/bin/env python3
import os
import sys
from os import path
from sys import argv
import urllib
from subprocess import call, check_output
import shutil
import pathlib
from urllib import request
from urllib.request import urlretrieve
import lddwrap
import argparse
from resolve_library import resolve as resolve_library
basedir = path.realpath(path.dirname(__file__))
def download_always(url: str, filename: str) -> None:
urlretrieve(url, filename)
def download_if_not_found(url: str, filename: str) -> None:
if path.exists(filename):
return
download_always(url, filename)
def download_appimagetool():
url = "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
filename = "appimagetool"
download_if_not_found(url, filename)
def build(*args: list[str]):
call(args=["./build.sh", *args])
def remove_recursive(inpath: str):
print("remove_recursive(%s)" % inpath)
if path.isdir(inpath) and not path.islink(inpath):
for inner in os.listdir(inpath):
remove_recursive(path.join(inpath, inner))
print("os.removedirs(%s)" % inpath)
os.removedirs(inpath)
elif path.islink(inpath):
print("os.unlink(%s)" % inpath)
os.unlink(inpath)
else:
print("os.remove(%s)" % inpath)
os.remove(inpath)
def force_link(src: str, dst: str):
if path.exists(dst):
remove_recursive(dst)
os.symlink(src, dst)
def force_copy(src: str, dst: str):
print("force_copy(%s, %s)" % (src, dst))
if path.exists(dst) and path.isdir(dst):
dst = path.join(dst, path.basename(src))
if path.exists(dst):
remove_recursive(dst)
shutil.copy(src, dst)
def copy_libraries(libpath: str, previous: list[str] = []):
print("Getting libraries for '%s'..." % libpath)
for lib in lddwrap.list_dependencies(pathlib.Path(libpath)):
if str(lib.path) in previous:
continue
print(" - Library %s" % lib.soname, end="")
if lib.path == None:
print("")
continue
print(" (%s)" % lib.path)
inpaths = resolve_library(str(lib.path))
for inpath in inpaths:
outpath = path.join("AppDir/lib", path.basename(inpath))
force_copy(inpath, outpath)
previous.append(str(lib.path))
copy_libraries(str(lib.path), previous)
def overwrite_file(dst: str, contents: str):
if path.exists(dst):
remove_recursive(dst)
with open(dst, "wt+") as f:
f.write(contents)
def main() -> None:
P = argparse.ArgumentParser()
P.add_argument("-j", "--parallel", action=argparse._StoreAction, default=0, type=int, help="Specifies the number of jobs to use. Set to 1 to disable parallelism", dest="parallel")
P.add_argument("-D", "--define", default=[], action=argparse._AppendAction, help="Defines a CMake variable", dest="cmake_vars")
p = P.parse_args(argv[1:])
old_dir = os.curdir
os.chdir(basedir)
2024-11-06 15:22:53 -08:00
os.makedirs("build", exist_ok=True)
2024-09-16 15:05:53 -07:00
os.chdir("build")
2024-12-18 13:09:07 -08:00
args=["cmake", "..", "-DBUILD_SDL=ON", "-DBUILD_SOUNDTOUCH=ON"]
2024-09-16 15:05:53 -07:00
for definition in p.cmake_vars:
args.append("-D%s" % definition)
ret = call(args);
if ret != 0:
exit(ret)
parallel = p.parallel
if parallel == 0:
parallel = os.cpu_count()
args=["cmake", "--build", ".", "-j%d" % parallel]
ret = call(args)
if ret != 0:
exit(ret)
download_appimagetool()
os.makedirs("AppDir", exist_ok=True)
for dir in ["bin", "lib", "share"]:
os.makedirs(path.join("AppDir", dir), exist_ok=True)
force_link(".", "AppDir/usr")
force_link(".", "AppDir/local")
force_link("lib", "AppDir/lib64")
force_copy("looper", "AppDir/bin")
copy_libraries("looper")
force_copy(path.join(basedir, "assets/com.complecwaft.Looper.desktop"), "AppDir")
force_copy(path.join(basedir, "assets/icon.svg"), "AppDir/looper.svg")
force_copy(path.join(basedir, "assets/icon.png"), "AppDir/looper.png")
overwrite_file("AppDir/AppRun", """#!/bin/bash
export LD_LIBRARY_PATH="$APPDIR/lib"
if [ "$1" = "--gdb" ]; then
shift
exec gdb --args "$APPDIR/usr/bin/looper" "$@"
else
exec "$APPDIR/usr/bin/looper" "$@"
fi""")
os.chmod("AppDir/AppRun", 0o777)
arch = check_output(["uname", "-m"])
print("Architecture: %s" % arch.decode())
os.environ["ARCH"] = arch.decode().removesuffix("\n")
call(args=["./appimagetool", "AppDir", "Looper.AppImage"])
os.chdir(old_dir)
if __name__ == "__main__":
main()