目錄

名稱

ExtUtils::MakeMaker - 建立模組 Makefile

用法

use ExtUtils::MakeMaker;

WriteMakefile(
    NAME              => "Foo::Bar",
    VERSION_FROM      => "lib/Foo/Bar.pm",
);

描述

此工具設計用於從 Makefile.PL 為擴充模組編寫 Makefile。它基於由Andy Dougherty和perl5-porters提供的 Makefile.SH 模型。

它將生成 Makefile 的任務拆分為幾個子程序,這些子程序可以分別覆寫。每個子程序都返回它希望寫入 Makefile 的文本。

由於有各種使用不相容語法的Make程式,它們使用操作系統殼層,同樣有不相容的語法,因此對於這個模組的使用者來說,知道Makefile是為哪種Make程式撰寫的至關重要,這樣他們就可以使用正確的Make程式,而不必面對因使用錯誤的Make程式而導致的可能令人困惑的錯誤。

在POSIX系統上,該程式可能是GNU Make;在Microsoft Windows上,它將是Microsoft NMake、DMake或GNU Make。詳細資訊請參閱有關"MAKE"參數的部分。

ExtUtils::MakeMaker(EUMM)是面向對象的。當前目錄下的每個包含Makefile.PL的目錄都被視為一個單獨的對象。這使得可以通過單次調用WriteMakefile()來撰寫無限數量的Makefile。

WriteMakefile的所有輸入都是Unicode字符,而不僅僅是八位元組。EUMM試圖正確處理所有這些。目前仍然無法在模組名中使用Unicode字符,因為這需要Perl處理Unicode檔案名,而這在Windows上尚未實現。

詳細設計和使用說明請參閱ExtUtils::MakeMaker::FAQ

如何編寫Makefile.PL

請參閱ExtUtils::MakeMaker::Tutorial

長答案是手冊的其餘部分 :-)

預設Makefile行為

生成的Makefile使擴展的使用者能夠調用

perl Makefile.PL # optionally "perl Makefile.PL verbose"
make
make test        # optionally set TEST_VERBOSE=1
make install     # See below

要製作的Makefile可能會通過添加形式為KEY=VALUE的參數進行更改。例如:

perl Makefile.PL INSTALL_BASE=~

在生成的Makefile中的其他有趣的目標包括

make config     # to check if the Makefile is up-to-date
make clean      # delete local temp files (Makefile gets renamed)
make realclean  # delete derived files (including ./blib)
make ci         # check in all the files in the MANIFEST file
make dist       # see below the Distribution Support section

make test

MakeMaker會檢查當前目錄中是否存在名為test.pl的檔案,如果存在,它將使用正確的perl -I選項執行該腳本。

MakeMaker還會檢查是否存在與glob("t/*.t")匹配的檔案。它將通過Test::Harness模組以正確設置-I開關的方式按字母順序執行所有匹配的檔案。

您還可以在t/目錄中的子目錄中組織您的測試。要這樣做,請在您的Makefile.PL中使用test指令。例如,如果您的測試位於

t/foo
t/foo/bar

您可以使用以下指令告訴make在這兩個目錄中運行測試

test => {TESTS => 't/*/*.t t/*/*/*.t'}
test => {TESTS => 't/foo/*.t t/foo/bar/*.t'}

第一個指令將在所有一級子目錄和它們包含的所有子目錄中運行所有測試檔案。第二個將僅在t/foot/foo/bar中運行測試。

如果您想查看測試的原始輸出,請將TEST_VERBOSE變量設置為true。

make test TEST_VERBOSE=1

如果您想要運行特定的測試檔案,請設置 TEST_FILES 變數。可以使用通配符與此機制。

make test TEST_FILES='t/foobar.t t/dagobah*.t'

使用 nmake 的 Windows 使用者應注意,由於 nmake 中的一個錯誤,當指定 TEST_FILES 時,必須使用反斜線而不是斜杠。

nmake test TEST_FILES='t\foobar.t t\dagobah*.t'

make testdb

上述的一個有用變體是目標 testdb。它在 Perl 調試器下運行測試(參見 perldebug)。如果當前目錄中存在文件 test.pl,則將其用於測試。

如果您想要調試其他測試檔案,請設置 TEST_FILE 變數。

make testdb TEST_FILE=t/mytest.t

默認情況下,調試器使用 -d 選項來調用 perl。如果您想指定其他選項,請設置 TESTDB_SW 變數。

make testdb TESTDB_SW=-Dx

make install

僅使用 make 將所有相關文件放入由宏 INST_LIB、INST_ARCHLIB、INST_SCRIPT、INST_MAN1DIR 和 INST_MAN3DIR 命名的目錄中。如果您 在 perl 源目錄下進行構建,則所有這些都默認為 ./blib 下的某些內容。如果您在 perl 源下進行構建,INST_LIB 和 INST_ARCHLIB 默認為 ../../lib,並且未定義 INST_SCRIPT。

生成的 Makefile 的 install 目標將在每個 INST_* 目錄下找到的文件複製到其 INSTALL* 對應目錄中。所選擇的對應目錄取決於 INSTALLDIRS 的設置,根據以下表格:

                               INSTALLDIRS set to
                         perl        site          vendor

               PERLPREFIX      SITEPREFIX          VENDORPREFIX
INST_ARCHLIB   INSTALLARCHLIB  INSTALLSITEARCH     INSTALLVENDORARCH
INST_LIB       INSTALLPRIVLIB  INSTALLSITELIB      INSTALLVENDORLIB
INST_BIN       INSTALLBIN      INSTALLSITEBIN      INSTALLVENDORBIN
INST_SCRIPT    INSTALLSCRIPT   INSTALLSITESCRIPT   INSTALLVENDORSCRIPT
INST_MAN1DIR   INSTALLMAN1DIR  INSTALLSITEMAN1DIR  INSTALLVENDORMAN1DIR
INST_MAN3DIR   INSTALLMAN3DIR  INSTALLSITEMAN3DIR  INSTALLVENDORMAN3DIR

INSTALL... 宏又默認為其 %Config($Config{installprivlib}、$Config{installarchlib} 等)對應目錄。

您可以使用以下命令在系統上檢查這些變數的值

perl '-V:install.*'

要檢查 perl 搜索庫目錄的順序,請運行

perl -le 'print join $/, @INC'

有時,您安裝的模塊的舊版本位於 @INC 中的其他目錄中。由於 Perl 加載找到的第一個版本的模塊,而不是最新版本,即使安裝了全新版本,您可能還是會意外獲得這些舊版本之一。要刪除您安裝的模塊的所有其他版本(而不僅僅是舊版本),請設置 UNINST 變數。

make install UNINST=1

INSTALL_BASE

可以將 INSTALL_BASE 傳遞給 Makefile.PL 以更改模塊的安裝位置。INSTALL_BASE 更像是其他人稱之為 "前綴" 的東西,而不是 PREFIX。

要將所有內容安裝在您的家目錄中,請按照以下步驟進行。

# Unix users, INSTALL_BASE=~ works fine
perl Makefile.PL INSTALL_BASE=/path/to/your/home/dir

像 PREFIX 一樣,它一次設置了幾個 INSTALL* 屬性。與 PREFIX 不同的是,很容易預測模組會被安裝到哪裡。安裝模式如下:

INSTALLARCHLIB     INSTALL_BASE/lib/perl5/$Config{archname}
INSTALLPRIVLIB     INSTALL_BASE/lib/perl5
INSTALLBIN         INSTALL_BASE/bin
INSTALLSCRIPT      INSTALL_BASE/bin
INSTALLMAN1DIR     INSTALL_BASE/man/man1
INSTALLMAN3DIR     INSTALL_BASE/man/man3

在 MakeMaker 中是 INSTALL_BASE,在 Module::Build 中是 --install_base(截至 0.28 版本),都安裝到相同的位置。如果希望 MakeMaker 和 Module::Build 安裝到相同的位置,只需將 INSTALL_BASE 和 --install_base 設置為相同的位置即可。

INSTALL_BASE 在 6.31 版本中添加。

PREFIX 和 LIB 屬性

PREFIX 和 LIB 可以一次設置多個 INSTALL* 屬性。以下是將模組安裝到您的家目錄的示例。

# Unix users, PREFIX=~ works fine
perl Makefile.PL PREFIX=/path/to/your/home/dir

