バイナリをインストールする前に automake を使用してバイナリを処理/変更したいと考えています。たとえば、バイナリからシンボルを別のファイルと場所 (このように) に抽出したいと思います。もう 1 つの例は、レポートを公開するために重要な資産の md5sums を収集することです。
これは私が持っている簡略化された (しかし代表的な) Makefile.am です:
abc_PROGRAMS = foo
foo_SOURCES = foo.cpp
pqr_PROGRAMS = bar
bar_SOURCES = bar.cpp
ALL_SYMS := $(PROGRAMS:%=%.sym)
sym_DATA = $(ALL_SYMS)
# A convenient target such as "make foo.sym" will trigger this rule:
$(ALL_SYMS): %.sym : %
...
objcopy --preserve-dates --only-keep-debug $< $@
objcopy --preserve-dates --strip-all --add-gnu-debuglink=$@ $<
...
インストール中にスクリプトをフックする方法をいくつか試しましたが、うまくいきませんでした。
考えられる方法の 1 つは、install-exec-local を使用することです。
install-exec-local: $(ALL_SYMS)
install-exec-local の問題は、「make install -j」を使用すると、install-exec-local ターゲットがインストールと並行して実行されるため、バイナリ foo と bar がそれぞれの宛先ディレクトリにインストールされることです。それらが %.sym ルールによって変更されている間に、インストールされたファイルが台無しになる可能性があります。ただし、このソリューションは -j が使用されていない場合に機能します。-j を使用する利点を活用できれば幸いです。
もう 1 つの考えられる方法は、install-exec-hook を使用することです。
install-exec-hook: $(ALL_SYMS)
install-exec-hook の問題は、%.sym ルールを使用してプログラムを変更する前に、プログラム foo と bar が既にインストールされていることです。foo と bar が異なる場所にインストールされることに加えて、適切な install-exec-hook ルールを作成する際に、インストール先の場所を取得する一般的な方法がありません。
別の潜在的な方法は、STRIP_PROGRAM または同等のものを定義することですが、「make install」ターゲットでは機能せず、「make install-strip -j」でのみ機能すると思われるため、実際にはうまく機能しません。私たちのビルド スクリプトは "make install -j" を使用しているため、このパスには行っていません。
もう 1 つの方法は、インストール時ではなくビルド時に実行されるビルド ルールを作成することです。しかし、これは非常に面倒です。ビルド ディレクトリに多くのファイルが作成されるため、避けたいと思います。また、新しいプログラムを追加しているプロジェクトの新しい人は、これらの細かく調整された手の込んだ配置を簡単にバイパスできます。
abc_PROGRAMS = foo foo : foo.tmp foo.sym : foo noinst_PROGRAMS = foo.tmp foo_tmp_SOURCES = foo.cpp pqr_PROGRAMS = bar bar : bar.tmp bar.sym : bar noinst_PROGRAMS += bar.tmp bar_tmp_SOURCES = bar.cpp sym_DATA = foo.sym bar.sym foo bar: % : %.tmp ... cp $@ $< objcopy --only-keep-debug $@ $@.sym objcopy --strip-all --add-gnu-debuglink=$@.sym $@
プログラムがインストールされる前、またはプログラムがビルドされた直後に実行されるフックを automake が提供してくれたら、私はとてもよかったと思います。
stackoverflow.com コミュニティは、インターネットで利用できるソリューションの品質に大きな違いをもたらしています。誰かが私のような問題に直面したに違いないと確信しています。この問題に関する適切な解決策または業界のベスト プラクティスをお待ちしています。最後に、質問をより簡潔に、または理解しやすくすることができなかったことをお詫び申し上げます。