KAGURA実験室

KAGURA開発者の個人ブログ

Azure PipelinesでCMakeを使ったC++ビルド

前回はAzure Pipelinesのビルド環境にCMakeがインストールされていることまで確認したので、実際にC++のコードをビルドしてみたいと思います。

まずはローカルでビルド

自動ビルドとはビルドコマンドを自動で叩いてくれるだけで、ビルドの設定まで自動でやってくれるわけではありません。まずは、ローカル環境でビルドが通るようにします。

KAGURAのビルド環境はWindowsMacなのですが、勉強のため、ここでは敢えてUbuntu(WSL)環境でやってみます。

適当なC++のコードがあるとして、

// main.cpp
#include <iostream>

int main() {
    std::cout << "Hello" << std::endl;
    return 0;
}

これをビルドするCMakeの設定ファイルはこんな感じです。

# CMakeLists.txt
cmake_minimum_required (VERSION 3.0)

project(hello)

# main.cppからhelloという実行ファイルを作る
add_executable(hello main.cpp)

# 実行ファイルをbinディレクトリにインストールする
install(TARGETS hello
  RUNTIME DESTINATION bin
)

インストール先のディレクトリが相対パスの場合、変数CMAKE_INSTALL_PREFIXからの相対パスになります。

フォルダ構造はこのようにします。

- (source dir)
    |- CMakeLists.txt
    |- main.cpp
    |- build/  ← ビルドディレクトリ(作業ディレクトリ)
        |- Makefile  ← CMakeによって生成される
    |- dist/  ← インストール先(CMAKE_INSTALL_PREFIX)
        |- bin/
            |- hello  ← インストールされた実行ファイル

CMakeを使ったビルドは、次の3ステップを実行することになります。

  1. プロジェクトファイルの生成
  2. ビルドの実行
  3. ビルド結果を取得

1. プロジェクトファイルの作成

cmakeコマンドは基本的にはビルドディレクトリで実行します。

$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX=../dist ../

-DオプションでCMAKE_INSTALL_PREFIX(インストール先)を指定、最後の引数はCMakeLists.txtファイルのある場所を指定します。

cmake -DINSTALL_PREFIX={インストール先} {ソースディレクトリ}

このコマンドでビルドディレクトリにMakefieが生成されます。

2. ビルドの実行

生成されたMakefileを叩くために、makeコマンドを実行してもいいのですが、より汎用的な方法があります。

$ cmake --build ./ --target install

これはmake installを実行するのと同じですが、Visual StudioXcodeのプロジェクトファイルであっても同じように機能するので便利です。

cmake --build {ビルドディレクトリ} --target {ターゲット名}

3. ビルド結果の取得

ビルドが成功すると、インストール先に実行ファイルがコピーされています。

$ ../dist/bin/hello
=> hello

パイプラインでビルド

上と同じことをパイプラインで実行するためのazure-pipelines.ymlは次のようになります。

# azure-pipelynes.yml
trigger:
- master

pool:
  vmImage: 'ubuntu-16.04'

steps:
- task: CMake@1
  inputs:
    cmakeArgs: >
      -DCMAKE_INSTALL_PREFIX=$(Build.ArtifactStagingDirectory)
      $(Build.SourcesDirectory)

- task: CMake@1
  inputs:
    cmakeArgs: >
      --build ./
      --target install

- task: PublishBuildArtifacts@1
  inputs:
    pathtoPublish: $(Build.ArtifactStagingDirectory)
    artifactName: out

3つのタスクのうち、上の2つがCMakeタスクです。詳しくはこちら CMake build and release task - Azure Pipelines | Microsoft Docs

cmakeコマンドは、作業ディレクトリがビルドディレクトリになります。Azure PipelinesのCMakeタスクでは、何も指定しないと、$(Build.SourcesDirectory)\buildが作業ディレクトリになります。

CMAKE_INSTALL_PREFIX(インストール先)には$(Build.ArtifactStagingDirectory)を指定しました。Artifacts(生成物)をまとめるために用意されているディレクトリのようです。

Artifactsを出力するためのタスクがPublishBuildArtifactsです。詳しくはこちら Publish Build Artifacts task - Azure Pipelines | Microsoft Docs

azure-pipelines.ymlを編集してmasterにコミットすると、パイプラインが実行されます。成功すると、ビルドログの右上の「Artifacts」ボタンからダウンロードできます。 f:id:nkshigeru:20190120231229p:plain

WindowsおよびMacの場合

CMakeはクロスプラットフォームなので、基本的にはそのままWindowsMac環境に持っていくことができます。azure-pipelines.ymlのvmImageを書き換えるだけです。

# azure-pipelines.yml(変更) Windows環境を使用
pool:
  vmImage: 'vs2017-win2016'
# azure-pipelines.yml(変更) Mac環境を使用
pool:
  vmImage: 'macOS-10.13'

実行すると、それぞれの環境の実行ファイルができました。 あっさり。

まとめ

Azure Pipelines上で、WindowsMac、ついでにUbuntu環境でCMakeを使ったC++のビルドを実行することができました。どこに落とし穴があるか分からないので、慎重にUbuntu環境から進めてみましたが、何にも問題ありませんでした。