apxs編譯安裝模塊


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源程序。

top

語法

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參數可以是下列一個或多個字符串:CCCFLAGSCFLAGS_SHLIBINCLUDEDIRLD_SHLIBLDFLAGS_SHLIBLIBEXECDIRLIBS_SHLIBSBINDIR,SYSCONFDIRTARGET 。

    這個參數用於手動查詢某些設置。比如,要手動處理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文件,但是並不安裝此模塊。

top

舉例

假設有一個擴展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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章