これまで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
  • makeをインストール

    makeをインストール

これでWindowsにおいてUbuntuで動作するmakeコマンドを実行できるようになる。

WindowsからWSLのmakeを使うための方法と設定

WSLで動作するコマンドは、Windowsからは「wsl Ubuntuのコマンド」のように実行することで使用できる。ためしにmakeではなく「wsl make」のように実行してみよう。Ubuntuで動作するmakeコマンドが動くことを確認できる。

wsl make
  • wsl 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を実行してみよう。次のようになる。

  • 前回作成した環境

    前回作成した環境

  • makeを実行するとエラーが出る

    makeを実行するとエラーが出る

実行するとエラーがでる。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
$ 
  • Ubuntu (WSL)からMicrosoft Excelのパスを探す

    Ubuntu (WSL)からMicrosoft Excelのパスを探す

このパスを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」と実行する。

  • make editと実行

    make editと実行

すると次のようにMicrosoft Excelが起動する。

  • make経由でMicrosoft Excelが起動してきた

    make経由でMicrosoft Excelが起動した

パスを書き換えるという手間は発生するものの、LinuxのコマンドもWindowsのアプリケーションも起動して利用できるのは便利だ。Linuxの利点もWindowsの利点も使用できる。世界で最もシェアの広いデスクトップOSであるWindowsでUbuntuが使えるようになったのだから、どちらの機能もフルに利用していくのがこれからの活用術となっていきそうだ。

参考