CppBuildTasks - vcpkgとCMake(CMakeLists.txtまたはCMakeSettings.jsonを使用)を使用してC ++ソフトウェアをビルドします。

Created at: 2019-05-24 00:38:27
Language: TypeScript
License: MIT

ビルドステータステストマーケットプレイスパブリッシング

実行cmakeのと、実行vcpkg:AzureのDevOpsチームC ++ビルドタスクのためのcmakeのvcpkg

GitHubアクションとしても利用できます:

ユーザーマニュアル

開発者マニュアル

前書き

vcpkgとCMake(CMakeLists.txtまたはCMakeSettings.jsonのいずれかを使用)を使用してC ++ソフトウェアをビルドします。提供されているサンプルは、DockerPipeline Cachingも使用して、セルフホストエージェントまたはMicrosoftホストエージェントの両方を使用しています。

クイックスタート

vcpkgをサブモジュールとして使用することを強くお勧めます。以下は、vcpkgがGitサブモジュールであるサンプルです。

  # Sample when vcpkg is a submodule

    # Cache/Restore the vcpkg's build artifacts.
  - task: Cache@2
    displayName: 'Cache vcpkg's  artifacts'
    inputs:
      # As 'key' use the content of the response file, vcpkg's submodule fetched commit id and the platform name.
      # The key must be one liner, each segment separated by pipe char, non-path segments enclosed by
      # double quotes.
      key: $(Build.SourcesDirectory)/vcpkg_x64-linux.txt | "$(Build.SourcesDirectory)/.git/modules/vcpkg/HEAD" | "$(Agent.OS)"
      path: '$(Build.SourcesDirectory)/vcpkg'
   
   - task: run-vcpkg@0
     displayName: 'Run vcpkg'
     inputs:
       # Response file stored in source control, it provides the list of ports and triplet(s).
       vcpkgArguments: @$(Build.SourcesDirectory)/vcpkg_x64-linux.txt
       # Location of the vcpkg as submodule of the repository.
       vcpkgDirectory: $(Build.SourcesDirectory)/vcpkg

   - task: run-cmake@0
     displayName: 'Run CMake with CMakeSettings.json'
     inputs:
       cmakeListsOrSettingsJson: 'CMakeSettingsJson'
       # Use the vcpkg's toolchain file for CMake.
       useVcpkgToolchainFile: true
       # Build all configurations whose name starts with "Linux".
       configurationRegexFilter: 'Linux.*'

vcpkgがサブモジュールではない場合の別のサンプル(非推奨):

  # Sample when vcpkg is NOT a submodule. The exact commit id to be fetched needs
  # to be explicitly provided then (i.e. the value of vcpkgGitRef in this sample).

  variables:
    # Exact vcpkg's version to fetch, commig id or tag name.
    vcpkgGitRef: 5a3b46e9e2d1aa753917246c2801e50aaabbbccc

    # Cache/restore the vcpkg's build artifacts.
  - task: Cache@2
    displayName: 'Cache vcpkg's artifacts'
    inputs:
      key: $(Build.SourcesDirectory)/vcpkg_x64-linux.txt | "$(vcpkgGitRef)" | "$(Agent.OS)"
      path: '$(Build.BinariesDirectory)/vcpkg'
   
   - task: run-vcpkg@0
     displayName: 'Run vcpkg'
     inputs:
       vcpkgArguments: @$(Build.SourcesDirectory)/vcpkg_x64-linux.txt
       # Specify the exact commit id to fetch.
       vcpkgGitCommitId: $(vcpkgGitRef)
       # URL to fetch vcpkg from (default is the official one).
       vcpkgGitURL: http://my.vcpkg.fork.git/

   - task: run-cmake@0
     displayName: 'Run CMake with CMakeSettings.json'
     inputs:
       cmakeListsOrSettingsJson: 'CMakeSettingsJson'
       useVcpkgToolchainFile: true
       # Build all configurations whose name starts with "Linux".
       configurationRegexFilter: 'Linux.*'

実行vcpkgのタスク

タスクは次の手順を完了します。

  1. vcpkgがで指定されたパスにすでに配置されているかどうかを確認します
    vcpkgDirectory
    (たとえば、vcpkgは親リポジトリとともにチェックアウトされたGitリポジトリのサブモジュールである可能性があります)。
  2. vcpkgがない場合は、Gitを使用してvcpkgをそのディレクトリにフェッチします。
  3. 必要に応じてvcpkgが構築されます。
  4. 最終的に、指定されたポートをビルドしてインストールするためにvcpkgが起動されます。

タスクは

RUNVCPKG_VCPKG_ROOT
タスク変数を設定します。これは、後続の「run-cmake」によって自動的に使用され、vcpkgのツールチェーンファイルを消費します。

注:

VCPKGRUN_VCPKG_ROOT
次の条件の最初の条件によってタスクによって設定されます。

  1. vcpkgArguments
    入力タスクが含まれている
    --triplet
    引数を、
  2. vcpkgの応答ファイルには
    --triplet
    引数が含まれています。
  3. vcpkgTriplet
    入力タスクは値に設定されます。

