これまでGNU makeとMakefileの使い方を取り上げてきた。前回はこの機能がWindowsでも利用できることを説明し、その例としてWindowsにMSYS2をインストールした状態でMakefileを使うサンプルを取り上げた。今回はWindowsで利用するLinuxの例としてMSYS2ではなくWSLを使う方法を取り上げる。
WSL登場後のWindowsとLinux
WindowsにWSLが登場する以前はMSYS2といったソフトウエアをインストールすることでWindowsでLinuxのコマンド群を利用することができた。似たようなソフトウエアはいくつかある。例えば、「MSYS2」は「pacman」というツールでLinuxコマンドのインストールを行うことができ、便利なものの一つだ。
MicrosoftがWSLをデフォルトの機能としてWindowsに導入したことで状況が変わった。WindowsではUbuntuをインストールして使うというのがデフォルトの機能として提供されるようになった。今後はこの機能を使ってWindowsでLinuxを使うという方法を選択肢の1つとして検討するのが当然になってくる。
WSL(現在はWSL2)は仮想環境でLinuxカーネルを動作させるものなので、Linuxカーネル互換性は100%だ。ただし、仮想環境で動作しているのでWindowsとの親和性に若干の弱さがある。Windowsのバイナリとして実行されるMSYS2に比べるとWindowsとのなじみが弱い。
例えば、前回使ったMakefileはWindowsのWSL (Ubuntu)ではそのままだと動かない。今後はWSLを使うケースが増えることが予測されるので、今回は前回のMakefileをWSL向けに書き換える方法を取り上げる。
Windows (MSYS2)で動かすMakefile
まず、前回の成果物をおさらいだ。経理処理(売上関係)の作業手順をMakefileにまとめた。ファイルとディレクトリを次のように配置した。
$ tree 経理処理(売上関係)
経理処理(売上関係)
├── Makefile
├── mk
│ └── base.mk
└── templates
├── mailbody
└── Makefile
2 directories, 4 files
$
◆経理処理(売上関係)/Makefile
all: clean
#========================================================================
# 新規作業ディレクトリのセットアップ
#========================================================================
add:
dir=$$(date +%Y%m%d); \
\
if [ ! -e $${dir} ]; \
then \
mkdir -p $${dir}; \
cp templates/Makefile \
$${dir}/; \
fi
#========================================================================
# クリーンナップ
#========================================================================
clean:
for i in 20*; \
do \
cd $${i}; \
make clean; \
cd ..; \
done
◆経理処理(売上関係)/templates/Makefile
include ./../mk/base.mk
◆経理処理(売上関係)/mk/base.mk
#========================================================================
# ディレクトリに記述されている日付
#========================================================================
date=$(notdir $(shell pwd))
#========================================================================
# 使用するアプリケーション
#========================================================================
ecl="C:\Program Files\Microsoft Office\root\Office16\ecl.EXE"
mail="mail.ps1"
#========================================================================
# POSから売上データを取得
#========================================================================
fetch:
scp postdata:~/sales/$(date)/sales.csv \
./
#========================================================================
# 売上データの処理および編集アプリケーションの起動
#========================================================================
edit:
prog1 sales.csv
$(ecl) sales.csv
cp sales.csv \
C:\\Users\\$(USERNAME)\\Desktop\\売上報告書.csv
#========================================================================
# 売上データの処理および編集アプリケーションの起動
#========================================================================
report:
mail.ps1 \
-To 報告先メールアドレス \
-Cc CCメールアドレス \
-Subject 【日報】$(date)締め売上関連データ報告書 \
-Attachment C:\\Users\\$(USERNAME)\\Desktop\\売上報告書.csv \
-BodyFromFile ./../templates/mailbody
clean:
不要なデータの削除処理
MSYS2のようなソフトウエアを使うと、MakefileからWindowsのアプリケーションも起動できるので便利だ。WSLでも同じことはできるのだが、少々書き換えが必要になる。
Windows (WSL)にmakeをインストール
WindowsでUbuntuを使う準備ができていないなら、先にMicrosoft StoreからUbuntuを選択してインストールするか、管理者権限のターミナルで次のコマンドを実行してUbuntuをインストールする。初めての場合は、ここで一旦再起動を求められることもあると思う。
wsl --install -d Ubuntu
Ubuntuがインストールできたら、Ubuntuで次のコマンドを実行してシステムをアップデートする。
sudo apt update
sudo apt upgrade
このあたりの作業に関しては「Ubuntuをインストールする | TECH+(テックプラス)」や「Ubuntuをインストール後にアップデートする | TECH+(テックプラス)」を参考にしてもらえればと思う。
この状態のUbuntuにはmakeがインストールされていないので、次のようにコマンドを実行してmakeをインストールする。
sudo apt install make
これでWindowsにおいてUbuntuで動作するmakeコマンドを実行できるようになる。
WindowsからWSLのmakeを使うための方法と設定
WSLで動作するコマンドは、Windowsからは「wsl Ubuntuのコマンド」のように実行することで使用できる。ためしにmakeではなく「wsl make」のように実行してみよう。Ubuntuで動作するmakeコマンドが動くことを確認できる。
wsl make
ただ、毎回毎回「wsl make」と実行するのはちょっと手間だ。「make」で実行したい。これを実現する方法はいくつかある。MicrosoftはWindowsでシェルとしてPowerShellを使うことを推奨しているので、ここではPowerShellの設定で「make」を実行したら「wsl make」が代わりに実行されるように設定する。
まず、次のように指定してメモ帳を実行する。これでPowerShellの設定ファイルを編集する状態になる。 notepad $PROFILE
ここに次の設定を追加する。
function make { wsl make $Args; }
説明は省くが、これはPowerShellで関数を設定するというものだ。シェルの関数と同じようなことを行っていると考えてもらえればと思う。シェルであればエイリアスも使えるのだが、PowerShellでは同じようなことは関数を利用する(PowerShellのエイリアスはかなり厳密なものでこういった用途には使えない)。
PowerShellとターミナルを再起動すれば先程の設定が反映される。
そのままのMakefileだとエラーになる
Windowsからmakeが実行できるようになったので、早速前回作ったMakefileを実行してみよう。次のようになる。
実行するとエラーがでる。Microsoft Excelを実行するために指定したパスが存在しないというエラーだ。
C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE
WSLで動作しているとはいえUbuntuはUbuntuであり、「C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE」というWindowsのパスはUbuntuは理解しないことが原因だ。
WSLから使えるパスに変更する
WSLで利用できるようにするには、どうすればよいか。それには、Windowsのパスになっている部分をUbuntuから利用できるパスに書き換えるという作業を行う。WSLで動作しているUbuntuからは、Windowsのファイルシステムが/mnt/c/以下にマウントされるようになっているので、そこにあるMicrosoft Excelを指定すればよいということになる。
Ubuntuからfindコマンドで探すと、次のパスに存在していることがわかる。
$ find /mnt/c/ -name EXCEL.EXE 2> /dev/null
/mnt/c/Program Files/Microsoft Office/root/Office16/EXCEL.EXE
$
このパスをMakefileで指定して実行するように書き換えればよい。UbuntuからWindowsのアプリケーションやコマンドを実行することはできるようになっているので、ここさえ書き換えれば動作するようになる。
書き換えたMakefileのサンプル
元のMakefileにはMicrosoft Excel以外にもWindows特有の表記でパスが記載されているので、これをUbuntuから認識できるパスに書き換えると次のようになる。
#========================================================================
# ディレクトリに記述されている日付
#========================================================================
date=$(notdir $(shell pwd))
#========================================================================
# 使用するアプリケーション
#========================================================================
ecl="/mnt/c/Program Files/Microsoft Office/root/Office16/EXCEL.EXE"
mail="mail.ps1"
#========================================================================
# POSから売上データを取得
#========================================================================
fetch:
scp postdata:~/sales/$(date)/sales.csv \
./
#========================================================================
# 売上データの処理および編集アプリケーションの起動
#========================================================================
edit:
prog1 sales.csv
$(ecl) sales.csv
cp sales.csv \
/mnt/c/Users/daichi/Desktop/売上報告書.csv
#========================================================================
# 売上データの処理および編集アプリケーションの起動
#========================================================================
report:
mail.ps1 \
-To 報告先メールアドレス \
-Cc CCメールアドレス \
-Subject 【日報】$(date)締め売上関連データ報告書 \
-Attachment /mnt/c/Users/daichi/Desktop/売上報告書.csv \
-BodyFromFile ./../templates/mailbody
clean:
echo 不要なデータの削除処理
WSLで動作するUbuntuとWindowsを組み合わせる場合、常にこうしたパスの書き換えが必要になる。
Windows + WSLで動作するMakefile
書き換えたMakefileを使ってみよう。例えば「make edit」と実行する。
すると次のようにMicrosoft Excelが起動する。
パスを書き換えるという手間は発生するものの、LinuxのコマンドもWindowsのアプリケーションも起動して利用できるのは便利だ。Linuxの利点もWindowsの利点も使用できる。世界で最もシェアの広いデスクトップOSであるWindowsでUbuntuが使えるようになったのだから、どちらの機能もフルに利用していくのがこれからの活用術となっていきそうだ。