build.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import os
  2. import subprocess
  3. import sys
  4. from ..utils.deps import APPIMAGETOOL, ensure_appimagetool
  5. from ..utils.docker import docker_run
  6. from ..utils.fs import copy_tree
  7. from ..utils.log import debug, log
  8. from ..utils.tmp import TemporaryDirectory
  9. __all__ = ['build_appimage']
  10. def build_appimage(appdir=None, destination=None):
  11. '''Build an AppImage from an AppDir
  12. '''
  13. if appdir is None:
  14. appdir = 'AppDir'
  15. log('BUILD', appdir)
  16. ensure_appimagetool()
  17. cmd = [APPIMAGETOOL, appdir]
  18. if destination is not None:
  19. cmd.append(destination)
  20. cmd = ' '.join(cmd)
  21. debug('SYSTEM', cmd)
  22. p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
  23. stderr=subprocess.STDOUT)
  24. stdout = []
  25. while True:
  26. out = p.stdout.readline()
  27. try:
  28. out = out.decode()
  29. except AttributeError:
  30. out = str(out)
  31. stdout.append(out)
  32. if out == '' and p.poll() is not None:
  33. break
  34. elif out:
  35. out = out.replace('%', '%%')[:-1]
  36. for line in out.split(os.linesep):
  37. if line.startswith('WARNING'):
  38. log('WARNING', line[9:])
  39. elif line.startswith('Error'):
  40. raise RuntimeError(line)
  41. else:
  42. debug('APPIMAGE', line)
  43. rc = p.poll()
  44. if rc != 0:
  45. print(''.join(stdout))
  46. sys.stdout.flush()
  47. raise RuntimeError('Could not build AppImage')