ExtUtils::MM_VMS - 在 ExtUtils::MakeMaker 中覆盖 UN*X 行为的方法
Do not use this directly.
Instead, use ExtUtils::MM and it will figure out which MM_*
class to use for you.
有关此处提供的方法的文档,请参见 ExtUtils::MM_Unix。此包覆盖了这些方法的实现,而不是语义。
将列表转换为大约 80 列的字符串。
覆盖默认 MM_Unix 方法的方法标记为“(覆盖)”,而 MM_VMS 独有的方法标记为“(特定)”。对于覆盖的方法,文档仅限于解释此方法为何覆盖 MM_Unix 方法;有关更多详细信息,请参见 ExtUtils::MM_Unix 文档。
尝试确定正在构建的扩展的名称。我们从当前目录的名称开始。但是,由于 VMS 文件名不区分大小写,因此我们查找与当前目录名称匹配的 .pm 文件(大概是此扩展的“主” .pm 文件),并尝试找到一个 package
语句,从中获取 Mixed::Case 包名称。
使用 VMS 文件规范语法和 CLI 命令查找并调用 Perl 映像。
用于 MM->fixin() 的辅助例程,重写是因为不存在实际的 shebang 行会被 shell 解释,所以我们只是在前面添加 $Config{startperl} 并保留 shebang 行参数以供其可能包含的任何开关使用。
遵循 VMS 可执行文件命名约定。如果传入的名称与可执行文件不完全匹配,则追加 .Exe(或等效项)以检查可执行映像,并追加 .Com 以检查 DCL 过程。如果失败,则检查 DCL$PATH 中的目录,最后检查 Sys$System: 中是否存在具有指定名称的可执行文件,无论是否带有 .Exe 等效后缀。
要传递的宏定义列表必须使用 /MACRO 限定符指定,并且不能添加另一个 /DEFINE 限定符。我们在这里将自己的逗号添加到 $(PASTHRU_DEFINE) 的内容中,因为它通常为空,而 CCFLAGS 中始终存在的逗号会生成缺少限定符值的错误。
VMS 希望每个文件都有一个点,所以我们不能有一个名为 'pm_to_blib' 的文件,它变成了 'pm_to_blib.',而 MMS/K 不够智能,无法在您有一个名为 'pm_to_blib' 的目标时,它应该查找 'pm_to_blib.'。
所以在 VMS 中,它是 pm_to_blib.ts。
如果传入的名称未指定可读文件,则追加 .com 或 .pl 并再次尝试,因为在 VMS 下的所有文件上都有文件类型是惯例。
使用 VMS 语法文件名中合法的字符作为分隔符。
(重写) 由于连接 VMS 文件路径的困难,我们必须预先扩展 DEST* 变量。
VMS 上目录路径和文件名之间没有分隔符。
提供 VMS 特定的各种实用程序命令形式。
将 DEV_NULL 设置为空,因为我不知道如何在 VMS 上执行此操作。
将 EQUALIZE_TIMESTAMP 更改为将目标文件的修订日期设置为源文件之后的 1 秒,因为 MMK 将源文件和目标文件的完全相同的修订日期解释为需要更新目标的标志。
添加 PERL_VMS、MM_VMS_REVISION 和 MM_VMS_VERSION。
MM_VMS_REVISION 用于在 MM_VMS 具有 $VERSION 之前的向后兼容性。
使用 VMS 语义覆盖 *DEFINE_VERSION 宏。将 MAKEMAKER 文件路径转换为 VMS 样式。
修复了大量文件和目录宏,以确保无论输入语法如何都使用 VMS 语法。还将文件列表改为逗号分隔。
清除默认的 .SUFFIXES 并放入我们自己的列表。
绕过 shell 脚本并直接为 CC 生成限定符(但如果此扩展名存在 shell 脚本,则警告用户)。将多个 /Defines 折叠为一个,因为某些 C 编译器只关注命令行中此限定符的一个实例。
添加指令以在处理 #include <sys/foo.h> 指令时将 C 预处理器指向正确的位置。还以与 MM_Unix 方法略有不同的方式构建 CC 命令行。
为 Makefile 参数添加一些可疑的额外宏。
还保留旧的 $(SAY) 宏,以防有人使用它。
某些值的 VMS 式默认值。
macro description default
ZIPFLAGS flags to pass to ZIP -Vu
COMPRESS compression command to gzip
use for tarfiles
SUFFIX suffix to put on -gz
compressed files
SHAR shar command to use vms_share
DIST_DEFAULT default target to use to tardist
create a distribution
DISTVNAME Use VERSION_SYM instead of $(DISTNAME)-$(VERSION_SYM)
VERSION for the name
在命令行中使用 VMS 语法。特别是,$(DEFINE) 和 $(PERL_INC) 已被拉入 $(CCCMD)。还使用 MM[SK] 宏。
使用 MM[SK] 宏。
使用 MM[SK] 宏和 VMS 命令行来编译 C 代码。
由于限定符及其所有子限定符必须一起考虑,因此没有简单的替换方法,所以我们使用自己的实用程序例程进行替换。
将扩展规范转换为 Unix 格式,因为这将与 XSBUILD 数据结构中的内容匹配。
创建 VMS 链接器选项文件,指定此扩展的共享映像的通用符号,并列出应链接到的其他共享映像或库。
覆盖以修复 -o 标志。
使用 VMS Link 命令。
使用 VMS 命令来操作对象库。
使用 VMS 命令来操作对象库。
清理一些特定于操作系统的文件。加上用于缩短许多命令的临时文件。以及名称混淆数据库。
调用 shar、tar 和 zip 的语法与 Unix 不同。
多次解决 DCL 的 255 个字符限制,并在某些情况下使用 VMS 风格的命令行引用。
使用 VMS 风格的语法来表示文件;直接在这里执行比让 MM_Unix 方法重复调用 catfile
更便宜。此外,如果我们必须重建 Config.pm,则使用 MM[SK] 来完成。
着手使用 VMS 命令构建一组新的 Perl 映像。由于 VMS 执行动态加载,因此无需将每个扩展静态链接到 Perl 映像中,因此这不是正常的构建路径。因此,它还没有真正经过测试,并且可能不完整。
确保标记目标的冒号前面有空格,以便区分目标分隔符和作为文件规范的一部分出现的冒号。
在 VMS 上进行前缀化很简单。每个都应该简单地
perl_root:[some.dir]
可以简单地转换为
volume:[your.prefix.some.dir]
否则你会得到默认布局。
实际上,你的搜索前缀会被忽略,而 $Config{vms_prefix} 会被使用。
perl 会将 "<foo>" 误认为是输入重定向。因此,我们使用本地的 Write 命令代替。此外,它更快。
引用,不要转义。
引用,不要转义。
256 个字符。
消除输出到 MMS/MMK 文件中的宏。
(File::Spec::VMS 曾经为我们做这件事,但它正在被移除)
使用 %$self
中同名元素的内容,扩展文本字符串中的 MM[KS]/Make 宏,并将结果作为 Unix 语法中的文件规范返回。
注意:这是该方法的规范版本。 File::Spec::VMS 中的版本已弃用。
my $path = $mm->fixpath($path);
my $path = $mm->fixpath($path, $is_dir);
用于清理问题 MM[SK]/Make 宏的通用例程。扩展任何目录规范中的宏,以避免在运行 MM[SK] 时将两个 VMS 语法目录并置。还扩展所有宏的表达式,以便我们可以知道扩展的长度,并在运行 MM[KS] 时避免超过 DCL 的命令缓冲区。
fixpath() 检查结果是否与当前默认目录中目录的名称匹配,并相应地返回目录或文件规范。$is_dir
可以设置为 true 强制 fixpath() 将路径视为目录,或设置为 false 强制其视为文件。
注意:这是该方法的规范版本。 File::Spec::VMS 中的版本已弃用。
VMS 是 VMS。
正在检查的 make 类型在 VMS 上都不可用,而且我们的 $self->{MAKE} 是一个未展开(也无法展开)的宏,其值只有 make 工具本身知道。
返回一个合适的字符串,描述正在编写的 Makefile 的类型。
最初作者 Charles Bailey [email protected]
维护者 Michael G Schwern [email protected]
有关补丁和联系信息,请参阅 ExtUtils::MakeMaker。