這將把所有文件安裝到您的家目錄下的模組中,man 頁面和庫文件放置在適當的位置(通常是 ~/man 和 ~/lib)。確定確切位置的方式很復雜,取決於您的 Perl 配置方式。INSTALL_BASE 更像是其他構建系統所稱的 "prefix",而不是 PREFIX,我們建議您使用它。

另一種指定多個 INSTALL 目錄的方法是 LIB。

perl Makefile.PL LIB=~/lib

這將把模組的與架構無關的文件安裝到 ~/lib,與架構有關的文件安裝到 ~/lib/$archname。

請注意,在這兩種情況下,波浪符展開是由 MakeMaker 執行的,不是默認由 Perl 或 make 執行的。

LIB、PREFIX 和各種 INSTALL* 參數之間的衝突將被解析為:

如果用戶具有超級用戶特權,並且不是在 AFS 或相關系統上工作,那麼 INSTALLPRIVLIB、INSTALLARCHLIB、INSTALLSCRIPT 等的默認值將是適當的,並且這個咒語將是最好的

perl Makefile.PL;
make;
make test
make install

make install 默認會將已完成的操作寫入文件 $(INSTALLARCHLIB)/perllocal.pod 中的一些文檔。可以通過調用 make pure_install 繞過此功能。

AFS 用戶

必須指定安裝目錄,因為自從 perl 安裝以來,這些目錄很可能已經更改。他們將不得不通過調用以下命令來執行此操作

perl Makefile.PL INSTALLSITELIB=/afs/here/today \
    INSTALLSCRIPT=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
make

每次重新編譯擴展時都要小心重複此過程,除非您確定 AFS 安裝目錄仍然有效。

新 Perl 二進制文件的靜態鏈接

使用上述步驟構建的擴展已經準備好在支持動態加載的系統上使用。在不支持動態加載的系統上,任何新創建的擴展都必須與可用資源一起鏈接。MakeMaker 通過在構建擴展時在 Makefile 中創建適當的目標來支持鏈接過程。您可以通過以下方式調用 makefile 的相應部分

make perl

這將在當前目錄中生成一個新的 perl 二進制文件,其中包含在 INST_ARCHLIB、SITELIBEXP 和 PERL_ARCHLIB 中可以找到的所有已連接的擴展。為此,MakeMaker 寫入一個新的 Makefile,在 UNIX 上,這個檔案被稱為 Makefile.aperl(可能與系統有關)。如果您想強制創建一個新的 perl,建議您刪除此 Makefile.aperl,以便再次搜索目錄以尋找可連接的庫。

二進制文件可以安裝到您機器上正常所在的 perl 目錄中

make inst_perl

要生成具有不同名稱的 perl 二進制文件,可以說

perl Makefile.PL MAP_TARGET=myperl
make myperl
make inst_perl

或說

perl Makefile.PL
make myperl MAP_TARGET=myperl
make inst_perl MAP_TARGET=myperl

無論哪種情況,您將收到 inst_perl 目標的正確調用提示,該目標將新的二進制文件安裝到 INSTALLBIN 中。

make inst_perl 默認會將已執行的操作的一些文檔寫入文件 $(INSTALLARCHLIB)/perllocal.pod。可以通過調用 make pure_inst_perl 來繞過這一點。

警告:inst_perl:目標很可能會覆蓋您現有的 perl 二進制文件。請謹慎使用!

有時,您可能希望建立一個靜態鏈接的 perl,即使您的系統支持動態加載。在這種情況下,您可以通過調用 Makefile.PL 或 make 來明確設置 linktype

perl Makefile.PL LINKTYPE=static    # recommended

make LINKTYPE=static                # works on most systems

Perl 库和安裝位置的確定

MakeMaker 需要知道,或者猜測,某些東西的位置。特別是 INST_LIB 和 INST_ARCHLIB(在執行 make(1) 過程中放置文件的位置)、PERL_LIB 和 PERL_ARCHLIB(從中讀取現有模塊的位置)以及 PERL_INC(頭文件和 libperl*.*)。

擴展可以使用 perl 源目錄樹中的內容構建,也可以使用已安裝的 perl 库構建。建議的方式是在對 perl 本身運行 'make install' 後構建擴展。您可以在任何不在 perl 源樹下的硬盤目錄中執行此操作。對於 perl 發行版的 ext 目錄下的擴展,只有標準擴展才能支持。

如果正在 perl 源代碼的 ext/ 目錄下構建擴展,則 MakeMaker 將自動設置 PERL_SRC(例如,../..)。如果定義了 PERL_SRC 且該擴展被識別為標準擴展,則其他變量默認為以下值

PERL_INC     = PERL_SRC
PERL_LIB     = PERL_SRC/lib
PERL_ARCHLIB = PERL_SRC/lib
INST_LIB     = PERL_LIB
INST_ARCHLIB = PERL_ARCHLIB

如果正在建立一個與perl源碼分離的擴展,則MakeMaker會將PERL_SRC設置為未定義,並默認使用已安裝的perl庫的副本。其他變量默認為以下值

PERL_INC     = $archlibexp/CORE
PERL_LIB     = $privlibexp
PERL_ARCHLIB = $archlibexp
INST_LIB     = ./blib/lib
INST_ARCHLIB = ./blib/arch

如果perl尚未安裝,則可以像前一節中所示,在命令行上定義PERL_SRC。

哪個架構相關的目錄?

如果您不想保留INSTALL*宏的默認值,MakeMaker可以幫助您最小化所需的輸入:在perl編譯時,INSTALLPRIVLIB和INSTALLARCHLIB之間的通常關係由Configure確定。 MakeMaker支持設置INSTALLPRIVLIB的用戶。如果設置了INSTALLPRIVLIB,但未設置INSTALLARCHLIB,則MakeMaker將後者默認為Configure在%Config中的對應項決定的INSTALLPRIVLIB的同一個子目錄,否則默認為INSTALLPRIVLIB。對於INSTALLSITELIB和INSTALLSITEARCH也適用相同的關係。

MakeMaker為您提供了比需要更多的自由來配置內部變量並獲得不同的結果。值得一提的是,make(1)還允許您配置用於Makefile的大多數變量。但在大多數情況下,這是不必要的,只有在包的作者建議這樣做(或者您知道自己在做什麼)時才應該這樣做。

使用屬性和參數

以下屬性可以作為WriteMakefile()的參數或作為命令行上的NAME=VALUE對指定。使用後來版本的MakeMaker提供的屬性已在文中標示。

為了保持與舊版本的MakeMaker的屬性的可移植性,您可能希望在您的Makefile.PL中使用App::EUMM::Upgrade

摘要

模塊的一行描述。將包含在PPD文件中。

從摘要中獲取

包含包描述的文件名。MakeMaker尋找POD中匹配/^($package\s-\s)(.*)/的行。這通常是“=head1 NAME”部分中的第一行。$2成為摘要。

作者

包含包作者(和電子郵件地址)的字符串數組。用於CPAN元文件(META.yml或META.json)和PPD(Perl包描述)文件,用於PPM(Perl包管理器)。

BINARY_LOCATION

在建立二進制套件的 PPD 檔案時使用。可以設置為特定架構的完整或相對路徑或 URL,指向特定架構的二進制存檔。例如:

perl Makefile.PL BINARY_LOCATION=x86/Agent.tar.gz

建立一個參考 x86 目錄中的 Agent 套件二進制檔案的 PPD 套件。

BUILD_REQUIRES

自版本 6.55_03 及以上可用。

需要用於建立模組但不用於執行的模組哈希。

將會放置在您的 META.ymlbuild_requires 欄位以及您的 META.jsonprereqs 欄位的 build 中。

如果未指定此屬性,預設值為 { "ExtUtils::MakeMaker" => 0 }

格式與 PREREQ_PM 相同。

C

參考 *.c 檔案名稱的陣列。從目錄掃描和 XS 屬性哈希的值部分初始化。目前 MakeMaker 沒有使用此功能,但在 Makefile.PL 中可能很方便。

CCFLAGS

將包含在編譯器調用命令行中的字串,位於 INC 和 OPTIMIZE 之間的引數之間。請注意,設置此值將覆蓋其默認值($Config::Config{ccflags});為了保留默認值,直接包含默認值,例如:

CCFLAGS => "$Config::Config{ccflags} ..."
CONFIG

