aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz@archlinux.org>2022-03-27 00:56:26 -0400
committerJussi Pakkanen <jpakkane@gmail.com>2022-03-30 02:06:52 +0300
commit258cd5d5836a6660f1122cec274f0a947c1d0459 (patch)
tree72f1ecb04c9c3540aa03ba23ef512a2a1c00ea32
parentff8a9c9efb9937e7d7776bba8b85930ed44192fa (diff)
downloadmeson-258cd5d5836a6660f1122cec274f0a947c1d0459.zip
meson-258cd5d5836a6660f1122cec274f0a947c1d0459.tar.gz
meson-258cd5d5836a6660f1122cec274f0a947c1d0459.tar.bz2
packaging: rework how pyinstaller gets its instructions
Make use of pyinstaller hooks by creating a hook that updates how the `mesonbuild` import functions. This is more or less the same as passing a bajillion arguments to pyinstaller's CLI, but allows the logic to be self-contained (and reusable). It becomes more obvious what parts of the process pertain to pyinstaller, and which parts pertain to MSI/pkg creation.
-rwxr-xr-xpackaging/createmsi.py47
-rwxr-xr-xpackaging/createpkg.py5
-rw-r--r--packaging/hook-mesonbuild.py49
3 files changed, 51 insertions, 50 deletions
diff --git a/packaging/createmsi.py b/packaging/createmsi.py
index 653caa5..fe49b7b 100755
--- a/packaging/createmsi.py
+++ b/packaging/createmsi.py
@@ -39,49 +39,6 @@ def gen_guid():
'''
return str(uuid.uuid4()).upper()
-def get_all_modules_from_dir(dirname):
- '''
- Get all modules required for Meson build MSI package
- from directories.
- '''
- modname = os.path.basename(dirname)
- modules = [os.path.splitext(os.path.split(x)[1])[0] for x in glob(os.path.join(dirname, '*'))]
- modules = ['mesonbuild.' + modname + '.' + x for x in modules if not x.startswith('_')]
- return modules
-
-def get_more_modules():
- '''
- Getter for missing Modules.
- Python packagers want to be minimal and only copy the things
- that they can see that being used. They are blind to many things.
- '''
- return ['distutils.archive_util',
- 'distutils.cmd',
- 'distutils.config',
- 'distutils.core',
- 'distutils.debug',
- 'distutils.dep_util',
- 'distutils.dir_util',
- 'distutils.dist',
- 'distutils.errors',
- 'distutils.extension',
- 'distutils.fancy_getopt',
- 'distutils.file_util',
- 'distutils.spawn',
- 'distutils.util',
- 'distutils.version',
- 'distutils.command.build_ext',
- 'distutils.command.build',
- 'distutils.command.install',
- 'filecmp',
- ]
-
-def get_modules():
- modules = get_all_modules_from_dir('mesonbuild/modules')
- modules += get_all_modules_from_dir('mesonbuild/scripts')
- modules += get_more_modules()
- return modules
-
class Node:
'''
Node to hold path and directory values
@@ -166,7 +123,6 @@ class PackageGenerator:
if os.path.exists(sdir):
shutil.rmtree(sdir)
main_stage, ninja_stage = self.staging_dirs
- modules = get_modules()
pyinstaller = shutil.which('pyinstaller')
if not pyinstaller:
@@ -178,10 +134,9 @@ class PackageGenerator:
shutil.rmtree(pyinstaller_tmpdir)
pyinst_cmd = [pyinstaller,
'--clean',
+ '--additional-hooks-dir=packaging',
'--distpath',
pyinstaller_tmpdir]
- for m in modules:
- pyinst_cmd += ['--hidden-import', m]
pyinst_cmd += ['meson.py']
subprocess.check_call(pyinst_cmd)
shutil.move(pyinstaller_tmpdir + '/meson', main_stage)
diff --git a/packaging/createpkg.py b/packaging/createpkg.py
index 533b3b9..70da656 100755
--- a/packaging/createpkg.py
+++ b/packaging/createpkg.py
@@ -22,8 +22,6 @@ import xml.etree.ElementTree as ET
sys.path.append(os.getcwd())
from mesonbuild import coredata
-from createmsi import get_modules
-
class PkgGenerator:
def __init__(self):
@@ -46,10 +44,9 @@ class PkgGenerator:
pyinstaller_bin = '/Users/jpakkane/Library/Python/3.8/bin/pyinstaller'
pyinst_cmd = [pyinstaller_bin,
'--clean',
+ '--additional-hooks-dir=packaging',
'--distpath',
self.pkg_dir]
- for m in get_modules():
- pyinst_cmd += ['--hidden-import', m]
pyinst_cmd += ['meson.py']
subprocess.check_call(pyinst_cmd)
tmpdir = os.path.join(self.pkg_dir, 'meson')
diff --git a/packaging/hook-mesonbuild.py b/packaging/hook-mesonbuild.py
new file mode 100644
index 0000000..b5f09ef
--- /dev/null
+++ b/packaging/hook-mesonbuild.py
@@ -0,0 +1,49 @@
+#!hint/python3
+
+"""
+PyInstaller hook to make mesonbuild include everything it needs to.
+"""
+
+import os
+from glob import glob
+
+hiddenimports = []
+
+def get_all_modules_from_dir(dirname):
+ '''
+ Get all modules required for Meson itself from directories.
+ '''
+ modname = os.path.basename(dirname)
+ modules = [os.path.splitext(os.path.split(x)[1])[0] for x in glob(os.path.join(dirname, '*'))]
+ modules = ['mesonbuild.' + modname + '.' + x for x in modules if not x.startswith('_')]
+ return modules
+
+hiddenimports += get_all_modules_from_dir('mesonbuild/modules')
+hiddenimports += get_all_modules_from_dir('mesonbuild/scripts')
+
+# Python packagers want to be minimal and only copy the things
+# that they can see being used. They are blind to many things.
+hiddenimports += [
+ # we run distutils as a subprocess via INTROSPECT_COMMAND.
+ 'distutils.archive_util',
+ 'distutils.cmd',
+ 'distutils.config',
+ 'distutils.core',
+ 'distutils.debug',
+ 'distutils.dep_util',
+ 'distutils.dir_util',
+ 'distutils.dist',
+ 'distutils.errors',
+ 'distutils.extension',
+ 'distutils.fancy_getopt',
+ 'distutils.file_util',
+ 'distutils.spawn',
+ 'distutils.util',
+ 'distutils.version',
+ 'distutils.command.build_ext',
+ 'distutils.command.build',
+ 'distutils.command.install',
+
+ # needed for gtk's find_program() scripts
+ 'filecmp',
+]