清单参考

每个项目的 fpm.toml 文件称为其清单。它使用 TOML 格式编写。每个清单文件都包含以下部分

项目名称

项目名称标识该项目包,并用于引用它。当把该项目列为另一个项目包的依赖项时和默认的库和可执行目标名称时使用该名称。因此,项目名称必须始终存在。

示例

name = "hello_world"

项目版本

项目版本号指定为字符串。管理和指定版本的标准化方法是语义化版本控制方案。

示例

version = "1.0.0"

版本条目还可以包含一个相对于项目根目录的文件名,该文件名包含项目的版本号

示例

version = "VERSION"

项目许可证

项目许可证字段包含许可证标识符。指定许可信息标准化方法是SPDX标识符。

示例

GNU宽通用公共许可证下获得许可的项目,版本 3 或任何更高版本,指定为

license = "LGPL-3.0-or-later"

Apache许可证,版本 2.0MIT许可证下获得双重许可的项目指定为

license = "Apache-2.0 OR MIT"

项目维护人员

项目维护人员信息及联系他们。

示例

maintainer = "jane.doe@example.com"

项目作者

项目作者信息。

示例

author = "Jane Doe"

项目描述

描述提供了项目简短摘要。它应为纯文本,不使用任何标记格式。

示例

description = "A short summary on this project"

项目类别

项目可以与不同类别关联。

示例

categories = ["io"]

项目关键词

关键词字段是一个字符串数组,用于描述项目。

示例

keywords = ["hdf5", "mpi"]

项目主页

项目网页的 URL。

示例

homepage = "https://stdlib.fortran-lang.cn"

项目目标

每个 fpm 项目都可以定义库、可执行文件和测试目标。库目标被导出并可供其他项目使用。

库配置

定义项目的导出库目标。如果在项目中找到源目录或包含目录,则会生成库。默认源目录和包含目录是 srcinclude;可以在 library 部分中使用 source-dirinclude-dir 条目来修改它们。源目录和包含目录的路径相对于项目根目录给出,并在所有平台上使用 / 作为路径分隔符。

示例

[library]
source-dir = "lib"
include-dir = "inc"

包含目录

注意

仅在 Fortran fpm 中受支持

使用 Fortran include 语句或 C 预处理程序 #include 语句的项目可以使用 include-dir 键指定包含文件搜索目录。include-dir 可以包含一个或多个目录,其中多个目录使用字符串列表指定。所有项目依赖关系中的包含目录都使用适当的编译器标志传递给编译器。

示例

[library]
include-dir = ["include", "third_party/include"]

注意

include-dir 目前不允许使用预构建的模块 .mod 文件

可执行目标

可执行目标定义为 executable 部分的 Fortran 程序。如果没有指定可执行部分,将搜索 app 目录以获取程序定义。对于明确指定的可执行文件,必须始终指定 name 条目。可以在 source-dir 条目中调整每个可执行文件的源目录。源目录的路径相对于项目根目录给出,并在所有平台上使用 / 作为路径分隔符。包含程序主体的源文件可以在 main 条目中指定。

可执行文件可以有它自己的依赖关系。请参阅 指定依赖关系 了解更多详细信息。

可执行文件还可以指定它们自己的外部库依赖关系。请参阅 外部库 了解更多详细信息。

注意

仅在 Fortran fpm 中支持针对库的链接

示例

[[executable]]
name = "app-name"
source-dir = "prog"
main = "program.f90"

[[executable]]
name = "app-tool"
link = "z"
[executable.dependencies]
helloff = { git = "https://gitlab.com/everythingfunctional/helloff.git" }

为了简便,可以通过使用内联表格来指定许多单独的可执行文件

executable = [
  { name = "a-prog" },
  { name = "app-tool", source-dir = "tool" },
]

示例目标

项目的示例应用程序定义为示例部分。如果未指定示例部分,则搜索 example 目录以查找程序定义。对于明确指定的示例,必须始终指定名称条目。每个示例的源目录可以在source-dir 条目中调整。源目录的路径相对于项目根目录给出,并在所有平台上使用 / 作为路径分隔符。包含程序正文的源文件可以在main 条目中指定。

示例可以有自己的依赖项。有关更多详细信息,请参见 指定依赖项

