Azure PipelinesでCMakeを使ったC++ビルド
前回はAzure Pipelinesのビルド環境にCMakeがインストールされていることまで確認したので、実際にC++のコードをビルドしてみたいと思います。
まずはローカルでビルド
自動ビルドとはビルドコマンドを自動で叩いてくれるだけで、ビルドの設定まで自動でやってくれるわけではありません。まずは、ローカル環境でビルドが通るようにします。
KAGURAのビルド環境はWindowsとMacなのですが、勉強のため、ここでは敢えて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. プロジェクトファイルの作成
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 StudioやXcodeのプロジェクトファイルであっても同じように機能するので便利です。
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」ボタンからダウンロードできます。
WindowsおよびMacの場合
CMakeはクロスプラットフォームなので、基本的にはそのままWindowsやMac環境に持っていくことができます。azure-pipelines.ymlのvmImage
を書き換えるだけです。
# azure-pipelines.yml(変更) Windows環境を使用 pool: vmImage: 'vs2017-win2016'
# azure-pipelines.yml(変更) Mac環境を使用 pool: vmImage: 'macOS-10.13'
実行すると、それぞれの環境の実行ファイルができました。 あっさり。
まとめ
Azure Pipelines上で、Windows、Mac、ついでにUbuntu環境でCMakeを使ったC++のビルドを実行することができました。どこに落とし穴があるか分からないので、慎重にUbuntu環境から進めてみましたが、何にも問題ありませんでした。