內容

名稱

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 選項。

選項

-A, --omit-autoload

省略所有自動載入設施。這與 -c 相同,但也會從 .pm 檔案中移除 use AutoLoader 陳述式。

-B, --beta-version

使用 alpha/beta 樣式的版本號碼。除非指定 -v,否則會導致版本號碼為「0.00_01」。

-C, --omit-changes

省略建立 Changes 檔案,並將 HISTORY 區段新增到 POD 範本。

-F, --cpp-flags=addflags

在掃描標頭以尋找函式宣告時,要指定給 C 預處理器的其他旗標。也會在產生的 Makefile.PL 中寫入這些選項。

-M, --func-mask=regular expression

選取要處理的函式/巨集。

-O, --overwrite-ok

允許覆寫現有的擴充目錄。

-P, --omit-pod

省略自動產生的 stub POD 區段。

-X, --omit-XS

省略 XS 部分。用於產生純 Perl 模組的架構。會隱含啟用 -c-f

-a, --gen-accessors

針對結構和聯合的每個元素產生存取方法。產生的方法以元素名稱命名;如果在沒有其他引數的情況下呼叫,將傳回元素的目前值;如果使用其他引數呼叫,將設定元素為提供的值(並傳回新值)。嵌入的結構和聯合會傳回指標,而不是完整的結構,以利於連鎖呼叫。

這些方法都適用於結構的 Ptr 類型;此外,也會為結構類型本身建構兩個方法,_to_ptr 會傳回指向相同結構的 Ptr 類型,以及一個 new 方法來建構並傳回新的結構,初始化為零。

-b, --compat-version=version

產生與指定的 Perl 版本向後相容的 .pm 檔案。

對於版本 < 5.6.0,變更如下。- 不使用「our」(改用「use vars」)- 不使用「use warnings」

指定與您用於執行 h2xs 的 Perl 版本更高的相容版本,不會有任何影響。如果未指定,h2xs 會預設與您用於執行 h2xs 的 Perl 版本相容。

-c, --omit-constant

從 .xs 檔案中省略 constant(),並從 .pm 檔案中省略對應的特殊化 AUTOLOAD

-d, --debugging

開啟偵錯訊息。

-e, --omit-enums=[正規表示法]

如果未提供 正規表示法,則跳過在 C 列舉中定義的所有常數。否則,僅跳過在名稱符合 正規表示法 的列舉中定義的常數。

由於 正規表示法 是選用的,因此,如果您省略 正規表示法 並有一些待處理參數(例如標頭檔案名稱),請確保此開關後至少接續另一個開關。這是可以的

h2xs -e -n Module::Foo foo.h

這是不可行的

h2xs -n Module::Foo -e foo.h

在後者中,foo.h 被視為 正規表示法

-f, --force

允許為標頭建立擴充功能,即使該標頭未在標準包含目錄中找到。

-g, --global

包含用於安全儲存 .xs 檔案中靜態資料的程式碼。不使用靜態資料的擴充功能可以忽略此選項。

-h, -?, --help

列印此 h2xs 的用法、說明和版本,然後結束。

-k, --omit-const-func

對於宣告為 const 的函式參數,在產生的 XS 程式碼中省略 const 屬性。

-m, --gen-tied-var

實驗性:對於標頭檔案中宣告的每個變數,宣告一個神奇地繫結到 C 變數的相同名稱的 Perl 變數。

-n, --name=模組名稱

指定要使用的擴充功能名稱,例如,-n RPC::DCE

-o, --opaque-re=正規表示法

對與正規表示法相符的 C 類型使用「不透明」資料類型,即使這些類型與類型對應中的類型 typedef 相等。不應在沒有 -x 的情況下使用。

這可能會很有用,因為,例如,與整數等效的 typedef 類型可能表示與作業系統相關的控制代碼,而且人們可能想要以物件導向的方式處理這些控制代碼,例如在 $handle->do_something() 中。如果您想要將所有 typedef 類型視為不透明類型處理,請使用 -o .

要比對的類型會被洗白(逗號除外,逗號前面沒有空白,而多個 * 之間沒有空白)。

-p, --remove-prefix=prefix

指定應從 Perl 函數名稱中移除的前綴,例如,-p sec_rgy_。這會設定 XS PREFIX 關鍵字,並從透過 constant() 機制自動載入的函數中移除前綴。

-s, --const-subs=sub1,sub2

為指定的巨集建立 Perl 子常式,而不是透過 constant() 子常式自動載入。假設這些巨集的回傳類型為 char *,例如,-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid

-t, --default-type=type

指定 constant() 機制用於巨集的內部類型。預設值為 IV(有號整數)。目前,在標頭掃描程序中找到的所有巨集都假設具有此類型。h2xs 的未來版本可能會具備做出明智猜測的能力。

--use-new-tests

如果存在 --compat-version (-b),則產生的測試將使用 Test::More,而不是 5.6.2 之前版本的預設值 TestTest::More 會新增到產生的 Makefile.PL 中的 PREREQ_PM。

--use-old-tests

將強制產生使用較舊的 Test 模組的測試程式碼。

--skip-exporter

不要使用 Exporter 和/或匯出任何符號。

--skip-ppport

不要使用 Devel::PPPort:不具備與較舊版本的相容性。

--skip-autoloader

不要使用模組 AutoLoader;但保留 constant() 函數和 sub AUTOLOAD 以供常數使用。

--skip-strict

勿使用 pragma strict

--skip-warnings

勿使用 pragma warnings

-v, --version=version

為此擴充功能指定版本號碼。此版本號碼會加入範本。預設為 0.01,或在指定 -B 時為 0.00_01。指定的版本應為數字。

-x, --autogen-xsubs

根據標頭檔中的函式宣告自動產生 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

基於 .h.c 檔案的擴充功能

假設您有一些 C 檔案實作某些功能,以及對應的標頭檔。如何建立一個擴充功能,讓 Perl 中可以使用此功能?以下範例假設標頭檔為 interface_simple.hinterface_hairy.h,而且您希望 Perl 模組命名為 Ext::Ension。如果您需要一些預處理器指令和/或與外部函式庫連結,請參閱 "選項" 中的旗標 -F-L-l

尋找目錄名稱

從 h2xs 的虛擬執行開始

h2xs -Afn Ext::Ension

此步驟的唯一目的是建立所需的目錄,並讓您知道這些目錄的名稱。從輸出中,您可以看到擴充功能的目錄為 Ext/Ension

複製 C 檔案

將您的標頭檔和 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 和其他人

另請參閱

perlperlxstutExtUtils::MakeMakerAutoLoader

診斷

如果無法讀取或寫入相關檔案,則會顯示一般警告。

-x 的限制

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

請參閱 perlxsperlxstut 以取得更多詳細資料。