2008-10-02 71 views

回答

7

我有GCC在Solaris上類似的問題 - 我用的是 '標準' 的技術:

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

(或者,實際上,我使用/ bin/ksh的,但設置CONFIG_SHELL env var允許你告訴autoconf腳本使用哪個shell。)

我檢查了git和gd(它們恰好被提取)的配置腳本來檢查這不是GCC特有的env var。

-4

ln -f /bin/bash /bin/sh

:-P(不,這不是一個嚴肅的回答,請不要軟管系統通過這樣做!)

+0

你可以倒下我喜歡的所有東西;它只是證明你沒有幽默感。 :-P – 2010-02-18 04:10:39

0

凡SHELL被設置爲?當你想要/ bin/bash時,用/ bin/sh運行什麼?

配置腳本可以在任何地方運行,即使是在野外存在的可怕破碎和非Bash shell中也是如此。

編輯:究竟是什麼問題?

另一編輯:也許你想讓腳本重新執行自己,就像這樣。這也可能是車:

if test "$SHELL" = "/bin/sh" && test -x /bin/bash; then 
    exec /bin/bash -c "$0" "[email protected]" 
fi 
+0

問題是,有時配置腳本需要Bourne shell不支持的語法。配置腳本已被破壞,但這在軟件行業中是存在的。此時,您需要說服配置使用正確的shell運行 - 並且需要CONFIG_SHELL,正如我所指出的那樣。 – 2008-10-18 18:57:48

4

什麼是「大問題」? autoconf很難生成一個配置腳本,它可以處理很大比例的shell。如果您有一個autoconf寫入的構造不可移植的示例,請將其報告給autoconf郵件列表。另一方面,如果你遇到的問題是由於你自己的configure.ac中的shell代碼不能移植(例如,你使用bashisms),那麼解決方案是停止使用不可移植的代碼或者需要用戶在配置時顯式設置SHELL或CONFIG_SHELL。

聽起來像你遇到的問題是在用戶運行configure的環境中。在Linux上,您的用戶將SHELL設置爲/ bin/bash,但在OS X上,它設置爲/ bin/sh。由autoconf生成的配置腳本對它運行的shell執行一些初始測試,並且如果提供的shell缺少某些功能,它會嘗試使用不同的shell重新執行自身。但是,如果你在configure.ac中引入了不可移植的shell代碼,那麼你違反了autoconf的一個主要原理 - 即配置腳本應該是可移植的。如果您真的想在shell代碼中使用bashisms,那麼您需要用戶將SHELL =/bin/bash作爲參數傳遞給配置腳本。這不是autoconf中的錯誤,但許多人認爲這是您項目構建中的一個錯誤。

+0

僅供參考,確實存在/ bin/sh是問題的情況。例如,在AIX上,使用/ bin/sh可以使構建過程花費時間,因爲/ bin/sh非常緩慢地處理配置典型測試。 (可能會在更新的版本中修復,因爲我遇到了這個問題已經有一段時間了。) – DevSolar 2010-07-30 12:28:18

2

Autoconf應該通過生成一個可以在任何位置運行的腳本來解決可移植性問題。這就是爲什麼它會產生奇怪的代碼,如:

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

而不是:

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

那樣的這些混沌的代碼很可能一度讓這些腳本來一些古老的Ultrix系統或任何上運行。

配置腳本由於殼體差異而沒有運行,就像是參加10升氣體和3個備用輪胎的F1比賽。

如果您使用Autoconf開發配置腳本,並且它對shell是Bash還是OSX shell很敏感,那麼您做錯了什麼,或者Autoconf人員破壞了某些東西。如果來自您,請將它們添加到腳本中的任何外殼程序通過使其可移植來修復。

+0

使用``x $ foo「`(除了`x`前綴以外還帶有雙引號)而不是``$ foo」`與空字符串無關。它與「$ foo」可能評估爲可能看起來像`-f`這樣的測試選項的情況有關。 – adl 2012-03-09 22:07:37