web-dev-qa-db-ja.com

configureが変数を引数として取るのはなぜですか?

VAR=value ./configure./configure VAR=valueと同じですか?

最初のケースでは、シェルが環境変数を設定し、2番目のケースでは、configureスクリプトが文字列'VAR=value'を引数として取り、おそらく変数を設定します。 configureが変数に対して他に何かをするのではないか(一部の値を無視またはフィルタリングする可能性があります)、なぜそもそも変数を引数として取るのでしょうか。

10
spelufo

この場合

_VAR=value ./configure
_

この動作は現在のシェルに依存しますが、

_./configure VAR=value
_

動作はconfigure-scriptに依存します。開発者の中には、外部からスクリプトの変数を魔法のように設定するのではなく、スクリプト内で変数を設定するかどうかを選択するため、後者を好む人もいます。

実際には、ほとんど違いはありません。

  • 構成を行うほとんどの人はPOSIXシェルから実行しており、以前の動作は「そのまま」機能します。
  • ほとんどの構成スクリプトは、既存の環境変数の設定を解除しません。
  • 従来の環境変数(automake以外)は、長い間使用されてきました。

たとえば、bash構成スクリプトの_--help_メッセージは次のように表示されます。

_Some influential environment variables:
  DEBUGGER_START_FILE
              location of bash debugger initialization file
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CPP         C preprocessor
  YACC        The `Yet Another C Compiler' implementation to use. Defaults to
              the first program found out of: `bison -y', `byacc', `yacc'.
  YFLAGS      The list of arguments that will be passed by default to $YACC.
              This script will default YFLAGS to the empty string to avoid a
              default value of `-d' given by some make applications.
_

どちらの場合も、変数worksを設定するいずれかの方法です。

しかし、誰かが物事を「改善する」ことを決定した場合に備えて、開発者の好みに留意してください。

参考文献:

  • autoconfの_./configure_ に環境変数を渡す
    これは、値を_config.status_に入れるために後者(VAR = value)が必要であることを示しています
  • 3.3。引数としての環境変数
    automakeの観点から_AC_ARG_VAL_について説明します(開発者の好みを表現します):

_AC_ARG_VAR_マクロは、特定の(環境)変数をスクリプトの引数として宣言するために使用され、説明と特定の用途を与えます。この機能はautoconfの歴史の中で比較的最近追加されましたですが、それは本当に重要です。最近の存在を反映して、マクロは_AS_HELP_STRING_ヘルパーを必要とせず、2つのパラメーター(変数の名前と./configure --help中に出力される文字列)のみを取ります。

AC_ARG_VAR(var-name, help-string)

そして長年の実践についてのコメントを続けます:

デフォルトでは、configureは他のshスクリプトと同様に環境から変数を取得します。それらのほとんどは無視されます。ないものは、このマクロで宣言する必要があります。このようにして、それらは貴重な変数としてマークされます。

貴重なものとしてマークされた変数は、明示的に_AC_SUBST_を呼び出す必要なしにMakefile.inで置き換えられますを取得しますが、これは定義の最も重要な部分ではありません。重要なのは、変数がキャッシュされることです。

  • 7.2出力変数の設定 (autoconfドキュメント)
    は_AC_ARG_VAR_を説明し、開発者の好みを再度表現します。:

    Configureが起動されたときの変数の値は、コマンドラインではなく環境を介して指定された場合を含め、キャッシュに保存されます。実際、configureはCCの定義を「./configure CC = bizarre-cc」で認識できますが、「CC = bizarre-cc ./configure」でそれを認識することはできません。これは残念ながら、ほとんどのユーザーが行っていることです。

12
Thomas Dickey