h2xs - 將 .h C 標頭檔轉換為 Perl 擴充功能
h2xs [選項 ...] [標頭檔 ... [額外函式庫]]
h2xs -h|-?|--help
h2xs 從 C 標頭檔建置 Perl 擴充功能。擴充功能將包含可供用來擷取 C 標頭檔中任何 #define 陳述式值的函式。
module_name 將用於擴充功能的名稱。如果未提供 module_name,則會使用第一個標頭檔的名稱,並將第一個字元大寫。
如果擴充功能可能需要額外的函式庫,則應在此處包含這些函式庫。擴充功能 Makefile.PL 將負責檢查函式庫是否實際存在,以及應如何載入這些函式庫。額外的函式庫應以 -lm -lposix 等形式指定,就像在 cc 命令列中一樣。預設情況下,Makefile.PL 將搜尋由 Configure 確定的函式庫路徑。該路徑可透過在額外函式庫引數中包含 -L/另一個/函式庫/路徑 形式的引數來擴充。
儘管名稱如此,h2xs 也可用於建立純 Perl 模組的雛形。請參閱 -X 選項。
省略所有自動載入設施。這與 -c 相同,但也會從 .pm 檔案中移除 use AutoLoader
陳述式。
使用 alpha/beta 樣式的版本號碼。除非指定 -v,否則會導致版本號碼為「0.00_01」。
省略建立 Changes 檔案,並將 HISTORY 區段新增到 POD 範本。
在掃描標頭以尋找函式宣告時,要指定給 C 預處理器的其他旗標。也會在產生的 Makefile.PL 中寫入這些選項。
選取要處理的函式/巨集。
允許覆寫現有的擴充目錄。
省略自動產生的 stub POD 區段。
省略 XS 部分。用於產生純 Perl 模組的架構。會隱含啟用 -c
和 -f
。
針對結構和聯合的每個元素產生存取方法。產生的方法以元素名稱命名;如果在沒有其他引數的情況下呼叫,將傳回元素的目前值;如果使用其他引數呼叫,將設定元素為提供的值(並傳回新值)。嵌入的結構和聯合會傳回指標,而不是完整的結構,以利於連鎖呼叫。
這些方法都適用於結構的 Ptr 類型;此外,也會為結構類型本身建構兩個方法,_to_ptr
會傳回指向相同結構的 Ptr 類型,以及一個 new
方法來建構並傳回新的結構,初始化為零。
產生與指定的 Perl 版本向後相容的 .pm 檔案。
對於版本 < 5.6.0,變更如下。- 不使用「our」(改用「use vars」)- 不使用「use warnings」
指定與您用於執行 h2xs 的 Perl 版本更高的相容版本,不會有任何影響。如果未指定,h2xs 會預設與您用於執行 h2xs 的 Perl 版本相容。
從 .xs 檔案中省略 constant()
,並從 .pm 檔案中省略對應的特殊化 AUTOLOAD
。
開啟偵錯訊息。
如果未提供 正規表示法,則跳過在 C 列舉中定義的所有常數。否則,僅跳過在名稱符合 正規表示法 的列舉中定義的常數。
由於 正規表示法 是選用的,因此,如果您省略 正規表示法 並有一些待處理參數(例如標頭檔案名稱),請確保此開關後至少接續另一個開關。這是可以的
h2xs -e -n Module::Foo foo.h
這是不可行的
h2xs -n Module::Foo -e foo.h
在後者中,foo.h 被視為 正規表示法。
允許為標頭建立擴充功能,即使該標頭未在標準包含目錄中找到。
包含用於安全儲存 .xs 檔案中靜態資料的程式碼。不使用靜態資料的擴充功能可以忽略此選項。
列印此 h2xs 的用法、說明和版本,然後結束。
對於宣告為 const
的函式參數,在產生的 XS 程式碼中省略 const 屬性。
實驗性:對於標頭檔案中宣告的每個變數,宣告一個神奇地繫結到 C 變數的相同名稱的 Perl 變數。
指定要使用的擴充功能名稱,例如,-n RPC::DCE
對與正規表示法相符的 C 類型使用「不透明」資料類型,即使這些類型與類型對應中的類型 typedef
相等。不應在沒有 -x 的情況下使用。
這可能會很有用,因為,例如,與整數等效的 typedef
類型可能表示與作業系統相關的控制代碼,而且人們可能想要以物件導向的方式處理這些控制代碼,例如在 $handle->do_something()
中。如果您想要將所有 typedef
類型視為不透明類型處理,請使用 -o .
。
要比對的類型會被洗白(逗號除外,逗號前面沒有空白,而多個 *
之間沒有空白)。
指定應從 Perl 函數名稱中移除的前綴,例如,-p sec_rgy_。這會設定 XS PREFIX 關鍵字,並從透過 constant()
機制自動載入的函數中移除前綴。
為指定的巨集建立 Perl 子常式,而不是透過 constant() 子常式自動載入。假設這些巨集的回傳類型為 char *,例如,-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid。
指定 constant() 機制用於巨集的內部類型。預設值為 IV(有號整數)。目前,在標頭掃描程序中找到的所有巨集都假設具有此類型。h2xs
的未來版本可能會具備做出明智猜測的能力。
如果存在 --compat-version (-b),則產生的測試將使用 Test::More
,而不是 5.6.2 之前版本的預設值 Test
。Test::More
會新增到產生的 Makefile.PL
中的 PREREQ_PM。
將強制產生使用較舊的 Test
模組的測試程式碼。
不要使用 Exporter
和/或匯出任何符號。
不要使用 Devel::PPPort
:不具備與較舊版本的相容性。
不要使用模組 AutoLoader
;但保留 constant() 函數和 sub AUTOLOAD
以供常數使用。
勿使用 pragma strict
。
勿使用 pragma warnings
。
為此擴充功能指定版本號碼。此版本號碼會加入範本。預設為 0.01,或在指定 -B
時為 0.00_01。指定的版本應為數字。
根據標頭檔中的函式宣告自動產生 XSUB。應安裝套件 C::Scan
。如果指定此選項,標頭檔名稱可能會類似於 NAME1,NAME2
。在此情況下,會使用 NAME1 取代指定的字串,但僅會針對從檔案 NAME2 中包含的宣告發射 XSUB。
請注意,某些函式的引數/傳回值類型可能會導致 XSUB 宣告/類型對應表項目需要手動編輯。例如無法從指標轉換為指標的物件 (例如 long long
)、函式指標或陣列。另請參閱 "-x 的限制事項" 一節。
# Default behavior, extension is Rusers
h2xs rpcsvc/rusers
# Same, but extension is RUSERS
h2xs -n RUSERS rpcsvc/rusers
# Extension is rpcsvc::rusers. Still finds <rpcsvc/rusers.h>
h2xs rpcsvc::rusers
# Extension is ONC::RPC. Still finds <rpcsvc/rusers.h>
h2xs -n ONC::RPC rpcsvc/rusers
# Without constant() or AUTOLOAD
h2xs -c rpcsvc/rusers
# Creates templates for an extension named RPC
h2xs -cfn RPC
# Extension is ONC::RPC.
h2xs -cfn ONC::RPC
# Extension is a pure Perl module with no XS code.
h2xs -X My::Module
# Extension is Lib::Foo which works at least with Perl5.005_03.
# Constants are created for all #defines and enums h2xs can find
# in foo.h.
h2xs -b 5.5.3 -n Lib::Foo foo.h
# Extension is Lib::Foo which works at least with Perl5.005_03.
# Constants are created for all #defines but only for enums
# whose names do not start with 'bar_'.
h2xs -b 5.5.3 -e '^bar_' -n Lib::Foo foo.h
# Makefile.PL will look for library -lrpc in
# additional directory /opt/net/lib
h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
# Extension is DCE::rgynbase
# prefix "sec_rgy_" is dropped from perl function names
h2xs -n DCE::rgynbase -p sec_rgy_ dce/rgynbase
# Extension is DCE::rgynbase
# prefix "sec_rgy_" is dropped from perl function names
# subroutines are created for sec_rgy_wildcard_name and
# sec_rgy_wildcard_sid
h2xs -n DCE::rgynbase -p sec_rgy_ \
-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid dce/rgynbase
# Make XS without defines in perl.h, but with function declarations
# visible from perl.h. Name of the extension is perl1.
# When scanning perl.h, define -DEXT=extern -DdEXT= -DINIT(x)=
# Extra backslashes below because the string is passed to shell.
# Note that a directory with perl header files would
# be added automatically to include path.
h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h
# Same with function declaration in proto.h as visible from perl.h.
h2xs -xAn perl2 perl.h,proto.h
# Same but select only functions which match /^av_/
h2xs -M '^av_' -xAn perl2 perl.h,proto.h
# Same but treat SV* etc as "opaque" types
h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h
假設您有一些 C 檔案實作某些功能,以及對應的標頭檔。如何建立一個擴充功能,讓 Perl 中可以使用此功能?以下範例假設標頭檔為 interface_simple.h 和 interface_hairy.h,而且您希望 Perl 模組命名為 Ext::Ension
。如果您需要一些預處理器指令和/或與外部函式庫連結,請參閱 "選項" 中的旗標 -F
、-L
和 -l
。
從 h2xs 的虛擬執行開始
h2xs -Afn Ext::Ension
此步驟的唯一目的是建立所需的目錄,並讓您知道這些目錄的名稱。從輸出中,您可以看到擴充功能的目錄為 Ext/Ension。
將您的標頭檔和 C 檔案複製到此目錄 Ext/Ension。
執行 h2xs,覆寫舊的自動產生檔案
h2xs -Oxan Ext::Ension interface_simple.h interface_hairy.h
h2xs 會在切換至擴充目錄之後尋找標頭檔,因此它會順利找到標頭檔。
照常執行
cd Ext/Ension
perl Makefile.PL
make dist
make
make test
盡早執行 make dist
非常重要。如此一來,如果你決定編輯 .h
檔並重新執行 h2xs,便可以輕鬆合併(1)對自動產生檔案的變更。
別忘了編輯已產生 .pm 檔中的文件。
僅將自動產生檔案視為結構,你可以發明比 h2xs 所猜測的更好的介面。
僅將本節視為指南,h2xs 的其他選項可能更適合你的需求。
未使用的環境變數。
Larry Wall 和其他人
perl、perlxstut、ExtUtils::MakeMaker 和 AutoLoader。
如果無法讀取或寫入相關檔案,則會顯示一般警告。
h2xs 無法區分 C 函式的引數類型為 int *
的輸入、輸出或輸入/輸出參數。特別是,下列形式的引數宣告
int
foo(n)
int *n
應改寫成
int
foo(n)
int &n
(如果 n
是輸入參數)。
此外,h2xs 沒有辦法直覺地得知函式
int
foo(addr,l)
char *addr
int l
會取得位址和此位址資料長度的配對,因此最好將此函式改寫成
int
foo(sv)
SV *addr
PREINIT:
STRLEN len;
char *s;
CODE:
s = SvPV(sv,len);
RETVAL = foo(s, len);
OUTPUT:
RETVAL
或改寫成
static int
my_foo(SV *sv)
{
STRLEN len;
char *s = SvPV(sv,len);
return foo(s, len);
}
MODULE = foo PACKAGE = foo PREFIX = my_
int
foo(sv)
SV *sv