Git for Windows には awk や Perl などの MSYS ツールのサブセットがついてきます。
git は開発者向けツールなので、一般のユーザ環境でインストールされていることは期待できませんが、GitHub で公開するソフトウェアから使う分には、入手している時点で git for Windows が入っているとしても問題ないでしょう。
つまり、ビルド用バッチならば awk や Perl が使えるということです。
awk や Perl は環境変数 PATH こそ通っていませんが、git.exe からは
- (GITのインストールディレクトリ)/
- cmd/
- git.exe
- usr/
- bin/
- gawk.exe
- perl.exe
- bin/
- cmd/
と相対パスが決まっています。なので、git の絶対パスが分かれば
setlocal
for %%I in (git.exe) do set "GITDIR=%%~dp$PATH:I.."
set "AWK=%GITDIR%\usr\bin\gawk.exe"
"%AWK%" "BEGIN{ print \"ahaha\" }"
endlocal
のように呼び出すことができます。
%~dp$PATH:I
は %I に与えられた実行ファイル名を %PATH% のリストのディレクトリから検索し、最初に見付かった実行ファイルの「ドライブ+ディレクトリ」に変換します。where.exe でも同様のことができますが、複数見付かったら複数行出力してしまうので、パス文字列を組み立てる時はこちらの方が都合がよいです。
ただし、このバッチファイルはパッケージマネージャの scoop でインストールされた git ではうまく動作しません。git.exe の本体ではなく、パスを調整するプロキシー的な実行ファイルが %PATH% のディレクトリリスト上にあるからです。
ですが、幸い、scoop の git の場合、%GIT_INSTALL_ROOT%
という git のインストールディレクトリを示す環境変数が設定されているようです。これを利用しましょう。
完成形は以下のとおりです。
setlocal
if "%GIT_INSTALL_ROOT%" == "" for %%I in (git.exe) do set "GIT_INSTALL_ROOT=%%~dp$PATH:I.."
set "AWK=%GIT_INSTALL_ROOT%\usr\bin\gawk.exe"
"%AWK%" "BEGIN{ print \"success\" }"
endlocal