Manifest-Referenz

Die fpm.toml Datei für jedes Projekt wird als Manifest-Datei benannt. Sie wird im [TOML] Format geschrieben. Jede Manifest-Datei enthält folgende Abschnitte:

  • name: Der Name des Projekts

  • version: Die Version des Projekts

  • license: Die Lizenz des Projekts

  • maintainer: Der Maintainer des Projekts

  • author: Der Autor des Projekts

  • copyright: Copyright des Projekts

  • description: Die Beschreibung des Projekts

  • categories: Kategorien, die dem Projekt zugeordnet sind

  • keywords: Schlüsselwörter, die dem Projekt zugeordnet sind

  • homepage: Die Homepage des Projekts

  • Build-Konfiguration:

    • auto-tests: Automatische Erkennung von Test Programmen

    • auto-examples: Automatische Erkennung von Beispiel Programmen

    • auto-executables: Automatische Erkennung von Programmen

    • link: Link mit externen Abhängigkeiten

    • external-modules: Module, die nicht innerhalb des fpm Paketes definiert werden

  • Fortran configuration:

  • Target-Abschnitte:

    • library Konfiguration des Library-Targets

    • executable Konfiguration der Executable-Targets

    • test Konfiguration der Test-Targets

  • Abhängigkeiten-Abschnitte:

  • install: Installation-Konfiguration

  • [Vorverarbeitung] (#preprocessor-configuration) Präprozessor-Konfiguration

  • extra: Zusätzliches freies Datenfeld

Projektname

Der Projektname identifiziert das Paket und wird benutzt, um es zu referenzieren. Er wird verwendet, um das Projekt als Abhängigkeit für ein anderes Paket zu listen und der Standardname des Library- und Executable-Targets. Daher muss der Projektname immer vorhanden sein.

Beispiel:

name = "hello_world"

Projektversion

Die Versionsnummer des Projekts wird als String angegeben. Eine Standardisierungsmethode zur Versionsverwaltung und zur Spezifikation der Versionsnummer ist das [Semantic Versioning] Schema.

Beispiel:

version = "1.0.0"

Die Versions-Eintrag kann auch einen Dateinamen relativ zum Projekt-Wurzel-Verzeichnis enthalten, der die Versionsnummer des Projekts enthält

Beispiel:

version = "VERSION"

Projekt-Lizenz

Das Projekt-Lizenz-Feld enthält den Lizenz-Identifikator. Eine Standardisierungsmethode zur Spezifikation der Lizenzinformationen sind die [SPDX] Identifikatoren.

Beispiele:

Projekte, die unter der [GNU Lesser General Public License] (https://www.gnu.org/licenses/lgpl-3.0-standalone.html), entweder Version 3 oder jede spätere Version, werden angegeben als

license = "LGPL-3.0-or-later"

Projekte, die unter der [Apache-Lizenz, Version 2.0] (http://www.apache.org/licenses/LICENSE-2.0) oder der [MIT-Lizenz] (https://opensource.org/licenses/MIT) lizenziert sind, werden angegeben als

license = "Apache-2.0 OR MIT"

Projekt-Maintainer

Informationen über den Projekt-Maintainer und die Möglichkeit zur Kontakaufname.

Beispiel:

maintainer = "jane.doe@example.com"

Projekt-Autor

Informationen über den Projekt-Autor.

Beispiel:

author = "Jane Doe"

Projekt-Beschreibung

Die Beschreibung stellt eine kurze Zusammenfassung des Projekts dar. Sie sollte keine Markup-Formatierung verwenden.

Beispiel:

description = "A short summary on this project"

Projekt-Kategorien

Das Projekt kann mit verschiedenen Kategorien assoziiert werden.

Beispiel:

categories = ["io"]

Projekt-Schlüsselwörter

Das Schlüsselwort-Feld ist ein Feld von Strings, die das Projekt beschreiben.

Beispiel:

keywords = ["hdf5", "mpi"]

Projekt-Homepage

URL zur Webseite des Projekts.

Beispiel:

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

Projekt-Ziele

Jedes fpm-Projekt kann Bibliotheken, ausführbare Programme und Tests definieren. Bibliotheken werden exportiert und für andere Projekte nutzbar.

Bibliotheks-Konfiguration

Definiert das exportierte Bibliotheks-Ziel des Projekts. Eine Bibliothek wird generiert, wenn die Quell- oder Include-Verzeichnisse im Projekt gefunden werden. Die Standard-Quell- und Include-Verzeichnisse sind src und include; diese können in der library-Sektion mit den source-dir und include-dir Einträgen angepasst werden. Pfade für die Quell- und Include-Verzeichnisse sind relativ zum Projekt-Wurzelverzeichnis und verwenden / als Pfad-Trenner auf allen Plattformen.

Beispiel:

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

Include-Verzeichnis

Bemerkung

Nur in Fortran fpm unterstützt

Projekte, die die Fortran-Include-Anweisung oder die C-Präprozessor-Include-Anweisung verwenden, können das Schlüsselwort include-dir verwenden, um die Verzeichnisse für die eingebundenen Dateien anzugeben. include-dir kann ein oder mehrere Verzeichnisse enthalten, in denen mehrere Verzeichnisse als Liste von Strings angegeben werden. Die Include-Verzeichnisse aller Projekt-Abhängigkeiten werden dem Compiler mittels dem entsprechenden Kompilierungsoptionen übergeben.

Beispiel:

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

Bemerkung

include-dir erlaubt derzeit keine Verwendung von breits kompilierten .mod-Dateien

Ausführbare Ziele

Ausführbare Ziele sind Fortran-Programme definiert als executable-Sektionen. Wenn keine executable-Sektion angegeben ist, wird das app-Verzeichnis für Programmdefinitionen gesucht. Für explizit angegebene Ausführbare muss immer das name-Eintrag angegeben werden. Das Quell-Verzeichnis für jedes Ausführbare kann in dem source-dir-Eintrag angepasst werden. Pfade für das Quell-Verzeichnis sind relativ zum Projekt-Wurzelverzeichnis und verwenden / als Pfad-Trenner auf allen Plattformen. Die Quell-Datei mit dem Programm-Körper kann in dem main-Eintrag angegeben werden.

Ausführbare Programme können ihre eigenen Abhängigkeiten haben. Siehe spezifizieren von Abhängigkeiten für weitere Details.

Ausführbare Programme können auch ihre eigenen externen Bibliotheksabhängigkeiten spezifizieren. Siehe externe Bibliotheken für weitere Details.

Bemerkung

Nur Fortran fpm unterstützt das Linken gegen Bibliotheken

Beispiel:

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

Viele separate Ausführbare können auch mittels Inline-Tabellen spezifiziert werden

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

Beispiel-Ziele

Beispiel-Programme für ein Projekt sind definiert als example-Sektionen. Wenn keine example-Sektion angegeben ist, wird das example-Verzeichnis für Programmdefinitionen gesucht. Für explizit angegebene Beispiele muss immer das name-Eintrag angegeben werden. Das Quell-Verzeichnis für jedes Beispiel kann in dem source-dir-Eintrag angepasst werden. Pfade für das Quell-Verzeichnis sind relativ zum Projekt-Wurzelverzeichnis und verwenden / als Pfad-Trenner auf allen Plattformen. Die Quell-Datei mit dem Programm-Körper kann in dem main-Eintrag angegeben werden.

Beispiel-Programme können ihre eigenen Abhängigkeiten haben. Siehe spezifizieren von Abhängigkeiten für weitere Details.

Beispiel-Programme können auch ihre eigenen externen Bibliotheksabhängigkeiten spezifizieren. Siehe externe Bibliotheken für weitere Details.

Bemerkung

Nur Fortran fpm unterstützt das Linken gegen Bibliotheken

Beispiel:

[[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-Ziele

Test-Programme sind in Fortran definiert als test-Sektionen. Sie folgen ähnlichen Regeln wie Ausführbare Programme. Wenn keine test-Sektion angegeben ist, wird das test-Verzeichnis für Programmdefinitionen gesucht. Für explizit angegebene Tests muss immer das name-Eintrag angegeben werden. Das Quell-Verzeichnis für jedes Test kann in dem source-dir-Eintrag angepasst werden. Pfade für das Quell-Verzeichnis sind relativ zum Projekt-Wurzelverzeichnis und verwenden / als Pfad-Trenner auf allen Plattformen. Die Quell-Datei mit dem Programm-Körper kann in dem main-Eintrag angegeben werden.

Test-Programme können ihre eigenen Abhängigkeiten haben. Siehe spezifizieren von Abhängigkeiten für weitere Details.

Test-Programme können auch ihre eigenen externen Bibliotheksabhängigkeiten spezifizieren. Siehe externe Bibliotheken für weitere Details.

Bemerkung

Nur Fortran fpm unterstützt das Linken gegen Bibliotheken

Beispiel:

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

System-installierte Module verwenden

Um Module, die nicht in einem fpm-Paket oder Abhängigkeiten definiert sind, anzugeben, müssen diese im build-Tabellen-Eintrag unter external-modules angegeben werden.

Wichtig

fpm kann nicht automatisch externe Modul-Dateien finden; es ist die Verantwortung der Benutzer*in, die benötigten Include-Verzeichnisse mittels Kompiler-Optionen anzugeben, damit der Kompiler externe Modul-Dateien finden kann, während der Kompilierung.

Beispiel:

[build]
external-modules = "netcdf"

Mehrere externe Module können als Liste angegeben werden.

Beispiel:

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

Automatische Zielerkennung

Bemerkung

Nur in Fortran fpm unterstützt

Ausführbare Programme und Tests können automatisch in ihren Standard- Verzeichnissen gefunden werden. Die automatische Erkennung rekursiv sucht die app-, example- und test-Verzeichnisse nach program-Definitionen und deklarieren diese als ausführbare, Beispiel- und Test-Ziele, entsprechend. Die automatische Erkennung wird standardmäßig aktiviert.

Um die automatische Erkennung von Zielen zu deaktivieren, setzen Sie die Einträge auto-executables, auto-examples, und auto-tests auf false.

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

Fortran features

Allows to enable and disable specific language features

Implicit typing

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

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

Implicit external

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

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

Source form

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"

Abhängigkeiten spezifizieren

Abhängigkeiten können in der dependencies-Tabelle im Manifest-Wurzel- Eintrag oder in den executable oder test-Abschnitten angegeben werden. Wenn sie im Manifest-Wurzel-Eintrag angegeben werden, werden sie mit dem Projekt exportiert.

Abhängigkeiten von Version-Kontrollsystemen

Abhängigkeiten können durch die Git-Repository des Projekts angegeben werden.

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

Um einen bestimmten Branch des Upstreams anzugeben, muss der branch-Name mit angegeben werden

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

Alternativ können Referenz-Tags durch den Eintrag tag verwendet werden

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

Um eine bestimmte Revision festzulegen, muss der Commit-Hash im rev-Eintrag angegeben werden

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

Für eine ausführlichere Layout-Darstellung können normal-Tabellen statt inline-Tabellen zur Abhängigkeits-Spezifikation verwendet werden

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

Dependencies from a registry

Bemerkung

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.

Version

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"

Lokale Abhängigkeiten

Um lokale Abhängigkeiten anzugeben, muss der path-Eintrag genutzt werden.

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

Lokale Abhängigkeits-Pfade sind relativ zum Projekt-Wurzelverzeichnis angegeben und verwenden / als Pfad-Trenner auf allen Plattformen.

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

Entwicklungsabhängigkeiten

Entwicklungsabhängigkeiten ermöglichen es, dev-dependencies im Manifest-Wurzel-Eintrag anzugeben, die für alle Tests verfügbar sind, aber nicht mit dem Projekt exportiert werden.

Installations-Konfiguration

In den install-Abschnitten können Komponenten für die Installation ausgewählt werden. Standardmäßig werden nur ausführbare Projekte installiert, Library-Projekte können das library-Attribut auf true setzen, um die Module-Dateien auch zu installieren und das Archiv.

Beispiel

[install]
library = true

Konfiguration des Präprozessors

Unter dem Abschnitt preprocess können ein oder mehrere Präprozessoren angeben werden, die in einem fpm-Projekt verwendet werden sollen.

Spezifizierung des Präprozessors

Im Abschnitt preprocess können ein oder mehrere Präprozessoren angegeben werden. Zum Beispiel kann cpp wie folgt angegeben werden:

Beispiel

[preprocess]
[preprocess.cpp]

Um mehrere Präprozessoren zu verwenden, z. B. cpp und fypp, werden diese wie folgt angegeben:

Beispiel

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

Auch Suffixe von Quelldateien mit denen der Präprozessor arbeiten soll können angeben werden:

Beispiel

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

Außerdem können Sie den Präprozessor anweisen, mit Quelldateien in bestimmten Verzeichnissen zu arbeiten:

Beispiel

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

Präprozessor-Makros können wie folgt definiert werden:

Beispiel

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

Wir können auch gepunktete Schlüssel verwenden, um unsere Präprozessoreinstellungen zu definieren.

Beispiel

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

Wir können in der Präprozessortabelle auch Makros mit Werten definieren.

Beispiel

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

Wir können auch die Wiederverwendung von Werten wie der Versionsnummer von Manifest als Wert für einen Makro auswerten.

Beispiel

version = "1"

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

Zusätzliches freies Datenfeld

Externe Tools können ihre Konfiguration in den extra-Abschnitten speichern. Dieser Abschnitt wird von fpm nie evaluiert, es wird nur eine Einschränkung gesetzt, dass gültiges TOML benutzt wird.

Da das Format dieses Abschnitts frei ist, werden hier nur Empfehlungen für das Hinzufügen von Daten zum extra-Abschnitt angegeben.

  1. Verwenden Sie nur Untertabellen, niemals Daten in den extra-Abschnitt auf der obersten Ebene hinzufügen. Grund: verschiedene Tools können Kollisionen von Schlüsselnamen vermeiden, indem ihre Daten in separate Untertabellen gespeichert werden.

  2. Verwenden Sie den konkreten Namen des Tools statt eines generischen Namens für die Untertabelle. Grund: verschiedene Formatter- oder Linter-Tools können in einer format- oder lint-Untertabelle widersprüchliche Schlüsselwörter verwenden. Benutzer*innen können auch von dem Tabellennamen auf die Tool-Vorgabe des Projekts hinweisen.

  3. Fpm-Plugins sollten eine Untertabelle in den extra.fpm-Abschnitten mit ihrem Plugin-Namen speichern. Grund: diese Verwendung ermöglicht der Benutzer*in von fpm-Plugins eine einzige Sektion zur Konfiguration ihrer benutzten Plugins.

  4. Verwenden Sie den fpm-vorherigen Stil für Schlüsselwörter, der Konkatenation mit Bindestrichen in Kleinbuchstaben darstellt. Grund: während keine Überprüfung in diesem Abschnitt stattfindet, macht ein konsistenter Stil im gesamten Manifest es einfacher für die Benutzer*in das gesamte Paket-Manifest zu verstehen.

Rückmeldungen und Vorschläge für die oben genannten Empfehlungen ist sehr herzlich willkommen. Wir freuen uns über Rückmeldungen im fpm-Diskussionsforum von Tools, die den extra-Abschnitt im Paket-Manifest verwenden.