次の方法で共有


スクリプト ポートの作成

スクリプト ポートはヘルパー ポートとも呼ばれ、ビルド プロセス中に使用する他のポートの関数を公開します。 たとえば、 vcpkg-cmake ポートは、他のポートが使用する vcpkg_cmake_configure() 関数を定義します。 共通スクリプトをヘルパー ポートにパッケージ化することで、更新を 1 か所で行うことができるので、メンテナンスがより効率化されます。 さらに、ヘルパー ポートをバージョン管理し、通常のポートと同じメカニズムを使用して依存できます。

どのように動作しますか?

ヘルパー ポートは、 vcpkg-port-config.cmake 拡張メカニズムを介して実装されます。

ポートが実行される前に、vcpkg は、実行中のポートの直接の依存関係によってエクスポートされた vcpkg-port-config.cmake ファイルをインポートします。

ヘルパー ポートが別のヘルパー ポートに依存している場合は、依存関係の vcpkg-port-config.cmake ファイルを明示的にインポートする必要があります。 ヘルパーからヘルパー へのポートの依存関係は ホスト依存関係としてマークしないでください。これにより、1 つのスクリプトが同じインストール ディレクトリ内にある他のスクリプトに依存できるようになります。

ヘルパー ポートに依存するポートは、依存関係を ホスト依存関係としてマークする必要があります。

ヘルパー ポートは、インストール ツリーの vcpkg-port-config.cmake サブディレクトリに常にshare/${PORT} ファイルをインストールする必要があります。

例: 単純なヘルパー ポートを記述する

1 - ヘルパー関数を定義する CMake ファイルを作成します。

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()

ファイルの先頭にある include_guard(GLOBAL) は、ファイルが複数回含まれている場合に、この関数を再定義することを防ぎ、保護します。

次の行では、メッセージを表示し、別のヘルパー ポートで定義されているmy_helper_functionを呼び出すmy_other_helper_functionという名前の関数を宣言します。

2 - ヘルパー ポートの 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)

VCPKG_POLICY_CMAKE_HELPER_PORT ポリシーを有効にすると、vcpkg はヘルパー ポートに特に適用されるビルド後のチェックを有効にします。 具体的には、 vcpkg-port-config.cmake が正しいパスにインストールされていることと、 include ディレクトリにファイルがインストールされていないことを確認します。

次の行では、必要な vcpkg-port-config.cmakecopyright ファイルが適切な場所 (share/${PORT}) にインストールされます。

3 - ヘルパー ポートの 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" } 
  ]
}

ヘルパー ポートのversion-dateとしてを使用することをお勧めします。

この例の dependencies には、 my-other-helperという名前の別のヘルパー ポートへの参照が含まれています。 依存関係は、ヘルパーからヘルパーへのポートの依存関係であるため、意図的にホストの依存関係としてマークされません。

4 - ヘルパー ポートの vcpkg-port-config.cmakefile を作成する

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")

vcpkg-port-config.cmake ファイルは 3 行で構成されます。1 つ目は、ファイルが複数回含まれるのを防ぐグローバル インクルード ガードです。

2 行目には、my-other-helper/vcpkg-port-config.cmakeの関数を、直接依存関係の一覧にmy-other-helperを含めなくても、my-helperに依存するポートで使用できるようにするmy-other-helperが含まれています。

最後に、my_helper_function.cmake定義を含むmy_helper_function ファイルが含まれます。

5 - マニフェストで my-helper を使用する

my-helperのすべてのコンシューマーは、my-helper自体への直接的な依存関係のみを含める必要があり、my-other-helperへの依存関係は必要ありません。 使用するマニフェストは、依存関係をホスト依存関係としてマークする必要があります。

my-port/vcpkg.json

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

これにより、my_helper_functionmy-port/portfile.cmakeで使用できるようになります。

my-port/portfile.cmake

my_helper_function()