このような場合、最初のヒットによって

RUNVCPKG_VCPKG_ROOT
変数の内容が決まります。他のすべての場合、変数は設定され
run-cmake
ず、タスクインスタンスはvcpkgのツールチェーンパスもトリプレットも再利用できません。

Gitリポジトリのサブモジュールとしてvcpkgを使用します

このvcpkgを使用するときは、具体的にどのように機能するかに注意してください。

  • vcpkgの特定のバージョンは、ローカルおよびビルドサーバーで使用する必要があります。
  • vcpkgの特定のバージョンは
    2019.07
    、使用されているvcpkgリポジトリのコミットIDまたはタグ(リリースタグなど)によって識別されます。
  • インストールするポートのバージョンを選択することはできません。代わりに、使用可能なポートのバージョンを確立するのはvcpkgの使用バージョンです。

要約すると、ローカルビルド環境とリモートビルド環境の間で一貫した開発エクスペリエンスを維持するために、Gitリポジトリのサブモジュールとしてvcpkgを使用することを強くお勧めします。このように、使用されるvcpkgのバージョンは、vcpkgのサブモジュールによって指定されたコミットIDによって暗示されます。

vcpkgの応答ファイルをパラメーターとして使用する

vcpkgは、引数を含む応答ファイルを受け入れます。インストールするポートのリストを含むテキストファイルをソース管理下に保存すると便利です。これは、vcpkgをローカルおよびビルドサーバーでまったく同じ方法で実行するのに役立ちます。たとえば、実行する場合:

vcpkg install boost zlib:x64 libmodbus --triplet x64

代わりに実行することが可能です

vcpkg install @ response_file.txt

response_file.txt
含む場所(末尾の空白は許可されません):

   boost
   zlib:x64
   libmodbus
   --triplet
   x64

vcpkgのアーティファクトのキャッシュ

ビルド時間を最小限にするために、キャッシュのタスクが(で指定された全体vcpkgのディレクトリキャッシュするために使用されるべき

vcpkgDirectory
「実行vcpkg」タスク)。

注:

installed
サブディレクトリと
vcpkg
実行可能ファイルのみをキャッシュする必要があるため、それら以外はすべて
.artifactignore
vcpkg-runタスクによって生成されたファイルによって除外されます。

key
提供されるキャッシュのタスク一意に次のことを確認する必要があります。

  • 提供されているすべてのポートとその特定のバージョンも識別するvcpkgバージョン。
  • 使用されたトリプレットと構築およびインストールされるポートのリスト。
  • ポートを構築するときに使用されるプラットフォームとツールセット。

次のサンプルキーは、上記のほとんどを許可するはずです。

key:  $(vcpkgCommitId)| @$(Build.SourcesDirectory)/response_file_with_ports_and_triplet.txt | "$(Agent.OS)"

どこ:

  • $(vcpkgCommitId)
    Gitの手段によって識別vcpkgの特定のバージョンは、IDまたはタグをコミット。リポジトリのサブモジュールとして、たとえばルートでvcpkgを使用することをお勧めします
    $(Build.SourcesDirectory)/.git/modules/vcpkg/HEAD
    。このような場合、コミットIDはファイルに保存されます。ブランチ名はvcpkgのバージョンを一意に識別しないため、使用しないでください。

  • 応答ファイルには、ポートのリストとトリプレットが含まれています。たとえば、

    sqlite3 --triplet x64-linux
    または別の同じ例
    sqlite3:x64-windows
    です。

    --triplet
    引数は、ポートがトリプレットが指定されていないデフォルト値を指定します。

  • $(Agent.OS)
    ビルドエージェントプラットフォームのみをキャプチャします。必要に応じて、ビルド時に使用されるツールセットを一意に識別するために、キーにさらに値を追加すると便利な場合があります。

注:キーは1つのライナーである必要があり、パイプ文字でセグメントに分割できます。ファイルパス以外の各セグメントは二重引用符で囲む必要があります。文書化されているように、ファイルパスセグメントの場合、ハッシュ値が計算されますが、非ファイルパスセグメントの値はそのまま使用されます。

「を実行-vcpkg」フローチャート

vcpkgタスクを実行します

実行cmakeのタスク

「実行cmakeの」タスクはCMakeLists.txtとで動作しますCMakeSettings.json。 タスク変数を使用して、「run-vcpkg」タスクの以前の実行を活用でき

RUNVCPKG_VCPKG_ROOT
ます。

  • 必要に応じて、vcpkgのツールチェーンファイルを
    $RUNVCPKG_VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake
    ;に設定します。
  • Windowsでmsvcを使用してビルドする場合(つまり、起動によって作成された環境でビルドする場合)、提供されたトリプレットの環境を設定します
    $RUNVCPKG_VCPKG_ROOT/vcpkg env

「を実行-cmakeの」フローチャート

フローチャートには、

CMakeLists.txt
または
CMakeSettings.json
ファイルで使用できる2つのエントリポイントがあります。

注:タスクは、

