Circle CIではdotnet.exeやMSBuildでのビルド例はあるようなのですが、nmakeでのビルドは、探してもなかなか見つかりませんでした。
msbuildとは異なり、nmakeは、そのままの状態だとコマンドにパスが通っていないため、呼び出せません。手動ビルドの時は、vcvarsall.batなどで開発者コマンドプロンプトに入ってからビルドしてましたが、Circle CIでそれをやると、バッチ実行以降の処理が、実行ログに全く記載されなくなります。call等で呼び出すと、次の行では環境変数が元に戻ってしまいます。GitHub Actionでは、vcvarsall.batで設定される全部の環境変数を引き継ぐmsvc-dev-cmdというものがあるので、それを呼び出すだけなのですけどね。
対処
powershell.exe (windows executorのデフォルト)で実行し、開発者用PowerShellの起動ショートカットの中身を直接実行するような感じで実装しました。
- run:
name: compile
command: |
$vswhere = "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
$instanceId = & $vswhere -property instanceId -format value
$installationPath = & $vswhere -property installationPath -format value
Import-Module (Join-Path $installationPath "Common7\Tools\Microsoft.VisualStudio.DevShell.dll")
Enter-VsDevShell $instanceId -SkipAutomaticLocation -Arch amd64
nmake /F NMakefile
※ 32ビットの場合は-Arch x86
です。
vcvarsall.batの環境変数を全部取り出して引き継ぐ方法よりも、こちらのほうが短く書けて、すっきりしました。
参考:
おまけ
今回、3つのプロジェクトで、Circle CIのワークフローを書きました。Circle CIの存在を知ってからわずか数日で、それぞれの更新をリリースできるまでになりました。ご参考までに。
- lslint: LSLの構文チェックバイナリ。Win/OSX/Linuxのそれぞれのビルド処理あり。
- sublime-text-lsl: SublimeTextのLSL(SecondLifeのスクリプト言語)のプラグインです。
- sublime-text-tooltip-lsl: こちらもSublimeTextのプラグインです。ちょっと短め。
※ リンクは、config.ymlへの直リンです。
全て、kwdbという、LSLの定数や関数の一覧を提供しているリポジトリから、データをダウンロードしてきています。lslintでは、ダウンロードしたデータを、makeでソースに変換して、リポジトリにコミットしています。下2つは、kwdb_to_sublimeという、変換処理だけを入れてあるリポジトリをクローンして、それを使って定義ファイル類に変換し、コミットしています。