Freigeben über


Erstellung von Skript-Ports

Skriptports, auch Hilfsports genannt, machen Funktionen für andere Ports verfügbar, die während ihres Buildprozesses verwendet werden können. Beispielsweise definiert der vcpkg-cmake Port die vcpkg_cmake_configure() Funktion für andere Ports, die verwendet werden sollen. Durch das Packen allgemeiner Skripts in einen Hilfsport wird die Wartung optimiert, da Updates an einem einzigen Ort vorgenommen werden können. Darüber hinaus können Hilfs-Ports versioniert werden und von denselben Mechanismen wie reguläre Ports abhängen.

Wie funktionieren sie?

Hilfsports werden über den vcpkg-port-config.cmake Erweiterungsmechanismus implementiert.

Bevor ein Port ausgeführt wird, importiert vcpkg alle vcpkg-port-config.cmake-Dateien, die von den direkten Abhängigkeiten des auszuführenden Ports exportiert wurden.

Wenn ein Hilfsport von einem anderen Hilfsport abhängt, muss die Abhängigkeitsdatei vcpkg-port-config.cmake explizit importiert werden. Hilfs-zu-Hilfsportabhängigkeiten sollten nicht als Hostabhängigkeiten gekennzeichnet werden. Dadurch wird sichergestellt, dass ein Skript von dem anderen abhängig sein kann, der sich im selben Installationsverzeichnis befindet.

Ports, die von einem Hilfsport abhängig sind, sollten die Abhängigkeit als Hostabhängigkeit kennzeichnen.

Hilfsports müssen ihre vcpkg-port-config.cmake Datei immer in einem share/${PORT} Unterverzeichnis in der Installationsstruktur installieren.

Beispiel: Schreiben eines einfachen Hilfsports

1 – Erstellen Sie eine CMake-Datei, die die Hilfsfunktion definiert.

my-helper/my_helper_function.cmake

include_guard(GLOBAL)

function(my_helper_function)
  message(STATUS "my_helper_function() was called")
  my_other_helper_function()
endfunction()

Der include_guard(GLOBAL) obere Rand der Datei schützt vor der Neudefinition dieser Funktion, wenn die Datei mehrmals enthalten ist.

In den folgenden Zeilen wird eine Funktion mit dem Namen my_helper_function deklariert, die eine Nachricht anzeigt und die my_other_helper_function aufruft, die in einem anderen Hilfsmodul definiert ist.

2 – Erstellen der Hilfsportdatei porftile.cmake

my-helper/portfile.cmake

set(VCPKG_POLICY_CMAKE_HELPER_PORT enabled)

file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/my_helper_function.cmake" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")
file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")

file(INSTALL "${VCPKG_ROOT_DIR}/LICENSE.txt" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)

Durch das Aktivieren der VCPKG_POLICY_CMAKE_HELPER_PORT-Richtlinie ermöglicht vcpkg Nachbauprüfungen, die speziell auf Hilfsports angewendet werden. Überprüfen Sie insbesondere, ob vcpkg-port-config.cmake im richtigen Pfad installiert ist und ob keine Dateien im include Verzeichnis installiert sind.

Die nächsten Zeilen installieren die erforderlichen vcpkg-port-config.cmake- und copyright-Dateien an ihrem richtigen Speicherort (share/${PORT}).

3 – Erstellen der Hilfsportdatei vcpkg.json

my-helper/vcpkg.json

{
  "name": "my-helper",
  "version-date": "2024-03-20",
  "description": "Provide my_helper_function()",
  "license": "MIT",
  "dependencies": [ 
    { "name": "my-other-helper" } 
  ]
}

Wir empfehlen die Verwendung version-date als Versionsverwaltungsschema für Hilfsports.

Das dependencies in diesem Beispiel enthält einen Verweis auf einen anderen Hilfsport mit dem Namen my-other-helper. Die Abhängigkeit wird absichtlich nicht als Hostabhängigkeit gekennzeichnet, da es sich um eine Abhängigkeit zwischen Helfer-Ports handelt.

4 – Erstellen der Hilfsportdatei vcpkg-port-config.cmake

my-helper/vcpkg-port-config.cmake

include_guard(GLOBAL)

include("${CMAKE_CURRENT_LIST_DIR}/../my-other-helper/vcpkg-port-config.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/my_helper_function.cmake")

Die vcpkg-port-config.cmake Datei besteht aus drei Zeilen, der erste ist ein globaler Include Guard, der verhindert, dass die Datei mehrmals eingeschlossen wird.

Die zweite Zeile enthält my-other-helper/vcpkg-port-config.cmake, um die Funktionen in my-other-helper für Ports verfügbar zu machen, die von my-helper abhängen, ohne dabei my-other-helper in ihre Liste der direkten Abhängigkeiten aufnehmen zu müssen.

Schließlich wird die Datei, die die my_helper_function-Definition enthält, eingeschlossen.

5 – Verwenden my-helper in einem Manifest

Jeder Verbraucher von my-helper muss nur eine direkte Abhängigkeit zu my-helper hinzufügen, eine Abhängigkeit zu my-other-helper ist nicht erforderlich. Das verwendende Manifest sollte die Abhängigkeit als Host-Abhängigkeit kennzeichnen.

my-port/vcpkg.json

{
  "name": "my-port",
  "version": "1.0.0",
  "dependencies": [
    {
      "name": "my-helper",
      "host": true
    }
  ]
}

Dadurch wird my_helper_function in my-port/portfile.cmake verfügbar gemacht.

my-port/portfile.cmake

my_helper_function()