0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PxDTAdvent Calendar 2024

Day 2

シェルスクリプトやmakefileでWSLかどうかを判定して、コマンドを切り替える

Last updated at Posted at 2024-12-24

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スマホや組み込み機器の開発をしています。

この記事は小ネタのような内容ですが、複雑ながらも面白い製品開発に業務として日々取り組んでいます。

ピクシーダストテクノロジーズでは、組み込みエンジニアやモバイルアプリエンジニアを募集していますので、もしご興味があればぜひご応募ください。

お待ちしております!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?