内容

名称

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 程序,它们使用操作系统 shell,同样语法也不兼容,因此此模块的用户必须了解为其编写了 Makefile 的 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

可以通过添加 KEY=VALUE 形式的参数来修改要生成的 Makefile。例如

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 和 ~/lib)。确切位置的确定方式很复杂,取决于 Perl 的配置方式。INSTALL_BASE 的工作方式更像是其他构建系统所说的“前缀”,而不是 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 二进制文件,请说

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

在任何情况下,您都将收到有关安装新二进制文件到 INSTALLBIN 的 inst_perl 目标的正确调用的提示。

默认情况下,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 附带的标准扩展。

如果扩展在 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 可以帮助您最大程度地减少所需的输入:INSTALLPRIVLIB 和 INSTALLARCHLIB 之间的通常关系由 Configure 在 Perl 编译时确定。MakeMaker 支持设置 INSTALLPRIVLIB 的用户。如果设置了 INSTALLPRIVLIB,但未设置 INSTALLARCHLIB,则 MakeMaker 将默认后者为 INSTALLPRIVLIB 的相同子目录,就像 Configure 为 %Config 中的对应项所决定的一样,否则它将默认设置为 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)和 PPM(Perl 包管理器)的 PPD(Perl 包描述)文件。

二进制位置

用于创建二进制包的 PPD 文件时。它可以设置为特定体系结构的二进制存档的完整路径或相对路径或 URL。例如

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

构建一个 PPD 包,该包引用位于相对于 PPD 本身的 `x86` 目录中的 `Agent` 包的二进制文件。

构建需求

在 6.55_03 及更高版本中可用。

构建模块所需的模块哈希,但不需要运行它。

这将进入您的 META.yml 的 `build_requires` 字段和您的 META.json 的 `prereqs` 字段的 `build` 中。

如果未指定此属性,则默认为 `{ "ExtUtils::MakeMaker" => 0 }`。

格式与 PREREQ_PM 相同。

C

对 *.c 文件名的数组的引用。从目录扫描和 XS 属性哈希的值部分初始化。目前 MakeMaker 未使用它,但在 Makefile.PL 中可能很方便。

CCFLAGS

将在编译器调用命令行中包含在 INC 和 OPTIMIZE 参数之间的字符串。请注意,设置此项将覆盖其默认值 ($Config::Config{ccflags});要保留它,请直接包含默认值,例如

CCFLAGS => "$Config::Config{ccflags} ..."
配置

数组引用。例如 [qw(archname manext)] 从 config.sh 定义 ARCHNAME 和 MANEXT。MakeMaker 将在 CONFIG 中添加以下值:ar cc cccdlflags ccdlflags cpprun dlext dlsrc ld lddlflags ldflags libc lib_ext obj_ext ranlib sitelibexp sitearchexp so

配置

CODE 引用。子例程应返回一个哈希引用。哈希可能包含其他属性,例如 {LIBS => ...},这些属性必须通过某种评估方法确定。

配置需求

在 6.52 及更高版本中可用。

一个模块的哈希,这些模块是运行 Makefile.PL 本身所需的,但不是运行你的发行版所需的。

这将进入你的 META.yml 文件的 configure_requires 字段和你的 META.json 文件的 configureprereqs 字段。

如果未指定此属性,则默认为 `{ "ExtUtils::MakeMaker" => 0 }`。

格式与 PREREQ_PM 相同。

DEFINE

类似于 "-DHAVE_UNISTD_H"

DESTDIR

这是代码将被安装到的根目录。它会将自身添加到正常的路径前缀。例如,如果你的代码通常会安装到 /usr/local/lib/perl,你可以设置 DESTDIR=~/tmp/,安装将进行到 ~/tmp/usr/local/lib/perl

这主要用于重新打包 Perl 模块的人。

注意:由于 make 的性质,在你的 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。

在一些 . 有特殊含义的操作系统上,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 下使用。提供的例程名称将以与 XS() 宏扩展 XSUB 名称相同的方式扩展。默认为

