为什么configure接受变量作为参数?

为什么configure接受变量作为参数?

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.

在每种情况下,设置变量的任何一种方式作品

但请记住开发人员的偏好,以防有人决定“改进”某些东西。

进一步阅读:

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'中注意到它,不幸的是,这是大多数用户所做的。

相关内容