2007年4月16日 星期一
AutoRun Way in Linux (3)
啟動和關閉(或reboot):
1.程式的啟動由Script控制(ex:script filename為testserverctl)
則Script內容則由下法來設置啟動
case $1 in
start)
#將要啟動的程式寫至於此,如下:
cd /tmp/testserver
./tesetserver &
exit 0
;;
stop)
#將要結束的程式寫至於此,如下:
cd /tmp/testserver
test –e testserver_pid && cat testserver_pid xargs kill -15 echo “no testserver_pid file”
exit 0
;;
執行script方式為:/script所在路徑/testserverctl start 及 /script所在路徑/testserverctl stop
將此script建立在/etc/rc.d/init.d/下
並分別在所需執行的runlevel下(如:/etc/rc.d/rc3.d/)分別建立兩種連結:S99testserver、K05testserver
使這兩連結分別連結到../init.d/testserver
即可在開機後自動啟動此程式,以及關機(或reboot)時關閉此程式
註:此法可不需修改原程式來判別參數
2.程式的啟動由程式本身執行檔控制(ex:script filename為testserverctl)
則Script內容則由下法來設置啟動
case $1 in
start)
#將要啟動的程式寫至於此,如下:
cd /tmp/testserver
./tesetserver start
exit 0
;;
stop)
#將要結束的程式寫至於此,如下:
cd /tmp/testserver
./tesetserver stop
exit 0
;;
執行script方式為:/script所在路徑/testserverctl start 及 /script所在路徑/testserverctl stop
將此script建立在/etc/rc.d/init.d/下
並分別在所需執行的runlevel下(如:/etc/rc.d/rc3.d/)分別建立兩種連結:S99testserver、K05testserver
使這兩連結分別連結到../init.d/testserver
即可在開機後自動啟動此程式,以及關機(或reboot)時關閉此程式
註:此法需修改原程式來判別參數start、stop
※以上兩種開機後自動啟動也可以將要執行的script寫入/etc/rc.d/rc.local裡
※結束需時較久的程式不建議在關機(或reboot)時才結束,最好事先結束完在關機(或reboot)
2007年4月12日 星期四
[轉]管理內核資源
資源上限.(在有些系統上,出廠設置低得你都不用一次"大型"安裝.) 如果你碰到這類問題,請繼續閱讀。
共享內存和信號燈的正確叫法是"System VIPC"( 還有消息隊列,不過對于PostgreSQL而言沒什麼 關係.)儘管所有現代作業系統都提供這個特性,但並不是
所有系統缺省都打開它或者有足夠的資源,尤其是有 BSD 親源 的系統. (對于QNX和 BeOS移植? PostgreSQL自己提供這套
機製的替換實現.)
完全缺少這些機製的表現通常是在 postmaster 啟動的時候的 Illegal system
call錯誤.這時除了重新配置內核以外 沒什麼可做的 -- PostgreSQL
沒它們干不了活.
如果 PostgreSQL 超出了這些IPC 資源的硬限制之一的時候 就會拒絕啟動並且留下一條相當有啟發性的錯誤訊息告訴你它碰到了
什麼問題以及需要為它做些什麼. (又見 Section
3.3.1.) 相關的內核參數在不同系統之間有著相對固定的術語; Table
3-3 是一個概況.不過,設置它們的方法卻 多種多樣.不過要注意的是,你可能最好重新啟動你的機器,或者還要 重新編譯內核來修改這些設置.
Table 3-3. System VIPC參數
| 名字 | 描述 | 合理取值 |
|---|---|---|
| SHMMAX | 最大共享內存段尺寸(位元組) | 250kB + 8.2 kB * shared_buffers + 14.2 kB * max_connections 或者無窮大 |
| SHMMIN | 最小共享內存段尺寸(位元組) | 1 |
| SHMALL | 可用共享內存的總數量(位元組或者頁面) | 如果是位元組,就和 SHMMAX 一樣;如果是頁面,ceil(SHMMAX/PAGE_SIZE) |
| SHMSEG | 每進程最大共享內存段數量 | 只需要 1 個段,不過缺省比這高得多. |
| SHMMNI | 系統範圍最大共享內存段數量 | 類似 SHMSEG 加上用于其他應用的空間 |
| SEMMNI | 信號燈標識符的最小數量(也就是說,套) | >= ceil(max_connections % 16) |
| SEMMNS | 系統範圍的最大信號燈數量 | ceil(max_connections / 16) * 17+ 用于其他應用的空間 |
| SEMMSL | 每套信號燈最小信號燈數量 | >= 17 |
| SEMMAP | 信號燈映射裡的記錄數量 | 參閱文本 |
| SEMVMX | 信號燈的最大值 | >= 255 (缺省通常是32767,除非被要求,否則不要修改) |
最重要的共享內存參數是 SHMMAX,
以位元組記的共享內存段可擁有的最大尺寸. 如果你收到來自shmget的類似Invalid argument 這樣的錯誤訊息,那么很有可能是你超過限制了.
要求的共享內存段隨著請求的緩沖區數量(-B選項)和 允許的連接數量(-N選項)的變化而變化,儘管前者是 最重要的原素. (因此,作為一種臨時的解決方法,你可以降低這些設置來繞過失敗.)
如果粗略地估計,你可以估計所需要的段尺寸是緩沖區數量乘以塊 尺寸(缺省 8 kB)加上足夠的盈余(至少半兆位元組). 任何錯誤訊息都會包含分發失敗的尺寸.
不太可能出問題的是共享內存段的最小尺寸(SHMMIN), 對 PostgreSQL來說大約是 256 kB左右(通常只是 1),而 系統範圍(SHMMNI)或每進程(SHMSEG)
最大共享內存段數量不應該會產生問題,除非你的系統把它們設成零. 有些系統還對系統裡的共享內存總量有限制;參閱下面平台相關的指導.
PostgreSQL 每個允許的聯接使用一個信號燈 (-N選項), 以 16 個為一套.每套信號燈還包含第十七個信號燈, 它裡面存儲一個"magic number(標誌數字)", 以檢測和其他應用使用的信號燈集衝突. 系統裡的最大信號燈數目是由SEMMNS設置的, 因此這個值應該至少和聯接設置一樣大,並且每十六個聯接還要另外加一個. (參閱Table
3-3 裡面的公式.) 參數SEMMNI決定 系統裡一次可以存在的信號燈集的數目.因此這個參數至少應該為
ceil(max_connections % 16).降低允許的聯接數目是一個臨時的
繞開失敗的方法,這個啟動失敗通常被來自函數semget() 的錯誤附應 "No space left on
device"搞得很讓人迷惑.
有時候還可能有必要增大SEMMAP,使之至少按照 SEMMNS配置.這個參數定義信號燈資源映射的尺寸, 可用的每個連續的信號燈塊在這個映射中存放一條記錄.
每當一套信號燈被釋放,那么它要么會加入到該映射中一條相連的 已釋放的塊的入口中,要么註冊成一條新的入口.如果映射填滿了碎片,
那么被釋放的信號燈就丟失了(除非重起).因此時間長信號燈空間的碎片 了會導致可用的信號燈比應該有的信號燈少.
SEMMSL 參數,決定一套信號燈裡可以有多少信號燈,對于 PostgreSQL而言應該至少是 17.
許多設置與 "semaphore undo(信號燈恢復)"有關,比如 SEMMNU 和 SEMUME,這些與 PostgreSQL無關.
- BSD/OS
共享內存. 缺省時是只支持 4 MB 的共享內存.請記住共享內存是不能分頁的;它是 鎖在 RAM 裡面的.要增加 postmaster
支持的共享緩沖區數目,向 你的內核配置文件裡增加下面的行.一個值為 1024 的 SHMALL 代表 4 M
共享內存.下面的東西把共享內存區域增加到 32 MB:options "SHMALL=8192"
options "SHMMAX=\(SHMALL*PAGE_SIZE\)"對于營運 4.1 或更新的版本的人,只需要做上面的修改, 然後編譯內核並重起.對于營運 更早的版本的,請用 bpatch 找出當前內核的 sysptsize值.它是啟動的時候自動計算的.
$ bpatch -r sysptsize
0x9 = 9然後,把 SYSPTSIZE修改為在內核配置文件裡的一個硬代碼值. 用 bpatch 算出來的值,並且為你需要的每個額外的 4 MB 共享內存再加 1.
options "SYSPTSIZE=16"
sysptsize不能用 sysctl 修改.
信號燈. 你可能需要增加信號燈的數量.缺省時,PostgreSQL 分發
34 個信號燈.這個數量只是剛剛超過缺省的系統總數 60 的一半.在內核配置文件裡設置你需要的值,比如︰
options "SEMMNI=40"
options "SEMMNS=240"
options "SEMUME=40"
options "SEMMNU=120"- FreeBSD
NetBSD
OpenBSD 編譯內核時 需要把選項SYSVSHM 和 SYSVSEM打開. (缺省是打開的.) 共享內存的最大尺寸是由選項SHMMAXPGS(以頁計). 下面顯示了一個如何設置這些參數的例子︰
options SYSVSHM
options SHMMAXPGS=4096
options SHMSEG=256
options SYSVSEM
options SEMMNI=256
options SEMMNS=512
options SEMMNU=256
options SEMMAP=256(在 NetBSD 和 OpenBSD裡,關鍵字實際上是單數的 option)
你可能原意使用 sysctl 設置將共享內存鎖在 RAM
中以避免它們被交換出去,也即,kern.ipc.shm_use_phys。- HP-UX
缺省設置看來對普通安裝是足夠的了. 在 HP-UX 10,SEMMNS的出廠缺省是 128, 可能對大的數據庫節點來說太小了.
IPC可以在 System
Administration Manager(系統管理器) (SAM)下面的 Kernel Configuration->Configurable Parameters 配置.你配置完了以後敲 Create A New Kernel選項.- Linux
在 2.2 內核裡缺省的共享內存限制( SHMMAX 和 SHMALL)都是 32 MB,但是你可以在 proc
文件系統裡修改這些值(不用重起). 比如,要允許 128 MB︰$echo 134217728 >/proc/sys/kernel/shmall
$echo 134217728 >/proc/sys/kernel/shmmax你可以把這些命令放到一個引導時營運的腳本中.
另外,如果你的系統裡有的話,你可以使用 sysctl 來控制這些參數. 查找一個叫 /etc/sysctl.conf 的文件,然後再它裡面加下面 這樣的幾行︰
kernel.shmall = 134217728
kernel.shmmax = 134217728通常在引導的時候會處理這個文件, 但你也可以稍后明確調用 sysctl.
其他參數對任何應用來說都足夠了. 如果你想自己查看,你可以看看下面幾個文件︰ /usr/src/linux/include/asm-xxx/shmparam.h 和 /usr/src/linux/include/linux/sem.h.
- MacOS X
編輯文件 /System/Library/StartupItems/SystemTuning/SystemTuning
並且修改下列數值︰sysctl -w kern.sysv.shmmax
sysctl -w kern.sysv.shmmin
sysctl -w kern.sysv.shmmni
sysctl -w kern.sysv.shmseg
sysctl -w kern.sysv.shmall這些值在 MacOS X 上的含義和前面列出的作業系統的含義相同。
- SCO OpenServer
缺省配置時,只允許每段 512KB 共享內存,大概只夠 -B 24 -N 12用的.要增大設置,首先進入
/etc/conf/cf.d目錄.要顯示當前的以位元組記的 SHMMAX,營運./configure -y SHMMAX
設置 SHMMAX的新值︰
./configure SHMMAX=value
這裡 value 是你想設置的以位元組記的新值. 設置完了以後SHMMAX重新製作內核
./link_unix
然後重起.
- Solaris
至少到版本 2.6 為止,共享內存段的缺省最大設置對 PostgreSQL
來說是太低了.相關的設置可以在/etc/system裡面修改, 例如︰set shmsys:shminfo_shmmax=0x2000000
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=256
set shmsys:shminfo_shmseg=256
set semsys:seminfo_semmap=256
set semsys:seminfo_semmni=512
set semsys:seminfo_semmns=512
set semsys:seminfo_semmsl=32你要重起系統令修改生效.
又見 http://www.sunworld.com/swol-09-1997/swol-09-insidesolaris.html
獲取關於 Solaris 裡面的共享內存的訊息.- UnixWare
在 UnixWare 7 上,缺省配置裡的最大共享內存段是 512 kB.
這個數只夠-B 24 -N 12用的.要顯示SHMMAX的
當前值,營運/etc/conf/bin/idtune -g SHMMAX
就會顯示以位元組記的當前的缺省的最小和最大值. 要給SHMMAX設置一個新值,營運︰
/etc/conf/bin/idtune SHMMAX value
這裡 value是你想設置的以位元組記的新值. 設置完SHMMAX后,重建內核
/etc/conf/bin/idbuild -B
然後重起.
伺服器的營運. 這裡尤其重要是對每個用戶的進程數目的限制,每個進程打開文件數目, 以及每個進程可用的內存. 這些限制中每個都有一個"硬"限制和一個"軟" 限制.
軟限制實際是管用的,但用戶可以自己修改成最大為硬限制的數目. 而硬限制是只能由 root 用戶修改的限制. 系統調用 setrlimit 負責設置這些參數. shell 的內建命令 ulimit(Bourne shells) 或limit (csh) 就是用于在命令行上控制資源限制的. 在 BSD 衍生的系統上,文件/etc/login.conf 控制在登錄時對各種資源設置什麼樣的限制數值. 參閱 login.conf 獲取細節.
相關的參數是 maxproc, openfiles,和 datasize. 比如︰
default:\
...
:datasize-cur=256M:\
:maxproc-cur=256:\
:openfiles-cur=256:\
...
(-cur 是軟限制,后面附加 -max 就可以設置硬限制.)
內核通常也有一些系統範圍的資源限制.
在 Linux 上, /proc/sys/fs/file-max 決定內核可以支持的
最大文件數.你可以透過往該文件寫入一個不同的數值修改此值, 或者在 /etc/sysctl.conf
裡增加一個賦值. 每個進程的最大打開文件限制是在編譯內核的時候固定的; 參閱 /usr/src/linux/Documentation/proc.txt 獲取更多訊息.
PostgreSQL 伺服器每個聯接都使用一個進程,
所以你應該至少允許和聯接數相同的進程數,再加上你的系統其它部分 所需要的數目.通常這個並不是什麼問題,但如果你在一台機器上
營運多個伺服器,那你就要把事情理清楚.
打開文件數目的出廠缺省設置通常設置為 "社會友好"數值,就是說允許許多用戶共存于一台機器,
而不會導致只使用系統資源的不當比例.如果你在一台機器上營運許多 伺服器,這也許就是你想要的,但是在特殊的伺服器上,你可能需要提升 這個限制.
問題的另外一邊,一些系統允許獨立的進程打開非常多的文件; 如果有那么幾個進程這么干,那系統範圍的上限就很容易達到.
如果你發現這樣的現象,並且不想修改系統範圍的限止, 你就可以把 PostgreSQL 的 max_files_per_process 配置參數設置為你允許的 最大單進程打開文件數.
2007年4月11日 星期三
[轉]安裝Oracle於Debian
1. 於oracle上下載Oracle Database 10g Release 2,個File名叫做10201_database_linux32.zip
2. 要欺騙Oracle Installer我係RHEL 3
echo “Red Hat Enterprise Linux AS release 3 (Taroon)” > /etc/redhat-release
3. 建立Oracle專用戶口和群組
su - root
groupadd dba #group of users to be granted with SYSDBA privilege
groupadd oinstall # group owner of Oracle files
useradd -c "Oracle software owner" -g oinstall -G dba oracle
passwd -d /home/oracle -s /bin/bash oracle
4. 建立安裝地址,當然要確認夠位
su - root
mkdir /opt/oracle
mkdir /opt/oracle/product
mkdir /opt/oracle/product/10g
chown -R oracle.oinstall /opt/oracle
5. 更改核心用的/etc/sysctl.conf,在/etc/sysctl.conf上加上以下的
kernel.shmall=2097152
kernel.shmmax=2147483648
kernel.shmmni=4096
kernel.sem=250 32000 100 128
fs.file-max=65536
net.ipv4.ip_local_port_range=1024 65000
6. 用以下指令叫Linux重新讀取/etc/sysctl.conf
sysctl -e -p /etc/sysctl.conf
7. 用以下指令來確認是否正確重設系統參數
/sbin/sysctl -a grep sem
/sbin/sysctl -a grep shm
/sbin/sysctl -a grep file-max
/sbin/sysctl -a grep ip_local_port_range
8. 於 /etc/security/limits.conf 加上以下
* soft nproc 2047
* hard nproc 16384
* soft nofile 1024
* hard nofile 65536
9. 確認/etc/pam.d/login中有沒有以下這句,沒有的請自行加上去
session required pam_limits.so
10. 於/home/oracle/.bash_profile上加上以下的幾句
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/10g
export ORACLE_SID=SKY # Make sure you create a new Db with the same ORACLE_SID
export ORACLE_TERM=xterm
export DISPLAY=:0.0
# export TNS_ADMIN= Set if sqlnet.ora, tnsnames.ora, etc. are not in $ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN;
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
# Set shell search paths
export PATH=$PATH:$ORACLE_HOME/bin
11. 安裝以下package
apt-get install rpm gcc-2.95 libaio
11. 加上以下Symlink
su - root
cd /usr/lib
ln -s libstdc++-libc6.2-2.so.3 libstdc++-libc6.1-1.so.2
ln -s /usr/bin/basename /bin/basename
rm /usr/bin/gcc
ln -s /usr/bin/gcc-2.95 /usr/bin/gcc
ln -s /usr/bin/rpm /bin/rpm
ln -s /usr/bin/awk /bin/awk
12. 可以開始用佢個Installer
./runInstaller
13. 最重要的一部,有可能你要在個installer行到30%時,即刻修改/opt/oracle/product/10g/bin/gennttab,把3句包令有(注意那好像好怪的換行):
SED 's/ /
/g'
改成
SED 's/ /n/g'
14. 如果部伺服器無行X-Windows,你想個Installer係你用緊部機打開,可以在runInstaller時行以下command
係你自己用的部機打:xhost +
係部伺服器打(假設你部機的IP係192.168.1.1):DISPLAY=192.168.1.1:0 ./runInstaller
[轉]ulimit命令的用法
有時候在程序裡面需要打開多個文件,進行分析,系統一般默認數量是1024,(用ulimit-a可以看到)對於正常使用是夠了,但是對於程序來講,就太少了。
修改辦法:
vi /etc/security/limits.conf
加上:
* soft nofile 8192
* hard nofile 20480
重啟就OK
ulimit命令
用途
設置或報告用戶資源極限。
語法
ulimit [ -H ] [ -S ] [ -a ] [ -c ] [ -d ] [ -f ] [ -m ] [ -n ] [ -s ] [ -t ] [ Limit ]
描述
ulimit命令設置或報告用戶進程資源極限,如/etc/security/limits文件所定義。 文件包含以下缺省值極限:
fsize = 2097151
core = 2097151
cpu = -1
data = 262144
rss = 65536
stack = 65536
nofiles = 2000
當新用戶添加到系統中時,這些值被作為缺省值使用。當向系統中添加用戶時,以上值通過mkuser命令設置,或通過chuser命令更改。
極限分為軟性和硬性。 通過ulimit命令,用戶可將軟極限更改到硬極限的最大設置值。 要更改資源硬極限,必須擁有root用戶權限。
很多系統不包括以上一種或數種極限。特定資源的極限在指定Limit參數時設定。Limit參數的值可以是每個資源中指定單元中的數字,或者為值unlimited。 要將特定的ulimit設置為unlimited,可使用詞unlimited。
注:在/etc/security/limits文件中設置缺省極限就是設置了系統寬度極限,而不僅僅是創建用戶時用戶所需的極限。
省略Limit參數時,將會打印出當前資源極限。除非用戶指定-H標誌,否則打印出軟極限。當用戶指定一個以上資源時,極限名稱和單元在值之前打印。如果未給予選項,則假定帶有了-f標誌。
由於ulimit命令影響當前shell環境,所以它將作為shell常規內置命令提供。如果在獨立的命令執行環境中調用該命令,則不影響調用者環境的文件大小極限。以下示例中正是這種情況:
nohup ulimit -f 10000nohupulimit-f10000
env ulimit 10000envulimit10000
一旦通過進程減少了硬極限,若無root特權則無法增加,即使返回到原值也不可能。
關於用戶和系統資源極限的更多信息,請參見AIX5LVersion5.2TechnicalReference:BaseOperatingSystemandExtensionsVolume1中的getrlimit、setrlimit或vlimit子例程。
标志標誌
-a 列出所有當前資源極限。
-c 以512字節塊為單位,指定核心轉儲的大小。
-d 以K字節為單位指定數據區域的大小。
-f 使用Limit參數時設定文件大小極限(以塊計),或者在未指定參數時報告文件大小極限。缺省值為-f標誌。
-H 指定設置某個給定資源的硬極限。 如果用戶擁有root用戶權限,可以增大硬極限。任何用戶均可減少硬極限。
-m 以K字節為單位指定物理存儲器的大小。
-n 指定一個進程可以擁有的文件描述符的數量的極限。
-s 以K字節為單位指定堆棧的大小。
-S 指定為給定的資源設置軟極限。軟極限可增大到硬極限的值。如果-H和-S標誌均未指定,極限適用於以上二者。
-t 指定每個進程所使用的秒數。
退出狀態
返回以下退出值:
0成功完成。
>0 拒絕對更高的極限的請求,或發生錯誤。
示例
要將文件大小極限設置為51,200字節,輸入:
ulimit -f 100ulimit-f100
文件
usr/bin/ksh包含ulimit內置命令。
相關信息
ksh命令。
AIX5LVersion5.2TechnicalReference:BaseOperatingSystemandExtensionsVolume1中的ulimit子例程、getrlimit、setrlimit或vlimit子例程。
2007年3月20日 星期二
2007年2月20日 星期二
autoconf手冊(七)
陳舊的宏名
在Autoconf的第2版,大部分宏被重新命名以使用更加統一和具有描述性的命名方案。下面是被重新命名了的宏的原來名字,隨後給出了這些宏現下的名字。雖然為了保持向後兼容,舊名字仍然能夠被autoconf程式所接受,舊名字都被看作過時的。關於新的命名方案,參見宏名。
AC_ALLOCA
AC_FUNC_ALLOCA
AC_ARG_ARRAY
因為用途有限而被刪除了。
AC_CHAR_UNSIGNED
AC_C_CHAR_UNSIGNED
AC_CONST
AC_C_CONST
AC_CROSS_CHECK
AC_C_CROSS
AC_ERROR
AC_MSG_ERROR
AC_FIND_X
AC_PATH_X
AC_FIND_XTRA
AC_PATH_XTRA
AC_FUNC_CHECK
AC_CHECK_FUNC
AC_GCC_TRADITIONAL
AC_PROG_GCC_TRADITIONAL
AC_GETGROUPS_T
AC_TYPE_GETGROUPS
AC_GETLOADAVG
AC_FUNC_GETLOADAVG
AC_HAVE_FUNCS
AC_CHECK_FUNCS
AC_HAVE_HEADERS
AC_CHECK_HEADERS
AC_HAVE_POUNDBANG
AC_SYS_INTERPRETER (不同的調用慣例)
AC_HEADER_CHECK
AC_CHECK_HEADER
AC_HEADER_EGREP
AC_EGREP_HEADER
AC_INLINE
AC_C_INLINE
AC_LN_S
AC_PROG_LN_S
AC_LONG_DOUBLE
AC_C_LONG_DOUBLE
AC_LONG_FILE_NAMES
AC_SYS_LONG_FILE_NAMES
AC_MAJOR_HEADER
AC_HEADER_MAJOR
AC_MINUS_C_MINUS_O
AC_PROG_CC_C_O
AC_MMAP
AC_FUNC_MMAP
AC_MODE_T
AC_TYPE_MODE_T
AC_OFF_T
AC_TYPE_OFF_T
AC_PID_T
AC_TYPE_PID_T
AC_PREFIX
AC_PREFIX_PROGRAM
AC_PROGRAMS_CHECK
AC_CHECK_PROGS
AC_PROGRAMS_PATH
AC_PATH_PROGS
AC_PROGRAM_CHECK
AC_CHECK_PROG
AC_PROGRAM_EGREP
AC_EGREP_CPP
AC_PROGRAM_PATH
AC_PATH_PROG
AC_REMOTE_TAPE
因為用途有限而被刪除了。
AC_RESTARTABLE_SYSCALLS
AC_SYS_RESTARTABLE_SYSCALLS
AC_RETSIGTYPE
AC_TYPE_SIGNAL
AC_RSH
因為用途有限而被刪除了。
AC_SETVBUF_REVERSED
AC_FUNC_SETVBUF_REVERSED
AC_SET_MAKE
AC_PROG_MAKE_SET
AC_SIZEOF_TYPE
AC_CHECK_SIZEOF
AC_SIZE_T
AC_TYPE_SIZE_T
AC_STAT_MACROS_BROKEN
AC_HEADER_STAT
AC_STDC_HEADERS
AC_HEADER_STDC
AC_STRCOLL
AC_FUNC_STRCOLL
AC_ST_BLKSIZE
AC_STRUCT_ST_BLKSIZE
AC_ST_BLOCKS
AC_STRUCT_ST_BLOCKS
AC_ST_RDEV
AC_STRUCT_ST_RDEV
AC_SYS_SIGLIST_DECLARED
AC_DECL_SYS_SIGLIST
AC_TEST_CPP
AC_TRY_CPP
AC_TEST_PROGRAM
AC_TRY_RUN
AC_TIMEZONE
AC_STRUCT_TIMEZONE
AC_TIME_WITH_SYS_TIME
AC_HEADER_TIME
AC_UID_T
AC_TYPE_UID_T
AC_UTIME_NULL
AC_FUNC_UTIME_NULL
AC_VFORK
AC_FUNC_VFORK
AC_VPRINTF
AC_FUNC_VPRINTF
AC_WAIT3
AC_FUNC_WAIT3
AC_WARN
AC_MSG_WARN
AC_WORDS_BIGENDIAN
AC_C_BIGENDIAN
AC_YYTEXT_POINTER
AC_DECL_YYTEXT
環境變量索引
這是一個按照字母順序排序的,由Autoconf檢查的環境變量的清單。
Jump to: a - c - s
a
AC_MACRODIR, AC_MACRODIR, AC_MACRODIR, AC_MACRODIR, AC_MACRODIR, AC_MACRODIR
c
CONFIG_FILES
CONFIG_HEADERS
CONFIG_SHELL
CONFIG_SITE
CONFIG_STATUS
s
SIMPLE_BACKUP_SUFFIX
輸出變量索引
這是一個按照字母順序排序的,Autoconf將在它所創建的檔案(通常是一個或更多``Makefile'')中進行替換的變量的清單。關於這些是如何實現的,請參見設定輸出變量。
Jump to: a - b - c - d - e - f - h - i - k - l - m - n - o - p - r - s - t - x - y
a
ALLOCA
AWK
b
bindir
build
build_alias
build_cpu
build_os
build_vendor
c
CC, CC, CC
CFLAGS, CFLAGS
configure_input
CPP
CPPFLAGS
CXX
CXXCPP
CXXFLAGS, CXXFLAGS
d
datadir
DEFS
e
exec_prefix
EXEEXT
f
F77
FFLAGS, FFLAGS
FLIBS
h
host
host_alias
host_cpu
host_os
host_vendor
i
includedir
infodir
INSTALL
INSTALL_DATA
INSTALL_PROGRAM
INSTALL_SCRIPT
k
KMEM_GROUP
l
LDFLAGS
LEX
LEX_OUTPUT_ROOT
LEXLIB
libdir
libexecdir
LIBOBJS, LIBOBJS, LIBOBJS, LIBOBJS, LIBOBJS
LIBS, LIBS, LIBS
LN_S
localstatedir
m
mandir
n
NEED_SETGID
o
OBJEXT
oldincludedir
p
prefix
program_transform_name
r
RANLIB
s
sbindir
SET_MAKE
sharedstatedir
srcdir
subdirs
sysconfdir
t
target
target_alias
target_cpu
target_os
target_vendor
top_srcdir
x
X_CFLAGS
X_EXTRA_LIBS
X_LIBS
X_PRE_LIBS
y
YACC
預處理器符號索引
這是一個按照字母順序排序的,由Autoconf宏定義的C預處理符號的清單。為了與Autoconf協同工作,C源代碼應該在#if指令中使用這些名字。
Jump to: _ - c - d - f - g - h - i - l - m - n - o - p - r - s - t - u - v - w - y
_
__CHAR_UNSIGNED__
_ALL_SOURCE
_MINIX
_POSIX_1_SOURCE
_POSIX_SOURCE, _POSIX_SOURCE
_POSIX_VERSION
c
C_ALLOCA
CLOSEDIR_VOID
const
d
DGUX
DIRENT
f
F77_NO_MINUS_C_MINUS_O
g
GETGROUPS_T
GETLODAVG_PRIVILEGED
GETPGRP_VOID
gid_t
h
HAVE_ALLOCA_H
HAVE_CONFIG_H
HAVE_DIRENT_H
HAVE_DOPRNT
HAVE_function
HAVE_GETMNTENT
HAVE_header
HAVE_LONG_DOUBLE
HAVE_LONG_FILE_NAMES
HAVE_MMAP
HAVE_NDIR_H
HAVE_RESTARTABLE_SYSCALLS
HAVE_ST_BLKSIZE
HAVE_ST_BLOCKS
HAVE_ST_RDEV
HAVE_STRCOLL
HAVE_STRFTIME
HAVE_STRINGIZE
HAVE_SYS_DIR_H
HAVE_SYS_NDIR_H
HAVE_SYS_WAIT_H
HAVE_TM_ZONE
HAVE_TZNAME
HAVE_UNISTD_H
HAVE_UTIME_NULL
HAVE_VFORK_H
HAVE_VPRINTF
HAVE_WAIT3
i
inline
INT_16_BITS
l
LONG_64_BITS
m
MAJOR_IN_MKDEV
MAJOR_IN_SYSMACROS
mode_t
n
NDIR
NEED_MEMORY_H
NEED_SETGID
NLIST_NAME_UNION
NLIST_STRUCT
NO_MINUS_C_MINUS_O
o
off_t
p
pid_t
r
RETSIGTYPE
s
SELECT_TYPE_ARG1
SELECT_TYPE_ARG234
SELECT_TYPE_ARG5
SETPGRP_VOID
SETVBUF_REVERSED
size_t
STDC_HEADERS
SVR4
SYS_SIGLIST_DECLARED
SYSDIR
SYSNDIR
t
TIME_WITH_SYS_TIME
TM_IN_SYS_TIME
u
uid_t
UMAX
UMAX4_3
USG
v
vfork
VOID_CLOSEDIR
w
WORDS_BIGENDIAN
y
YYTEXT_POINTER
宏索引
這是按字母排序的Autoconf宏清單。為了使清單易於使用,宏以沒有前綴``AC_''的形式列出。
Jump to: a - b - c - d - e - f - g - h - i - l - m - o - p - r - s - t - u - v - w - x - y
a
AIX
ALLOCA
ARG_ARRAY
ARG_ENABLE
ARG_PROGRAM
ARG_WITH
b
BEFORE
c
C_BIGENDIAN
C_CHAR_UNSIGNED
C_CONST
C_CROSS
C_INLINE
C_LONG_DOUBLE
C_STRINGIZE
CACHE_CHECK
CACHE_LOAD
CACHE_SAVE
CACHE_VAL
CANONICAL_HOST
CANONICAL_SYSTEM
CHAR_UNSIGNED
CHECK_FILE
CHECK_FILES
CHECK_FUNC
CHECK_FUNCS
CHECK_HEADER
CHECK_HEADERS
CHECK_LIB
CHECK_PROG
CHECK_PROGS
CHECK_SIZEOF
CHECK_TOOL
CHECK_TYPE
CHECKING
COMPILE_CHECK
CONFIG_AUX_DIR
CONFIG_HEADER
CONFIG_SUBDIRS
CONST
CROSS_CHECK
CYGWIN
d
DECL_SYS_SIGLIST
DECL_YYTEXT
DEFINE
DEFINE_UNQUOTED
DEFUN
DIR_HEADER
DYNIX_SEQ
e
EGREP_CPP
EGREP_HEADER
ENABLE
ERROR
EXEEXT
f
F77_LIBRARY_LDFLAGS
FIND_X
FIND_XTRA
FUNC_ALLOCA
FUNC_CHECK
FUNC_CLOSEDIR_VOID
FUNC_FNMATCH
FUNC_GETLOADAVG
FUNC_GETMNTENT
FUNC_GETPGRP
FUNC_MEMCMP
FUNC_MMAP
FUNC_SELECT_ARGTYPES
FUNC_SETPGRP
FUNC_SETVBUF_REVERSED
FUNC_STRCOLL
FUNC_STRFTIME
FUNC_UTIME_NULL
FUNC_VFORK
FUNC_VPRINTF
FUNC_WAIT3
g
GCC_TRADITIONAL
GETGROUPS_T
GETLOADAVG
h
HAVE_FUNCS
HAVE_HEADERS
HAVE_LIBRARY
HAVE_POUNDBANG
HEADER_CHECK
HEADER_DIRENT
HEADER_EGREP
HEADER_MAJOR
HEADER_STAT
HEADER_STDC
HEADER_SYS_WAIT
HEADER_TIME
i
INIT
INLINE
INT_16_BITS
IRIX_SUN
ISC_POSIX
l
LANG_C
LANG_CPLUSPLUS
LANG_FORTRAN77
LANG_RESTORE
LANG_SAVE
LINK_FILES
LN_S
LONG_64_BITS
LONG_DOUBLE
LONG_FILE_NAMES
m
MAJOR_HEADER
MEMORY_H
MINGW32
MINIX
MINUS_C_MINUS_O
MMAP
MODE_T
MSG_CHECKING
MSG_ERROR
MSG_RESULT
MSG_WARN
o
OBJEXT
OBSOLETE
OFF_T
OUTPUT
p
PATH_PROG
PATH_PROGS
PATH_X
PATH_XTRA
PID_T
PREFIX
PREFIX_PROGRAM
PREREQ
PROG_AWK
PROG_CC
PROG_CC_C_O
PROG_CPP
PROG_CXX
PROG_CXXCPP
PROG_F77_C_O
PROG_FORTRAN
PROG_GCC_TRADITIONAL
PROG_INSTALL
PROG_LEX
PROG_LN_S
PROG_MAKE_SET
PROG_RANLIB
PROG_YACC
PROGRAM_CHECK
PROGRAM_EGREP
PROGRAM_PATH
PROGRAMS_CHECK
PROGRAMS_PATH
PROVIDE
r
REMOTE_TAPE
REPLACE_FUNCS
REQUIRE
REQUIRE_CPP
RESTARTABLE_SYSCALLS
RETSIGTYPE
REVISION
RSH
s
SCO_INTL
SEARCH_LIBS, SEARCH_LIBS
SET_MAKE
SETVBUF_REVERSED
SIZE_T
SIZEOF_TYPE
ST_BLKSIZE
ST_BLOCKS
ST_RDEV
STAT_MACROS_BROKEN, STAT_MACROS_BROKEN
STDC_HEADERS
STRCOLL
STRUCT_ST_BLKSIZE
STRUCT_ST_BLOCKS
STRUCT_ST_RDEV
STRUCT_TIMEZONE
STRUCT_TM
SUBST
SUBST_FILE
SYS_INTERPRETER
SYS_LONG_FILE_NAMES
SYS_RESTARTABLE_SYSCALLS
SYS_SIGLIST_DECLARED
t
TEST_CPP
TEST_PROGRAM
TIME_WITH_SYS_TIME
TIMEZONE
TRY_COMPILE
TRY_CPP
TRY_LINK
TRY_LINK_FUNC, TRY_LINK_FUNC
TRY_RUN
TYPE_GETGROUPS
TYPE_MODE_T
TYPE_OFF_T
TYPE_PID_T
TYPE_SIGNAL
TYPE_SIZE_T
TYPE_UID_T
u
UID_T
UNISTD_H
USG
UTIME_NULL
v
VALIDATE_CACHED_SYSTEM_TUPLE
VERBOSE
VFORK
VPRINTF
w
WAIT3
WARN
WITH
WORDS_BIGENDIAN
x
XENIX_DIR
y
YYTEXT_POINTER
autoconf手冊(六)
我如何解開死結?
如果Autoconf需要GNU m4並且GNU m4還有一個Autoconf configure腳本,
我如何解開這個死結?它好像是一個類似於雞和蛋的問題﹗
這實際上是一種誤解。雖然GNU m4帶有一個由Autoconf生成的configure腳本,但在營運腳本及安裝GNU m4的時候並不需要安裝Autoconf。只有在你需要修改m4的configure 腳本的時候,這只是少數幾個人(主要是它的維護者)必須去作的事,才需要Autoconf。
為什麼不使用Imake?
為什麼不用Imake來代替configure腳本?
有些人已經提出了這個問題,所以在改編之後,我把給他們的解釋寫在這裡。
下面是對Richard Pixley的問題的回答︰
由Autoconf生成的腳本經常地在它以前從未設定過的機器上工作。這就是說,它善於推斷新系統的配置。而Imake不能做到。
Imake使用含有主機特定數據的通用數據庫。對X11來說,這種方法具有意義是因為發布版本是由一個控制整個數據庫的總管機關管理的一組工具組成的。
GNU工具並不按這種模式發行。每個GNU工具都有一個維護者;這些維護者散佈在世界各地。使用統一的數據庫將使維護變成噩夢。 Autoconf可能成為這類數據庫,但實際上它沒有。不是列舉主機的倚賴性,它列舉的是程式的需求。
如果你把GNU套件看作一組本地工具,那麼問題就很相似了。但GNU開發工具可以作為交叉工具(cross tools)而在幾乎所有主機+目標機的組合中進行配置。所有的這些配置都可以同時(concurrency)安裝。它們甚至可以被配置成可以在不同主機上共享與主機獨立的訊息的形式。Imake不能處理這些問題。
Imake模板是標準的一種形式。GNU編碼標準在沒有強加相同的限制的情況下,解決了相同的問題。
下面是一些由Per Bothner撰寫的進一步的解釋︰
Imake的一個長處是它易於透過使用cpp的``#include''和宏機製生成大的Makefile。然而,cpp是不可編程的︰它含有有限的條件工具,而不含有循環。而且cpp不能檢查它的環境。
所有這些問題可以透過使用sh而不是cpp來解決。shell是完全可編程的、含有宏替換、可以執行(或者編製)其它的shell腳本,並且可以檢查它的環境。
Paul Eggert更詳細地闡述︰
使用Autoconf,安裝者不必假定Imake自身已經被安裝並且正常地工作了。這對於習慣使用Imake的人們來說,看起來不是突出的長處。但在許多主機上,並沒有安裝Imake或者缺省的安裝不能很好地工作,為此,要求安裝Imake就阻礙了在這些主機上使用由Imake配置的套裝軟件。例如,Imake模板和配置檔案可能不能適當地安裝在一個主機上,或者Imake創建過程可能會錯誤地假定所有的源代碼檔案都在一個大目錄樹中,或者Imake配置可能使用某個編譯器而包或者安裝器需要使用另一個編譯器,或者包需要的Imake的版本號與系統支援的版本號不匹配。這些問題在Autoconf中很少出現,這是因為包附帶屬於它自己的獨立配置處理器。
還有,Imake通常會在make和安裝者的C預處理器之間遇到難以預期的影響。這裡的基本問題是,C預處理器是為處理C程式而不是``Makefile''而設計的。這對Autoconf來說問題小得多,它使用通用目的預處理器m4,並且包的作者(而不是安裝者)以標準的模式進行預處理。
最後,Mark Eichin解釋道︰
Imake還不是完全可擴展的。為了把新特徵添加到Imake中,你需要提供你自己的項目模板,並且複製已經存在的特徵的主要部分。這意味著對於複雜的項目來說,使用由買主提供的(vendor-provided)Imake模板不能提供任何平衡作用--這是因為它們不包括你自己的項目的任何東西(除非它是一個X11程式)。
但是,另一方面︰
一個Imake勝過configure的長處是︰ ``Imakefile''總是趨向於比``Makefile.in''簡短(同樣地,冗餘較少)。但是,這兒有一個修正的方法--至少對於Kerberos V5樹來說,我們已經在整個樹中進行了修改以調用通用的 ``post.in''和``pre.in'' ``Makefile''片斷。這意味著大部分通用的東西,即使它們通常是在configure中設定的,也不必複製。
從版本1中升級
Autoconf第2版基本上與第1版是向後兼容的。但是,它給出了作某些事的更好方法,並且不再支援版本1中一些醜陋的東西。因此,根據你的``configure.in''檔案的複雜性,你可能必須作一些手工的工作以升級到版本2。本章指出了一些在升級的時候需要注意的問題。還有,可能你的configure腳本可以從版本2中的新特徵中獲得一些好處;在Autoconf發布包中的``NEWS''檔案概括了改變的部分。
首先,確認你安裝了1.1版或者更高版本的GNU m4,最好是1.3版或者更高版本。在1.1版之前的版本含有bug 以至於它不能與Autoconf版本2一同工作。版本1.3及其後的版本比早期的版本更快一些,這是因為1.3版的GNU m4 對轉換(diversions)進行了更有效的實現並且能夠在可以快速讀回的檔案中凍結(freeze)它的內部狀態。
改變了的檔案名
如果你隨Autoconf一起安裝了``aclocal.m4''(相對於特定套裝軟件的源代碼目錄中的``aclocal.m4''),你必須把它重命名為``acsite.m4''。參見用autoconf創建configure。
如果你與你的套裝軟件一同發布``install.sh'',就把它重命名為``install-sh''以便make的內置規則不會無意地從該檔案創建一個稱為``install''的檔案。AC_PROG_INSTALL將尋找這兩個名字的腳本,但最好使用新名字。
如果你使用``config.h.top''或者``config.h.bot'',你仍然可以使用它們,但如果你把它們混合到 ``acconfig.h''之中,將減少你的麻煩。參見用autoheader創建``config.h.in''。
改變了的Makefile
在你的``Makefile.in''檔案中添加``@CFLAGS@''、``@CPPFLAGS@''和``@LDFLAGS@'',以便它們可以在configure營運的時候利用環境中的這些變量的值。這樣做不是必須的,但對用戶來說比較方便。
對於AC_OUTPUT的每個非``Makefile''的輸入檔案,你還應該添加一條含有 ``@configure_input@''的註釋,以便輸出檔案將會包含一條註釋以說明它們是由configure生成的。自動地為每種人們在AC_OUTPUT中輸出的檔案選擇正確的註釋語法需要做太多的工作。
把``config.log''和``config.cache''添加到你要在distclean目標中刪除的檔案的清單中。
如果你的``Makefile.in''如下︰
prefix = /usr/local
exec_prefix = ${prefix}
你必須把它修改成︰
prefix = @prefix@
exec_prefix = @exec_prefix@
不使用``@''字符的老式的對這些變量的替換行為已經被刪除了。
改變了的宏
在Autoconf第2版中,重新命名了許多宏。你仍然可以使用舊名字,但新名字更清晰,並且易於找到相關文檔。關於為舊宏名提供新宏名的清單,參見陳舊的宏名。用autoupdate程式轉換你的``configure.in''以使用新的宏名。參見用autoupdate更新configure。
有些宏已經被能夠更好地完成工作的類似宏所代替,但在調用上並不兼容。如果你在營運autoconf時受到了關於調用過時宏的警告,你可以安全地忽略它們,但如果你按照列印的建議替換過時的宏,你的configure腳本通常可以工作的更好。特別地,報告測試結果的機製已經改變了。如果你使用了echo或者AC_VERBOSE(可能是透過AC_COMPILE_CHECK),如果你改用AC_MSG_CHECKING和AC_MSG_RESULT,你的configure腳本的輸出將更加美觀。參見列印消息。這些宏能夠更好地與緩存變量協同工作。參見緩存結果。
用autoupdate更新configure
程式autoupdate把使用Autoconf舊宏名的``configure.in''檔案更新為使用當前宏名的檔案。在Autoconf第2版中,大部分宏被重命名以使用一個更統一、更具有描述性的命名機製。關於對新的命名機製的描述,參見宏名。雖然舊宏名仍然可以工作(關於舊宏名和對應的新宏名的清單,參見陳舊的宏名),如果你更新它們以使用新的宏名,你可以使你的 ``configure.in''檔案更加可讀並且易於使用當前的Autoconf文檔。
如果沒有給出參數,autoupdate就更新``configure.in'',並且透過添加後綴``~'' (或者在設定了環境變量SIMPLE_BACKUP_SUFFIX的時候,使用該環境變量的值)以備份原始版本。如果你帶參數調用autoupdate,它就讀入那個檔案而不是讀入``configure.in'',並且把更新的檔案輸出到標準輸出。
autoupdate接受下列選項︰
--help
-h
列印命令行選項的概述並且退出。
--macrodir=dir
-m dir
在目錄dir中,而不是在缺省安裝目錄中尋找Autoconf宏檔案。你還可以把環境變量AC_MACRODIR設定成一個目錄;本選項覆蓋該環境變量。
--version
列印autoupdate的版本號並且退出。
改變了的結果
如果你透過檢驗shell變量DEFS來檢驗以前測試的結果,你需要把這些檢驗替換為對那些測試的緩存變量的檢查。在configure營運的時候,DEFS不再存在;它僅僅在生成輸出檔案的時候才被創建。這種與第1版的不同是因為正確地對變量實行引用(quoting)實在太麻煩而且在每次調用AC_DEFINE都要實行引用是低效的。參見緩存變量名。
例如,下面是為Autoconf第1版編寫的``configure.in''的片斷︰
AC_HAVE_FUNCS(syslog)
case ""$DEFS"" in
*-DHAVE_SYSLOG*) ;;
*) # syslog is not in the default libraries. See if it''s in some other.
saved_LIBS=""$LIBS""
for lib in bsd socket inet; do
AC_CHECKING(for syslog in -l$lib)
LIBS=""$saved_LIBS -l$lib""
AC_HAVE_FUNCS(syslog)
case ""$DEFS"" in
*-DHAVE_SYSLOG*) break ;;
*) ;;
esac
LIBS=""$saved_LIBS""
done ;;
esac
這裡是為版本2編寫的模式︰
AC_CHECK_FUNCS(syslog)
if test $ac_cv_func_syslog = no; then
# syslog is not in the default libraries. See if it''s in some other.
for lib in bsd socket inet; do
AC_CHECK_LIB($lib, syslog, [AC_DEFINE(HAVE_SYSLOG)
LIBS=""$LIBS $lib""; break])
done
fi
如果你透過在引號的後邊添加反斜線以處理AC_DEFINE_UNQUOTED中的bug,你需要刪除它們。它現下以可以預期的模式工作,並且不需要特別地處理引號(處理反斜線)。參見設定輸出變量。
所有由Autoconf宏設定的布爾shell變量現下用``yes''來表示真值。雖然為了向後兼容,有些宏使用空字元串表示假,大部分宏使用``no''來表示假。如果你倚賴於shell變量用諸如1或者``t''來表示真,你就需要改變你的測試。
改變了的宏的編寫
在定義你自己的宏時,你現下應該使用AC_DEFUN而不是define。 AC_DEFUN自動調用AC_PROVIDE並且確保透過AC_REQUIRE調用該宏不會被其他宏所打斷,從而防止在螢幕上出現巢狀的``checking...''消息。繼續按照老辦法行事沒有實際上的傷害,但它缺乏便利和吸引力。參見宏定義。
你可能把與Autoconf一同發行的宏作為如何解決問題的指南。看看它們的新版本將是一個好主意,因為風格已經有些改進並且它們利用了一些新的特徵。
如果你利用未公開的(undocumented)Autoconf內部元素(宏、變量、變換(diversions))作了微妙的工作,就要檢查你是否需要修改些什麼以適應已經發生的變化。可能你甚至能夠用版本2中公開(officially)支援的技術來代替你的拼裝(kludging)。但也可能不能。
為了加快你自行編寫的特徵測試,為它們添加緩存。看看你所有的測試是否足夠一般化,從而具有足夠的用途以把它們封裝到你可以共享的宏中去。
Autoconf的歷史
你可能會困惑,最初為什麼要編寫Autoconf?它是如何演變到今天的形式的?(為什麼它看起來就像大猩猩的吐沫?)如果你不困惑,那麼本章就不包含對你有用的訊息,你也可能會跳過它。如果你困惑,那就讓它明白些...
起源(Genesis)
在1991年六月,我為自由軟體基金會維護了許多GNU工具。由於它們被移植到更多的平台並且增加了更多的程式,用戶必須在``Makefile''中選擇的``-D''選項的數目(大約20個)變得難以承受。尤其是我-- 我不得不在許多不同的系統上對每個新的發布版本進行測試。所以我編寫了一個簡單的shell腳本為fileutils包猜測一些正確的設定,並且把它作為fileutils 2.0的一部分進行發布。這個configure能夠勝任工作,因此,我在下個月中,手工對其進行了修改以用於其他幾個GNU工具包,從而創建了相似的configure腳本。 Brian Berliner也修改了我的腳本以用與它的CVS修訂控制系統。
那個夏天以後,我得知Richard Stallman和Richard Pixley正在開發用於GNU編譯器工具的類似腳本;所以我對我的 configure進行了修改以支援它們的進化的界面︰把名為``Makefile.in''的檔案當作模板;添加``+srcdir'',作為許多選項的第一個選項;並創建``config.status''檔案。
出發(Exodus)
由於我從用戶那裡獲得了回饋,我組合了許多改進,使用Emacs進行搜索和替換、剪切(cut)和粘貼(paste),在每個腳本中進行類似的修改。隨著我修改更多的GNU工具包以使用configure腳本,完全用手工更新它們就不可能了。Rich Murphey,GNU圖形工具的維護者,在給我發送的郵件中說configure腳本很好,並問我是否有一個可以生成它們的工具可以發給他。沒有,我想,但我將會有﹗所以我開始考慮如何生成它們。這樣,從手工編寫configure腳本的苦力向功能強大而易於使用的Autoconf前進的旅程開始了。
Cygnus configure,它大約也在那個時候被開發,是表驅動的;這意味著用少量的大體上不可猜測的特徵來處理離散數量的系統類型(例如目標檔案格式的細節)。Brian Fox為Bash開發的自動配置系統採用了類似的方法。為了統一用法,我好像必須絕望地試圖為每個作業系統的變種的特徵維護一個及時更新的數據庫。更容易和更可靠的辦法是不檢查大多數特徵--特別是在那些人們已經在本地深入地研究或者安裝了買主提供的補丁的雜合的系統。
我考慮到使用與Cygnus configure相似的架構,就是提供一個單獨的configure腳本,在營運時讀入``configure.in''的片斷。但是我不想讓每個包都發布所有的特徵測試,所以我選擇了使用預處理器從每個``configure.in''中創建不同的configure。這個方法還提供了更多的控制和便利。
我簡要地察看了被Larry Wall、Harlan Stenn和Raphael Manfredi採用的Metaconfig包,但我為了幾個原因而不採用它。這種模式生成的Configure腳本是交互式的,我認為太不方便了;我不喜歡它測試某些特徵的模式(例如庫函數);我不知道它是否還有人維護,並且我所見到的Configure腳本在許多現代系統(例如System V R4和NeXT)中都不能工作;設定在支援某個特徵或者不支援該特徵時所進行的動作也不是很方便;我發現它難於學習;並且對於我的需要,它太大、太複雜了(我沒有意識到Autoconf最終將變得多么大)。
我考慮過使用Perl來生成我的風格的configure腳本,但顯然m4更加適合於簡單的文本替換工作︰由於輸出是隱含的,它的工作比較少。還有,每個人都已經擁有它了。(一開始,我並不倚賴於 GNU對m4的擴展。)我在Maryland大學的一些朋友最近用一些程式,包括tvtwm,製作了m4的前端,並且我也有興趣試試一種新語言。
上路(Leviticus)
因為我的configure在沒有與用戶進行交互的條件下自動地確定了系統的能力,我決定把生成它們的程式稱作Autoconfig。但附加了版本號之後,這個名字對於老式的UNIX檔案系統來說就太長了,所以我把它縮短成Autoconf。
在1991年秋天,我召集了一群期望獲得移植性的家伙(alpha測試者)以給我提供回饋從而使我可以壓縮(encapsulate)我用m4宏寫的腳本並且繼續添加特徵、改進檢查中採用的技術。測試者中的傑出人物有Pinard,他提出了創建一個``autoconf''來營運m4並且檢查找不到的宏調用的想法;還有Richard Pixley,他建議透過營運編譯器而不是在檔案系統中尋找引入檔案和符號,以獲得更精確的結果;還有Kerl Berry,他使得Autoconf可以配置 Tex並且把宏索引添加到文檔中;還有Ian Taylor,他增加了對創建C頭檔案的支援以代替在``Makefile''中添加 ``-D''選項的方法,以便他可以把Autoconf用於他的UUCP包。alpha測試者愉快地、一次又一次地隨著 Autoconf不同發布版本中的Autoconf名稱和宏調用慣例的改變而調整他們的檔案。他們都貢獻了許多特定的檢查、絕妙的想法,以及對bug的修正。
發展(Numbers)
在1992年七月,在alpha測試之後一個月,我發布了Autoconf 1.0,並且修改了許多GNU包以使用它。我對它帶來的正面作用感到很吃驚。很多人,包括那些編寫並不屬於GNU工程的軟體(例如TCL、FSP和Kerberos V5)的人們,開始使用它,以至於我無法跟蹤他們了。隨著很多使用configure腳本的人報告他們所遇到的問題,Autoconf繼續快速地得到改進,
Autoconf成為考驗m4實現的酷刑般的測試。由於Autoconf定義的宏的長度,UNIX m4開始失敗(dump core),同時也發現了GNU m4中的一些bug。最終,我們意識到我們需要使用一些只有 GNU m4才提供的特徵。特別的,4.3BSD m4含有一組增強了的內置宏;System V版本更好一些,但仍然不能提供我們所需要的所有東西。
隨著Autoconf得到人們越來越多的重視,對Autoconf進行了更多的開發(並且有了我不能預見的用途)。Karl Berry添加了對X11的檢查。david zuhn貢獻了對C++的支援。Pinard使Autoconf能夠診斷非法的參數。Jim Blandy勇敢地用它配置了GNU Emacs,並且為某些未來的改進打下了基礎。Roland McGrath用它配置了GNU C庫,編寫了autoheader 腳本以自動創建C頭檔案模板,並且為configure添加了一個``--verbose''選項。 Noah Friedman添加了``--macrodir''選項和環境變量AC_MACRODIR。(他還提出了術語 autoconfiscate,用來表示“調整套裝軟件以使用Autoconf”。)Roland和Noah改進了AC_DEFINE 中的引用保護並且修正了許多bug,特別是在1993年二月到六月間我們對處理移植性問題感到厭倦的時候。
現狀(Deuteronomy)
在累積了一個關於希望添加的主要特徵的長長的清單,並且在幾年之中各式各樣的人們提供的補丁殘留了古怪的效果之後。在1994年四月,處理對Cygnus的支援時,我開始對Autoconf進行一次主要的修訂。我添加了大部分Cygnus configure 有,而Autoconf缺少的特徵,主要是在david zuhn和Ken Raeburn的幫助下改編Cygnus configure的相關部分。這些特徵包括對使用``config.sub''、``config.guess''、``--host''和 ``--target''的支援;創建對檔案的連接;以及在次目錄中營運configure腳本。添加這些特徵使得Ken可以放棄GNU as,Rob Savoye可以放棄DejaGNU,而改用Autoconf。
作為對其他人的要求的回應,我添加了更多的特徵。許多人要求configure腳本能夠在不同的營運中共享檢查的結果,這是因為它們實在太慢了(尤其是像Cygnus那樣在配置一個大的源代碼樹的時候)。 Mike Haertel建議增加與位置有關的初始化腳本。發布必須在MS-DOS中解包(unpack)的軟體的人們要求提供一種覆蓋那些諸如``config.h.in''那樣的、含有兩個點的檔案名中的``.in''擴展名的方法。 Jim Avera透過AC_DEFINE和AC_SUBST中的引用擴展了對程式的檢測;他的洞察力帶來了重要的改進。Richard Stallman要求把編譯器的輸出送到``config.log''中,而不是送到``/dev/null''中,以幫助人們調試Emacs configure腳本。
由於我對程式質量的不滿,我進行了一些其他的修改。我減少了用於顯示檢查結果的消息的二義性,總是列印結果。我識別宏的名字並且消除編碼風格的不一致性。我添加了一些我所開發的附加工具以助於修改源代碼包以使用Autoconf。在Pinard的幫助下,我創建了不會在彼此的消息中導致衝突的宏。(這個特徵暴露了他草率地修正的、GNU m4 中的一些性能瓶頸﹗)我重新組織了人們需要解決的問題的文檔。並且我開始了一組測試(testsuite),這是因為經驗已經表明︰在我們修改Autoconf的時候,它有明顯的回歸傾向。
一些alpha測試者再次給出了難以估量的回饋,特別是 Pinard、Jim Meyering、Karl Berry、Rob Savoye、Ken Raeburn和Mark Eichin。
最後,2.0版本準備好了。而且我們也很高興。(我們又有閒暇時間了。我想。哇,很好。)