| // -*- mode:doc; -*- |
| // vim: set syntax=asciidoc: |
| |
| === Infrastructure for Cargo-based packages |
| |
| Cargo is the package manager for the Rust programming language. It allows the |
| user to build programs or libraries written in Rust, but it also downloads and |
| manages their dependencies, to ensure repeatable builds. Cargo packages are |
| called "crates". |
| |
| [[cargo-package-tutorial]] |
| |
| ==== +cargo-package+ tutorial |
| |
| The +Config.in+ file of Cargo-based package 'foo' should contain: |
| |
| ---- |
| 01: config BR2_PACKAGE_FOO |
| 02: bool "foo" |
| 03: depends on BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS |
| 04: select BR2_PACKAGE_HOST_RUSTC |
| 05: help |
| 06: This is a comment that explains what foo is. |
| 07: |
| 08: http://foosoftware.org/foo/ |
| ---- |
| |
| And the +.mk+ file for this package should contain: |
| |
| ---- |
| 01: ################################################################################ |
| 02: # |
| 03: # foo |
| 04: # |
| 05: ################################################################################ |
| 06: |
| 07: FOO_VERSION = 1.0 |
| 08: FOO_SOURCE = foo-$(FOO_VERSION).tar.gz |
| 09: FOO_SITE = http://www.foosoftware.org/download |
| 10: FOO_LICENSE = GPL-3.0+ |
| 11: FOO_LICENSE_FILES = COPYING |
| 12: |
| 13: $(eval $(cargo-package)) |
| ---- |
| |
| The Makefile starts with the definition of the standard variables for |
| package declaration (lines 7 to 11). |
| |
| As seen in line 13, it is based on the +cargo-package+ |
| infrastructure. Cargo will be invoked automatically by this |
| infrastructure to build and install the package. |
| |
| It is still possible to define custom build commands or install |
| commands (i.e. with FOO_BUILD_CMDS and FOO_INSTALL_TARGET_CMDS). |
| Those will then replace the commands from the cargo infrastructure. |
| |
| ==== +cargo-package+ reference |
| |
| The main macros for the Cargo package infrastructure are |
| +cargo-package+ for target packages and +host-cargo-package+ for host |
| packages. |
| |
| Just like the generic infrastructure, the Cargo infrastructure works |
| by defining a number of variables before calling the +cargo-package+ |
| or +host-cargo-package+ macros. |
| |
| All the package metadata information variables that exist in the |
| xref:generic-package-reference[generic package infrastructure] also |
| exist in the Cargo infrastructure. |
| |
| A few additional variables, specific to the Cargo infrastructure, can |
| also be defined. Many of them are only useful in very specific cases, |
| typical packages will therefore only use a few of them. |
| |
| * +FOO_SUBDIR+ may contain the name of a subdirectory inside the package |
| that contains the Cargo.toml file. This is useful, if for example, it |
| is not at the root of the tree extracted by the tarball. If |
| +HOST_FOO_SUBDIR+ is not specified, it defaults to +FOO_SUBDIR+. |
| |
| * +FOO_CARGO_ENV+ can be used to pass additional variables in the |
| environment of +cargo+ invocations. It used at both build and |
| installation time |
| |
| * +FOO_CARGO_BUILD_OPTS+ can be used to pass additional options to |
| +cargo+ at build time. |
| |
| * +FOO_CARGO_INSTALL_OPTS+ can be used to pass additional options to |
| +cargo+ at install time. |
| |
| A crate can depend on other libraries from crates.io or git |
| repositories, listed in its +Cargo.toml+ file. Buildroot automatically |
| takes care of downloading such dependencies as part of the download |
| step of packages that use the +cargo-package+ infrastructure. Such |
| dependencies are then kept together with the package source code in |
| the tarball cached in Buildroot's +DL_DIR+, and therefore the hash of |
| the package's tarball doesn't only cover the source of the package |
| itself, but also covers the sources of the dependencies. Thus, a change |
| injected into one of the dependencies will also be discovered by the |
| hash check. In addition, this mechanism allows the build to be |
| performed completely offline since cargo will not do any downloads |
| during the build. This mechanism is called vendoring the dependencies. |