Referência do manifesto

O ficheiro fpm.toml para cada projeto é chamado de seu manifest (manifesto). É escrito usando um formato de texto chamado TOML. Cada ficheiro de manifesto é dividido nas seguintes seções:

  • name: O nome do projeto

  • version: A versão do projeto

  • license: A licença do projeto

  • maintainer: Mantenedor do projeto

  • author: Autor do projeto

  • copyright: Copyright do projeto

  • description: Descrição do projeto

  • categories: Categorias associadas com o projeto

  • keywords: Palavras-chave descrevendo o projeto

  • homepage: A página principal do projeto

  • Configuração de compilação:

    • auto-tests: Alterna a descoberta automática dos executáveis de teste

    • auto-examples: Alterna a descoberta automática de programas de exemplo

    • auto-executables: Alterna o reconhecimento automático de executáveis

    • link: Vínculo com dependências externas

    • external-modules: Define módulos usados que não usados de dentro do seu pacote fpm

  • Fortran configuration:

  • Seção de alvos:

    • library Configuração da biblioteca alvo

    • executable Configuração de alvos executáveis

    • test Configuração dos alvos de teste

  • Seção de dependências:

  • install: Configuração da instalação

  • preprocess Configuração do pré-processador

  • extra: Campo de dados adicional

Nome do projeto

O nome do projeto identifica o pacote e será usado ao se referir a ele. Será usado ao listá-lo como dependência por outro pacote e será, por padrão, o nome da biblioteca e de seu executável. Dessa forma, o nome do projeto deve sempre estar presente.

Exemplo:

name = "hello_world"

Versão do projeto

O número da versão do projeto é definido como uma cadeia. Uma forma padronizada de gerir e definir versões é o esquema de Versionamento Semântico.

Exemplo:

version = "1.0.0"

O campo de versão poderá conter também um nome de ficheiro, relativo a raiz do projeto, contendo o número da versão do projeto

Exemplo:

version = "VERSION"

Licença do projeto

O campo de licença do projeto contém um identificador da licença. Uma forma padronizada de definir a informação de licenciamento são os identificadores SPDX.

Exemplos:

Projetos licenciados sob a GNU Lesser General Public Licence, tanto a versão 3 quanto qualquer versão posterior, são definidos como

license = "LGPL-3.0-or-later"

Projetos de licença dupla sob Apache license, version 2.0 ou MIT license são definidos como

license = "Apache-2.0 OR MIT"

Mantenedor do projeto

Informação sobre o mantenedor do projeto e meios de contatá-lo.

Exemplo:

maintainer = "jane.doe@example.com"

Autor do projeto

Informação sobre o autor do projeto.

Exemplo:

author = "Jane Doe"

Descrição do projeto

A descrição fornece um pequeno resumo sobre o projeto. Deve conter apenas texto e não usar nenhum tipo de formatação.

Exemplo:

description = "A short summary on this project"

Categorias do projeto

O projeto pode ser associado com diferentes categorias.

Exemplo:

categories = ["io"]

Palavras-chave do projeto

O campo de palavras-chave é um array de cadeias que descreve o projeto.

Exemplo:

keywords = ["hdf5", "mpi"]

Página principal do projeto

URL da página web do projeto.

Exemplo:

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

Alvos do projeto

Cada projeto fpm pode definir bibliotecas, executáveis e testes. Bibliotecas são exportadas e podem ser usadas em outros projetos.

Configuração de biblioteca

Define a biblioteca-alvo a ser exportada pelo projeto. Uma biblioteca é gerada se o diretório do código-fonte ou diretório include é encontrado em um projeto. Os diretórios padrão para o código-fonte o os includes são src e include; estes podem ser modificadas na seção library usando o campo source-dir e include-dir. Os caminhos de arquivo são dados relativos a raiz do projeto e usam / como separador em todas as plataformas.

Exemplo:

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

Incluir diretório

Nota

Disponível apenas na versão Fortran do fpm

Projetos que usam o comando include do Fortran ou o comando #include do preprocessador da linguagem C, podem usar a chave include-dir para definir diretórios de busca para a inclusão dos ficheiros. include-dir pode conter um ou mais diretórios, onde múltiplos diretórios são definidos usando uma lista de cadeias. Os diretórios incluídos por todas as dependências do projeto serão passadas ao compilador com a flag apropriada.

Exemplo:

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

Nota

include-dir atualmente não permite usar módulos .mod pré-compilados

Executáveis-alvo

