diff --git a/src/pup/__main__.py b/src/pup/__main__.py index 2dc874f..82fb5cb 100644 --- a/src/pup/__main__.py +++ b/src/pup/__main__.py @@ -73,9 +73,10 @@ def main(log_level): @click.option('--nice-name') @click.option('--icon-path') @click.option('--license-path') +@click.option('--pip-platform', default=None) @click.argument('src') @command_wrapper -def package(src, ignore_plugins, python_version, launch_module, launch_pyflags, nice_name, icon_path, license_path): +def package(src, ignore_plugins, python_version, launch_module, launch_pyflags, nice_name, icon_path, license_path, pip_platform): """ Packages the GUI application in the given pip-installable source. """ @@ -88,4 +89,5 @@ def package(src, ignore_plugins, python_version, launch_module, launch_pyflags, nice_name=nice_name, icon_path=icon_path, license_path=license_path, + pip_platform=pip_platform, ) diff --git a/src/pup/api.py b/src/pup/api.py index ceab577..ebff1f1 100644 --- a/src/pup/api.py +++ b/src/pup/api.py @@ -24,6 +24,7 @@ def _context( nice_name=None, icon_path=None, license_path=None, + pip_platform=None, ): return context.Context( @@ -35,6 +36,7 @@ def _context( license_path=license_path, ignore_plugins=ignore_plugins, platform=sys.platform, + pip_platform=pip_platform, python_version=python_version, ) @@ -50,11 +52,12 @@ def package( nice_name=None, icon_path=None, license_path=None, + pip_platform=None, ): _log.info('Package %r: starting.', src) - ctx = _context(ignore_plugins, src, python_version, launch_module, launch_pyflags, nice_name, icon_path, license_path) + ctx = _context(ignore_plugins, src, python_version, launch_module, launch_pyflags, nice_name, icon_path, license_path, pip_platform) dsp = dispatcher.Dispatcher(ctx) dsp.collect_src_metadata() diff --git a/src/pup/context.py b/src/pup/context.py index c2c7402..deeac53 100644 --- a/src/pup/context.py +++ b/src/pup/context.py @@ -19,6 +19,7 @@ def __init__( license_path, ignore_plugins, platform, + pip_platform, python_version, ): @@ -52,6 +53,8 @@ def __init__( self.final_artifact = None + self.pip_platform = pip_platform + @property def nice_name(self): diff --git a/src/pup/plugins/pip_install.py b/src/pup/plugins/pip_install.py index 2e815d1..deef005 100644 --- a/src/pup/plugins/pip_install.py +++ b/src/pup/plugins/pip_install.py @@ -4,6 +4,7 @@ import logging import subprocess +import os _log = logging.getLogger(__name__) @@ -25,13 +26,33 @@ def usable_in(ctx): ) def __call__(self, ctx, dsp): + python_path = str(ctx.python_runtime_dir / ctx.python_rel_exe) + + platform_flags = [] + if ctx.pip_platform: + platform_flags.append('--platform={}'.format(ctx.pip_platform)) + platform_flags.append('--only-binary=:all:') + # TODO: This should probably be done with the spawn helpers, but + # done this way as a proof of concept + site_packages_path = subprocess.check_output([ + python_path, + '-c', + 'import site; print(site.getsitepackages()[0], end="")' + ]) + site_packages_path = site_packages_path.decode("utf-8") + if os.path.isdir(site_packages_path): + platform_flags.append('--target') + platform_flags.append('{}'.format(site_packages_path)) + else: + raise Exception("Invalid site-packages directory: {}".format(site_packages_path)) cmd = [ - str(ctx.python_runtime_dir / ctx.python_rel_exe), + python_path, '-m', 'pip', 'install', '--no-warn-script-location', + *platform_flags, ctx.src_wheel, ]