shを使用したautoconf、SHELL = BASHが必要です。autoconfでbashを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/161064

  •  03-07-2019
  •  | 
  •  

質問

autoconfを実行し、configure SHELLを「/ bin / sh」に設定しています。 これは大きな問題を引き起こします。 autoconfでSHELLを強制的に '/ bin / bash'にする方法

osxでこれを実行しようとしています。Linuxで動作しています。 LinuxはSHELL = / bin / bashを使用しています。 osxのデフォルトは/ bin / shです。

役に立ちましたか?

解決

GCCを使用したSolarisでも同様の問題が発生します。「標準」の手法を使用しています:

CONFIG_SHELL=/bin/bash ./configure ...

(または、実際には/ bin / kshを使用していますが、CONFIG_SHELL env varを設定すると、使用するシェルをautoconfスクリプトに指示できます。)

gitおよびgdのconfigureスクリプトをチェックして(たまたま抽出されました)、これがGCC固有のenv変数ではないことを確認しました。

他のヒント

「巨大な問題」とは何ですか? autoconfは、非常に大きな割合のシェルで動作するconfigureスクリプトを生成するために非常に働きます。 autoconfが作成している移植性のない構造の例がある場合は、autoconfメーリングリストに報告してください。一方、発生している問題がconfigure.acの独自のシェルコードの移植性の結果である場合(たとえば、bashismsを使用している場合)、解決策は、移植性のないコードの使用を停止するか、構成時にSHELLまたはCONFIG_SHELLを明示的に設定するユーザー。

発生している問題は、configureを実行しているユーザーの環境にあるようです。 Linuxでは、ユーザーのシェルは/ bin / bashに設定されていますが、OS Xでは/ bin / shに設定されています。 autoconfによって生成されたconfigureスクリプトは、実行中のシェルの初期テストを行い、提供されたシェルに特定の機能がない場合、別のシェルを使用して自分自身を再実行しようとします。ただし、configure.acに移植性のないシェルコードを導入する場合は、autoconfの主要な哲学の1つ、つまり、configureスクリプトは移植可能である必要があることに違反しています。シェルコードで本当にbashismsを使用する場合は、configureスクリプトへの引数としてSHELL = / bin / bashを渡す必要があります。これはautoconfのバグではありませんが、多くの人がプロジェクトのビルドのバグであると考えています。

Autoconfは、「どこでも」実行できるスクリプトを生成することにより、移植性の問題を解決することになっています。そのため、次のような奇妙なコードが生成されます。

if test X$foo = X ; then ...   # check if foo is empty

ではなく:

if [ "$x" = "" ] ; then ...

この種のcruftyコードは、おそらくこれらのスクリプトを古代のUltrixシステムなどで実行することを可能にしていたでしょう。

シェルの違いのために実行されないconfigureスクリプトは、10リットルのガスと3つのスペアタイヤを使用したFormula-1レースに参加するようなものです。

Autoconfを使用してconfigureスクリプトを開発しており、シェルがBashかOSXシェルかを区別する場合、何か間違ったことをしている、またはAutoconfの人々が何かを壊しました。それがあなたのものである場合は、スクリプトに追加するシェル部分を移植可能にして修正してください。

SHELLはどこに設定されますか? / bin / bashが必要な場合、/ bin / shで何を実行していますか?

configureスクリプトは、野生に存在する恐ろしく壊れた非Bashシェル上であっても、どこでも実行することを意図しています。

編集:問題は正確に何ですか?

別の編集:おそらく、このようなスクリプト自体を再実行したいでしょう。おそらくバグがあります:

if test "$SHELL" = "/bin/sh" && test -x /bin/bash; then
    exec /bin/bash -c "<*>" "$@"
fi

ln -f / bin / bash / bin / sh

:-P(いいえ、それは深刻な答えではありません。システムにホースをかけないでください!)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top