Windows 版 GNU Make で PowerShell を使う方法

# はじめに

Windows 版 GNU Make をインストールしてデフォルト設定で実行すると、シェルがコマンドプロンプト (cmd.exe) で実行されてしまう。何とかして Windows PowerShell (powershell.exe) に変更できないか調べていたところ、[set Powershell core as a default GNU Make shell on windows/linux](https://stackoverflow.com/questions/61754413/set-powershell-core-as-a-default-gnu-make-shell-on-windows-linux) にやり方が書いてあったのでやってみた。
PowerShell Core (pwsh.exe) にも変更できるらしい。（こちらは試していない）

# 環境

* GNU Make 4.2.1 (Mingw-w64)
* Windows Powershell 5.1.19041.610

## 補足

(2021/1/10 追記) 以下、GNU Make のインストール方法について色々書いたが、[Chocolatey に make パッケージ](https://chocolatey.org/packages/make)があったので、```choco install make -y```でインストールしたほうがたぶん早い。

Windows で動く GNU Make には何種類かあるが、[GnuWin32](http://gnuwin32.sourceforge.net/) のものはバージョンが古すぎる。また、使いたいのは make だけなので、[msys2](https://www.msys2.org/) や [cygwin](https://cygwin.com/) や [WSL](https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux) ではオーバースペックすぎる。私は Windows で使うシェルは PowerShell がよいので、[Mingw-w64](http://mingw-w64.org/doku.php) の Windows ネイティブで実行できる make を利用することにした。

また、私の環境には Git for Windows をインストールしているので、Linux ライクなコマンドが競合しないように make だけを選り分けて単体でインストールすることにした。[混ぜるな危険 (msys2とCygwinとGit For Windowsを一緒に使ってはいけません)](https://opcdiary.net/%E6%B7%B7%E3%81%9C%E3%82%8B%E3%81%AA%E5%8D%B1%E9%99%BA-msys2%E3%81%A8cygwin%E3%81%A8git-for-windows%E3%82%92%E4%B8%80%E7%B7%92%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%BE/) にも混ぜるなと書いてあることだし。

# GNU Make のインストール

## ダウンロード

[Mingw-builds のダウンロードサイト](https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/) から x86_64-posix-seh を選択してダウンロードする。
本記事作成時点 (2020/01/08) での最新版は x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z だった。

posix と seh の意味は [MinGW-w64 を導入する](https://text.baldanders.info/remark/2018/03/mingw-w64/) によると下記の通り。

> Thread : スレッドモデル。 posix か win32 のいずれかを選択する。 win32 は Windows ネイティブ関数を使っていて速いのだが C++ 11 以降の thread, mutex, future が使えなくなる。特に理由がないのであれば posix でいいだろう

> Exception : 例外処理ハンドリング。アーキテクチャによって以下を選択できる。
> (略)
>    x86_64
>        seh : Structured Exception Handling （Windows ネイティブ。おすすめ）
>        sjlj : SetJump/LongJump

## インストール

ダウンロードしたアーカイブを適当なパスに解凍する。
ex) E:\Programs\bin\mingw64

GNU Make は mingw32-make.exe というファイル名になっているので、make.exe にリネームしておく。

## make だけ選別する

E:\Programs\bin\mingw64\bin から残したいコマンドだけ残して削除（または退避）する。
*.exe は何かの *.dll に依存している可能性があるので、[Dependencies](https://github.com/lucasg/Dependencies) とかで調べておく。

### make.exe

make.exe は単体でも動くようなので、これだけ残しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168765/d32722cc-15a5-f05e-bf53-4fab56cb13f4.png)

### おまけ

gcc.exe と g++.exe は libwinpthread-1.dll に依存しているようなので、これらのコマンドを使いたい場合は

* gcc.exe
* g++.exe
* libwinpthread-1.dll

をまとめて残しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168765/0eda4506-f89f-494f-7af7-984d3715ccb5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168765/ff3730a5-067a-6c94-e3ef-3e69f249b006.png)

## PATH を通す

環境変数の PATH に E:\Programs\bin\mingw64\bin を追加しておく。

# Makefile の設定

[set Powershell core as a default GNU Make shell on windows/linux](https://stackoverflow.com/questions/61754413/set-powershell-core-as-a-default-gnu-make-shell-on-windows-linux) を参考にして、SHELL と .SHELLFLAGS を設定した。

```Makefile:Makefile
# vi: set fileencoding=utf-8 noexpandtab :
SHELL       := powershell.exe
.SHELLFLAGS := -NoProfile -Command

all:
	Get-Date

```

```PowerShell:実行結果
PS F:\Temp> make
Get-Date

2021年1月8日 22:37:15


PS F:\Temp>
```

これで Windows でも make と PowerShell を使った自動化が捗るようになる。
めでたしめでたし。

# 余談

GNU Make の使い方は [「GNU Make 第3版 日本語版（オライリー）」の無料PDF ](https://www.yokoweb.net/2016/08/28/gnu-make-3rd-pdf-github/) で公開されている [GNU Make 第3版](https://www.oreilly.co.jp/library/4873112699/) の無料書籍で勉強した。ありがたやありがたや。

# 参考 URL

* [MinGW-w64 を導入する](https://text.baldanders.info/remark/2018/03/mingw-w64/)
* [Mingw-w64のオフライン インストール](https://qiita.com/k_maki/items/140f7c14482488891cf9)
* [Windows MinGW開発環境](https://www.torutk.com/projects/swe/wiki/Windows_MinGW%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83)
* [Windows環境にフリーのC開発環境を構築した際のメモ](https://qiita.com/yut-nagase/items/9bb65481685f6b8002de)
* [MSYS2 MinGW GCC環境をつくる（その1）](https://blogs.osdn.jp/2018/01/30/msys2-mingw.html)
* [set Powershell core as a default GNU Make shell on windows/linux](https://stackoverflow.com/questions/61754413/set-powershell-core-as-a-default-gnu-make-shell-on-windows-linux)