獲取規范的系統類型
下列的宏使得configure腳本可以獲得系統類型
它們運行shell腳本config
guess以確定用戶在命令行中沒有給出的
它們需要的關於主機
目標和創建類型的所有值
它們運行config
sub對用戶給出的任何別名進行規范化
如果你使用這些宏
你必須把這兩個shell腳本與你的源代碼一同發布
關於 AC_CONFIG_AUX_DIR的信息
你可以通過該宏設置configure查找這些腳本的目錄
請參見 創建輸出文件
如果你沒有使用這些宏中的任意一個
configure 就忽略任何傳遞給它的`
host
`
target
和`
build
選項
宏
AC_CANONICAL_SYSTEM
檢測系統類型並把輸出變量設置成規范的系統類型
關於該宏設置變量的細節
參見系統類型變量
宏
AC_CANONICAL_HOST
只執行AC_CANONICAL_SYSTEM中關於主機類型功能的子集
對於不是編譯工具鏈(compiler toolchain)一部分的程序
這就是所需要的全部功能
宏
AC_VALIDATE_CACHED_SYSTEM_TUPLE (cmd)
如果緩存文件與當前主機
目標和創建系統類型不一致
就執行cmd或者打印一個缺省的錯誤消息
系統類型變量
在調用了AC_CANONICAL_SYSTEM之後
下列輸出變量包含了系統類型信息
在調用了AC_CANONICAL_HOST 之後
只設置了下列host變量
build
host
target
規范系統名稱
build_alias
host_alias
target_alias
如果使用了config
guess
就是用戶指定的名稱或者規范名稱
build_cpu
build_vendor
build_os
host_cpu
host_vendor
host_os
target_cpu
target_vendor
target_os
為方便而提供的規范名稱的獨立部分
使用系統類型
你將如何使用規范的系統類型?通常
你在`configure
in
中的一個或多個case語句中使用它來選擇系統特定的C文件
而後把那些使用基於系統名的文件名的文件連接到諸如`host
h
或`target
c
的普通的文件上
case語句模型允許使用shell通配符對多種情況進行編組
就像下面的片斷
case
$target
in
i
*
mach* | i
*
gnu*) obj_format=aout emulation=mach bfd_gas=yes ;;
i
*
bout) obj_format=bout ;;
esac
宏
AC_LINK_FILES (source
dest
)
使得AC_OUTPUT把每個存在文件的source連接到對應連接名dest
如果可能
創建一個符號連接
否則就創建硬連接
dest和source應該是相對於頂層源代碼目錄或者創建目錄的相對路徑
可以多次調用本宏
例如
下列調用
AC_LINK_FILES(config/${machine}
h config/${obj_format}
h
host
h object
h)
在當前目錄中創建`host
h
它是一個到`srcdir/config/${machine}
h
的連接
並且創建`object
h
它是一個到`srcdir/config/${obj_format}
h
的連接
你還可以使用主機系統類型以尋找交叉編譯工具
關於完成該任務的宏AC_CHECK_TOOL的信息
參見對普通程序和文件的檢查
站點配置
configure腳本支持幾種本地配置決策方式
它們是用戶指明外部軟件的位置
包括或除去可選的特征
以修改過的名稱安裝的程序
以及為configure選項設置缺省值的手段
與外部軟件一起工作
有些軟件包需要
或者可選地使用其它已經安裝的軟件包
用戶可以把命令行選項傳遞給configure 以指明使用那個外部軟件
選項采用下列形式之一
with
package[=arg]
without
package
例如
`
with
gnu
ld
的意思是使用GNU連接器而不是任何其它連接器
`
with
x
的意思是使用X Window系統
用戶可以給出包名加`=
加參數的命令行參數
`no
是關於包的缺省參數
它表示不使用包
既不是`yes
又不是`no
的參數將包含其它包的名字或者版本號
以便更精確地指定本程序可以與之協同工作的包
如果沒有給出參數
`
without
package
的缺省參數為`yes
`
without
package
等價於`
with
package=no
configure腳本並不對它們不支持的`
with
package
選項發出警告
本特征允許頂層目錄中的configure腳本配置一個包含多個包的源代碼樹
在包支持不同的選項的時候
不會因為給出了只有一部分包支持的選項而導致不必要的錯誤消息
一個不幸的副作用是選項的拼寫錯誤就不能被檢查出來了
迄今為止還沒有處理該問題的更好辦法
對於每個可能使用的外部軟件包
`configure
in
都應該調用AC_ARG_WITH以檢測 configure的用戶是否要求使用它
確定在缺省狀態下
是使用還是不使用每個包
以及那個參數是合法的
是你的任務
宏
AC_ARG_WITH (package
help
string [
action
if
given [
action
if
not
given]])
如果用戶以選項`
with
package
或者`
without
package
調用 configure
就運行shell命令action
if
given
如果兩個選項都沒有給出
就運行shell命令 action
if
not
given
名字package給出了本程序應該與之協同工作的其它軟件包
它應該僅僅由字母
數字和破折號(dashes)組成
shell命令action
if
given可以通過shell變量withval得到選項的參數
該變量的值實際上就是把 shell變量with_package的值中的所有`
字符替換為`_
而得的
如果你願意
可以使用變量with_package
參數help
string是對選項的描述
它看起來應該像
with
readlinesupport fancy command line editing
如果需要給出更多的細節
help
string可能多於一行
只要確保`configure
help
中的列的排列就可以了
不要在求助字符串中使用tab
你將需要用`[
和`]
包圍它以生成前導空格
宏
AC_WITH (package
action
if
given [
action
if
not
given])
這是不支持求助字符串的AC_ARG_WITH的過時版本
選擇包選項
如果軟件包含有可選的編譯時(compile
time)特征
用戶就可以在調用configure時使用命令行選項來指明是否編譯它們
選項采用如下形式之一
enable
feature[=arg]
disable
feature
這些選項允許用戶選擇可選的選項進行創建和安裝
`
enable
feature
選項永遠不要使特征的行為變得不同或者導致一個特征代替另一個特征
它們只應該導致程序的一部分被創建而另一部分不創建
用戶可以通過在特征名之後添加`=
和參數來給出參數
給出參數`no
表示 不能使用該特征
一個帶有參數的特征看起來就像`
enable
debug=stabs
如果沒有給出參數
它的缺省值就是`yes
`
disable
feature
等價於 `
enable
feature=no
configure腳本並不對它們所不支持的`
enable
feature
選項發出警告
本特征允許頂層目錄中的configure腳本配置一個包含多個包的源代碼樹
在包支持不同的選項的時候
不會因為給出了只有一部分包支持的選項而導致不必要的錯誤消息
一個不幸的副作用是選項的拼寫錯誤就不能被檢查出來了
迄今為止還沒有處理該問題的更好辦法
對於每個可選的特征
`configure
in
都應該調用AC_ARG_ENABLE以檢測configure 的用戶是否要求把該特征包含進來
確定在缺省情況下
每個特征是否被包含進來
以及那些選項是合法的
是你的任務
宏
AC_ARG_ENABLE (feature
help
string [
action
if
given [
action
if
not
given]])
如果用戶以選項`
enable
feature
或者`
disable
feature
調用 configure
就運行shell命令action
if
given
如果兩個選項都沒有給出
就運行shell命令 action
if
not
given
名稱feature表示可選的用戶級功能
它應該僅僅由字母
數字和破折號(dashes)組成
shell命令可以通過訪問shell變量enableval來得到選項的參數
該變量的值實際上就是把shell變量 enable_feature的值中所有的`
字符替換成`_
而得到的
如果你願意
可以使用變量enable_feature
help
string參數類似於 AC_ARG_WITH中相應的參數(參見與外部軟件一起工作)
宏
AC_ENABLE (feature
action
if
given [
action
if
not
given])
這是不支持求助字符串的AC_ARG_ENABLE的過時版本
配置站點細節
有些軟件包需要復雜的與站點相關(site
specific)的信息
例如用於某種服務
公司名稱和email聯系地址的主名(host names)
因為有些配置腳本是通過Metaconfig方式交互地詢問這些信息生成的
人們有時對於按非交互方式
由Autoconf生成配置腳本如何獲取這些信息感到困惑
這些站點配置信息應該被儲存在一個僅僅由用戶
而不是程序
編輯的文件中
文件的位置既可以基於 prefix變量
也可以是一個標准的位置
比如說用戶的home目錄
它甚至可能通過一個環境變量給出
程序應該在運行時
而不是在編譯時
檢查那個文件
運行時配置對於用戶來說更為方便
並且使得配置過程比在配置時獲取這些信息要簡單
關於存放數據文件的地點的詳細信息
參見GNU編碼標准中的 `為安裝目錄而提供的變量
在安裝的時候改變程序的名稱
Autoconf支持在安裝程序的時候修改程序的名稱
為了使用這些變換
`configure
in
必須調用宏 AC_ARG_PROGRAM
宏
AC_ARG_PROGRAM
把對被安裝的程序的名稱進行替換的sed命令序列存入輸出變量program_transform_name中
如果把下列任意選項傳遞給了configure
程序名就據此進行變換
否則
如果已經調用了AC_CANONICAL_SYSTEM並且`
target
的值給出了與主機類型(用`
host
給出的
或者是在config
sub中設置的缺省值)不同的類型
就把末尾附加了破折號的目標類型作為前綴
否則
就不進行程序名變換
轉換選項
From:http://tw.wingwit.com/Article/program/Oracle/201311/18172.html