示例也可以指定它们自己的外部库依赖项。有关更多详细信息,请参见 外部库

注意

仅在 Fortran fpm 中支持针对库的链接

示例

[[example]]
name = "demo-app"
source-dir = "demo"
main = "program.f90"

[[example]]
name = "example-tool"
link = "z"
[example.dependencies]
helloff = { git = "https://gitlab.com/everythingfunctional/helloff.git" }

测试目标

测试目标是定义为test 部分的 Fortran 程序。它们遵循与可执行目标类似的规则。如果未指定测试部分,则搜索 test 目录以查找程序定义。对于明确指定的测试,必须始终指定名称条目。每个测试的源目录可以在source-dir 条目中调整。源目录的路径相对于项目根目录给出,并在所有平台上使用 / 作为路径分隔符。包含程序正文的源文件可以在main 条目中指定。

测试可以有自己的依赖项。有关更多详细信息,请参见 指定依赖项

测试也可以指定它们自己的外部库依赖项。有关更多详细信息,请参见 外部库

注意

仅在 Fortran fpm 中支持针对库的链接

示例

[[test]]
name = "test-name"
source-dir = "testing"
main = "tester.F90"

[[test]]
name = "tester"
link = ["blas", "lapack"]
[test.dependencies]
helloff = { git = "https://gitlab.com/everythingfunctional/helloff.git" }

使用系统安装的模块

要使用未在 fpm 包或其依赖项中定义的模块,请使用build 表中的external-modules 键指定模块名称。

重要

fpm 无法自动找到外部模块文件,用户需要使用编译器标志指定必要的包含目录,以便编译器在编译期间能够找到外部模块文件。

示例

[build]
external-modules = "netcdf"

可以将多个外部模块指定为列表。

示例

[build]
external-modules = ["netcdf", "h5lt"]

自动目标发现

注意

仅在 Fortran fpm 中受支持

可以在默认目录中自动发现可执行文件和测试。自动发现将递归搜索 appexampletest 目录中的 program 定义,并将它们分别声明为可执行、示例和测试目标。自动发现默认启用。

若要禁用目标自动搜索,请将 auto-executablesauto-examplesauto-tests 条目设置为 false

[build]
auto-executables = false
auto-examples = false
auto-tests = false

Fortran 特性

允许启用和禁用特定的语言特性

隐式类型

允许切换是否应该使用默认的隐式类型。默认选项为 false

[fortran]
implicit-typing = true  # default: false

隐式外部

允许切换是否可以隐式声明外部接口。默认选项为 false

[fortran]
implicit-external = true  # default: false

源表单

允许指定项目中所有文件的源表单。可能的选项有:"free"(假定所有文件都是自由格式源代码)、"fixed"(假定所有文件都是固定格式源代码)以及 "default"(根据编译器自己的启发式信息让编译器决定)。默认选项为 "free"

[fortran]
source-form = "fixed"  # default: "free"

指定依赖项

可以在 manifest 根目录或 可执行测试 部分中的 dependencies 表中声明依赖项。在 manifest 根目录中声明时,将随项目一起导出依赖项。

来自版本控制系统的依赖项

可以通过项目的 git 代码库指定依赖项。

[dependencies]
toml-f = { git = "https://github.com/toml-f/toml-f" }

要使用特定的上游分支,请使用以下方式声明 branch 名称

[dependencies]
toml-f = { git = "https://github.com/toml-f/toml-f", branch = "main" }

或者,使用 tag 条目引用标签

[dependencies]
toml-f = { git = "https://github.com/toml-f/toml-f", tag = "v0.2.1" }

要锁定特定修订版本,请在 rev 条目中指定提交哈希

[dependencies]
toml-f = { git = "https://github.com/toml-f/toml-f", rev = "2f5eaba" }

对于更详细的布局,请使用普通表格而不是嵌入式表格来指定依赖项。

[dependencies]
[dependencies.toml-f]
git = "https://github.com/toml-f/toml-f"
rev = "2f5eaba864ff630ba0c3791126a3f811b6e437f3"

来自注册中心软件包的依赖项

注意

若要启用 fpm 中的注册中心,请务必首先阅读 注册中心 部分的说明。

命名空间

