是VAR=value ./configure
相同的./configure VAR=value
?
在第一种情况下,shell 设置环境变量,在第二种情况下,配置脚本将字符串'VAR=value'
作为参数,然后可能设置该变量。我想知道 configure 是否对变量执行其他操作(可能忽略或过滤某些值),以及为什么它首先将变量作为参数。
答案1
在这种情况下
VAR=value ./configure
该行为取决于您当前的 shell,而在此
./configure VAR=value
行为取决于配置脚本。一些开发人员更喜欢后者,因为他们希望选择是否在脚本内设置变量,而不是让人从外部神奇地设置脚本的变量。
实际上,差别很小,因为
- 大多数进行配置的人都是从 POSIX shell 运行,其中前一种行为“正常工作”,并且
- 大多数配置脚本不会取消设置现有的环境变量,并且
- 传统的环境变量(在 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.
在每种情况下,设置变量的任何一种方式作品。
但请记住开发人员的偏好,以防有人决定“改进”某些东西。
进一步阅读:
- 将环境变量传递给 autoconf
./configure
其中指出需要后者(VAR=值)才能将值放入config.status
- 3.3.环境变量作为参数
AC_ARG_VAL
从 automake 的角度讨论(并表达开发人员的偏好):
该
AC_ARG_VAR
宏用于声明特定(环境)变量作为脚本的参数,为其提供描述和特定用途。虽然这个功能已经被autoconf 历史上最近添加的,这确实很重要。该宏不需要帮助AS_HELP_STRING
程序,只需要两个参数:变量的名称和 ./configure --help 期间打印的字符串,这反映出它是最近出现的:
AC_ARG_VAR(var-name, help-string)
并继续对长期实践进行评论:
默认情况下,configure 像任何其他 sh 脚本一样从环境中获取变量。其中大部分都被忽略了。那些不是的应该通过这个宏来声明。这样它们就被标记为珍贵的变量。
标记为珍贵的变量得到在Makefile.in中替换不必调用显式的
AC_SUBST
,但这不是定义中最重要的部分。重要的是变量被缓存。
- 7.2 设置输出变量(autoconf 文档)
描述了AC_ARG_VAR
,再次表达了开发人员的偏好:启动配置时变量的值保存在缓存中,包括如果它不是在命令行上而是通过环境指定的。事实上,虽然configure可以注意到'./configure CC=bizarre-cc'中CC的定义,但不可能在'CC=bizarre-cc ./configure'中注意到它,不幸的是,这是大多数用户所做的。