簡介
use ExtUtils::MakeMaker;
WriteMakefile(
NAME => 'Your::Module',
VERSION_FROM => 'lib/Your/Module.pm'
);
ExtUtils::MakeMaker 模塊是用于創建Makefile文件的模塊。
注:所有模塊必須以項目的方式發布到CPAN。
語法
使用ExtUtils::MakeMaker模塊來編寫目標項目的Makefile.PL 文件(Makefile.PL文件的結構稍候介紹),使用如下代碼段中的命令就可以完成目標項目的安裝。
perl Makefile.PL
make
make test
make install
項目結構說明
目標項目(需要發布到CPAN的項目)的基本結構如下所示:
Makefile.PL
MANIFEST
lib/Your/Module.pm
以上基本結構是每個項目都必需的,除此之外還有其他一些可選的結構,如下面的代碼段所示:
lib/Your/Other/Module.pm
t/some_test.t
t/some_other_test.t
Changes
README
INSTALL
MANIFEST.SKIP
bin/some_program
Makefile.PL
當你運行Makefile.PL時,它會生成一個Makefile。這就是ExtUtils::MakeMaker模塊的全部內容。
akefile.PL是一個簡單的程序,它加載ExtUtils :: MakeMaker并運行WriteMakefile()函數來生成一個Makefile。下面的代碼段是一個簡單的Makefile.PL文件的示例:
use ExtUtils::MakeMaker;
WriteMakefile(
NAME => 'Your::Module',
VERSION_FROM => 'lib/Your/Module.pm'
);
其中NAME是目標項目的頂級命名空間。VERSION_FROM是包含整個需要發布的項目的$VERSION變量的文件,通常它與您的頂級模塊相同。
MANIFEST
這個文件中列出了項目發布時包含的所有文件。下面是一個MANIFEST文件內容的示例:
Makefile.PL
MANIFEST
lib/Your/Module.pm
MANIFEST文件中的內容,對于文件路徑的分隔符必須是Unix約定的/
,即使不在Unix系統中也是一樣。這個文件你可以自己編寫也可以使用make manifest命令生成。
lib/
在這個目錄下存放目標項目的所有.pm和.pod文件,它們根據命名空間不同而分布在不同的文件夾中。
t/
在這個目錄中存放的是所有對你的模塊進行測試的代碼,每個測試文件都以.t結尾。make test命令將會運行這里的所有測試。參賽情況下所有測試文件都位于t/ 目錄下。但你也可以構建子目錄,把不同的測試文件分別放到不同的目錄下方便在測試文件較多時進行有效的管理。
t/foo/subdir_test.t
為了能夠在執行make test命令時能夠運行目標項目t/ 目錄下的所有測試代碼,你需要在Makefile.PL文件WriteMakeFile方法調用的函數中加入如下內容:
test => {TESTS => 't/*.t t/*/*.t'}
上面的代碼會使得t/目錄下的所有.t文件以及t/目錄的子目錄下的所有.t文件得以在執行make test命令時運行。當然如果在你的t/目錄下存放的測試文件有更深層級的嵌套,你還需要對test參數選項指定更多的內容。
t/foo/bar/subdir_test.t
test => {TESTS => 't/*.t t/*/*/*.t'}
從中應該覺察到規則,也就是說*
是通配符,但其不能匹配/
。
注:測試運行時的當前目錄為項目的頂級目標。
Changes
這個文件中記錄了目標項目的修改記錄。文件的格式比較自由,下面是一個可供參考的例子。
1.01 Fri Apr 11 00:21:25 PDT 2003
- thing() does some stuff now
- fixed the wiggy bug in withit()
1.00 Mon Apr 7 00:57:15 PDT 2003
- "Rain of Frogs" now supported
README
對目標項目的簡短說明,它的作用是向用戶介紹在什么情況下可以使用你的項目,以及使用這個項目的一些限制。CPAN將自動把這個文件中的內容展示給CPAN用戶,這是他們最先看到到的有關你項目的內容,并根據這些內容來判斷這個項目是否適合于他們使用。
INSTALL
有關如何安裝模塊和所有依賴關系的說明,建議包含以下信息:
- 使用這個項目必須安裝的依賴模塊
- 這個項目可運行在的Perl的最小版本
- 這個項目對操作系統的依賴
MANIFEST.SKIP
這個文件中記錄的是用于make manifest 命令使用的正則表達式,所有與這些正則表達式匹配的文件都不會被包含在make manifest命令生成的MANIFEST文件中。這些正則表達式將針對項目中找的每個文件路徑進行檢查,只要有一個正則不匹配某個文件,這個文件就會被排除在MANIFEST文件之外。
WriteMakefile 方法
WriteMakefile方法是這個模塊中對外導出的唯一方法,在這個方法中實現了ExtUtils::MakeMaker模塊的所有功能。所有的功能都是通過WriteMakefile方法的參數來控制的。
首先WriteMakefile支持的所有參數選項:
ABSTRACT 摘要,對項目的一句話(一行)說明,上傳到CPAN后會被加入到PPD文件中。
ABSTRACT_FROM 指定從一個文件的POD中提取摘要
AUTHOR 作者信息
BINARY_LOCATION
BUILD_REQUIRES 模塊構建時所依賴的包
C
CCFLAGS
CONFIG
CONFIGURE
CONFIGURE_REQUIRES 運行Makefile.PL所依賴的包
DEFINE
DESTDIR 安裝代碼的根目錄
DIR
DISTNAME 項目包的文件名
DISTVNAME 包含版本號的項目包的文件名
DLEXT
DL_FUNCS
DL_VARS
EXCLUDE_EXT
EXE_FILES
FIRST_MAKEFILE
FULLPERL
FULLPERLRUN
FULLPERLRUNINST
FUNCLIST
H
IMPORTS
INC
INCLUDE_EXT
INSTALLARCHLIB
INSTALLBIN
INSTALLDIRS
INSTALLMAN1DIR
INSTALLMAN3DIR
INSTALLPRIVLIB
INSTALLSCRIPT
INSTALLSITEARCH
INSTALLSITEBIN
INSTALLSITELIB
INSTALLSITEMAN1DIR
INSTALLSITEMAN3DIR
INSTALLSITESCRIPT
INSTALLVENDORARCH
INSTALLVENDORBIN
INSTALLVENDORLIB
INSTALLVENDORMAN1DIR
INSTALLVENDORMAN3DIR
INSTALLVENDORSCRIPT
INST_ARCHLIB
INST_BIN
INST_LIB
INST_MAN1DIR
INST_MAN3DIR
INST_SCRIPT
LD
LDDLFLAGS
LDFROM
LIB
LIBPERL_A
LIBS
LICENSE
LINKTYPE
MAGICXS
MAKE
MAKEAPERL
MAKEFILE_OLD
MAN1PODS
MAN3PODS
MAP_TARGET
META_ADD 要添加到CPAN元數據中的項目信息
META_MERGE 要添加到CPAN元數據中的項目信息
MIN_PERL_VERSION 支持的最小的Perl版本
MYEXTLIB
NAME
NEEDS_LINKING
NOECHO
NORECURS
NO_META
NO_MYMETA
NO_PACKLIST
NO_PERLLOCAL
NO_VC
OBJECT
OPTIMIZE
PERL
PERL_CORE
PERLMAINCC
PERL_ARCHLIB
PERL_LIB
PERL_MALLOC_OK
PERLPREFIX
PERLRUN
PERLRUNINST
PERL_SRC
PERM_DIR
PERM_RW
PERM_RWX
PL_FILES 指定MakeMaker在構建時運行的perl程序
PM
PMLIBDIRS
PM_FILTER
POLLUTE
PPM_INSTALL_EXEC
PPM_INSTALL_SCRIPT
PPM_UNINSTALL_EXEC
PPM_UNINSTALL_SCRIPT
PREFIX
PREREQ_FATAL 指定當不滿足項目運行時依賴時是否禁安裝,布爾值。
PREREQ_PM 項目運行時依賴的模塊
PREREQ_PRINT
PRINT_PREREQ
SITEPREFIX
SIGN
SKIP
TEST_REQUIRES
TYPEMAPS
VENDORPREFIX
VERBINST
VERSION
VERSION_FROM
VERSION_SYM
XS
XSBUILD
XSMULTI
XSOPT
XSPROTOARG
XS_VERSION
clean
depend
dist
dynamic_lib
linkext
macro
postamble
realclean
test
tool_autosplit
下面分別對WriteMakefile方法中的常用參數選項進行介紹。
ABSTRACT
指定項目的摘要,對項目的一句話(單行)說明,上傳到CPAN后會被加入到PPD文檔中。
ABSTRACT_FROM
指定從某個模塊文件的POD中提取摘要。MakeMaker會在指定模塊文件的POD中進行正則/^($package\s-\s)(.*)/
的匹配。把匹配得到的$2作為摘要。這通常是“= head1 NAME”小節的第一行。
AUTHOR
包含作者的名稱(和電子郵件地址)的字符串數組。用于PPM(Perl Package Manager)的CPAN Meta文件(META.yml或META.json)和PPD(Perl Package Description)文件。
BUILD_REQUIRES
模塊構建時所依賴的包,在運行時并不依賴這些包。該參數值的類型為hashref,在這個hashref中key為依賴的包名,value為依賴包的版本號。
CONFIGURE_REQUIRES
運行Makefile.PL文件時所依賴的包,在項目構建和運行時并不依賴這些包。該參數值的類型為hashref,在這個hashref中key為依賴的包名,value為依賴包的版本號。
META_ADD
META_MERGE
把項目的信息添加到CPAN的元數據中,如果他們具有與默認元數據相同的關鍵字META_ADD與META_MERGE的行為將有所不同。META_ADD將用會覆蓋默認值,而META_MERGE將會把這里的值與默認值合并。
除非你確定要覆蓋默認值,否則請優先使用META_MERGE。
注:這些數據僅用于生成META.yml和META.json,而不會直接被META.yml和META.json使用。
這兒默認使用的是CPAN Meta 規范 1.4 版本。如果要使用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',
},
},
},
PREREQ_FATAL
此選項被指定一個布爾值,用于說明當不滿足項目運行時依賴時是否禁安裝。如果值為真,則當PREREQ_PM 中指定的模塊不被滿足時將發生致命錯誤而退出安裝。
不建議設置此參數為真。你可以編寫一個測試(t/00compile.t)來檢查你的代碼運行時所依賴的包是否滿足,如果不滿足則可以在運行測試時就給出詳細的提醒,并且模塊安裝工具會根據你在測試過程中給出的信息自動解決依賴關系。
PL_FILES
MakeMaker在構建時會運行你用此參數選項指定的perl文件。默認情況下頂級目錄中名為*.PL(Makefile.PL和Build.PL除外)的任何文件都將被假定為一個Perl程序,在構建過程中MakeMaker會運行這些程序,并將其自己的basename作為參數。如下面的代碼段所示:
perl foo.PL foo
你可以通過PL_FILES參數選項指定自己的一組文件來覆蓋此默認行為。PL_FILES接受一個hashref,鍵名是要運行的文件,鍵值是運行文件時傳入的第一個參數。
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
PREREQ_PM
項目運行時所依賴的包。該參數值的類型為hashref,在這個hashref中key為依賴的包名,value為依賴包的版本號。如果所指定的版本號為0,則說明是所有版本都可以。下面是一個例子:
PREREQ_PM => {
# Require Test::More at least 0.47
"Test::More" => "0.47",
# Require any version of Acme::Buffy
"Acme::Buffy" => 0,
}
結束
暫時先寫這么多,對于我自己來說夠用了,后續在實際使用過程中慢慢被全。
a