apxs
是一個爲Apache HTTP服務器編譯和安裝擴展模塊的工具,用於編譯一個或多個源程序或目標代碼文件爲動態共享對象,使之可以用由mod_so
提供的LoadModule
指令在運行時加載到Apache服務器中。
因此,要使用這個擴展機制,你的平臺必須支持DSO特性,而且Apache httpd
必須內建了mod_so
模塊。apxs
工具能自動探測是否具備這樣的條件,你也可以自己用這個命令手動探測:
$ httpd -l
該命令的輸出列表中應該有mod_so
模塊。如果所有這些條件均已具備,則可以很容易地藉助apxs
安裝你自己的DSO模塊以擴展Apache服務器的功能:
$ apxs -i -a -c mod_foo.c gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c ld -Bshareable -o mod_foo.so mod_foo.o cp mod_foo.so /path/to/apache/modules/mod_foo.so chmod 755 /path/to/apache/modules/mod_foo.so [activating module 'foo' in /path/to/apache/etc/httpd.conf] $ apachectl restart /path/to/apache/sbin/apachectl restart: httpd not running, trying to start [Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module /path/to/apache/sbin/apachectl restart: httpd started $ _
其中的參數files可以是任何C源程序文件(.c)、目標代碼文件(.o)、甚至是一個庫(.a)。apxs
工具會根據其後綴自動編譯C源程序或者連接目標代碼和庫。但是,使用預編譯的目標代碼時,必須保證它們是地址獨立代碼(PIC),使之能被動態地加載。如果使用GCC編譯,則應該使用 -fpic
參數;如果使用其他C編譯器,則應該查閱其手冊,爲apxs
使用相應的編譯參數。
有關Apache對DSO的支持的詳細信息,可以閱讀mod_so
文檔,或者直接閱讀src/modules/standard/mod_so.c
源程序。
語法
apxs -g [ -S name=value ] -n modname apxs -q [ -S name=value ] query ... apxs -c [ -S name=value ] [ -o dsofile ] [ -I incdir ] [ -D name=value ] [ -L libdir ] [ -l libname ] [ -Wc,compiler-flags ] [ -Wl,linker-flags ] files ... apxs -i [ -S name=value ] [ -n modname ] [ -a ] [ -A ] dso-file ... apxs -e [ -S name=value ] [ -n modname ] [ -a ] [ -A ] dso-file ...
選項
一般選項
-n modname
它明確設置了
-i
(安裝)和-g
(模板生成)選項的模塊名稱。對-g
選項,它是必須的;對-i
選項,apxs
工具會根據源代碼判斷,或(在失敗的情況下)按文件名推測出這個模塊的名稱。
查詢選項
-q
查詢某種
apxs
設置的信息。該選項的query參數可以是下列一個或多個字符串:CC
,CFLAGS
,CFLAGS_SHLIB
,INCLUDEDIR
,LD_SHLIB
,LDFLAGS_SHLIB
,LIBEXECDIR
,LIBS_SHLIB
,SBINDIR
,SYSCONFDIR
,TARGET
。這個參數用於手動查詢某些設置。比如,要手動處理Apache的C頭文件,可以在Makefile中使用:
INC=-I`apxs -q INCLUDEDIR`
配置選項
-S name=value
此選項可以改變apxs的上述設置。
模板生成選項
-g
此選項生成一個名爲name的子目錄(見選項
-n
)和其中的兩個文件:一個是名爲mod_name.c
的樣板模塊源程序,可以用來建立你自己的模塊,或是學習使用apxs機制的良好開端;另一個則是對應的Makefile
,用於編譯和安裝此模塊。
DSO編譯選項
-c
此選項表示需要執行編譯操作。它首先會編譯C源程序(.c)files爲對應的目標代碼文件(.o),然後連接這些目標代碼和files中其餘的目標代碼文件(.o和.a),以生成動態共享對象dsofile 。如果沒有指定
-o
選項,則此輸出文件名由files中的第一個文件名推測得到,也就是默認爲mod_name.so
。-o dsofile
明確指定所建立的動態共享對象的文件名,它不能從files文件列表中推測得到。如果沒有明確指定,則其文件名將爲
mod_unknown.so
。-D name=value
此選項直接傳遞到給編譯命令,用於增加自定義的編譯變量。
-I incdir
此選項直接傳遞到給編譯命令,用於增加自定義的包含目錄。
-L libdir
此選項直接傳遞到給連接命令,用於增加自定義的庫文件目錄。
-l libname
此選項直接傳遞到給連接命令,用於增加自定義的庫文件。
-Wc,compiler-flags
此選項用於向編譯命令
libtool --mode=compile
中附加compiler-flags ,以增加編譯器特有的選項。-Wl,linker-flags
此選項用於向連接命令
libtool --mode=link
中附加linker-flags ,以增加連接器特有的選項。
DSO的安裝和配置選項
-i
此選項表示需要執行安裝操作,以安裝一個或多個動態共享對象到服務器的modules目錄中。
-a
此選項自動增加一個
LoadModule
行到httpd.conf
文件中,以激活此模塊,或者,如果此行已經存在,則啓用之。-A
與
-a
選項類似,但是它增加的LoadModule
命令有一個井號前綴(#
),即此模塊已經準備就緒但尚未啓用。-e
表示需要執行編輯操作,它可以與
-a
和-A
選項配合使用,與-i
操作類似,修改Apache的httpd.conf
文件,但是並不安裝此模塊。
舉例
假設有一個擴展Apache功能的模塊mod_foo.c
,使用下列命令,可以將C源程序編譯爲共享模塊,以在運行時加載到Apache服務器中:
$ apxs -c mod_foo.c /path/to/libtool --mode=compile gcc ... -c mod_foo.c /path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
然後,必須修改Apache的配置,以確保有一個LoadModule
指令來加載此共享對象。爲了簡化這一步驟,apxs
可以自動進行該操作,以安裝此共享對象到"modules"目錄,並更新httpd.conf
文件,命令如下:
$ apxs -i -a mod_foo.la /path/to/instdso.sh mod_foo.la /path/to/apache/modules /path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules ... chmod 755 /path/to/apache/modules/mod_foo.so [activating module 'foo' in /path/to/apache/conf/httpd.conf] $ _
如果配置文件中尚不存在,會增加下列的行:
LoadModule foo_module modules/mod_foo.so
如果你希望默認禁用此模塊,可以使用 -A
選項,即:
$ apxs -i -A mod_foo.c
要快速測試apxs機制,可以建立一個Apache模塊樣板及其對應的Makefile :
$ apxs -g -n foo Creating [DIR] foo Creating [FILE] foo/Makefile Creating [FILE] foo/modules.mk Creating [FILE] foo/mod_foo.c Creating [FILE] foo/.deps $ _
然後,立即可以編譯此樣板模塊爲共享對象並加載到Apache服務器中:
$ cd foo $ make all reload apxs -c mod_foo.c /path/to/libtool --mode=compile gcc ... -c mod_foo.c /path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo apxs -i -a -n "foo" mod_foo.la /path/to/instdso.sh mod_foo.la /path/to/apache/modules /path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules ... chmod 755 /path/to/apache/modules/mod_foo.so [activating module 'foo' in /path/to/apache/conf/httpd.conf] apachectl restart /path/to/apache/sbin/apachectl restart: httpd not running, trying to start [Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module /path/to/apache/sbin/apachectl restart: httpd started $ _
原文地址http://man.chinaunix.net/newsoft/ApacheMenual_CN_2.2new/programs/apxs.html