為什麼 configure 將變數作為參數?
是
VAR=value ./configure
一樣的./configure VAR=value
嗎?在第一種情況下,shell 設置環境變數,而在第二種情況下,配置腳本將字元串
'VAR=value'
作為參數,然後可能會設置變數。我想知道 configure 是否對變數做任何其他事情(可能忽略或過濾某些值),以及為什麼它首先將變數作為參數。
在這種情況下
VAR=value ./configure
行為取決於您目前的外殼,而在此
./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=value)將值放入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 可以注意到 ‘./configure CC=bizarre-cc’ 中的 CC 定義,但在 ‘CC=bizarre-cc ./configure’ 中是不可能注意到它的,不幸的是,大多數使用者都是這樣做的。