2008-10-02 43 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