私は次の問題に直面しています:configure.acファイルでm4_include([some/file.m4])
を使用することを主張します。ここで、some/file.m4には、libtoolizeが機能するために必要な「AC_INIT」や「LT_INIT」などのパターンが含まれています。 。言い換えると、libtoollizeがそれらのパターンを探してsedにフィードする前に、configure.acをm4で前処理する必要があります。
Configure.acを生成したくありません(回避できる場合)。 libtoolizeが提供する唯一のフックは、環境変数SEDを探し、見つかったときに/ bin/sedの代わりにそれを使用することです。
Sed引数を分析して実際のsedに渡すシェルスクリプトを作成しました。残念ながら、libtoolizeはm4local.acとconfigure.acを連結し、ある時点でそれを$ SEDにフィードするため、「configure.ac」という名前の入力ファイルの検索は失敗します。それでも、$ SEDに渡された引数を分析した後、すべての入力ファイルやstdinを連結することができます。これは、最終的にはストリーム(stdin)から読み取ることによって機能する必要があるためです。
したがって、私が直面している問題は次のとおりです。
私のスクリプトは、m4_include([cwm4/configure_ac_top.m4])
のような行に遭遇するまで、stdinから読み取り、stdoutに書き込む必要があります。この行を飲み込んで、代わりにcwm4/configure_ac_top.m4の内容を挿入します。他のm4前処理は必要なく、含まれます。実際、sedは他の無数の小さなことにも使用されているため、m4_include以外の前処理を行うことはまったく危険です。ただし、再帰的である必要もあります。インクルードされたファイルにm4_sinclude([lt_init.m4])
行が含まれている場合は、そのファイルもインクルードする必要があります。
このサイトで、あるファイルを別のファイルに挿入する方法を尋ねる複数の質問とその回答を見つけましたが、挿入されるファイルのファイル名がわかっている(元のファイルから読み取られていない)ため、再帰的ではなく、多くの場合、stdinから読み取っていませんでした(ただし、最初の既知のファイルから名前で)。
結局、m4を使ってこれを解決しました。この作業でスローされる可能性のある「sed」コマンドを作成するために、m4はm4_include()マクロの処理以外は何も実行しないでください。実際にm4入力を処理していると想定しているので、引用符の削除やもちろん再帰的なインクルードなど、さらに多くのことを実行しても問題ありません。
したがって、私が行うことは、入力ストリーム内のすべての「m4_」をマジックストリング(xyzzy)に置き換え、先頭にm4_changequote(,)
を挿入して引用符をなしに変更し、結果をm4にパイプすることです。これにより、m4が入力に対してまったく何もしないことが保証されます。ただし、_m4_include
_を処理したいので、m4にパイプする前に、xyzzyinclude([\1])
をm4_changequote([,])m4_include([\1])m4_changequote(,)
に置き換えて、m4にインクルードされたファイルを適切な引用符で処理させます。最後に、_m4 -P
_の出力はsedによって再度処理され、マジックストリングが「m4_」に置き換えられます。
_magic="xyzzy"
cat first.txt | /bin/sed "s/m4_/$magic/g;s/$magic""include(\[\([^]]*\)\])/m4_changequote([,])m4_include(\1)m4_changequote(,)/g;1s/^/m4_changequote(,)/" | m4 -P - | sed "s/$magic/m4_/g"
_
マジックストリングの制限は次のとおりです。(サブストリング)m4_を含めることはできず、アンダースコアまたは4_で開始することも、mまたはm4で終了することもできません。また、それが始まるのと同じ文字で終わるべきではありません。最後に、それが入力ストリームで発生した場合、それが「m4_」に置き換えられたときにスクリプトの目的を損なうべきではありません。
次の入力がある:
_A1 m4_dnl Nothing should be changed.
A2 m4___file__
m4_include([second.txt])
A4 m4___line__
A5 [` Unmatched quoting: no problem.
_
そして
_This is second.txt, an m4 file.
The wizard said xyzzy,
and nothing happened.
_
'xyzzy'の 'magic'文字列を使用すると、次の結果が得られます。
_A1 m4_dnl Nothing should be changed.
A2 m4___file__
This is second.txt, an m4 file.
The wizard said m4_,
and nothing happened.
A4 m4___line__
A5 [` Unmatched quoting: no problem.
_
Libtoolizeの目的では、m4_includeを使用するconfigure.acを使用して、これで十分です。完全なSEDスクリプトについては、 https://github.com/CarloWood/cwm4/blob/master/scripts/SED.sh を参照してください。
編集:それは十分ではないことが判明しました。また、ハックとしてm4を https://github.com/CarloWood/cwm4/blob/master/scripts/M4.sh に置き換える必要がありました。