我正在运行autoconf并配置将SHELL设置为'/bin/sh‘。这就产生了巨大的问题。如何对autoconf强制SHELL为'/bin/bash‘?
我正在尝试让它在osx上运行,它在linux上工作。Linux正在使用SHELL=/bin/bash。osx缺省为/bin/sh。
发布于 2008-10-02 06:43:57
我和GCC在Solaris上也有类似的问题--我使用的是“标准”技术:
CONFIG_SHELL=/bin/bash ./configure ...(或者,实际上我使用/bin/ksh,但是通过设置CONFIG_SHELL环境变量,您可以告诉autoconf脚本使用哪个shell。)
我检查了git和gd的配置脚本(它们恰好被提取出来了),以确认这不是一个GCC特有的env var。
发布于 2009-07-18 20:28:19
什么是“大问题”?autoconf很难生成一个能处理大量shell的配置脚本。如果您有一个autoconf正在编写的结构的示例是不可移植的,请将其报告给autoconf邮件列表。另一方面,如果您遇到的问题是由于configure.ac中的shell代码不可移植(例如,您正在使用bashism),那么解决方案是要么停止使用不可移植的代码,要么要求用户在配置时显式地设置SHELL或CONFIG_SHELL。
听起来您遇到的问题是在用户运行configure的环境中出现的。在Linux上,您的用户将SHELL设置为/bin/bash,但在OS上将其设置为/bin/sh。autoconf生成的配置脚本对运行它的shell执行一些初始测试,如果提供的shell缺少某些功能,则会尝试使用不同的shell重新执行自身。但是,如果您在configure.ac中引入了不可移植的shell代码,那么您就违反了autoconf的一个主要原则--即配置脚本应该是可移植的。如果您确实想在shell代码中使用bashism,那么您需要您的用户将SHELL=/bin/bash作为参数传递给配置脚本。这不是autoconf中的bug,但会被许多人认为是项目构建中的bug。
发布于 2012-03-08 09:41:24
Autoconf被认为可以通过生成一个可以在“任何地方”运行的脚本来解决可移植性问题。这就是为什么它会生成奇怪的代码,比如:
if test X$foo = X ; then ... # check if foo is empty而不是:
if [ "$x" = "" ] ; then ...这种粗糙的代码可能曾经允许这些脚本在某个古老的Ultrix系统或其他系统上运行。
由于shell差异而无法运行的配置脚本就像是带着10升汽油和3个备用轮胎参加一级方程式比赛。
如果您正在使用Autoconf开发配置脚本,并且它对shell是Bash还是OSX shell很敏感,那么您可能做错了什么,或者Autoconf人员破坏了某些东西。如果它来自您,请通过使其可移植来修复您要添加到脚本中的任何shell片段。
https://stackoverflow.com/questions/161064
复制相似问题