18

私は autoconf のファンではありませんが、原則として、(autoconf 以外の) configure スクリプトが、ユーザーが autoconf ベースのビルド システムに期待するものにできるだけ近い動作をするようにしています。GNU コーディング標準は、実際にはこのトピックに関してかなり合理的であり、autoconf/automake を使用せずに別の方法で互換性のあるインターフェースを提供する可能性について明示的に言及しています。

https://www.gnu.org/prep/standards/standards.html#Configuration

ただし、適切な説明が見つからない問題の 1 つは、CFLAGS を最適に処理する方法です。ユーザーのビジネスに関係のない重要なフラグ ( など-I$(srcdir)/inc) は、configure スクリプトまたは makefile の CFLAGS に属していないことは明らかです。それらをオーバーライドすると、ビルドが完全に壊れてしまうからです。したがって、これらは makefile にハードコーディングするか、(検出が必要な場合は) configure に検出ロジックを配置しますが、上書きされないように CFLAGS の代わりに別の make 変数を介して渡します。

ただし、最善の処理方法についてはまだ不明ですが、最適化レベル/オプション、警告フラグ、デバッグなどのオプションのものです。フラグは、次のようなものによって有効にするか、他の make 変数に追加--enable-debugまたは渡す必要がありますか? ユーザー提供のフラグと競合する場合はどうなりますか?--enable-warningsCFLAGSCFLAGS

多くのプロジェクトで、答えが「それをまったくいじらず、ユーザーに選択させるCFLAGS」であることがわかりますが、私の使用例のいくつかは、ユーザーベースが一般的に興味を持っているプロジェクトです-すぐに使用できる最適化されたデバッグ構成。

編集:CFLAGS私が忘れていたもう1つの問題:必須ではないが優先される特定のCFLAGSを検出して自動的に使用する場合、これはユーザーが環境で空白のままにした場合にのみ行うべきですか、それとも常に行うべきですか?

4

2 に答える 2

8

--enable-warnings のような引数を処理したい場合は、やるべきことがたくさんあります。シンプルに保ちたい場合は、その引数に次のようなものを追加できます

CFLAGS="$CFLAGS -Wall -Wextra"; CPPFLAGS="$CPPFLAGS -DWARNINGS"

構成スクリプトで、しかしこれは実際にはワームの大きな缶を開きます。これらのオプションはすべてのコンパイラで認識されますか?それとも、ユーザーがこれらのオプションを認識し、必要な処理を行うコンパイラを使用していると想定していますか? おそらく、あなたが知っている一連のコンパイラの別のチェックでその割り当てをラップする必要があります。または、ユーザーが使用しているコンパイラが少なくともこれらのフラグを渡したときにエラーにならないことを確認する必要があります (おそらく、ユーザーはすでに CFLAGS で -Wsome を設定しており、コンパイラは競合する引数でエラーになります - Wall.) 同じ問題が --enable-debug にも当てはまります。-DEBUG を CPPFLAGS に追加して --enable-debug に応答することは完全に合理的であるように思われるため、ユーザーはソースを調べて、-DDEBUG ではなく -DEBUG を介してデバッグが有効になっているかどうかを判断する必要はありません。そのようなことをしないでください。

ユーザーに「すぐに使える最適化されたデバッグ構成」を持たせたい場合、プロジェクトの構成スクリプトはそれを行う場所としては不適切です。構成をシンプルに保ち、ユーザーに pkgsrc などのパッケージ管理システムを使用してもらいます。ディストリビューション tarball にその機能の一部を持たせたい場合は、ユーザーに割り当てを行う一般的なプラットフォーム用の一連のスクリプトを提供します (おそらく、プラットフォームを検出した後に構成スクリプトによって自動的に呼び出されますが、その機能をオーバーライドする機能を提供します)。したがって、必要な機能を提供します。ただし、configure スクリプト自体は必要最小限に留めておいてください。

于 2012-05-02T13:14:28.707 に答える
1

カスタム フラグを提供するときに、ユーザーが何かと取り組まなければならないことを期待させるのは十分に正気です。追加することができ、先頭に追加CFLAGSすることできます(ヘッダー検索パス オプションは最初のパスを調べますが、コンパイラの最適化とディレクティブは最後のオプションを調べます (または、前のオプションをオーバーライドします))CPPFLAGS

--enable-debugまた、configure スクリプトに提供される他のコマンドライン ディレクティブは、コンパイラ オプションを変更する必要があるだけでなく、ソース内の変更も必要になる可能性があります (たとえば、インライン マクロを実際の関数として再定義するなど)。用途が若干異なります。

結論として、ユーザー指定をCPPFLAGS先頭に追加し、ユーザー指定をCFLAGS追加します。configure スクリプト オプションは、コンテキストに応じて追加または追加できます。

于 2012-05-02T17:07:30.640 に答える