solana-program-library/README.md

105 lines
3.3 KiB
Markdown
Raw Permalink Normal View History

2020-05-29 15:00:47 -07:00
[![Build status][travis-image]][travis-url]
2020-07-28 11:00:37 -07:00
[travis-image]:
https://travis-ci.org/solana-labs/solana-program-library.svg?branch=master
2020-05-29 15:00:47 -07:00
[travis-url]: https://travis-ci.org/solana-labs/solana-program-library
2020-05-29 12:41:23 -07:00
# Solana Program Library
2020-05-31 08:52:00 -07:00
The Solana Program Library (SPL) is a collection of on-chain programs targeting
2020-07-28 11:00:37 -07:00
the [Sealevel parallel
runtime](https://medium.com/solana-labs/sealevel-parallel-processing-thousands-of-smart-contracts-d814b378192).
These programs are tested against Solana's implementation of Sealevel,
solana-runtime, and deployed to its mainnet. As others implement Sealevel, we
will graciously accept patches to ensure the programs here are portable across
all implementations.
Full documentation is available at https://spl.solana.com
## Development
### Environment Setup
1. Install the latest Rust stable from https://rustup.rs/
2021-03-26 10:34:28 -07:00
2. Install Solana v1.6.1 or later from https://docs.solana.com/cli/install-solana-cli-tools
adding a dep i needed when building on Ubuntu 20.10 when building for the first time: ``` error: failed to run custom build command for `hidapi v1.2.5` Caused by: process didn't exit successfully: `solana-program-library/target/debug/build/hidapi-81175f45ee69e1c2/build-script-build` (exit code: 101) --- stdout cargo:rerun-if-env-changed=LIBUDEV_NO_PKG_CONFIG cargo:rerun-if-env-changed=PKG_CONFIG cargo:rerun-if-env-changed=LIBUDEV_STATIC cargo:rerun-if-env-changed=LIBUDEV_DYNAMIC cargo:rerun-if-env-changed=PKG_CONFIG_ALL_STATIC cargo:rerun-if-env-changed=PKG_CONFIG_ALL_DYNAMIC cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64-unknown-linux-gnu cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64_unknown_linux_gnu cargo:rerun-if-env-changed=HOST_PKG_CONFIG_PATH cargo:rerun-if-env-changed=PKG_CONFIG_PATH cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64-unknown-linux-gnu cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64_unknown_linux_gnu cargo:rerun-if-env-changed=HOST_PKG_CONFIG_LIBDIR cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64-unknown-linux-gnu cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_gnu cargo:rerun-if-env-changed=HOST_PKG_CONFIG_SYSROOT_DIR cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR --- stderr thread 'main' panicked at 'Unable to find libudev: Failure { command: "\"pkg-config\" \"--libs\" \"--cflags\" \"libudev\"", output: Output { status: ExitStatus(ExitStatus(256)), stdout: "", stderr: "Package libudev was not found in the pkg-config search path.\nPerhaps you should add the directory containing `libudev.pc\'\nto the PKG_CONFIG_PATH environment variable\nNo package \'libudev\' found\n" } }', ~/.cargo/registry/src/github.com-1ecc6299db9ec823/hidapi-1.2.5/build.rs:53:54 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace warning: build failed, waiting for other jobs to finish... error: build failed ```
2021-03-26 10:13:19 -07:00
3. Install the `libudev` development package for your distribution (`libudev-dev` on Debian-derived distros, `libudev-devel` on Redhat-derived).
### Build
The normal cargo build is available for building programs against your host machine:
```
$ cargo build
```
To build a specific program, such as SPL Token, for the Solana BPF target:
```
$ cd token/program
$ cargo build-bpf
```
### Test
Unit tests contained within all projects can be run with:
```bash
2020-11-06 09:31:24 -08:00
$ cargo test # <-- runs host-based tests
$ cargo test-bpf # <-- runs BPF program tests
```
To run a specific program's tests, such as SPL Token:
```
$ cd token/program
2020-11-06 09:31:24 -08:00
$ cargo test # <-- runs host-based tests
$ cargo test-bpf # <-- runs BPF program tests
```
Integration testing may be performed via the per-project .js bindings. See the
2020-07-28 11:00:37 -07:00
[token program's js project](token/js) for an example.
2020-06-24 10:56:25 -07:00
### Clippy
```bash
$ cargo clippy
```
### Coverage
```bash
2020-11-06 09:31:24 -08:00
$ ./coverage.sh # Please help! Coverage build currently fails on MacOS due to an XCode `grcov` mismatch...
```
## Release Process
SPL programs are currently tagged and released manually. Each program is
versioned independently of the others, with all new development occurring on
master. Once a program is tested and deemed ready for release:
### Bump Version
* Increment the version number in the program's Cargo.toml
* Generate a new program ID and replace in `<program>/program-id.md` and `<program>/src/lib.rs`
* Run `cargo build-bpf <program>` to update relevant C bindings. (Note the
location of the generated `spl_<program>.so` for attaching to the Github
release.)
* Open a PR with these version changes and merge after passing CI.
### Create Github tag
Program tags are of the form `<program>-vX.Y.Z`.
Create the new tag at the version-bump commit and push to the
solana-program-library repository, eg:
```
$ git tag token-v1.0.0 b24bfe7
$ git push upstream --tags
```
### Publish Github release
* Go to [GitHub Releases UI](https://github.com/solana-labs/solana-program-library/releases)
* Click "Draft new release", and enter the new tag in the "Tag version" box.
* Title the release "SPL <Program> vX.Y.Z", complete the description, and attach the `spl_<program>.so` binary
* Click "Publish release"
### Publish to Crates.io
Navigate to the program directory and run `cargo package`
to test the build. Then run `cargo publish`.