TL;DR
比較的簡単な方法として、次のようなものがありそうです。
シェルスクリプト
if [[ -d /run/WSL ]]; then
ADB=adb.exe
else
ADB=adb
fi
makefile
WSL := $(shell test -d /run/WSL && echo 1 || echo 0)
ifeq ($(WSL), 1)
ADB = adb.exe
else
ADB = adb
endif
やりたかったこと
最近は基本的にはWSL上で開発をしています。
WSLは非常に良いのですが、デバイスと通信するときとかは少し工夫が必要になります。
たとえば、Androidなどの開発をしているときに、USBでデバイスを接続して、adbコマンドでおしゃべりすることがありますが、USBデバイスの接続のサポートはWSLではネイティブに使用できないので何らかの対応をしなければなりません (たとえば、https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb )。
比較的簡単な方法として、そもそもホストWindows側にインストールしたadb.exeを使用するという方法があります。
これは簡単でよいのですが、adb.exe
というのをプロジェクトのシェルスクリプトなどに記述してしまうと、今度は、普通のLinux上でそのシェルスクリプトは動かなくなってしまいます。
そこで、そのシェルスクリプトが実行されている環境がWSL上なのか、それとも普通のLinux環境なのかを判定して、WSL上ならホストWindowsのadb.exe
を呼び出し、そうでなければ単にadb
コマンドを呼び出すというふうにしたいなと思いました (ネイティブのWindows上やMac OS上、あるいは他のOSのことは一旦ここでは考えないことにします)。
説明
調べてみると、uname -r
コマンドを使用して、microsoftという文字列が入っているかで判定する方式が見つかります (https://gist.github.com/mmktomato/e75a166a09fe8920919cf67e5599487d など)。
それでも良いのですが、grepにパイプしたりしなくちゃいけなくて、少し複雑な感じがしました。
そこでさらに調べてみると、WSL上には/run/WSL
というディレクトリがあり、そこでホストWindowsとの情報共有や通信を行っているようです。
良いかどうかは微妙ですが、このディレクトリの有無で判定すると、かなり簡単に「WSLかWSL以外か」を判定できそうでした。
TL;DRに記載した方法はこの方法で、今のところこの方法を採用しています。
エンジニアを募集しています
最後に宣伝となります。
私の所属するピクシーダストテクノロジーズ(PxDT)では、この記事の中で書いたように、adb
コマンド等を使用してAndroidスマホや組み込み機器の開発をしています。
この記事は小ネタのような内容ですが、複雑ながらも面白い製品開発に業務として日々取り組んでいます。
ピクシーダストテクノロジーズでは、組み込みエンジニアやモバイルアプリエンジニアを募集していますので、もしご興味があればぜひご応募ください。
お待ちしております!