Freigeben über


Autorhilfeports

Hilfsports, auch als Skriptports bezeichnet, machen Funktionen für andere Ports verfügbar, die während des Buildprozesses verwendet werden. 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 Standard Tenance optimiert, da Updates an einem einzigen Ort vorgenommen werden können. Darüber hinaus können Hilfsports versionsgesteuert und abhängig von der Verwendung der gleichen Mechanismen wie reguläre Ports sein.

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 Ports exportiert wurden, um ausgeführt zu werden.

Wenn ein Hilfsport von einem anderen Hilfsport abhängt, muss die vcpkg-port-config.cmake Datei der Abhängigkeit 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 in einem anderen Hilfsport definierten Aufrufe aufruft.

2 – Erstellen der Hilfsportdatei porftile.cmake

my-helper/portfile.cmake

set(VCPKG_POLICY_HELPER_PORT enabled)

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 aktivieren der VCPKG_POLICY_HELPER_PORT Richtlinie ermöglicht vcpkg Postbuildprüfungen, die speziell auf Hilfsports angewendet werden. Überprüfen Sie insbesondere, ob sie vcpkg-port-config.cmake im richtigen Pfad installiert ist und dass keine Dateien im include Verzeichnis installiert sind.

Die nächsten Zeilen installieren die erforderlichen vcpkg-port-config.cmake Dateien an copyright 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 ist absichtlich nicht als Hostabhängigkeit gekennzeichnet, da dies eine Hilfs-zu-Hilfsport-Abhängigkeit ist.

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 für my-other-helper Ports verfügbar zu machen, die davon my-helper abhängen, ohne dass sie in ihre Liste der direkten Abhängigkeiten einbezogen my-other-helper werden müssen.

Schließlich ist die Datei, die my_helper_function.cmake die my_helper_function Definition enthält, enthalten.

5 – Verwenden my-helper in einem Manifest

Jeder Verbraucher my-helper muss nur eine direkte Abhängigkeit my-helper von sich selbst enthalten, es ist keine Abhängigkeit my-other-helper erforderlich. Das verwendende Manifest sollte die Abhängigkeit als Hostabhä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.

my-port/portfile.cmake

my_helper_function()