Arrayref。例如 [qw(archname manext)] 定義 ARCHNAME 和 MANEXT 從 config.sh。MakeMaker 將在 CONFIG 中自動添加以下值:ar cc cccdlflags ccdlflags cpprun dlext dlsrc ld lddlflags ldflags libc lib_ext obj_ext ranlib sitelibexp sitearchexp so

CONFIGURE

代碼引用。該子程序應該返回一個哈希引用。哈希可以包含進一步的屬性,例如 {LIBS => ...},必須由某種評估方法確定。

CONFIGURE_REQUIRES

自版本 6.52 及以上可用。

需要用於運行 Makefile.PL 本身但不用於運行您的分發的模組哈希。

將會放置在您的 META.ymlconfigure_requires 欄位以及您的 META.jsonprereqs 欄位的 configure 中。

如果未指定此屬性,預設值為 { "ExtUtils::MakeMaker" => 0 }

格式與 PREREQ_PM 相同。

DEFINE

類似於 "-DHAVE_UNISTD_H"

DESTDIR

這是程式碼將被安裝的根目錄。它會將自己加到正常前綴之前。例如,如果您的程式碼通常會放在/usr/local/lib/perl,您可以設置 DESTDIR=~/tmp/,安裝將會放在~/tmp/usr/local/lib/perl

這主要適用於重新打包 Perl 模組的人。

注意:由於 make 的性質,將 DESTDIR 放在您的 DESTDIR 後面是很重要的。 ~/tmp/ 而不是 ~/tmp

DIR

參考包含 Makefile.PL 的子目錄數組,例如 ext/SDBM_File 中的 ['sdbm']

DISTNAME

套件的安全檔案名稱。

預設為下面的 NAME,但將 :: 替換為 -。

例如,Foo::Bar 變成 Foo-Bar。

DISTVNAME

您用於發布包含版本號的套件的名稱。這是由 'make dist' 使用來命名結果存檔檔案。

預設為 DISTNAME-VERSION。

例如,Foo::Bar 的版本 1.04 變成 Foo-Bar-1.04。

在一些 OS 中,. 具有特殊意義,此時可以使用 VERSION_SYM 代替 VERSION。

DLEXT

指定模組可載入物件的擴展。例如

DLEXT => 'unusual_ext', # Default value is $Config{so}

注意:當使用此選項來修改模組可載入物件的擴展時,必須還指定模組的 pm 檔案中相同的更改

local $DynaLoader::dl_dlext = 'unusual_ext';
DL_FUNCS

符號名稱的哈希參考,用於將例程作為通用符號提供。每個鍵/值對由套件名稱和該套件中的例程名稱數組組成。目前僅在 AIX、OS/2、VMS 和 Win32 中使用。提供的例程名稱將像 XSUB 名稱一樣由 XS() 宏擴展。預設為

{"$(NAME)" => ["boot_$(NAME)" ] }

例如

{"RPC" => [qw( boot_rpcb rpcb_gettime getnetconfigent )],
 "NetconfigPtr" => [ 'DESTROY'] }

有關 DL_FUNCS、DL_VARS 和 FUNCLIST 屬性的更多信息,請參閱ExtUtils::Mksymlists 文件。

DL_VARS

要作為通用符號提供的變數名稱的陣列。目前僅在 AIX、OS/2、VMS 和 Win32 中使用。預設為 []。 (例如 [ qw(Foo_version Foo_numstreams Foo_tree ) ])

EXCLUDE_EXT

在進行靜態構建時要排除的擴展名陣列。如果存在 INCLUDE_EXT,則會忽略此選項。有關更多詳情,請參閱 INCLUDE_EXT。 (例如 [ qw( Socket POSIX ) ] )

當作為命令行上的字符串指定此屬性時,此屬性可能最有用:perl Makefile.PL EXCLUDE_EXT='Socket Safe'

EXE_FILES

執行檔案的參考陣列。這些檔案將複製到 INST_SCRIPT 目錄中。執行 realclean 會再次從那裡刪除它們。

如果您的執行檔以類似 #!perl 或 #!/usr/bin/perl 開頭,MakeMaker 將其更改為 perl 'Makefile.PL' 呼叫時所使用的 perl 路徑,以確保即使 perl 不在 /usr/bin/perl 中,這些程式也能正常運行。

FIRST_MAKEFILE

要生成的 Makefile 的名稱。這用於為 MAP_TARGET 生成的第二個 Makefile。

在 VMS 上默認為 'Makefile' 或 'Descrip.MMS'。

(註: 我們無法使用 MAKEFILE,因為 dmake 用於其他用途)。

FULLPERL

能夠運行此擴展、載入 XS 模組等的 Perl 二進制文件。

FULLPERLRUN

與 PERLRUN 類似,但使用 FULLPERL。

FULLPERLRUNINST

與 PERLRUNINST 類似,但使用 FULLPERL。

FUNCLIST

提供了一種替代方式來指定要從擴展中導出的函數名稱。它的值是一個函數名稱的陣列參考,這些名稱將原封不動地傳遞到連結器選項文件中。

H

*.h 檔案名稱的參考陣列。與 C 類似。

IMPORTS

此屬性用於指定要導入擴展中的名稱。接受一個哈希參考。

僅在 OS/2 和 Win32 上使用。

INC

包含檔案目錄,例如: "-I/usr/5include -I/path/to/inc"

INCLUDE_EXT

在進行靜態構建時要包含的擴展名稱陣列。當進行靜態構建時,MakeMaker 通常會使用所有已安裝的擴展進行構建,這通常是期望的行為。如果 INCLUDE_EXT 存在,則 MakeMaker 將僅使用明確提及的擴展進行構建。(例如 [ qw( Socket POSIX ) ])

在填寫 INCLUDE_EXT 時,不需要提及 DynaLoader 或當前擴展。如果提及了 INCLUDE_EXT 但是為空,則只會將 DynaLoader 和當前擴展包含在構建中。

當指定為命令行上的字符串時,此屬性可能最有用:perl Makefile.PL INCLUDE_EXT='POSIX Socket Devel::Peek'

INSTALLARCHLIB

由 'make install' 使用,如果 INSTALLDIRS 設置為 perl,則從 INST_ARCHLIB 複製文件到此目錄。

INSTALLBIN

如果 INSTALLDIRS=perl,則用於安裝二進制文件(例如 tkperl)的目錄。

INSTALLDIRS

確定要選擇哪組安裝目錄:perl、site 或 vendor。默認為 site。

INSTALLMAN1DIR
INSTALLMAN3DIR

如果 INSTALLDIRS=perl,這些目錄將在 'make install' 時獲取 man 頁面。默認為 $Config{installman*dir}。

如果設置為 'none',將不會安裝 man 頁面。

INSTALLPRIVLIB

由 'make install' 使用,如果 INSTALLDIRS 設置為 perl,則從 INST_LIB 複製文件到此目錄。

默認為 $Config{installprivlib}。

INSTALLSCRIPT

6.30_02 版本及以上可用。

由 'make install' 使用,如果 INSTALLDIRS 設置為 perl,則從 INST_SCRIPT 複製文件到此目錄。

INSTALLSITEARCH

由 'make install' 使用,如果 INSTALLDIRS 設置為 site(默認),則從 INST_ARCHLIB 複製文件到此目錄。

INSTALLSITEBIN

由 'make install' 使用,如果 INSTALLDIRS 設置為 site(默認),則從 INST_BIN 複製文件到此目錄。

INSTALLSITELIB

由 'make install' 使用,如果 INSTALLDIRS 設置為 site(默認),則從 INST_LIB 複製文件到此目錄。

INSTALLSITEMAN1DIR
INSTALLSITEMAN3DIR

如果 INSTALLDIRS=site(默認),這些目錄將在 'make install' 時獲取 man 頁面。默認為 $(SITEPREFIX)/man/man$(MAN*EXT)。

如果設置為 'none',將不會安裝 man 頁面。

INSTALLSITESCRIPT

由 'make install' 使用,如果 INSTALLDIRS 設置為 site(默認),則從 INST_SCRIPT 複製文件到此目錄。

INSTALLVENDORARCH

由 'make install' 使用,如果 INSTALLDIRS 設置為 vendor,則從 INST_ARCHLIB 複製文件到此目錄。請注意,如果您不設置此值,將使用 INSTALLVENDORLIB 的值,這可能不是您想要的。

INSTALLVENDORBIN

