まとめ
//go:generate sh -c "m4 -DVAL=\"hello world\" hello.go.m4 > hello.go"
注意点
//go:generateディレクティブ以降に指定されたコマンドはシェルで実行されるわけではない。
だからシェルが提供する機能であるクオート、標準出入力は使えない。
ただgo generateはクオートの機能を提供している。シェルとは挙動が違う。
クオートしたい
"(ダブルクオート)で囲む。ちなみこのクオートされた文字列はgoの文字列リテラルと同じ働きをする。
シェルとは違う動作なので注意。
例えば次のようにすると、
//go:generate echo "\"hello\nworld\""
次のような出力をする。
"hello world"
この場合出力をするだけでgoコードは生成しない。意味のないコードである。
標準出入力を使いたい
標準出入力をあつかうのはshを使えばよい。
//go:generate sh -c "m4 -DVAL=\"hello world\" hello.go.m4 > hello.go"
goのクオートとシェルのクオートのどちらにも気をつける必要がある。
VALの値は何だろうか?
-DVAL=\"hello world\"の\はgoによって取り除かれて、"はシェルによって取り除かれる。
だからVALの値はhello worldである。
シングルクオートを使った方がいいかもしれない。
//go:generate sh -c "m4 -DVAL='hello world' hello.go.m4 > hello.go"
この場合もVALの値はhello worldである。