为什么配置将变量作为参数?


10

VAR=value ./configure一样的./configure VAR=value吗?

在第一种情况下,shell设置环境变量,在第二种情况下,configure脚本将字符串'VAR=value'作为参数,然后大概设置该变量。我想知道configure是否会对变量做其他任何事情(也许忽略或过滤某些值),以及为什么首先将变量作为参数。

Answers:


12

在这种情况下

VAR=value ./configure

行为取决于您当前的外壳,而在此

./configure VAR=value

行为取决于configure-script。一些开发人员更喜欢后者,因为他们想选择是否在脚本中设置变量,而不是让某个人从外面神奇地设置脚本的变量。

实际上,差异不大,因为

  • 大多数进行配置的人都是从POSIX Shell运行的,以前的行为“正常”,并且
  • 大多数配置脚本不会取消设置现有环境变量,并且
  • 常规环境变量(外部自动制作)具有悠久的用途

例如,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可以在“ ./configure CC = bizarre-cc”中注意到CC的定义,但不可能在“ CC = bizarre-cc ./configure”中注意到它,不幸的是,这是大多数用户所做的。


您可能还需要来描述如何env VAR=value ./configure涉及到VAR=value ./configure
Kusalananda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.