パッケージのホスト、ビルド、およびターゲットプラットフォームはどのように定義されますか(依存関係に関して)。

パッケージのホスト、ビルド、およびターゲットプラットフォームはどのように定義されますか(依存関係に関して)。

https://www.uber.com/blog/bootstrapping-ubers-infrastruct-on-arm64-with-zig/説明する:

ホストはバイナリがコンパイルされるシステムです。ターゲットはバイナリが実行されるマシンです。ネイティブコンパイルでは、ホストとターゲットは同じプラットフォームです(つまり、オペレーティングシステム、プロセッサアーキテクチャ、共有ライブラリは同じです)。

https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-dependent-reference説明する:

依存関係は3つの軸に沿って分類できます。新しいデリバティブに関連するホストおよびターゲットプラットフォーム、そして転送するかどうか。プラットフォームの違いは、クロスコンパイルによるものです。各プラットフォームが具体的に何を意味するかについては、クロスコンパイルを参照してください。 [1] しかし、クロスコンパイルではなくても、プラットフォームはランタイムに依存関係が必要なのかビルドタイムに必要かを意味します。デフォルトでは、ランタイム/ビルド時間の区別は明確にするためのヒントですが、strictDepsを設定するとデフォルトでデフォルトで有効になります。

上記の依存関係を含むPATH拡張は、関連するプラットフォームに従ってのみ行われます。このプロセスは、ホストプラットフォームが新しくフォークされたビルドプラットフォームと一致する依存関係、つまり新しいフォークがビルドされるプラットフォームで実行される依存関係に対してのみ実行されます。[2]これらの依存関係ごとに、dep / bin(存在する場合)がPATH環境変数に追加されます。

他の転移的(非直接)下流の依存関係も直接依存関係として要求する場合、依存関係が伝播されると言われています。 [サム]

注意することが重要です以前のように依存関係が必ずしも伝播するわけではありません。代わりに、プラットフォームのルールが一貫しているように、それに応じて順序を指定してください。依存関係の伝播の正確な規則を決定するために、最初に各依存関係に複数の三項数(ビルドの場合は-1、ホストの場合は0、ターゲットの場合は1)を割り当てて、ホストとターゲットをキャプチャする依存関係の種類を示します。プラットフォームの状況はそれぞれによって異なります。派生ホストとターゲットプラットフォームの「オフセット」。次の表は、利用可能なさまざまな組み合わせをまとめたものです。

最初の参照では、パッケージのホストおよびターゲットプラットフォームをパッケージが構築され実行されるプラットフォームとして定義します。

ところで2番目の文章を読んでみると理解できませんでした。

このプロセスは、ホストプラットフォームが新しくフォークされたビルドプラットフォームと一致する依存関係、つまり新しいフォークがビルドされるプラットフォームで実行される依存関係に対してのみ実行されます。

これは、依存関係のホストプラットフォームが実行される場所として定義されることを意味しますか?そして、新しく派生したビルドプラットフォームがビルドされる場所ですか?

ホスティングプラットフォームとビルドプラットフォームは同じ概念ですか?それでは、2番目の文はなぜこれらを区別するのですか?

ありがとうございます。

ベストアンサー1

ホストB(プラットフォームタイプA)がプラットフォームタイプY用のソフトウェアXを構築しているとします。

今Bはホストの構築Aはなります植物形態の確立。これはビルドプロジェクトのすべてのサブ部分に対応します。

ソフトウェアXには2種類の依存関係があります。ランタイム依存関係そしてビルド時間の依存関係。ただし、ビルド時間の依存関係は、2つのサブカテゴリにさらに分けることができます。

  • ビルドプロセスの一部としてビルドホストで実行する必要があること、つまりソースコードプリプロセッサと同様のツールです。これはプラットフォームAでの実行に適している必要があります。
  • 静的にリンクされるコードベースや最終ソフトウェアパッケージにマージされるデータなど、ソフトウェアXの一部になります。実行可能コードがこのカテゴリに属する​​場合は、プラットフォームYで実行するのに適している必要があります。このサブクラスの一部のコンテンツ(たとえば、特定のライブラリヘッダーファイルやその他のデータ項目)は、実際にはプラットフォームに依存しない場合があります。