{"$(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 目录。Make realclean 将从那里再次删除它们。

如果您的可执行文件以 #!perl 或 #!/usr/bin/perl 开头,MakeMaker 将将其更改为调用 perl 'Makefile.PL' 的路径,以便即使 perl 不在 /usr/bin/perl 中,程序也能正常运行。

FIRST_MAKEFILE

要生成的 Makefile 的名称。这用于为 MAP_TARGET 生成的第二个 Makefile。

默认为 'Makefile' 或 VMS 上的 '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' 时获取手册页。默认为 $Config{installman*dir}。

如果设置为 'none',则不会安装任何手册页。

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' 时获取手册页。默认值为 $(SITEPREFIX)/man/man$(MAN*EXT)。

如果设置为 'none',则不会安装任何手册页。

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' 时获取手册页。默认值为 $(VENDORPREFIX)/man/man$(MAN*EXT)。

如果设置为 'none',则不会安装任何手册页。

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' 时存放手册页的目录

INST_MAN3DIR

在 'make' 时存放手册页的目录

INST_SCRIPT

在 'make' 期间应安装可执行文件的目录。默认值为 "./blib/script",仅在测试期间使用虚拟位置。make install 将将 INST_SCRIPT 中的文件复制到 INSTALLSCRIPT。

LD

用于链接动态加载库的程序。

默认值为 $Config{ld}。

LDDLFLAGS

可能需要传递给 ld 的任何特殊标志,以创建适合动态加载的共享库。由 makefile 使用它。(参见 "lddlflags" in Config

默认值为 $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"]

请参阅 ODBM_File/Makefile.PL,了解需要数组的示例。如果您指定一个标量,如

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

MakeMaker 会将其转换为包含一个元素的数组。

LICENSE

在版本 6.31 及更高版本中可用。

您分发的许可条款。通常情况下,对于与 Perl 本身相同的许可证,它是 "perl_5"。

请参阅 CPAN::Meta::Spec,了解选项列表。

默认值为 "unknown"。

LINKTYPE

'static' 或 'dynamic'(默认情况下,除非 config.sh 中的 usedl=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) 将备份到此位置。

默认值为 $(FIRST_MAKEFILE).old 或 VMS 上的 $(FIRST_MAKEFILE)_old。

MAN1PODS

包含 pod 文件的哈希引用。MakeMaker 将默认将其设置为所有包含 POD 指令的 EXE_FILES 文件。此处列出的文件将被转换为手册页,并按照配置时请求的方式安装。

此哈希应该将 POD 文件(或包含 POD 的脚本)映射到 blib/man1/ 目录下的手册文件名,如以下示例所示

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

哈希引用,将 *.pm 和 *.pod 文件分配到要写入手册页面的文件。MakeMaker 解析所有 *.pod 和 *.pm 文件以查找 POD 指令。包含 POD 的文件将成为 MAN3PODS 哈希引用的默认键。然后,这些文件将在 make 期间转换为手册页,并在 make install 期间安装。

类似于 MAN1PODS 的示例。

MAP_TARGET

如果打算生成新的 perl 二进制文件,此变量可以保存该二进制文件的名称。默认为 perl

META_ADD
META_MERGE

在 6.46 及更高版本中可用。

要添加到 CPAN 元数据文件(META.ymlMETA.json)中的项目的哈希引用。

它们在具有与默认元数据相同的键时的行为方式不同。META_ADD 将使用自己的值覆盖默认值。META_MERGE 将其值与默认值合并。

除非您想覆盖默认值,否则请优先使用 META_MERGE,以便利用任何未来的默认值。

在涉及先决条件的情况下,如果使用 META_MERGE,先决条件将与其对应的 WriteMakefile() 参数合并(PREREQ_PM 合并到 {prereqs}{runtime}{requires},BUILD_REQUIRES 合并到 {prereqs}{build}{requires},CONFIGURE_REQUIRES 合并到 {prereqs}{configure}{requires},TEST_REQUIRES 合并到 {prereqs}{test}{requires})。当使用 META_ADD 指定先决条件时,添加到文件中的唯一先决条件来自元数据,而不是 WriteMakefile() 参数。

请注意,这些配置选项仅用于生成 META.ymlMETA.json - 它们不用于 MYMETA.ymlMYMETA.json。因此,这些字段中的数据不应用于动态(用户端)配置。

默认情况下,使用 CPAN 元数据规范 1.4。为了使用 CPAN 元数据规范 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

如果为真,则在“make distdir”期间抑制生成 META.yml 和 META.json 模块元数据文件并将其添加到 MANIFEST 中。

默认为 false。

NO_MYMETA

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

如果为真,则在“perl Makefile.PL”期间抑制生成 MYMETA.yml 和 MYMETA.json 模块元数据文件。

默认为 false。

NO_PACKLIST

在 6.7501 及以上版本中可用。

如果为真,则抑制为安装写入 packlist 文件。

默认为 false。

NO_PERLLOCAL

在 6.7501 及以上版本中可用。

如果为真,则抑制将安装追加到 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 之前运行,并且不包含 INST_LIB 和 INST_ARCH 在其 @INC 中。这种明显奇怪的行为是为了向后兼容(并且它有点 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

一个过滤器程序,按照传统的 Unix 意义(从 stdin 输入,到 stdout 输出),在构建期间(在 pm_to_blib() 阶段)传递给每个 .pm 文件。默认情况下它为空,这意味着没有进行过滤。您可以使用

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_UNINSTALL_EXEC

在 6.8502 及更高版本中可用。

用于运行下面 PPM_UNINSTALL_SCRIPT 的可执行文件名称。(例如 perl)

PPM_UNINSTALL_SCRIPT

在 6.8502 及更高版本中可用。

在 Perl 包管理器删除包之前执行的脚本名称。

PREFIX

这将覆盖所有默认的安装位置。手册页、库、脚本等... MakeMaker 将尝试根据您的 Config 默认值对新 PREFIX 下的位置进行合理的猜测。如果失败,它将回退到一个对您的平台来说应该合理的结构。

如果您指定了 LIB 或任何 INSTALL* 变量,它们将不受 PREFIX 的影响。

PREREQ_FATAL

布尔值。如果此参数为真,则缺少必需的模块(或其正确版本)将是致命的。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

布尔值。如果此参数为真,则先决条件将打印到标准输出,MakeMaker 将退出。输出格式是可评估的哈希引用。

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

如果发行版定义了最小所需的 perl 版本,则将其作为以下形式的附加行添加到输出中

$MIN_PERL_VERSION = '5.008001';

如果 BUILD_REQUIRES 不为空,它将被转储为 $BUILD_REQUIRES 哈希引用。

PREREQ_PRINT 的 RedHatism。输出格式不同,不过

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

如果存在,最小所需的 perl 版本将如下所示

perl(perl)>=5.008001
SITEPREFIX

与 PERLPREFIX 相似,但仅适用于站点安装位置。

默认为 $Config{siteprefixexp}。5.6.0 之前的 Perl 在 Config 中没有明确的站点前缀。在这些情况下,将使用 $Config{installprefix}。

可被 PREFIX 覆盖

SIGN

在 6.18 及以上版本中可用。

如果为真,则在 'make distdir' 期间,通过 'cpansign -s' 在 distdir 中执行生成和添加到 MANIFEST 的 SIGNATURE 文件。

请注意,您需要安装 Module::Signature 模块才能执行此操作。

默认为 false。

SKIP

数组引用。例如 [qw(name1 name2)] 跳过(不写入)Makefile 的部分。注意!不要将 SKIP 属性用于微不足道的加速。它可能会严重损害生成的 Makefile。仅当您确实需要它时才使用它。

TEST_REQUIRES

在 6.64 及以上版本中可用。

测试模块所需的模块的哈希,但不需要运行或构建它。

这将进入您的 META.yml 文件的 build_requires 字段和您的 META.json 文件的 prereqs 字段的 test 中。

格式与 PREREQ_PM 相同。

TYPEMAPS

类型映射文件名数组的引用。当类型映射位于当前目录以外的某个目录中或未命名为 typemap 时使用此选项。列表中的最后一个类型映射优先。当前目录中的类型映射具有最高优先级,即使它未在 TYPEMAPS 中列出。默认系统类型映射具有最低优先级。

VENDORPREFIX

类似于 PERLPREFIX,但仅适用于供应商安装位置。

默认为 $Config{vendorprefixexp}。

可被 PREFIX 覆盖

VERBINST

如果为真,make install 将是详细的

VERSION

用于分发包的版本号。默认为 0.1。

VERSION_FROM

您可以让 MakeMaker 解析文件来确定版本号,而不是在 Makefile.PL 中指定 VERSION。解析例程要求 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';

(在前面的行上放置 mylocal 将可以正常工作。)

“版本字符串”不兼容,不应使用。

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

version 对象是可以的。从 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

一个经过清理的 VERSION,其中 . 被替换为 _。对于 . 具有特殊含义的地方(某些文件系统、RCS 标签等),此属性很有用。

XS

.xs 文件的哈希引用。MakeMaker 将默认此属性。例如:

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

在 make clean 操作中,.c 文件将自动包含在要删除的文件列表中。

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 目标,因此 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 参数用于此目的。

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 => ''}

使用 5.0 之前的 MakeMaker。从 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,它是一组用于嵌入的实用程序。

如果您仍然需要不同的解决方案,请尝试开发另一个适合您需求的子例程,并将差异提交到 [email protected]

有关所有 MakeMaker 方法的完整描述,请参见 ExtUtils::MM_Unix

以下是一个向生成的 Makefile 添加新目标的简单示例

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

MAKE_FRAG
}

告别 Cargo Cult 编程

WriteMakefile() 现在对它的参数进行一些基本完整性检查,以防止出现拼写错误和格式错误的值。这意味着过去有效的一些操作现在会抛出警告,并可能产生内部错误。

一些最常见的错误

MAN3PODS => ' '

这通常用于抑制手册页的创建。MAN3PODS 接受一个哈希引用,而不是一个字符串,但上述代码在旧版本的 MakeMaker 中意外地起作用了。

正确的代码是 MAN3PODS => { }

Hintsfile 支持

MakeMaker.pm 使用来自 Config.pm 的特定于体系结构的信息。此外,它还评估 hints/ 目录中的特定于体系结构的提示文件。提示文件预计要像 PERL_SRC/hints 中的对应文件一样命名,但要使用 .pl 文件名扩展名(例如 next_3_2.pl)。它们只是由 MakeMaker 在 WriteMakefile() 子例程中 eval,并且可以用于执行命令以及包含特殊变量。选择提示文件的规则与 Configure 中的规则相同。

提示文件在将传递给 WriteMakefile 的参数填充到哈希引用 $self 中后立即被 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 生成一个 tar 文件,并删除该目录。最后执行一个 $(POSTOP) 命令,该命令默认为空命令。

make dist

默认为 $(DIST_DEFAULT),而 $(DIST_DEFAULT) 又默认为 tardist。

make uutardist

首先运行 tardist,然后对 tar 文件进行 uuencode 编码。

make shdist

首先执行 distdir。然后执行一个 $(PREOP) 命令,该命令默认为空命令。接下来,它在该目录上运行 shar 生成一个 shar 文件,并再次删除中间目录。最后执行一个 $(POSTOP) 命令,该命令默认为空命令。注意:为了使 shdist 正常工作,必须使用一个可以处理目录的 shar 程序。

make zipdist

首先执行 distdir。然后执行一个 $(PREOP) 命令,该命令默认为空命令。在该目录上运行 $(ZIP) $(ZIPFLAGS) 生成一个 zip 文件。然后删除该目录。最后执行一个 $(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 黑客马拉松上,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 unsupported”的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 是 MakeMaker 的纯 Perl 替代方案,它不依赖于 make 或任何其他外部工具。它可能更容易扩展以满足您的需求。

Module::Build::Tiny 是 MakeMaker 的最小纯 Perl 替代方案,它遵循 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 [email protected],Andreas König [email protected],Tim Bunce [email protected]。VMS 支持由 Charles Bailey [email protected] 提供。OS/2 支持由 Ilya Zakharevich [email protected] 提供。

目前由 Michael G Schwern [email protected] 维护

将补丁和想法发送到 [email protected]

通过 http://rt.cpan.org/ 发送错误报告。请将您生成的 Makefile 与您的报告一起发送。

有关更多最新信息,请参见 https://metacpan.org/release/ExtUtils-MakeMaker

存储库位于 https://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker

许可证

本程序是自由软件;您可以在与 Perl 本身相同的条款下重新发布和/或修改它。

参见 https://perldotcom.perl5.cn/perl/misc/Artistic.html