此 port 所依赖的 crates 的列表。每个条目都需要有类似 cratename-semver 的格式, 例如, libc-0.2.40。 Port 维护者可以使用 make cargo-crates 从 Cargo.lock 中生成这个列表。可以手动调整板条箱的版本,但要注意跨平台的依赖关系。如果由 make cargo-crates 生成的列表很大, 把它放在顶层 port 目录中的 Makefile.crates 文件中可能会比较方便。如果有的话, ports 框架会自动将这个文件作为源代码。这有助于将主 port 的 Makefile 保持在一个可管理的大小。
创建一个基于 Cargo 的 Port 是一个三阶段的过程。首先,我们需要提供一个获取应用程序分布文件的 ports 模板:
PORTNAME= tokei
DISTVERSIONPREFIX= v
DISTVERSION= 7.0.2
CATEGORIES= devel
MAINTAINER= tobik@FreeBSD.org
COMMENT= Display statistics about your code
WWW= https://github.com/XAMPPRocky/tokei/
USES= cargo
USE_GITHUB= yes
GH_ACCOUNT= Aaronepower
.include <bsd.port.mk>
产生一个初始的 distinfo:
% make makesum
=> Aaronepower-tokei-v7.0.2_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://codeload.github.com/Aaronepower/tokei/tar.gz/v7.0.2?dummy=/Aaronepower-tokei-v7.0.2_GH0.tar.gz
fetch: https://codeload.github.com/Aaronepower/tokei/tar.gz/v7.0.2?dummy=/Aaronepower-tokei-v7.0.2_GH0.tar.gz: size of remote file is not known
Aaronepower-tokei-v7.0.2_GH0.tar.gz 45 kB 239 kBps 00m00s
% make makesum
=> rust/crates/aho-corasick-0.6.4.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://crates.io/api/v1/crates/aho-corasick/0.6.4/download?dummy=/rust/crates/aho-corasick-0.6.4.tar.gz
rust/crates/aho-corasick-0.6.4.tar.gz 100% of 24 kB 6139 kBps 00m00s
=> rust/crates/ansi_term-0.11.0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://crates.io/api/v1/crates/ansi_term/0.11.0/download?dummy=/rust/crates/ansi_term-0.11.0.tar.gz
rust/crates/ansi_term-0.11.0.tar.gz 100% of 16 kB 21 MBps 00m00s
=> rust/crates/arrayvec-0.4.7.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://crates.io/api/v1/crates/arrayvec/0.4.7/download?dummy=/rust/crates/arrayvec-0.4.7.tar.gz
rust/crates/arrayvec-0.4.7.tar.gz 100% of 22 kB 3237 kBps 00m00s
=> rust/crates/atty-0.2.9.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://crates.io/api/v1/crates/atty/0.2.9/download?dummy=/rust/crates/atty-0.2.9.tar.gz
rust/crates/atty-0.2.9.tar.gz 100% of 5898 B 81 MBps 00m00s
=> rust/crates/bitflags-1.0.1.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
[...]
现在,该 Port 已经准备好进行测试构建和进一步的调整,如创建 plist、编写描述、添加许可证信息、选项等,与平常一样。
如果您不是在像 Poudriere 那样的干净环境中测试您的 port, 请记得在进行任何测试之前运行 make clean。
例58. 启用额外的应用功能
一些应用程序在其 Cargo.toml 中定义了额外的功能。它们可以通过在 port 中设置 CARGO_FEATURES 而被编译进来。
对于使用 Go 的 port, 应定义 USES=go。参考 go 以了解可以用来控制联编过程的变量列表。
例62. 为基于 Go 模块的应用程序创建一个 Port
在大多数情况下,将 GO_MODULE 变量设置为 go.mod 中的模块指令所指定的值即可:
PORTNAME= hey
PORTVERSION= 0.1.4
DISTVERSIONPREFIX= v
CATEGORIES= benchmarks
MAINTAINER= dmgk@FreeBSD.org
COMMENT= Tiny program that sends some load to a web application
WWW= https://github.com/rakyll/hey/
LICENSE= APACHE20
LICENSE_FILE= ${WRKSRC}/LICENSE
USES= go:modules
GO_MODULE= github.com/rakyll/hey
PLIST_FILES= bin/hey
.include <bsd.port.mk>
如果“简单”的方法不够用,或者需要对依赖关系进行更多的控制,下面将介绍完整的移植过程。
创建一个基于 Go 的 Port 是一个五阶段的过程。首先我们需要提供一个 ports 模板,以获取应用程序的分发文件:
% make makesum
===> License MIT accepted by the user
=> motemen-ghq-v0.12.5_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://codeload.github.com/motemen/ghq/tar.gz/v0.12.5?dummy=/motemen-ghq-v0.12.5_GH0.tar.gz
fetch: https://codeload.github.com/motemen/ghq/tar.gz/v0.12.5?dummy=/motemen-ghq-v0.12.5_GH0.tar.gz: size of remote file is not known
motemen-ghq-v0.12.5_GH0.tar.gz 32 kB 177 kBps 00s
% make makesum
=> Songmu-gitconfig-v0.0.2_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://codeload.github.com/Songmu/gitconfig/tar.gz/v0.0.2?dummy=/Songmu-gitconfig-v0.0.2_GH0.tar.gz
fetch: https://codeload.github.com/Songmu/gitconfig/tar.gz/v0.0.2?dummy=/Songmu-gitconfig-v0.0.2_GH0.tar.gz: size of remote file is not known
Songmu-gitconfig-v0.0.2_GH0.tar.gz 5662 B 936 kBps 00s
=> daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://codeload.github.com/daviddengcn/go-colortext/tar.gz/186a3d44e920?dummy=/daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz
fetch: https://codeload.github.com/daviddengcn/go-colortext/tar.gz/186a3d44e920?dummy=/daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz: size of remote file is not known
daviddengcn-go-colortext-186a3d44e920_GH0.tar. 4534 B 1098 kBps 00s
[...]
现在,该 Port 已经准备好进行测试构建和进一步的调整,如创建plist、编写描述、添加许可证信息、选项等,与平常一样。
如果您不是在像 Poudriere 那样的干净环境中测试您的 port, 请记得在进行任何测试之前运行 make clean。
例63. 设置输出二进制名称或安装路径
有些 port 需要将生成的二进制文件安装在不同的名字下, 或安装到默认的 ${PREFIX}/bin 以外的其他路径。这可以通过使用 GO_TARGET 元组的语法来实现, 例如:
% make cabal-extract
[...]
Downloading the latest package list from hackage.haskell.org
cabal get ShellCheck-0.6.0
Downloading ShellCheck-0.6.0
Downloaded ShellCheck-0.6.0
Unpacking to ShellCheck-0.6.0/
[...]
Resolving dependencies...
Build profile: -w ghc-8.10.7 -O1
In order, the following would be built (use -v for more details):
- Diff-0.4.1 (lib) (requires download & build)
- OneTuple-0.3.1 (lib) (requires download & build)
[...]