Executáveis-alvo são programas em Fortran definidos nas seções executable. Se nenhuma seção desse tipo for definida o diretório app é vasculhado para encontrar definições de programas. Para executáveis definidos explicitamente o campo name precisa sempre estar definido O diretório do código-fonte para cada executável pode ser ajustado com o campo source-dir. Os caminhos são sempre dados relativos a raiz do projeto e usa / como separador em todas as plataformas. O código fonte contendo o corpo do programa pode ser definido no campo main.

Executáveis podem ter suas próprias dependências. Veja definindo dependências para mais detalhes.

Executáveis também podem definir suas próprias dependências em bibliotecas externas. Veja bibliotecas externas para mais detalhes.

Nota

Apenas a versão Fortran do fpm possui suporte ao vínculo com bibliotecas

Exemplo:

[[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" }

A definição de múltiplos executáveis separados pode ser feita através do uso de tabelas na mesma linha de forma curta

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

Exemplos-alvo

Aplicações de exemplo para um projeto são definidas so a seção example. Se nenhuma seção de exemplo for definida o diretório example será vasculhado para encontrar definições de programas. Para exemplos explicitamente definidos o campo name também deve estar definido. Os diretórios dos código-fonte dos exemplos pode ser ajustada no campo source-dir. Os caminhos são sempre relativos a raiz do projeto e usa / como separador em todas as plataformas. O código-fonte contendo o corpo do programa pode ser definido no campo main.

Exemplos podem ter suas próprias dependências. Veja definir dependências para mais detalhes.

Exemplos podem definir suas próprias dependências de bibliotecas externas. Veja bibliotecas externas para mais detalhes.

Nota

Apenas a versão Fortran do fpm possui suporte ao vínculo com bibliotecas

Exemplo:

[[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" }

Testes-alvo

Alvos de teste são programas Fortran definidos nas seções test. Eles seguem regras parecidas com as dos alvos executáveis. Se nenhuma seção de teste é especificada o diretório test é escaneado em busca de definições de programas. Para os testes explicitamente definidos o campo name precisa estar sempre definido. O diretório do código-fonte para cada teste pode ser ajustado com a opção source-dir. Caminhos para este diretório são dados a partir da raiz do projeto e usa / como separador em todas as plataformas. O ficheiro que contém o corpo do programa pode ser especificado no campo main.

Testes podem ter suas próprias dependências. Veja definindo dependências para mais detalhes.

Testes podem também definir suas próprias dependências externas. Veja vínculo de bibliotecas externas para mais informações.

Nota

Apenas a versão Fortran do fpm possui suporte ao vínculo com bibliotecas

Exemplo:

[[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" }

Usar módulos instalados no sistema

Para usar módulos que não estão definidos dentro do seu pacote fpm ou de suas dependências, especifique o nome do módulo usando a chave external-module dentro da tabela build.

Importante

fpm não consegue localizar ficheiros de módulos externos; Sendo responsabilidade do usuário especificar os diretórios que precisam ser incluídos usando flags do compilador de forma que este possa localizar módulos externos durante a compilação.

Exemplo:

[build]
external-modules = "netcdf"

Múltiplos módulos externos podem ser especificados como uma lista.

Exemplo:

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

Localização automática de alvos

Nota

Disponível apenas na versão Fortran do fpm

Executáveis e testes podem ser detectados automaticamente nos seus diretórios padrão. A descoberta automática recursivamente procura por definições program nos diretórios app, example e test, declarando-os como executável, exemplo e alvo de teste, respectivamente. A descoberta automática é habilitada por padrão.

Para desabilitar a descoberta automática de alvos coloque as entradas auto-executables, auto-examples e auto-tests como false.

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

Recursos do Fortran

Allows to enable and disable specific language features

Tipagem Implícita

Allows to toggle whether the default implicit typing should be used. The default option is false.

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

Funções Externas Implícitas

Allows to toggle whether external interfaces can be declared implicitly. The default option is false.

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

Formatação do Código-Fonte

Allows to specifiy the source form to be used for all files in the project. Possible choices are "free" to assume all files are free form source, "fixed" to assume all files are fixed form source, and "default" to let the compiler decide based on its own heuristics. The default option is "free".

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

Definição de dependências

Dependências podem ser declaradas na tabela dependencies na raiz do manifesto, ou nas seções executable ou test. Quando declaradas na raiz as dependências serão exportadas com o projeto.

Dependências a partir de sistemas de controle de versão

Dependências podem ser especificadas a partir de repositórios git.

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

Para usar um ramo upstream específico declare o nome branch usando

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

Alternativamente, referencie tags usando a entrada tag

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

Para fixar uma versão específica, identifique o hash do commit na entrada rev

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

Para um leiaute mais verboso use tabelas normais em vez de tabelas em linha, ao especificar dependências

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

Dependencies from a registry

Nota

To enable the usage of a registry in fpm make sure you read the instructions in the registry section first.

Namespace

Packages obtained from a registry (both remote and local) are required to specify a namespace, which provides a way to uniquely identify and differentiate packages with identical names. The namespace is declared in the manifest (fpm.toml).

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

This will prompt fpm to download the newest version of «my-package», which belongs to «my-namespace», from the registry.

Versão

If you want to download a specific version of a package instead of the newest one available, you can specify the version (v) in the manifest.

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

Dependências locais

Para declarar dependências locais use a entrada path.

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

Os caminhos para dependências locais são dados relativos à localização do arquivo fpm.toml e usam / como separador de caminho em todas as plataformas.

Dependency-specific macro setting

As of fpm>=0.9.1, an array of dependency-specific macros can be passed to a single dependency from the manifest, in the same fashion as in the manifest’s preprocessor configuration table. Its preprocess table needs to be entered as part of the dependency entry. fpm will not check if the passed macros collide with the dependencie’s own manifest, so, it is the user’s responsibility to ensure that no collisions or unexpected behavior occur. For example, one can control the REAL precision that one library is to be used with:

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

Dependências de desenvolvimento

São permitidas as dependências de desenvolvimento declarar dev-dependencies na raiz do manifesto, que estão disponíveis para todos os testes porém não são exportadas com o projeto.

Configuração da instalação

Na seção install os componentes para a instalação podem ser selecionados. Por padrão, apenas executáveis são instalados, projetos do tipo biblioteca podem definir o booleano library para também instalar os arquivos de módulo e o archive.

Exemplo

[install]
library = true

Configuração de pré-processamento

Sob a seção preprocess, você pode especificar um ou mais pré-processadores para usá-lo em um projeto fpm.

Definição do pré-processador

A seção preprocess permite usar um ou mais pré-processadores. Por exemplo, o pré-processador cpp pode ser definido como:

Exemplo

[preprocess]
[preprocess.cpp]

Para usar mais de um pré-processador, por exemplo, o cpp e o fypp, defina-os como:

Exemplo

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

Você também pode definir sufixos de código-fonte aos quais o pré-processador deve processar:

Exemplo

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

Além disso, você pode instruir o pré-processador para processar código-fonte a partir de diretórios específicos:

Exemplo

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

As macros do pré-processador podem ser definidas como:

Exemplo

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

Também é possível definir as configurações do nosso pré-processador acessando as chaves usando o ponto.

Exemplo

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

Também é possível definir macros com seus valores em uma tabela de pré-processamento.

Exemplo

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

Além disso, é possível reutilizar valores como o número de versão a partir do manifesto como um valor para a sua macro.

Exemplo

version = "1"

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

Campo de dados adicionais

Ferramentas de terceiros podem guardar suas configurações dentro da seção extra. Esta seção nunca será processada pelo fpm, portanto a única coisa imposta é que ela seja escrita em TOML.

Já que o formato da seção extra é livre, apenas sugestões para adicionar dados a ela serão dadas aqui.

  1. Use apenas sub-tabelas, nunca adicione configurações no nível superior da seção extra. Motivo: diferentes ferramentas podem evitar colisões de nome colocando seus dados em tabelas separadas.

  2. Use um nome concreto para a ferramenta em vez de um nome genérico para a sub-tabela. Motivo: um formatador diferente ou ferramentas de linter podem usar palavras-chave conflitantes em um tabela chamada format ou lint. Além disso, usuários podem ficar sabendo a partir do nome da tabela qual ferramenta que prefere para usar no projeto.

  3. Os plugins fpm devem usar uma tabela com o nome do plugin sob a seção extra.fpm para armazenar seus dados. Motivo: seguir esta convenção fornece ao seus usuários uma seção para configuração dos seus plugins.

  4. Use o estilo preferido no fpm para as palavras-chave, que é caixa baixa com traços. Motivo: mesmo que não seja feita uma checagem de estilo desta seção, um estilo consistente em todo o seu manifesto fará com que seja mais fácil para o usuário entendê-lo como um todo.

Comentários sobre as recomendações acima são mais que bem-vindos. Se você possui uma ferramenta que usa a seção extra do manifesto, sinta-se à vontade para postar no mural de discussões do fpm.