CMakeSettings.json
と呼ばれるの属性を使用しません
inheritEnvironments
。代わりに、「run-vcpkg」によって設定されたトリプレットは、コマンドが実行される環境変数を設定するためにタスクによって使用されます。これは、適切なターゲット(x86、x64、armなど)を設定するために環境をセットアップする必要があるMSVCを使用する場合にのみ役立ちます。

注:タスクは

buildRoot
、CMakeSettings.jsonで指定された値を無視します。
buildDirectory
入力パラメータを使用してCMakeバイナリディレクトリを指定することができます
$(Build.ArtifactStagingDirectory)/<configuration name>
。デフォルトではです。

CMakeタスクを実行する

タスクリファレンス:すべての入力パラメーター

タスクのすべての入力の完全なリファレンスが提供されます。

サンプル

CMakeLists.txtサンプル
マックOS ビルドステータス
キャッシュ付きmacOS ビルドステータス
キャッシュ付きのmacOS、vcpkgサブモジュール ビルドステータス
Windows-vs2019 ビルドステータス
Windows-キャッシュ付きvs2019 ビルドステータス
Windows-キャッシュ付きvs2019、vcpkgサブモジュール ビルドステータス
Windows-vs2017 ビルドステータス
Windows-キャッシュ付きvs2017 ビルドステータス
Windows-キャッシュ付きvs2017、vcpkgサブモジュール ビルドステータス
Linux / Ubuntu ビルドステータス
キャッシュ付きのLinux / Ubuntu ビルドステータス
キャッシュ付きのLinux / Ubuntu、vcpkgサブモジュール ビルドステータス
CMakeSettings.jsonサンプル
マックOS ビルドステータス
キャッシュ付きmacOS ビルドステータス
キャッシュ付きのmacOS、vcpkgサブモジュール ビルドステータス
Windows-vs2019 ビルドステータス
Windows-キャッシュ付きvs2019 ビルドステータス
Windows-キャッシュ付きvs2019、vcpkgサブモジュール ビルドステータス
Windows-vs2017 ビルドステータス
Windows-キャッシュ付きvs2017 ビルドステータス
Windows-キャッシュ付きvs2017、vcpkgサブモジュール 該当なし
Linux / Ubuntu ビルドステータス
キャッシュ付きのLinux / Ubuntu ビルドステータス
キャッシュ付きのLinux / Ubuntu、vcpkgサブモジュール ビルドステータス

実世界のプロジェクトサンプル

プロジェクト:Microsoft MSVC STL
キャッシュ付きMSVCSTL、vcpkgサブモジュール ビルドステータス
プロジェクト:Microsoft MSVC STL(フォーク)
キャッシュ付きMSVCSTL、vcpkgサブモジュール、セルフホストエージェントDockerベース ビルドステータス
キャッシュ付きMSVCSTL、vcpkgサブモジュール、MSホストエージェントDockerベース ビルドステータス
プロジェクト:Microsoft cpprestsdk
マックOS ビルドステータス
Linux / Ubuntu ビルドステータス
vs2017 ビルドステータス
vs2019 ビルドステータス
プロジェクト:呼び起こす
macOS / Linux / Windows ビルドステータス
プロジェクト:sysmakeshift
macOS / Linux / Windows ビルドステータス
プロジェクト:helgoboss-midi
macOS / Linux / Windows ビルドステータス
プロジェクト:vct
macOS / Linux / Windows ビルドステータス
プロジェクト:CppOpenGLWebAssemblyCMake
webassembly(Dockerを使用)/ Linux / macOS / Windows ビルドステータス
プロジェクト:DisCPP
Linux / Windows ビルドステータス

質問と答え

なぜ単一のタスクではないのですか?

CMakeなしでvcpkgを使用できるからです。または、vcpkgなしでCMakeを使用することもできます。

アドホックbash / powershellスクリプトの作成は簡単でしょうか?

絶対に!誰でもこのタスクを、特定のニーズに合わせて独自のスクリプトを作成するためのインスピレーションとして使用できます。タスクの目的は、ビルドサーバーでのvcpkgとCMakeの使用を合理化および簡素化することです。

キャッシュされたポートファイルが復元された場合でも、「run-vcpkg」タスクがvcpkgを実行するのはなぜですか?

実際、キャッシュが復元されているときにvcpkgを実行する必要はなく、キャッシュタスク

cacheHitVar
パラメータを使用して「run-vcpkg」タスクの実行を制御できます。現在、「run-vcpkg」タスクはサニティチェックとしてvcpkgを防御的に実行します。要求されたすべてのポートがすでにインストールされていることをビルドログに出力し、無視できる時間を費やす必要があります。

開発者情報

貢献

ソフトウェアは現状のまま提供され、いかなる種類の保証もありません。すべてのユーザーは、ソースコードを入手し、修正と新機能でタスクを改善することをお勧めします。

詳細な開発手順については、CONTRIBUTING.mdをお読みください。

ライセンス

このリポジトリ内のすべてのコンテンツ、拡張機能、および「run-cmake」タスクと「run-vcpkg」タスクは、MITライセンスの下でライセンスされてます。

Copyright(c)2019-2020 Luca Cappa