从注册中心(包括远程和本地)获得的软件包需要指定命名空间,它提供了一种唯一标识和区分具有相同名称的软件包的方法。命名空间在清单 (fpm.toml) 中声明。

[dependencies]
my-package.namespace = "my-namespace"

这将提示 fpm 从注册中心下载“my-package” 的最新版本,该版本属于“my-namespace”。

版本

如果您想下载特定版本的软件包,而不是最新版本,您可以在清单中指定版本 (v)。

[dependencies]
example-package.namespace = "example-namespace"
example-package.v = "1.0.0"

本地依赖项

若要声明本地依赖项,请使用路径输入。

[dependencies]
my-utils = { path = "utils" }

本地依赖项路径是相对于写入它的 fpm.toml 提供的,并且在所有平台上使用 / 作为路径分隔符。

特定于依赖项的宏设置

fpm>=0.9.1 开始,可以按照清单中的预处理器配置表中的方式,将特定于依赖项的宏数组从清单传递到单个依赖项。其 preprocess 表需要作为依赖项输入的一部分输入。fpm 不会检查传递的宏是否与依赖项自己的清单冲突,因此,确保不会发生冲突或意外行为是用户的责任。例如,可以控制一个库应与之配合使用的 REAL 精度

[dependencies]
fftpack = { git="https://github.com/fortran-lang/fftpack.git", preprocess.cpp.macros = ["REAL32"] }

开发依赖项

开发依赖项允许在清单根目录中声明dev-dependencies,这些依赖项可用于所有测试,但不会随项目导出。

安装配置

安装部分可以选择用于安装的组件。默认情况下,只安装可执行文件,库项目可以设置布尔值以另外安装模块文件和存档。

示例

[install]
library = true

预处理器配置

预处理 部分,你可以指定在 fpm 项目中使用一个或多个预处理器。

指定预处理器

预处理 部分允许指定一个或多个预处理器。例如,可以像这样指定 cpp

示例

[preprocess]
[preprocess.cpp]

要使用多个预处理器,例如 cppfypp,像这样指定它们

示例

[preprocess]
[preprocess.cpp]
[preprocess.fypp]

你还可以指定预处理器应运行的源文件后缀

示例

[preprocess]
[preprocess.cpp]
suffixes = ["F90", "f90"]

此外,你可以指示预处理器在特定目录中的源文件上运行

示例

[preprocess]
[preprocess.cpp]
directories = ["src/feature1", "src/models"]

可以像这样定义预处理器宏

示例

[preprocess]
[preprocess.cpp]
macros = ["FOO", "BAR"]

我们还可以使用点分键来定义我们的预处理器设置。

示例

[preprocess]
cpp.suffixes = ["F90", "f90"]
cpp.directories = ["src/feature1", "src/models"]
cpp.macros = ["FOO", "BAR"]

我们还可以在预处理表中定义有值宏。

示例

[preprocess]
[preprocess.cpp]
macros=["FOO=2", "BAR=4"]

我们还可以将清单中的版本号等值重用为宏的值。

示例

version = "1"

[preprocess]
[preprocess.cpp]
macros=["VERSION={version}"]

附加自由数据字段

第三方工具可以在 extra 部分中存储其配置。此部分永远不会由 fpm 本身评估,唯一施加的限制是它必须是有效的 TOML。

由于此部分的格式是自由的,因此此处仅提供建议将数据添加到 extra 部分。

  1. 只使用子表,切勿将配置数据添加到 extra 部分的最高层。原因:不同的工具可以通过将数据放置在单独的子表中来避免键名的冲突。

  2. 为子表使用工具的具体名称,而不是通用名称。原因:不同的格式化程序或 linter 工具可能在 formatlint 子表中使用冲突的关键字。此外,用户可以从表名中了解哪个工具更适合与项目一起使用。

  3. Fpm 插件应在 extra.fpm 部分使用其插件名称的子表来存储其数据。原因:遵循此约定为 fpm 插件的用户提供一个部分来配置其使用的插件。

  4. 使用 fpm 首选的关键字样式,即带破折号的小写字母。原因:虽然此部分没有样式检查,但整个清单中的一致样式将使用户更容易理解整个包清单。

非常欢迎对以上建议的反馈。如果你有一个工具在包清单中使用了 extra 部分,请随时在 fpm 讨论板 中发布它。