2018-06-22 15:09:07 +00:00
|
|
|
# Creating a Pyodide package
|
|
|
|
|
|
|
|
Pyodide includes a set of automatic tools to make it easier to add new
|
|
|
|
third-party Python libraries to the build.
|
|
|
|
|
2018-06-22 15:49:32 +00:00
|
|
|
These tools automate the following steps to build a package:
|
2018-06-22 15:09:07 +00:00
|
|
|
|
2018-06-22 15:49:32 +00:00
|
|
|
- Download a source tarball (usually from PyPI)
|
|
|
|
- Confirm integrity of the package by comparing it to a checksum
|
|
|
|
- Apply patches, if any, to the source distribution
|
|
|
|
- Add extra files, if any, to the source distribution
|
2018-06-22 15:09:07 +00:00
|
|
|
- If the package includes C/C++/Cython extensions:
|
2018-06-22 15:49:32 +00:00
|
|
|
- Build the package natively, keeping track of invocations of the native
|
2018-06-22 15:09:07 +00:00
|
|
|
compiler and linker
|
2018-06-22 15:49:32 +00:00
|
|
|
- Rebuild the package using emscripten to target WebAssembly
|
2018-06-22 15:09:07 +00:00
|
|
|
- If the package is pure Python:
|
2018-06-22 15:49:32 +00:00
|
|
|
- Run the `setup.py` script to get the built package
|
|
|
|
- Package the results into an emscripten virtual filesystem package, which
|
2018-06-22 15:09:07 +00:00
|
|
|
comprises:
|
|
|
|
- A `.data` file containing the file contents of the whole package,
|
|
|
|
concatenated together
|
|
|
|
- A `.js` file which contains metadata about the files and installs them into
|
|
|
|
the virtual filesystem.
|
|
|
|
|
|
|
|
Lastly, a `packages.json` file is output containing the dependency tree of all
|
|
|
|
packages, so `pyodide.loadPackage` can load a package's dependencies
|
|
|
|
automatically.
|
|
|
|
|
|
|
|
## The meta.yaml file
|
|
|
|
|
|
|
|
Packages are defined by writing a `meta.yaml` file. The format of these files is
|
2018-06-22 18:54:59 +00:00
|
|
|
based on the `meta.yaml` files used to build [Conda
|
|
|
|
packages](https://conda.io/docs/user-guide/tasks/build-packages/define-metadata.html),
|
2018-06-22 15:09:07 +00:00
|
|
|
though it is much more limited. The most important limitation is that Pyodide
|
2018-06-22 15:49:32 +00:00
|
|
|
assumes there will only be one version of a given library available, whereas
|
|
|
|
Conda allows the user to specify the versions of each package that they want to
|
|
|
|
install. Despite the limitations, keeping the file format as close as possible
|
|
|
|
to conda's should make it easier to use existing conda package definitions as a
|
|
|
|
starting point to create Pyodide packages. In general, however, one should not
|
|
|
|
expect Conda packages to "just work" with Pyodide. (In the longer term, Pyodide
|
|
|
|
may use conda as its packaging system, and this should hopefully ease that
|
|
|
|
transition.)
|
2018-06-22 15:09:07 +00:00
|
|
|
|
|
|
|
The supported keys in the `meta.yaml` file are described below.
|
|
|
|
|
|
|
|
### `package`
|
|
|
|
|
|
|
|
#### `package/name`
|
|
|
|
|
|
|
|
The name of the package. It must match the name of the package used when
|
|
|
|
expanding the tarball, which is sometimes different from the name of the package
|
|
|
|
in the Python namespace when installed. It must also match the name of the
|
2018-08-29 08:40:10 +00:00
|
|
|
directory in which the `meta.yaml` file is placed. It can only contain
|
|
|
|
alpha-numeric characters and `-`, `_`.
|
2018-06-22 15:09:07 +00:00
|
|
|
|
|
|
|
#### `package/version`
|
|
|
|
|
|
|
|
The version of the package.
|
|
|
|
|
|
|
|
### `source`
|
|
|
|
|
|
|
|
#### `source/url`
|
|
|
|
|
|
|
|
The url of the source tarball.
|
|
|
|
|
|
|
|
The tarball may be in any of the formats supported by Python's
|
2018-06-22 15:49:32 +00:00
|
|
|
`shutil.unpack_archive`: `tar`, `gztar`, `bztar`, `xztar`, and `zip`.
|
2018-06-22 15:09:07 +00:00
|
|
|
|
|
|
|
#### `source/md5`
|
|
|
|
|
2018-08-06 15:03:51 +00:00
|
|
|
The MD5 checksum of the tarball. It is recommended to use SHA256 instead of MD5.
|
2018-08-06 15:31:20 +00:00
|
|
|
At most one checksum entry should be provided per package.
|
2018-08-06 15:03:51 +00:00
|
|
|
|
|
|
|
#### `source/sha256`
|
|
|
|
|
|
|
|
The SHA256 checksum of the tarball. It is recommended to use SHA256 instead of MD5.
|
2018-08-06 15:31:20 +00:00
|
|
|
At most one checksum entry should be provided per package.
|
2018-06-22 15:09:07 +00:00
|
|
|
|
|
|
|
#### `source/patches`
|
|
|
|
|
|
|
|
A list of patch files to apply after expanding the tarball. These are applied
|
|
|
|
using `patch -p1` from the root of the source tree.
|
|
|
|
|
|
|
|
#### `source/extras`
|
|
|
|
|
|
|
|
Extra files to add to the source tree. This should be a list where each entry is
|
|
|
|
a pair of the form `(src, dst)`. The `src` path is relative to the directory in
|
|
|
|
which the `meta.yaml` file resides. The `dst` path is relative to the root of
|
|
|
|
source tree (the expanded tarball).
|
|
|
|
|
|
|
|
### `build`
|
|
|
|
|
2018-10-29 11:52:13 +00:00
|
|
|
#### `build/skip_host`
|
|
|
|
|
|
|
|
Skip building C extensions for the host environment. Default: `True`.
|
|
|
|
|
|
|
|
Setting this to `False` will result in ~2x slower builds for packages that
|
|
|
|
include C extensions. It should only be needed when a package is a build
|
|
|
|
time dependency for other packages. For instance, numpy is imported during
|
|
|
|
installation of matplotlib, importing numpy also imports included C extensions,
|
|
|
|
therefore it is built both for host and target.
|
|
|
|
|
|
|
|
|
2018-06-22 15:09:07 +00:00
|
|
|
#### `build/cflags`
|
|
|
|
|
|
|
|
Extra arguments to pass to the compiler when building for WebAssembly.
|
|
|
|
|
2018-06-22 15:49:32 +00:00
|
|
|
(This key is not in the Conda spec).
|
|
|
|
|
2018-06-22 15:09:07 +00:00
|
|
|
#### `build/ldflags`
|
|
|
|
|
|
|
|
Extra arguments to pass to the linker when building for WebAssembly.
|
|
|
|
|
2018-06-22 15:49:32 +00:00
|
|
|
(This key is not in the Conda spec).
|
|
|
|
|
2018-06-22 15:09:07 +00:00
|
|
|
#### `build/post`
|
|
|
|
|
|
|
|
Shell commands to run after building the library. These are run inside of
|
|
|
|
`bash`, and there are two special environment variables defined:
|
|
|
|
|
2018-07-18 13:26:18 +00:00
|
|
|
- `$SITEPACKAGES`: The `site-packages` directory into which the package has been installed.
|
2018-06-22 15:09:07 +00:00
|
|
|
- `$PKGDIR`: The directory in which the `meta.yaml` file resides.
|
|
|
|
|
2018-06-22 15:49:32 +00:00
|
|
|
(This key is not in the Conda spec).
|
2018-06-22 15:09:07 +00:00
|
|
|
|
|
|
|
### `requirements`
|
|
|
|
|
|
|
|
#### `requirements/run`
|
|
|
|
|
|
|
|
A list of required packages.
|
|
|
|
|
|
|
|
(Unlike conda, this only supports package names, not versions).
|