プラットフォームAがプラットフォームYと等しい場合、両方のサブタイプは同じ方法で解決できます。つまり、依存関係ツリーを構築し、リーフから始めてルートまで作業するだけです。

ただし、AがYと等しくない場合は、各ビルド時間依存関係が属するサブタイプも追跡する必要があります。

これで、各ビルド時間依存関係は独自の依存関係を持つことができます。したがって、ビルダーは、ソフトウェアをビルドするために、チェーンがプラットフォームA用の別のツールT2をビルドし、最終的にソフトウェアXをビルドするプラットフォームA用のビルドツールT3に接続されることがわかります。

ビルド時間依存関係の2番目のサブクラスにはクロスビルドが必要です。ソフトウェアXに静的ライブラリLが必要な場合、ビルドホストは最初にプラットフォームタイプYのLバージョンを取得またはビルドする必要があります。ただし、ライブラリLには独自のビルド時間依存セットが含まれている可能性があります。2つのサブタイプ:プラットフォームY用のライブラリLをビルドするには、ビルドホストはまず、独自の(プラットフォームA)用のツールT2とライブラリLの一部として使用されるライブラリL2をビルドする必要があるため、プラットフォームY用のL2もビルドする必要があります。 。

自動化されたビルドプロセスは、これらすべての依存関係を追跡する必要があります。任意の深さに対する各反復。理想的には、ビルド全体の一部である複数のソフトウェアコンポーネントをビルドするために特定のツールTが必要な場合は、ツールを必要とするすべてのソフトウェアコンポーネントがビルドされるまで一度だけビルドして維持する必要があることも理解する必要があります。

したがって、自動化されたビルダーは、最終的にソフトウェアXがビルドされるまで、まずビルド時間依存関係を1つずつビルドします。各個別コンポーネントのビルド操作にはホストプラットフォーム一つと一つターゲットプラットフォームビルドタイム依存関係のサブクラスに応じて、AまたはYです。

一度ソフトウェア、つまり、この特定のソフトウェアXビルドインスタンスホストの構築バンドターゲットプラットフォームワイ。

これ植物形態の確立(A)特定のアーキテクチャで特定のツールを使用した場合にのみ発生するビルドエラーを追跡する必要がない限り、この時点では一般的に重要ではありません。

ソフトウェアプロジェクトでは、文書は通常、最大1つのクロスビルドステップを念頭に置いて作成されます。ホストプラットフォーム等しい植物形態の確立:どちらも実行可能ファイルがビルド/ビルド中/ビルドされるプラットフォームを参照します。ターゲットプラットフォームビルド中の実行可能ファイルが実行されるプラットフォームを示します。

実行可能ファイルを構築したら、実行可能ファイルがどのように構築されたかについて考えを止め、実行可能ファイルで何ができるかを考え始めることができます。実行可能ファイルがクロスコンパイラの場合、ホストおよびターゲットプラットフォームの用語は次のステップでリサイクルされます。

  • クロスコンパイラが構築されたプラットフォームは現在、歴史的な詳細にすぎず、具体的な名前はありません。
  • 新しいクロスコンパイラが実行されるプラットフォームが今すぐ呼び出されます。ホストプラットフォーム
  • 新しいクロスコンパイラが実行可能ファイルを生成するプラットフォームは次のとおりです。ターゲットプラットフォーム

クロスコンパイルクロスコンパイラの場合、「究極の」ターゲットプラットフォームに広く使用されている業界標準の用語はないと思います。

ただし、Nixpkgsビルドシステムはクロスコンパイラを使用してクロスコンパイル状況を処理する準備ができているためNixpkgsについて具体的に話すとき彼らは、次のようにさまざまなプラットフォーム用語を指定します。:

  • 植物形態の確立=ビルド/ビルド/ビルドされる実行可能ファイルがビルドされるプラットフォーム
  • ホストプラットフォーム=ビルド中の実行可能ファイルが実行されるプラットフォーム
  • ターゲットプラットフォーム=実行可能コードを生成する項目にのみ適用されます。ビルドされる実行可能ファイルが最終的にビルドされるプラットフォーム。

おすすめ記事