distutils/setuptools integration

Have p4a apk run setup.py (replaces --requirements)

If your project has a setup.py file, then it can be executed by p4a when your app is packaged such that your app properly ends up in the packaged site-packages. (Use --use-setup-py to enable this, --ignore-setup-py to prevent it)

This is functionality to run setup.py INSIDE `p4a apk`, as opposed to the other section below, which is about running p4a inside setup.py.

This however has these caveats:

  • Only your ``main.py`` from your app’s ``–private`` data is copied into the .apk! Everything else needs to be installed by your setup.py into the site-packages, or it won’t be packaged.
  • All dependencies that map to recipes can only be pinned to exact versions, all other constraints will either just plain not work or even cause build errors. (Sorry, our internal processing is just not smart enough to honor them properly at this point)
  • If you don’t use Python 3 per default, you still need to specify --requirements python2 (without any additional dependencies)
  • The dependency analysis at the start may be quite slow and delay your build

Reasons why you would want to use a setup.py to be processed (and omit specifying --requirements):

  • You want to use a more standard mechanism to specify dependencies instead of --requirements
  • You already use a setup.py for other platforms
  • Your application imports itself in a way that won’t work unless installed to site-packages)

Reasons not to use a setup.py (that is to use the usual --requirements mechanism instead):

  • You don’t use a setup.py yet, and prefer the simplicity of just specifying --requirements
  • Your setup.py assumes a desktop platform and pulls in Android-incompatible dependencies, and you are not willing to change this, or you want to keep it separate from Android deployment for other organizational reasons
  • You need data files to be around that aren’t installed by your setup.py into the site-packages folder

Use your setup.py to call p4a

Instead of running p4a via the command line, you can call it via setup.py instead, by it integrating with distutils and setup.py.

This is functionality to run p4a INSIDE setup.py, as opposed to the other section above, which is about running setup.py inside `p4a apk`.

The base command is:

python setup.py apk

The files included in the APK will be all those specified in the package_data argument to setup. For instance, the following example will include all .py and .png files in the testapp folder:

from distutils.core import setup
from setuptools import find_packages

setup(
    name='testapp_setup',
    version='1.1',
    description='p4a setup.py example',
    author='Your Name',
    author_email='youremail@address.com',
    packages=find_packages(),
    options=options,
    package_data={'testapp': ['*.py', '*.png']}
)

The app name and version will also be read automatically from the setup.py.

The Android package name uses org.test.lowercaseappname if not set explicitly.

The --private argument is set automatically using the package_data. You should not set this manually.

The target architecture defaults to --armeabi.

All of these automatic arguments can be overridden by passing them manually on the command line, e.g.:

python setup.py apk --name="Testapp Setup" --version=2.5

Adding p4a arguments in setup.py

Instead of providing extra arguments on the command line, you can store them in setup.py by passing the options parameter to setup. For instance:

from distutils.core import setup
from setuptools import find_packages

options = {'apk': {'debug': None,  # use None for arguments that don't pass a value
                   'requirements': 'sdl2,pyjnius,kivy,python2',
                   'android-api': 19,
                   'ndk-dir': '/path/to/ndk',
                   'dist-name': 'bdisttest',
                   }}

packages = find_packages()
print('packages are', packages)

setup(
    name='testapp_setup',
    version='1.1',
    description='p4a setup.py example',
    author='Your Name',
    author_email='youremail@address.com',
    packages=find_packages(),
    options=options,
    package_data={'testapp': ['*.py', '*.png']}
)

These options will be automatically included when you run python setup.py apk. Any options passed on the command line will override these values.

Adding p4a arguments in setup.cfg

You can also provide p4a arguments in the setup.cfg file, as normal for distutils. The syntax is:

[apk]

argument=value

requirements=sdl2,kivy