由 'make install' 使用,如果 INSTALLDIRS 設置為 vendor,則從 INST_BIN 複製文件到此目錄。

INSTALLVENDORLIB

'make install' 使用,若 INSTALLDIRS 設為 vendor,則從 INST_LIB 複製檔案到此目錄。

INSTALLVENDORMAN1DIR
INSTALLVENDORMAN3DIR

若 INSTALLDIRS=vendor,則這些目錄在 'make install' 時會取得 man 頁面。預設為 $(VENDORPREFIX)/man/man$(MAN*EXT)。

如果設置為 'none',將不會安裝 man 頁面。

INSTALLVENDORSCRIPT

6.30_02 版本及以上可用。

'make install' 使用,若 INSTALLDIRS 設為 vendor,則從 INST_SCRIPT 複製檔案到此目錄。

INST_ARCHLIB

針對與架構相關的檔案,與 INST_LIB 相同。

INST_BIN

'make' 時放置實際二進位檔案的目錄。這些檔案將在 'make install' 時複製到 INSTALLBIN。

INST_LIB

在建置擴充功能時,放置此擴充功能的程式庫檔案的目錄。

INST_MAN1DIR

'make' 時放置 man 頁面的目錄。

INST_MAN3DIR

'make' 時放置 man 頁面的目錄。

INST_SCRIPT

'make' 時應安裝可執行檔的目錄。預設為 "./blib/script",僅用於測試期間的虛擬位置。 'make install' 會將 INST_SCRIPT 中的檔案複製到 INSTALLSCRIPT。

LD

用於連結動態載入程式庫的程式。

預設為 $Config{ld}。

LDDLFLAGS

可能需要傳遞給 ld 以建立適用於動態載入的共享程式庫的任何特殊旗標。由 makefile 決定是否使用它。 (參見 Config 中的 "lddlflags")

預設為 $Config{lddlflags}。

LDFROM

預設為 "$(OBJECT)",在 ld 命令中用於指定從哪些檔案連結/載入 (另請參閱 dynamic_lib 中有關如何指定 ld 旗標的說明)

LIB

LIB應僅在perl Makefile.PL時設置,但允許作為MakeMaker參數。它的效果是將INSTALLPRIVLIB和INSTALLSITELIB都設置為該值,而不考慮這些參數(或PREFIX)的明確設置。INSTALLARCHLIB和INSTALLSITEARCH設置為對應的架構子目錄。

LIBPERL_A

將與此擴展一起使用的perllibrary的文件名。默認為libperl.a。

LIBS

替代庫規範的匿名數組,按順序搜索,直到找到至少一個庫為止。例如。

'LIBS' => ["-lgdbm", "-ldbm -lfoo", "-L/path -ldbm.nfs"]

請注意,數組的任何元素都包含ld命令的完整參數集。因此,不要指定

'LIBS' => ["-ltcl", "-ltk", "-lX11"]

參見ODBMM_File/Makefile.PL,其中需要一個數組的示例。如果您指定標量,則MakeMaker將其轉換為一個元素的數組。

'LIBS' => "-ltcl -ltk -lX11"

LICENSE

6.31版本及以上可用。

您的分發的許可條款。通常是“perl_5”,與Perl本身相同的許可證。

參見CPAN::Meta::Spec以查看選項列表。

默認為“unknown”。

LINKTYPE

“靜態”或“動態”(除非在config.sh中使用了undef)。應僅用於強制靜態鏈接(另見下面的linkext)。

MAGICXS

6.8305版本及以上可用。

當設置為1時,OBJECT將自動從O_FILES派生。

MAKE

6.30_01版本及以上可用。

您打算使用生成的Makefile運行的make的變體。此參數使Makefile.PL知道在生成Makefile時要考慮哪些make特性。

MakeMaker也會尊重MAKE環境變量。此參數優先。

