VisualStudio2017

Visual Studio 2017でビルドイベントにてnmakeを呼ぶ

発端

今やってるプロジェクトの開発環境を構築してもらってたらビルドに失敗するという報告を受けた。
nmakeが見つからないのだ。

いちおうVSさんの名誉のため断っておくけど、もちろん普通にプロジェクトを作っている場合にはこんなことは起きない。
VSではMakefileなんて普通は書かないし気にしなくてよいようになっている。
でもビルドプロセスにフックしてちょっとしたビルドイベントを書くことができるようになってて、今回はそこを使っていたからだ。

今のプロジェクトではgit tag -aでタグをつける運用をしていてビルドイベントの中からnmakeを呼ぶようにしている。
その中でgit describeで拾ったタグをもとにバージョンを自動で生成してversion.incファイルに書き出しておいて、Site.Masterの中で#include file="version.inc"を埋め込んでる。
常に今動いているアプリがどの時点のものかがハッシュ込みでVer. SNAPSHOT-20171204-275-g533f377fcみたいに表示されて便利という。1
incファイルを使ってたり多少構成は変わったけど以前別プロジェクトで若手がやってて便利なので使い続けてる。

ただ私自身はVS2015とかから移行してきているので忘れてたけど、新らしいマシンにインストールして環境を作ろうとした人はVS2017だけではビルドできないという問題に遭遇したわけ。

$(VS140COMNTOOLS)\..\..\VC\bin\nmake.exe" /F "$(ProjectDir)Makefile

と書いてあったので,このVS140COMNTOOLSという環境変数が使われ続けていたのだ。
この環境変数はVS2015を入れると設定され、nmakeもそちらのを使ってたということ。

というわけでここをVS2017用に書き換えてやればよいということです。

VS150COMNTOOLSはどこだ!?

さて早速だけどVS150COMNTOOLSを探すとない。
ググると確かにないないって言われててるんだけどどうするのかについては良く状況がつかめないのだ。
もちろん一つには手で環境変数を設定すればよいんだけどそれは別のところで問題がでるらしい。

VS2017からはそのあたりの構成も変わったので素直にVS150COMNTOOLSを設定して使うというのはなかなか厄介そう。
しばらくググってこの手のバグレポだかイシューを調べている過程でようやく気付いた。
「開発者コマンドプロンプト for VS 2017」というショートカットからコマンドプロンプトが呼べるんだけど,2
どうやらビルドイベントなんかもこの環境の中かあるいはこの環境相当の中で動いているっぽい。3

というわけで「開発者コマンドプロンプト for VS 2017」の中でnmakeをたたいてみたら。。。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise>nmake

Microsoft(R) Program Maintenance Utility Version 14.12.25834.0
Copyright (C) Microsoft Corporation.  All rights reserved.

NMAKE : fatal error U1064: MAKEFILE が見つかりません、またターゲットが指定されていません。
Stop.

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise>where nmake
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.12.25827\bin\Hostx86\x86\nmake.exe
c:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\SDK\ScopeCppSDK\VC\bin\nmake.exe

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise>

Oh...
なんというか盲点でした.
というわけでがっくりきますけど,問題解決。

結論

結論としてはVS2015までnmakeとかのビルドツールを使うには環境変数経由でアクセスする必要があったけど今はビルドイベントの中ではそもそもそんな必要はなく以下でnmakeとかcscとか呼べるということのようです。

nmake /F "$(ProjectDir)Makefile

と書き換えてやればよかっただけ...ぐぬぬ。


  1. 前半のSNAPSHOT-yyyymmddまでがタグでそこから先はタグ付けずにコミットが進んでいるのでこんな風になってたりする. 

  2. これがまたVSから呼び出す形になってないのでワケワカなんだ 

  3. あまりちゃんと確認してないので正しくないかもしれません