🐍

[小ネタ] PythonなどのスクリプトをMakefileに埋め込む方法

に公開

最近タスクランナーとして時々 Justfile を使っていて、これの場合、以下のように Python スクリプトを埋め込んだレシピが簡単に書けます。

ok:
  #!/usr/bin/env python
  print("OK");

これがかなり便利なので、Makefile (GNU make) のなかに Python スクリプトを直接埋め込む方法を備忘録として記載します。

やりかた

Justfile の場合とはだいぶ見た目が違いますが、以下の手順で実現できます。

  1. define ディレクティブを使って複数行のスクリプトを変数に格納する。
  2. 変数を export して環境変数にする。
  3. 定義した環境変数をレシピ中で参照し python に -c オプションで渡す。

Makefile の使用しているシェルが sh 類似のものの場合は以下のようになります。

定義した変数は Makefile の中では展開しないで、実行時のシェルの方で展開しているのがキモで、以下のように Makefile の中で変数展開しようとするとうまく動かないのでご注意ください。

ok:
    python -c "${PRINT_OK_PY}"

Makefile の中で変数展開すると、make は展開後の各行を個別にシェルに渡す挙動になるようです。つまり、上の例は変数展開が終わったあと以下のような見た目になります。

ok:
    python -c "print('--')
    print('OK')
    print('--')
    ...

上の例だと2行目の " が閉じてないのでエラーになります。

補足

当たり前ですが、Python のようにコマンドラインからスクリプトを引数として指定できるような環境であれば同じような事ができます。

利用した環境

$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0
$ python --version
Python 3.13.0

参考文献

https://stackoverflow.com/questions/69226331/how-should-i-embed-a-python-script-in-a-makefile

Discussion