目前唯一重要的值是“dmake”和“nmake”,用於Windows用戶,指示MakeMaker生成DMake(“Dennis Vadura's Make”)或Microsoft NMake風格的Makefile。

默認為$Config{make},它可能會在您的環境中尋找Make程序。

如果您沒有明確指定值,又想知道生成的Makefile是哪種Make的,您應該怎麼辦?搜索生成的Makefile以查找MAKE變量的定義,該變量用於遞歸調用Make工具。這將告訴您應該使用哪個Make來調用Makefile。

MAKEAPERL

布爾值,告訴MakeMaker它應該包含製作perl的規則。這通常由MakeMaker自動處理為開關。用戶通常不需要它。

MAKEFILE_OLD

執行 'make clean' 或類似的動作時,$(FIRST_MAKEFILE) 將會被備份到這個位置。

在 VMS 環境中預設為 $(FIRST_MAKEFILE).old 或 $(FIRST_MAKEFILE)_old。

MAN1PODS

包含 pod 內容的哈希參照。MakeMaker 將預設將所有包含 POD 指令的 EXE_FILES 檔案設定為此項目。列於此的檔案將會被轉換成 man 頁並且按照 Configure 時的要求進行安裝。

此哈希應將 POD 檔案(或包含 POD 的腳本)對映到 blib/man1/ 目錄下的 man 檔案名稱,如以下範例所示

MAN1PODS            => {
  'doc/command.pod'    => 'blib/man1/command.1',
  'scripts/script.pl'  => 'blib/man1/script.1',
}
MAN3PODS

將 *.pm 和 *.pod 檔案指定為應該寫入 man 頁面的檔案的哈希參照。MakeMaker 將解析所有的 *.pod 和 *.pm 檔案以尋找 POD 指令。包含 POD 的檔案將會成為 MAN3PODS 哈希參照的預設鍵。這些檔案將在 make 時轉換成 man 頁面並且在 make install 時安裝。

類似於 MAN1PODS 的範例。

MAP_TARGET

如果預期要生成一個新的 perl 執行檔,此變數可以保存該執行檔的名稱。預設為 perl。

META_ADD
META_MERGE

在版本 6.46 及以上可用。

要添加到 CPAN Meta 檔案(META.ymlMETA.json)中的項目的哈希參照。

它們的行為方式在與預設元數據具有相同鍵時有所不同。META_ADD 將使用自己的值覆蓋預設值。META_MERGE 將其值與預設值合併。

除非您想覆蓋預設值,否則請優先使用 META_MERGE 以便獲得任何未來預設值的好處。

在涉及 prereqs 時,如果使用 META_MERGE,則 prereqs 將與其對應的 WriteMakefile() 參數進行合併(PREREQ_PM 合併為 {prereqs}{runtime}{requires},BUILD_REQUIRES 合併為 {prereqs}{build}{requires},CONFIGURE_REQUIRES 合併為 {prereqs}{configure}{requires},TEST_REQUIRES 合併為 {prereqs}{test}{requires})。當使用 META_ADD 指定 prereqs 時,只有來自元數據而不是 WriteMakefile() 參數的前置條件會添加到檔案中。

請注意,這些配置選項僅用於生成 META.ymlMETA.json,不用於 MYMETA.ymlMYMETA.json。因此,這些字段中的數據不應用於動態(用戶端)配置。

默認情況下,使用 CPAN Meta 規範 1.4。為了使用 CPAN Meta 規範 2.0,請使用 meta-spec 指定您想使用的版本。

META_MERGE        => {

  "meta-spec" => { version => 2 },

  resources => {

    repository => {
        type => 'git',
        url => 'git://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker.git',
        web => 'https://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker',
    },

  },

},
MIN_PERL_VERSION

版本 6.48 及以上版本可用。

此發行版所需的最低 Perl 版本。

接受 5.006001 或 5.6.1 格式。

MYEXTLIB

如果擴展連結到其構建的庫,請將其設置為庫的名稱(參見 SDBM_File)。

NAME

表示發行版的包。例如,Test::MoreExtUtils::MakeMaker。它將用於派生有關發行版的信息,例如 "DISTNAME",Perl 库中的安裝位置以及默認情況下將查找 XS 文件的位置(參見 "XS")。

NAME 必須 是有效的 Perl 包名,並且它 必須 有一個關聯的 .pm 文件。例如,Foo::Bar 是一個有效的 NAME,並且必須存在 Foo/Bar.pm。除非另有說明,任何 XS 代碼應該在 Bar.xs 中。

您的發行版 必須 有一個 NAME

NEEDS_LINKING

MakeMaker 將查找擴展是否包含可以在目錄樹中的任何位置進行鏈接的代碼,並將相應地設置此變量,但如果您自己定義此布爾變量,則可以稍微加快速度。

NOECHO

命令以便 make 不打印它正在運行的字面命令。

將其設置為空字符串,可以生成打印所有命令的 Makefile。主要用於調試 MakeMaker 本身。

默認為 @

NORECURS

布爾值。阻止下降到子目錄。

NO_META

當為 true 時,抑制在 'make distdir' 過程中生成並添加到 MANIFEST 中的 META.yml 和 META.json 模塊元數據文件。

默認為 false。

NO_MYMETA

版本 6.57_02 及以上版本可用。

當設置為 true 時,在 'perl Makefile.PL' 過程中會壓制生成 MYMETA.yml 和 MYMETA.json 模塊元數據文件。

默認為 false。

NO_PACKLIST

版本 6.7501 及以上版本可用。

當設置為 true 時,會壓制安裝時的 packlist 文件寫入。

默認為 false。

NO_PERLLOCAL

版本 6.7501 及以上版本可用。

當設置為 true 時,會壓制將安裝信息附加到 perllocal 文件中。

默認為 false。

NO_VC

一般情況下,任何生成的 Makefile 都會檢查 MakeMaker 的當前版本和 Makefile 構建的版本。如果設置了 NO_VC,則版本檢查會被忽略。不要將此寫入 Makefile.PL 中,而是以交互方式使用。

OBJECT

對象文件列表,默認為 '$(BASEEXT)$(OBJ_EXT)',但可以是一個長字符串或包含所有對象文件的數組,例如 "tkpBind.o tkpButton.o tkpCanvas.o" 或 ["tkpBind.o", "tkpButton.o", "tkpCanvas.o"]

(其中 BASEEXT 是 NAME 的最後一個組件,OBJ_EXT 是 $Config{obj_ext}。)

OPTIMIZE

默認為 -O。將其設置為 -g 以開啟調試。標誌將傳遞給子目錄 make。

PERL

用於可以由 miniperl 完成的任務的 Perl 二進制文件。如果包含空格或其他 shell 元字符,則需要以保護它們的方式引用它們,因為此值旨在插入到 Makefile 中的 shell 命令行中。例如

# Perl executable lives in "C:/Program Files/Perl/bin"
# Normally you don't need to set this yourself!
$ perl Makefile.PL PERL='"C:/Program Files/Perl/bin/perl.exe" -w'
PERL_CORE

僅當 MakeMaker 正在構建 Perl 核心發行版的擴展時才設置。

PERLMAINCC

調用能夠編譯 perlmain.c 的程序。默認為 $(CC)。

PERL_ARCHLIB

與 PERL_LIB 類似,但用於架構相關文件。

僅在 MakeMaker 正在構建 Perl 核心發行版的擴展時使用(因為通常 $(PERL_ARCHLIB) 自動包含在 @INC 中,添加它將妨礙 PERL5LIB)。

PERL_LIB

包含要使用的 Perl 库的目錄。

僅在 MakeMaker 正在構建 Perl 核心發行版的擴展時使用(因為通常 $(PERL_LIB) 自動包含在 @INC 中,添加它將妨礙 PERL5LIB)。

PERL_MALLOC_OK

預設為0。如果擴展可以與由Perl malloc()子系統替換的記憶體配置例程一起運作,則應將其設置為TRUE。這應適用於大多數擴展,但不包括以下情況:

  • 與Perl的malloc()捕獲的記憶體分配錯誤有關的擴展;

  • 以其他方式與記憶體分配器交互,而不是通過malloc()、realloc()、free()、calloc()、sbrk()和brk();

  • 依賴於Perl的malloc()未提供的特殊對齊方式的擴展。

注意。 如果未在任何一個已加載的擴展中設置此標誌,則將使Perl的malloc()失去許多優勢,例如更好地使用系統資源、錯誤檢測、記憶體使用報告、可捕獲的記憶體分配失敗等。

PERLPREFIX

用於安裝核心模塊的目錄。

預設為$Config{installprefixexp},如果$Config{installprefixexp}不存在,則降級為$Config{installprefix}、$Config{prefixexp}或$Config{prefix}。

可被PREFIX覆蓋。

PERLRUN

當您希望運行perl時,請使用此選項,而不是$(PERL)。它將為您設置額外必要的標誌。

PERLRUNINST

當您希望運行perl來處理模塊時,請使用此選項,而不是$(PERL)。它將添加像-I$(INST_ARCH)這樣的東西以及其他必要的標誌,以便perl可以看到您即將安裝的模塊。

PERL_SRC

包含Perl源代碼的目錄(應避免使用此選項,它可能未定義)。

PERM_DIR

在版本6.51_01及以上可用。

目錄的所需權限。預設為755

PERM_RW

讀/寫文件的所需權限。預設為644

PERM_RWX

可執行文件的所需權限。預設為755

PL_FILES

MakeMaker可以在構建時運行程序以生成文件。默認情況下,位於頂級目錄中的任何名稱為*.PL(除了Makefile.PL和Build.PL)的文件將被假定為Perl程序並運行,將其自己的基本名稱作為參數傳遞。此基本名稱實際上是一個構建目標,並且有一個意圖,但不是一個要求,即*.PL文件使其作為參數傳遞的文件。例如...

perl foo.PL foo

可以通過提供您自己的文件集來覆蓋此行為。PL_FILES接受一個哈希引用,鍵是要運行的文件,當運行PL文件時,其值作為第一個參數傳遞。

PL_FILES => {'bin/foobar.PL' => 'bin/foobar'}

PL_FILES => {'foo.PL' => 'foo.c'}

將以此方式運行bin/foobar.PL

perl bin/foobar.PL bin/foobar

如果需要一個程序的多個文件,可以使用數組引用。

PL_FILES => {'bin/foobar.PL' => [qw(bin/foobar1 bin/foobar2)]}

在這種情況下,將多次運行該程序,每次使用一個目標文件。

perl bin/foobar.PL bin/foobar1
perl bin/foobar.PL bin/foobar2

如果輸出文件除了腳本本身之外還依賴於額外的輸入文件,則在版本7.36及以上中可以使用哈希引用

PL_FILES => { 'foo.PL' => {
    'foo.out' => 'foo.in',
    'bar.out' => [qw(bar1.in bar2.in)],
}

在這種情況下,額外的輸入文件將在目標文件之後傳遞給程序

perl foo.PL foo.out foo.in
perl foo.PL bar.out bar1.in bar2.in

PL檔案通常在執行pm_to_blib之後運行,並在其@INC中包含INST_LIB和INST_ARCH,以便可以訪問剛剛建構的模塊... 除非PL檔案正在製作模塊(或PM中的任何其他內容),在這種情況下,它會在pm_to_blib之前運行,並且不會在其@INC中包含INST_LIB和INST_ARCH。這種顯然奇怪的行為是為了向後兼容性(並且在某種程度上是DWIM)。傳遞給.PL的參數設置為Makefile中要構建的目標。在其他部分(如postamble)中,您可以指定對應於.PL應該(或現在已經是一個依賴項)生成的文件的文件名/參數的依賴項。請注意,即使您沒有創建明確的依賴項,要生成的文件仍將生成,並且.PL仍將運行,因為all目標仍取決於運行所有符合條件的.PL文件。

PM

.pm文件和*.pl文件的哈希引用,將被安裝。例如

{'name_of_file.pm' => '$(INST_LIB)/install_as.pm'}

默認情況下,這將包括*.pm和*.pl以及在PMLIBDIRS目錄中找到的文件。在Makefile.PL中定義PM將覆蓋PMLIBDIRS。

PMLIBDIRS

包含庫文件的子目錄數組引用。默認為['lib', $(BASEEXT)]。將掃描目錄,包含的任何文件都將安裝在庫中的相應位置。可以使用libscan()方法來更改行為。在Makefile.PL中定義PM將覆蓋PMLIBDIRS。

(其中BASEEXT是NAME的最後一個組件。)

PM_FILTER

在構建期間(在pm_to_blib()階段)傳遞給每個.pm文件的傳統Unix意義上的過濾程序(從stdin輸入,輸出到stdout)。默認情況下為空,表示不執行過濾。您可以使用

PM_FILTER => 'perl -ne "print unless /^\\#/"',

在構建過程中動態刪除所有前導注釋。為了盡可能地具有可移植性,請考慮使用Perl單行程式而不是Unix(或其他)實用程序,如上所述。#在Makefile中被轉義,因為然後將生成的內容

PM_FILTER = perl -ne "print unless /^\#/"

如果#前沒有\,則我們將有一個Makefile注釋的開始,並且宏將被錯誤定義。

您幾乎肯定會更好地使用PL_FILES系統。參見上文或ExtUtils::MakeMaker::FAQ條目。

POLLUTE

在5.6之前,各種解釋器變量可以不帶PL_前綴使用,例如PL_undef可以作為undef使用。從版本5.6開始,只有在啟用POLLUTE標誌時才定義這些變量

perl Makefile.PL POLLUTE=1

如有需要在 5.6 或更新版本下成功安裝模組,請通知模組作者。

PPM_INSTALL_EXEC

執行 PPM_INSTALL_SCRIPT 的可執行檔名稱。(例如 perl)

PPM_INSTALL_SCRIPT

Perl 套件管理器(PPM)安裝套件後執行的腳本名稱。

PPM_UNINSTALL_EXEC

版本 6.8502 及以上版本可用。

執行 PPM_UNINSTALL_SCRIPT 的可執行檔名稱。(例如 perl)

PPM_UNINSTALL_SCRIPT

版本 6.8502 及以上版本可用。

Perl 套件管理器(PPM)移除套件前執行的腳本名稱。

PREFIX

這將覆蓋所有預設的安裝位置。手冊頁、庫、腳本等... MakeMaker 將嘗試根據您的 Config 預設猜測在新 PREFIX 下放置物件的位置。如果失敗,它將退回到一個對您的平台合理的結構。

如果您指定了 LIB 或任何 INSTALL* 變數,它們將不受 PREFIX 的影響。

PREREQ_FATAL

Bool。如果此參數為真,缺少所需模組(或其正確版本)將導致致命錯誤。 perl Makefile.PLdie 而不僅僅是通知使用者缺少的依賴項。

使用 PREREQ_FATAL 是非常罕見的。強烈不建議模組作者使用它,而且絕不能輕率使用。

對於運行 Makefile.PL 所需的依賴項,請參閱 CONFIGURE_REQUIRES

模組安裝工具有解決未滿足依賴項的方法,但它們需要一個 Makefile。使用 PREREQ_FATAL 會破壞這一點。這是不好的。

假設您有良好的測試覆蓋率,您的測試應該因缺少依賴項而失敗,更強烈地通知使用者出現了問題。您可以編寫一個 t/00compile.t 測試,僅檢查您的代碼是否編譯,如果不編譯則提前停止 "make test"。有關更多詳細信息,請參閱 Test::More 中的 "BAIL_OUT"

PREREQ_PM

需要運行您的模組的模組的哈希表。鍵是模組名,例如 Test::More,而值是最低版本。如果所需版本號為 0,則任何版本都可以。給定的版本可以是 Perl v-字串(請參閱 version)或範圍(請參閱 CPAN::Meta::Requirements)。

這將進入您的 META.ymlrequires 欄位以及您的 META.jsonprereqs 欄位的 runtime

PREREQ_PM => {
    # Require Test::More at least 0.47
    "Test::More" => "0.47",

    # Require any version of Acme::Buffy
    "Acme::Buffy" => 0,
}
PREREQ_PRINT

布林值。如果此參數為 true,則先決條件將被列印到標準輸出並退出 MakeMaker。輸出格式為可評估的哈希參考。

$PREREQ_PM = {
               'A::B' => Vers1,
               'C::D' => Vers2,
               ...
             };

如果發行版定義了最低所需的 Perl 版本,則會將其添加到輸出中,格式如下所示的額外行:

$MIN_PERL_VERSION = '5.008001';

如果 BUILD_REQUIRES 不為空,則將其轉儲為 $BUILD_REQUIRES 哈希參考。

RedHatism for PREREQ_PRINT。儘管輸出格式不同

perl(A::B)>=Vers1 perl(C::D)>=Vers2 ...

如果存在最低所需的 Perl 版本,則如下所示:

perl(perl)>=5.008001
SITEPREFIX

與 PERLPREFIX 類似,但僅適用於站點安裝位置。

默認為 $Config{siteprefixexp}。Perl 5.6.0 之前的版本沒有在 Config 中明確指定 siteprefix。在這些情況下,將使用 $Config{installprefix}。

可被 PREFIX 覆蓋

SIGN

在版本 6.18 及以上可用。

當為 true 時,在 'make distdir' 時執行並將 SIGNATURE 文件添加到 distdir 中,通過 'cpansign -s'。

請注意,您需要安裝 Module::Signature 模塊才能執行此操作。

默認為 false。

SKIP

數組參考。例如 [qw(name1 name2)] 跳過(不寫入) Makefile 的部分。注意!不要為了微不足道的加速而使用 SKIP 屬性。這可能會嚴重損壞生成的 Makefile。只有在確實需要時才使用它。

TEST_REQUIRES

在版本 6.64 及以上可用。

需要測試您的模塊但不運行或構建它的模塊的哈希。

這將進入您的 META.ymlbuild_requires 字段和您的 META.jsonprereqs 字段的 test

格式與 PREREQ_PM 相同。

TYPEMAPS

對 typemap 文件名數組的引用。當 typemaps 不在當前目錄中或者它們的名稱不是 typemap 時使用此選項。列表中的最後一個 typemap 有最高優先順序。當前目錄中的 typemap 優先順序最高,即使它未在 TYPEMAPS 中列出。默認系統 typemap 優先順序最低。

VENDORPREFIX

與 PERLPREFIX 類似,但僅適用於供應商安裝位置。

默認為 $Config{vendorprefixexp}。

可被 PREFIX 覆蓋

VERBINST

如果為 true,則 make install 將會冗長

VERSION

用於分發套件的版本號。默認為 0.1。

VERSION_FROM 版本號來源

您可以讓 MakeMaker 解析文件以確定版本號,而不是在 Makefile.PL 中指定版本。解析過程要求 VERSION_FROM 所指定的文件包含一個單一行以計算版本號。該文件中第一行包含類似於 $VERSION 分配或 package Name VERSION 的內容將被使用。接下來的行將被解析。

# Good
package Foo::Bar 1.23;                      # 1.23
$VERSION   = '1.00';                        # 1.00
*VERSION   = \'1.01';                       # 1.01
($VERSION) = q$Revision$ =~ /(\d+)/g;       # The digits in $Revision$
$FOO::VERSION = '1.10';                     # 1.10
*FOO::VERSION = \'1.11';                    # 1.11

但這些將失敗

# Bad
my $VERSION         = '1.01';
local $VERSION      = '1.02';
local $FOO::VERSION = '1.30';

(在前一行放置 my 或 local 將正常工作)

“版本字符串”不相容,不應使用。

# Bad
$VERSION = 1.2.3;
$VERSION = v1.2.3;

版本對象很好。從 MakeMaker 6.35 開始,將自動加載 version.pm,但您必須聲明對 version.pm 的依賴。為了與舊版本的 MakeMaker 兼容,您應該在聲明 $VERSION 的同一行上加載。

# All on one line
use version; our $VERSION = qv(1.2.3);

VERSION_FROM 中指定的文件並不會添加為 Makefile 的依賴。這並不完全正確,但在開發過程中,對該文件的任何小更改都必須重新編寫 Makefile 將會很麻煩。如果您想確保在文件更改後,Makefile 包含正確的 VERSION 宏,您需要執行類似的操作

depend => { Makefile => '$(VERSION_FROM)' }

請參見下面的屬性 depend。

VERSION_SYM 版本符號

消除了 . 並用 _ 替換的版本。用於 . 具有特殊含義的地方(一些文件系統、RCS 標籤等)

XS

.xs 文件的哈希參照。MakeMaker 將默認此。例如:

{'name_of_file.xs' => 'name_of_file.c'}

.c 文件將自動包含在 make clean 刪除的文件列表中。

XSBUILD

7.12 版本及以上可用。

具有控制 XSMULTI 操作的選項的哈希參照

{
  xs => {
      all => {
          # options applying to all .xs files for this distribution
      },
      'lib/Class/Name/File' => { # specifically for this file
          DEFINE => '-Dfunktastic', # defines for only this file
          INC => "-I$funkyliblocation", # include flags for only this file
          # OBJECT => 'lib/Class/Name/File$(OBJ_EXT)', # default
          LDFROM => "lib/Class/Name/File\$(OBJ_EXT) $otherfile\$(OBJ_EXT)", # what's linked
      },
  },
}

請注意 xs 是文件擴展名。將來可能會出現更多可能性。請注意,對象名稱是不帶有其 XS 擴展名的。

LDFROM 默認與 OBJECT 相同。對於 XSMULTIOBJECT 默認僅為具有特定編譯器的文件擴展名的 XS 文件名所替換的目標文件擴展名。

OBJECTLDFROM 之間的區別:OBJECT 是建構目標,因此 make 會嘗試構建它。然而,LDFROM 是實際上將被連結在一起以製作共享對象或靜態庫(SO/SL)的內容,因此如果您覆蓋它,請確保它包含您希望製作最終 SO/SL 的內容,幾乎肯定包括帶有 $(OBJ_EXT) 的 XS 基本名。

XSMULTI

7.12 版本及以上可用。

當此設置為 1 時,多個 XS 文件可以放置在其相應的 lib/ 目錄下,與其相應的 *.pm 文件並列(這對於使用正確的 VERSION 值進行編譯是必不可少的)。此功能應被視為實驗性的,並且其細節可能會更改。

此功能的靈感來自於,並且部分代碼是從 ExtUtils::MakeMaker::BigHelper 複製過來的。希望這個功能能夠使該模塊基本上變得過時。

XSOPT

要傳遞給 xsubpp 的選項字符串。這可能包括 -C++-extern。不要在這裡包含 typemap;TYPEMAP 參數就是為此而存在的。

XSPROTOARG

可以設置為 -prototypes-noprototypes 或空字符串。空字符串等同於 xsubpp 的默認值,即 -noprototypes。詳細信息請參閱 xsubpp 文檔。MakeMaker 默認為空字符串。

XS_VERSION

此包的 .xs 文件的版本號。默認為 VERSION 屬性的值。

附加的小寫屬性

可以用來將參數傳遞給實現該部分 Makefile 的方法。參數被指定為哈希引用,但作為哈希傳遞給方法。

clean
{FILES => "*.xyz foo"}
depend
{ANY_TARGET => ANY_DEPENDENCY, ...}

(ANY_TARGET 不得由 MakeMaker 提供雙冒號規則。)

dist
{TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => '.gz',
SHAR => 'shar -m', DIST_CP => 'ln', ZIP => '/bin/zip',
ZIPFLAGS => '-rl', DIST_DEFAULT => 'private tardist' }

如果指定了 COMPRESS,那麼 SUFFIX 也應該被修改,因為這需要告訴 make 壓縮的目標文件。如果您需要保留文件的時間戳記,則將 DIST_CP 設置為 ln 可以很有用。DIST_CP 可以取 'cp'(複製文件)、'ln'(鏈接文件)和 'best'(複製符號鏈接並鏈接其餘文件)。默認值為 'best'。

dynamic_lib
{ARMAYBE => 'ar', OTHERLDFLAGS => '...', INST_DYNAMIC_DEP => '...'}
linkext
{LINKTYPE => 'static', 'dynamic' or ''}

注意:除了 *.pm 文件之外什麼都沒有的擴展必須說明。

{LINKTYPE => ''}

在 Pre-5.0 的 MakeMakers 中。自 MakeMaker 的版本 5.00 起,這樣的行可以安全地刪除。MakeMaker 會識別到沒有需要連結的東西。

macro
{ANY_MACRO => ANY_VALUE, ...}
postamble

放在這裡的任何內容都將傳遞給 MY::postamble()(如果有)。

realclean
{FILES => '$(INST_ARCHAUTODIR)/*.xyz'}
test

指定測試的目標。

{TESTS => 't/*.t'}

RECURSIVE_TEST_FILES 可以用於遞迴包含 t 目錄下包含 .t 文件的所有目錄。如果您提供自己的 TESTS 屬性,它將被忽略,預設為 false。

{RECURSIVE_TEST_FILES=>1}

此功能自 6.76 版本起受支持。

tool_autosplit
{MAXLEN => 8}

覆蓋 MakeMaker 方法

如果通過指定屬性無法達到所需的 Makefile 行為,您可以在 Makefile.PL 中定義私有子例程。每個子例程都會返回它希望寫入 Makefile 的文本。要覆蓋 Makefile 的某部分,您可以選擇以下任一方式:

sub MY::c_o { "new literal text" }

或者您可以通過類似以下方式編輯默認值:

package MY; # so that "SUPER" works right
sub c_o {
    my $inherited = shift->SUPER::c_o(@_);
    $inherited =~ s/old text/new text/;
    $inherited;
}

如果您正在嘗試將 Perl 嵌入其他應用程序中,可能會發現 MakeMaker 不夠。您最好看一下ExtUtils::Embed,這是一組用於嵌入的實用程序。

如果您仍然需要不同的解決方案,請嘗試開發另一個符合您需求的子例程,並將差異提交給 makemaker@perl.org

有關所有 MakeMaker 方法的完整描述,請參見 ExtUtils::MM_Unix

這裡是如何向生成的 Makefile 添加新目標的簡單示例

sub MY::postamble {
    return <<'MAKE_FRAG';
$(MYEXTLIB): sdbm/Makefile
        cd sdbm && $(MAKE) all

MAKE_FRAG
}

貨郵崇拜編程的終結

WriteMakefile() 現在對其參數進行了一些基本的健全性檢查,以防止打字錯誤和格式錯誤的值。這意味著過去某些可行的事情現在會產生警告,並可能產生內部錯誤。

一些最常見的錯誤

MAN3PODS => ' '

這通常用於抑制創建 man 頁面。MAN3PODS 接受哈希引用而不是字符串,但以上的工作方式在舊版本的 MakeMaker 中偶然生效。

正確的代碼是 MAN3PODS => { }

Hintsfile 支援

MakeMaker.pm 使用 Config.pm 中的特定於架構的信息。此外,它會評估一個 hints/ 目錄中的特定於架構的提示文件。提示文件的名稱應與 PERL_SRC/hints 中的對應文件相同,但檔名擴展名為 .pl(例如 next_3_2.pl)。它們只是由 MakeMaker 在 WriteMakefile() 子例程中進行 eval,並且可以用於執行命令以及包含特殊變數。選擇提示文件的規則與 Configure 中的相同。

在將參數填入哈希引用 $self 但在此引用被 Bless 之前,hintsfile 會立即 eval()。因此,如果您想要覆蓋或創建屬性的等效操作,您可以這樣說:

$self->{LIBS} = ['-ldbm -lucb -lc'];

發行支援

對於擴展的作者,MakeMaker 提供了幾個 Makefile 目標。大多數支援來自 ExtUtils::Manifest 模組,這裡可以找到額外的文件。

make distcheck

報告哪些文件在建置目錄下但不在 MANIFEST 文件中,反之亦然。(有關詳細信息,請參見 "ExtUtils::Manifest 中的 fullcheck

make skipcheck

報告由於 MANIFEST.SKIP 文件中的條目而被跳過的文件。(有關詳細信息,請參見 "ExtUtils::Manifest 中的 skipcheck

make distclean

首先執行 realclean,然後執行 distcheck。請注意,只要確定 MANIFEST 文件沒問題,就不需要這樣做來構建新的發行版。

make veryclean

首先執行 realclean,然後刪除備份文件,如 *~, *.bak, *.old*.orig

make manifest

重寫 MANIFEST 文件,添加所有找到的剩餘文件(有關詳細信息,請參見 "ExtUtils::Manifest 中的 mkmanifest

make distdir

將 MANIFEST 文件中的所有文件複製到以 $(DISTNAME)-$(VERSION) 命名的新建目錄中。如果該目錄存在,將首先刪除它。

此外,它將在 distdir 中創建 META.yml 和 META.json 模塊元數據文件,並將其添加到 distdir 的 MANIFEST 中。您可以使用 NO_META 標誌關閉此行為。

make disttest

首先創建一個 distdir,然後在該目錄中運行 perl Makefile.PL、一個 make,以及一個 make test。

make tardist

首先創建一個 distdir。然後執行一個命令 $(PREOP),默認為空命令,然後是 $(TO_UNIX),在 UNIX 下默認為空命令,否則將轉換發行目錄中的文件為 UNIX 格式。接下來,將 tar 用於該目錄,將其打包為 tarfile,並刪除該目錄。最後執行一個命令 $(POSTOP),默認為空命令。

make dist

默認為 $(DIST_DEFAULT),其默認為 tardist。

make uutardist

首先運行 tardist,然後對 tarfile 進行 uuencode 編碼。

make shdist

首先進行 distdir。然後執行一個名為 $(PREOP) 的命令,默認為空命令。接著將 shar 執行在該目錄上,生成一個 sharfile,然後再刪除中間目錄。最後執行一個名為 $(POSTOP) 的命令,默認為空命令。注意:為了讓 shdist 正常運行,必須有一個能夠處理目錄的 shar 程序。

make zipdist

首先進行 distdir。然後執行一個名為 $(PREOP) 的命令,默認為空命令。執行 $(ZIP) $(ZIPFLAGS) 在該目錄上,生成一個 zipfile。然後刪除該目錄。最後執行一個名為 $(POSTOP) 的命令,默認為空命令。

make ci

對 MANIFEST 文件中的所有文件執行 $(CI) 和 $(RCS_LABEL)。

可以通過指定對 WriteMakefile 調用的 dist 屬性的哈希參考來自定義 dist 目標。識別以下參數

CI           ('ci -u')
COMPRESS     ('gzip --best')
POSTOP       ('@ :')
PREOP        ('@ :')
TO_UNIX      (depends on the system)
RCS_LABEL    ('rcs -q -Nv$(VERSION_SYM):')
SHAR         ('shar')
SUFFIX       ('.gz')
TAR          ('tar')
TARFLAGS     ('cvf')
ZIP          ('zip')
ZIPFLAGS     ('-r')

一個示例

WriteMakefile(
    ...other options...
    dist => {
        COMPRESS => "bzip2",
        SUFFIX   => ".bz2"
    }
);

模塊元數據(META 和 MYMETA)

基於 MakeMaker 的模塊的長期困擾是在 執行 Makefile.PL 並對生成的 Makefile 做一堆混亂的啟發式分析的情況下從源代碼中獲取有關模塊的基本信息。多年來,將這些信息保存在與每個發布一起分發的一個或多個 CPAN 元文件中已成為標準做法。

CPAN 元文件的原始格式是 YAML,對應的文件被稱為 META.yml。2010年,發布了 CPAN::Meta::Spec 的第2版,該版本強制要求使用 JSON 格式來保存元數據,以解決某些 YAML 序列化器之間的兼容性問題,並避免破壞無法處理新版本規範的舊客戶端。現在,CPAN::Meta 库是訪問新舊樣式元文件的標準方法。

如果安裝了 CPAN::Meta,MakeMaker 將自動為您生成 META.jsonMETA.yml 文件,並將它們添加到您的 MANIFEST 中作為 'distdir' 目標(因此是 'dist' 目標)。這旨在無縫且快速地將模塊元數據填充到 CPAN 中。如果希望關閉此功能,將 NO_META WriteMakefile() 標誌設置為 true。

在2008年奧斯陸的 QA Hackathon 上,Perl 模塊工具鏈維護人員同意使用 CPAN 元格式在工具鏈組件之間通信後配置要求。這些文件,MYMETA.jsonMYMETA.yml,是在 Makefile.PL 生成 Makefile 時生成的(如果安裝了 CPAN::Meta)。客戶端(如 CPANCPANPLUS)將讀取這些文件,查看在構建或測試分發之前必須滿足什麼先決條件。如果希望關閉此功能,將 NO_MYMETA WriteMakefile() 標誌設置為 true。

禁用擴展

如果在 Makefile.PL 中檢測到某些事件暗示沒有辦法創建模塊,但這是一個正常的狀態,那麼您可以創建一個 Makefile,它什麼也不做,但在所有“通常”的構建目標上成功。要這樣做,請使用

use ExtUtils::MakeMaker qw(WriteEmptyMakefile);
WriteEmptyMakefile();

而不是 WriteMakefile()。

如果其他模塊期望此模塊 建構 正確,而不是 工作 正確(例如,這個依賴系統的模塊在其他分發的子目錄中建構,或者在 CPAN::Bundle 中被列為依賴,但是在當前架構上以不同方式支援功能)則這可能很有用。

其他方便的功能

prompt
my $value = prompt($message);
my $value = prompt($message, $default);

prompt() 函數提供了一種簡便的方式來請求用於撰寫 makefile 的使用者輸入。它將 $message 顯示為輸入提示。如果提供了 $default,則將使用其作為默認值。該函數返回用戶選擇的 $value。

如果 prompt() 檢測到它並非在交互模式下運行,並且 STDIN 上沒有任何內容,或者如果 PERL_MM_USE_DEFAULT 環境變量設置為 true,則將使用 $default 而不進行提示。這可防止自動化過程在用戶輸入上阻塞。

如果沒有提供 $default,則將使用空字符串代替。

os_unsupported
os_unsupported();
os_unsupported if $^O eq 'MSWin32';

os_unsupported() 函數提供了一種在調用 WriteMakefile 之前正確退出您的 Makefile.PL 的方法。它本質上是一個帶有消息 "OS 不支援" 的 die

自 7.26 版本開始支援

Perl 支援的版本

請注意,雖然此模塊可在 Perl 5.6 上運行,但不再在 5.6 上進行常規測試 - 常規測試和明確支援的最早 Perl 版本是 5.8.1。然而,仍然接受用於修復 5.6 上的任何故障的補丁。

環境

PERL_MM_OPT

MakeMaker->new() 使用的命令行選項,因此也是 WriteMakefile() 使用的。該字符串將如同 shell 一樣進行拆分,並且在處理任何實際的命令行參數之前進行處理。

PERL_MM_OPT='CCFLAGS="-Wl,-rpath -Wl,/foo/bar/lib" LIBS="-lwibble -lwobble"'
PERL_MM_USE_DEFAULT

如果設置為真值,則 MakeMaker 的提示函數將始終返回默認值,而不等待用戶輸入。

PERL_CORE

與 PERL_CORE 參數相同。該參數將覆蓋此參數。

另見

Module::Build 是一個純 Perl 替代 MakeMaker 的方案,不依賴 make 或其他外部工具。可能更容易擴展以滿足您的需求。

Module::Build::Tiny 是一個極簡的純 Perl 替代 MakeMaker,遵循 Module::Build 的 Build.PL 協議,但沒有其複雜性和冗餘,僅實現模塊的安裝,將作者編寫交給 mbtiny 或其他作者工具。

Module::Install 是一個(現已不鼓勵使用的)MakeMaker 包裝器,添加了通常不可用的功能。

ExtUtils::ModuleMakerModule::Starter 都是幫助您設置分發的模塊。

CPAN::MetaCPAN::Meta::Spec 詳細解釋了 CPAN 元文件。

File::ShareDir::Install 使得安裝靜態文件(有時也稱為共享文件)變得容易。 File::ShareDir 幫助在安裝後訪問共享文件。 Test::File::ShareDir 在編寫測試時幫助使用共享文件,無論是在安裝前還是安裝後。

Dist::Zilla 是一個作者工具,允許對作者體驗進行大量自定義和擴展,僅依賴於現有的安裝工具,如 ExtUtils::MakeMaker 進行安裝。

Dist::Milla 是一個 Dist::Zilla 捆綁包,大大簡化了常見的用法。

Minilla 是一個極簡的作者工具,與 Dist::Milla 具有相同的功能,但不具備 Dist::Zilla 的開銷。

作者

Andy Dougherty doughera@lafayette.edu,Andreas König andreas.koenig@mind.de,Tim Bunce timb@cpan.org。VMS 支持由 Charles Bailey bailey@newman.upenn.edu 提供。OS/2 支持由 Ilya Zakharevich ilya@math.ohio-state.edu 提供。

目前由 Michael G Schwern schwern@pobox.com 進行維護。

請將補丁和想法發送至 makemaker@perl.org

請通過 http://rt.cpan.org/ 提交錯誤報告。請將您生成的 Makefile 連同報告一起發送。

有關更多最新信息,請參見 https://metacpan.org/release/ExtUtils-MakeMaker

存儲庫位於 https://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker

許可證

本程式是自由軟體;您可以依據 Perl 本身的相同條款重新分發或修改它。

請參閱 http://www.perl.com/perl/misc/Artistic.html