内容

名称

perlcygwin - Cygwin 的 Perl

概要

本文档将帮助您在 Cygwin 上配置、制作、测试和安装 Perl。本文档还介绍了 Cygwin 的功能,这些功能将影响 Perl 在运行时的行为。

注意:Cygwin 有可用的预编译 Perl 软件包,并且在正常的 Cygwin 安装中提供了 Perl 版本。如果您不需要自定义配置,请考虑使用其中一个软件包。

在 Cygwin 上编译 Perl 的先决条件

Cygwin = GNU+Cygnus+Windows(离开 UNIX 前不要错过它)

Cygwin 工具是流行的 GNU 开发工具的 Win32 平台移植。它们得益于 Cygwin 库的运行,该库提供了 UNIX 系统调用和这些程序期望的环境。有关此项目的更多信息,请访问

https://www.cygwin.com/

需要最新的网络或商业版 Cygwin。

在本文档上次更新时,Cygwin 3.0.7 为最新版本。

Cygwin 配置

在构建 Perl 时,可能需要对 Cygwin 设置进行一些更改,以便 Perl 能够干净地构建。对于正常的 Perl 使用,不需要进行这些更改。

注意:构建的二进制文件将在所有 Win32 版本上运行。它们不依赖于您的主机系统或 Cygwin 配置(二进制/文本挂载、cygserver)。唯一的依赖关系来自硬编码路径名,如 /usr/local。但是,您的主机系统和 Cygwin 配置会影响 Perl 的运行时行为(请参阅 "TEST")。

在 CYGWIN 上配置 PERL

hints/cygwin.sh 的帮助下,Configure 收集的默认选项将构建一个支持动态加载的 Perl(需要一个共享的 cygperl5_16.dll)。

这将运行 Configure 并保留记录

./Configure 2>&1 | tee log.configure

如果您愿意接受所有默认值,请使用 -de 运行 Configure。但是,有几个有用的自定义项可用。

在 Cygwin 上剥离 Perl 二进制文件

可以剥离构建过程创建的 EXE 和 DLL。生成的二进制文件将明显更小。如果您希望剥离二进制文件,可以在 Configure 提示时添加 -s 选项,

Any additional ld flags (NOT including libraries)? [none] -s
Any special flags to pass to g++ to create a dynamically loaded
library?
[none] -s
Any special flags to pass to gcc to use dynamic linking? [none] -s

或者,您可以编辑 hints/cygwin.sh 并取消注释文件末尾附近的相关变量。

Cygwin 上 Perl 的可选库

一些 Perl 函数和模块依赖于某些可选库的存在。如果这些库安装在列为用于库搜索的目录之一中,Configure 将找到它们。大多数库的预构建软件包可从 Cygwin 安装程序中获取。

Cygwin 上 Perl 的配置时选项

INSTALL 文档描述了几个配置时选项。其中一些选项适用于 Cygwin,而另一些选项目前还不可用。此外,其中一些选项是实验性的。您可以在配置提示您时选择一个选项,也可以在命令行上定义(取消定义)符号。

在 Cygwin 上进行 MAKE

只需运行 make 并等待

make -jn 2>&1 | tee log.make

其中 n 是您希望同时进行的最大编译数;省略此参数与指定 -j1 相同。

在 Cygwin 上进行测试

运行测试套件有两个步骤

make test 2>&1 | tee log.make-test

cd t; ./perl harness 2>&1 | tee ../log.harness

两次运行相同的测试,但以 ./perl harness 运行时会提供更多信息,并且您可以通过指定以下内容来并行运行测试

cd t; TEST_JOBS=n ./perl harness 2>&1 | tee ../log.harness

其中 n 是同时运行的最大测试数。

测试结果会根据您的主机系统和 Cygwin 配置而有所不同。如果某个测试可以在某些 Cygwin 设置中通过,则始终会尝试该测试,并且会记录可解释的测试失败。Perl 有可能通过所有测试,但更有可能由于以下原因之一而导致某些测试失败。

Cygwin 上的文件权限

UNIX 文件权限基于 {read,write,execute} 的模式位集,分别针对 {user,group,other}。默认情况下,Cygwin 仅跟踪表示为 UNIX 文件用户写位(文件始终可读,如果文件具有 .{com,bat,exe} 扩展名或以 #! 开头,则文件可执行,目录始终可读且可执行)。在具有 ntea CYGWIN 设置的 WinNT 上,其他模式位存储为扩展文件属性。在具有默认 ntsec CYGWIN 设置的 WinNT 上,权限使用标准 WinNT 安全描述符和访问控制列表。如果没有这些选项之一,则这些测试将失败(列表尚未更新)

Failed Test           List of failed
------------------------------------
io/fs.t               5, 7, 9-10
lib/anydbm.t          2
lib/db-btree.t        20
lib/db-hash.t         16
lib/db-recno.t        18
lib/gdbm.t            2
lib/ndbm.t            2
lib/odbm.t            2
lib/sdbm.t            2
op/stat.t             9, 20 (.tmp not an executable extension)

NDBM_File 和 ODBM_File 在 FAT 文件系统上不起作用

不要在 FAT 文件系统上使用 NDBM_File 或 ODBM_File。它们可以在 FAT 文件系统上构建,但许多测试将失败

../ext/NDBM_File/ndbm.t       13  3328    71   59  83.10%  1-2 4 16-71
../ext/ODBM_File/odbm.t      255 65280    ??   ??       %  ??
../lib/AnyDBM_File.t           2   512    12    2  16.67%  1 4
../lib/Memoize/t/errors.t      0   139    11    5  45.45%  7-11
../lib/Memoize/t/tie_ndbm.t   13  3328     4    4 100.00%  1-4
run/fresh_perl.t                          97    1   1.03%  91

如果您打算仅在 FAT 上运行(或在 FAT 上使用 AnyDBM_File),请使用 -Ui_ndbm 和 -Ui_dbm 选项运行 Configure,以防止构建 NDBM_File 和 ODBM_File。

对于 NTFS(并且没有 CYGWIN=nontsec),即使 perl 是在 FAT 上构建的,也不应该有任何问题。

io_* 测试中的 fork() 失败

fork() 失败可能导致以下测试失败

ext/IO/lib/IO/t/io_multihomed.t
ext/IO/lib/IO/t/io_sock.t
ext/IO/lib/IO/t/io_unix.t

请参阅下方的 "杂项" 中关于 fork 的注释。

Cygwin 端口的特定功能

Cygwin 上的脚本可移植性

Cygwin 在 Win32 系统上提供类 UNIX 语义方面做得非常出色。但是,除了上面提到的项目之外,还有一些您应该了解的差异。这是一份非常简短的可移植性指南,更多信息可以在 Cygwin 文档中找到。

预构建方法

Cwd::cwd

返回当前工作目录。

Cygwin::pid_to_winpid

将 Cygwin pid 转换为相应的 Windows pid(可能相同,也可能不同)。

Cygwin::winpid_to_pid

将 Windows pid 转换为相应的 Cygwin pid(如果存在)。

Cygwin::win_to_posix_path

将 Windows 路径转换为相应的 Cygwin 路径,并遵循当前装入点。使用第二个非空参数返回绝对路径。双字节字符不会被转换。

Cygwin::posix_to_win_path

将 Cygwin 路径转换为相应的 Cygwin 路径,并遵循当前装入点。使用第二个非空参数返回绝对路径。双字节字符不会被转换。

Cygwin::mount_table()

返回 [mnt_dir, mnt_fsname, mnt_type, mnt_opts] 数组。

perl -e 'for $i (Cygwin::mount_table) {print join(" ",@$i),"\n";}'
/bin c:\cygwin\bin system binmode,cygexec
/usr/bin c:\cygwin\bin system binmode
/usr/lib c:\cygwin\lib system binmode
/ c:\cygwin system binmode
/cygdrive/c c: system binmode,noumount
/cygdrive/d d: system binmode,noumount
/cygdrive/e e: system binmode,noumount
Cygwin::mount_flags

返回指定装载点的装载类型和标志。mntent->mnt_type(始终为“system”或“user”)的逗号分隔字符串,然后为 mntent->mnt_opts,其中第一个始终为“binmode”或“textmode”。

system|user,binmode|textmode,exec,cygexec,cygdrive,mixed,
notexec,managed,nosuid,devfs,proc,noumount

如果参数为“/cygdrive”,则仅返回卷装载设置和 cygdrive 装载前缀。

用户装载覆盖系统装载。

$ perl -e 'print Cygwin::mount_flags "/usr/bin"'
system,binmode,cygexec
$ perl -e 'print Cygwin::mount_flags "/cygdrive"'
binmode,cygdrive,/cygdrive
Cygwin::is_binmount

如果给定的 cygwin 路径是二进制装载的,则返回 true;如果路径以文本模式装载,则返回 false。

Cygwin::sync_winenv

Cygwin 不会初始化所有原始 Win32 环境变量。请参阅此页面底部 https://cygwin.com/cygwin-ug-net/setup-env.html 中的“受限 Win32 环境”。

从 cygwin 程序调用的某些 Win32 程序可能需要一些环境变量,例如 ADODB 需要 %COMMONPROGRAMFILES%。调用 Cygwin::sync_winenv() 将所有 Win32 环境变量复制到您的进程,请注意 cygwin 会在遇到非 POSIX 路径时发出警告。

在 CYGWIN 上安装 PERL

这将安装 Perl,包括 man 页面。

make install 2>&1 | tee log.make-install

注意:如果 STDERR 被重定向,make install 不会提示您将 perl 安装到 /usr/bin 中。

您可能需要成为 管理员才能运行 make install。如果不是,您必须具有对相关目录的写访问权限。

有关以 HTML 格式安装 Perl 文档的信息,请参阅 INSTALL 文档。

CYGWIN 上的 MANIFEST

这些是 Perl 版本中包含对 Cygwin 的引用的文件。这些非常简短的注释试图解释所有条件代码的原因。希望保持最新状态将允许 Cygwin 端口尽可能保持简洁。

文档
INSTALL README.cygwin README.win32 MANIFEST
pod/perl.pod pod/perlport.pod pod/perlfaq3.pod
pod/perldelta.pod pod/perl5004delta.pod pod/perl56delta.pod
pod/perl561delta.pod pod/perl570delta.pod pod/perl572delta.pod
pod/perl573delta.pod pod/perl58delta.pod pod/perl581delta.pod
pod/perl590delta.pod pod/perlhist.pod pod/perlmodlib.pod
pod/perltoc.pod Porting/Glossary pod/perlgit.pod
Porting/updateAUTHORS.pl
dist/Cwd/Changes ext/Compress-Raw-Zlib/Changes
dist/Time-HiRes/Changes
ext/Compress-Raw-Zlib/README ext/Compress-Zlib/Changes
ext/DB_File/Changes ext/Encode/Changes ext/Sys-Syslog/Changes
ext/Win32API-File/Changes
lib/ExtUtils/CBuilder/Changes lib/ExtUtils/Changes
lib/ExtUtils/NOTES lib/ExtUtils/PATCHING lib/ExtUtils/README
lib/Net/Ping/Changes lib/Test/Harness/Changes
lib/Term/ANSIColor/ChangeLog lib/Term/ANSIColor/README
构建、配置、制作、安装
cygwin/Makefile.SHs
ext/IPC/SysV/hints/cygwin.pl
ext/NDBM_File/hints/cygwin.pl
ext/ODBM_File/hints/cygwin.pl
hints/cygwin.sh
Configure             - help finding hints from uname,
                        shared libperl required for dynamic loading
Makefile.SH Cross/Makefile-cross-SH
                      - linklibperl
Porting/patchls       - cygwin in port list
installman            - man pages with :: translated to .
installperl           - install dll, install to 'pods'
makedepend.SH         - uwinfix
regen_lib.pl          - file permissions

plan9/mkfile
vms/descrip_mms.template
win32/Makefile
测试
t/io/fs.t             - no file mode checks if not ntsec
                        skip rename() check when not
                        check_case:relaxed
t/io/tell.t           - binmode
t/lib/cygwin.t        - builtin cygwin function tests
t/op/groups.t         - basegroup has ID = 0
t/op/magic.t          - $^X/symlink WORKAROUND, s/.exe//
t/op/stat.t           - no /dev, skip Win32 ftCreationTime quirk
                        (cache manager sometimes preserves ctime of
                        file previously created and deleted), no -u
                        (setuid)
t/op/taint.t          - can't use empty path under Cygwin Perl
t/op/time.t           - no tzset()
编译的 Perl 源代码
EXTERN.h              - __declspec(dllimport)
XSUB.h                - __declspec(dllexport)
cygwin/cygwin.c       - os_extras (getcwd, spawn, and several
                        Cygwin:: functions)
perl.c                - os_extras, -i.bak
perl.h                - binmode
doio.c                - win9x can not rename a file when it is open
pp_sys.c              - do not define h_errno, init
                        _pwent_struct.pw_comment
util.c                - use setenv
util.h                - PERL_FILE_IS_ABSOLUTE macro
pp.c                  - Comment about Posix vs IEEE math under
                        Cygwin
perlio.c              - CR/LF mode
perliol.c             - Comment about EXTCONST under Cygwin
编译的模块源代码
ext/Compress-Raw-Zlib/Makefile.PL
                      - Can't install via CPAN shell under Cygwin
ext/Compress-Raw-Zlib/zlib-src/zutil.h
                      - Cygwin is Unix-like and has vsnprintf
ext/Errno/Errno_pm.PL - Special handling for Win32 Perl under
                        Cygwin
ext/POSIX/POSIX.xs    - tzname defined externally
ext/SDBM_File/sdbm/pair.c
                      - EXTCONST needs to be redefined from
                        EXTERN.h
ext/SDBM_File/sdbm/sdbm.c
                      - binary open
ext/Sys/Syslog/Syslog.xs
                      - Cygwin has syslog.h
ext/Sys/Syslog/win32/compile.pl
                      - Convert paths to Windows paths
ext/Time-HiRes/HiRes.xs
                      - Various timers not available
ext/Time-HiRes/Makefile.PL
                      - Find w32api/windows.h
ext/Win32/Makefile.PL - Use various libraries under Cygwin
ext/Win32/Win32.xs    - Child dir and child env under Cygwin
ext/Win32API-File/File.xs
                      - _open_osfhandle not implemented under
                        Cygwin
ext/Win32CORE/Win32CORE.c
                      - __declspec(dllexport)
Perl 模块/脚本
ext/B/t/OptreeCheck.pm - Comment about stderr/stdout order under
                         Cygwin
ext/Digest-SHA/bin/shasum
                      - Use binary mode under Cygwin
ext/Sys/Syslog/win32/Win32.pm
                      - Convert paths to Windows paths
ext/Time-HiRes/HiRes.pm
                      - Comment about various timers not available
ext/Win32API-File/File.pm
                      - _open_osfhandle not implemented under
                        Cygwin
ext/Win32CORE/Win32CORE.pm
                      - History of Win32CORE under Cygwin
lib/Cwd.pm            - hook to internal Cwd::cwd
lib/ExtUtils/CBuilder/Platform/cygwin.pm
                      - use gcc for ld, and link to libperl.dll.a
lib/ExtUtils/CBuilder.pm
                      - Cygwin is Unix-like
lib/ExtUtils/Install.pm - Install and rename issues under Cygwin
lib/ExtUtils/MM.pm    - OS classifications
lib/ExtUtils/MM_Any.pm - Example for Cygwin
lib/ExtUtils/MakeMaker.pm
                      - require MM_Cygwin.pm
lib/ExtUtils/MM_Cygwin.pm
                      - canonpath, cflags, manifypods, perl_archive
lib/File/Fetch.pm     - Comment about quotes using a Cygwin example
lib/File/Find.pm      - on remote drives stat() always sets
                        st_nlink to 1
lib/File/Spec/Cygwin.pm - case_tolerant
lib/File/Spec/Unix.pm - preserve //unc
lib/File/Spec/Win32.pm - References a message on cygwin.com
lib/File/Spec.pm      - Pulls in lib/File/Spec/Cygwin.pm
lib/File/Temp.pm      - no directory sticky bit
lib/Module/CoreList.pm - List of all module files and versions
lib/Net/Domain.pm     - No domainname command under Cygwin
lib/Net/Netrc.pm      - Bypass using stat() under Cygwin
lib/Net/Ping.pm       - ECONREFUSED is EAGAIN under Cygwin
lib/Pod/Find.pm       - Set 'pods' dir
lib/Pod/Perldoc/ToMan.pm - '-c' switch for pod2man
lib/Pod/Perldoc.pm    - Use 'less' pager, and use .exe extension
lib/Term/ANSIColor.pm - Cygwin terminal info
lib/perl5db.pl        - use stdin not /dev/tty
utils/perlbug.PL      - Add CYGWIN environment variable to report
Perl 模块测试
dist/Cwd/t/cwd.t
ext/Compress-Zlib/t/14gzopen.t
ext/DB_File/t/db-btree.t
ext/DB_File/t/db-hash.t
ext/DB_File/t/db-recno.t
ext/DynaLoader/t/DynaLoader.t
ext/File-Glob/t/basic.t
ext/GDBM_File/t/gdbm.t
ext/POSIX/t/sysconf.t
ext/POSIX/t/time.t
ext/SDBM_File/t/sdbm.t
ext/Sys/Syslog/t/syslog.t
ext/Time-HiRes/t/HiRes.t
ext/Win32/t/Unicode.t
ext/Win32API-File/t/file.t
ext/Win32CORE/t/win32core.t
lib/AnyDBM_File.t
lib/Archive/Extract/t/01_Archive-Extract.t
lib/Archive/Tar/t/02_methods.t
lib/ExtUtils/t/Embed.t
lib/ExtUtils/t/eu_command.t
lib/ExtUtils/t/MM_Cygwin.t
lib/ExtUtils/t/MM_Unix.t
lib/File/Compare.t
lib/File/Copy.t
lib/File/Find/t/find.t
lib/File/Path.t
lib/File/Spec/t/crossplatform.t
lib/File/Spec/t/Spec.t
lib/Net/hostent.t
lib/Net/Ping/t/110_icmp_inst.t
lib/Net/Ping/t/500_ping_icmp.t
lib/Net/t/netrc.t
lib/Pod/Simple/t/perlcyg.pod
lib/Pod/Simple/t/perlcygo.txt
lib/Pod/Simple/t/perlfaq.pod
lib/Pod/Simple/t/perlfaqo.txt
lib/User/grent.t
lib/User/pwent.t

CYGWIN 上的 BUG

交换真实用户和有效用户和组 ID 的支持不完整。在 WinNT Cygwin 上提供 setuid()seteuid()setgid()setegid()。但是,需要额外的 Cygwin 调用来操作 WinNT 访问令牌和安全上下文。

作者

Charles Wilson <[email protected]>、Eric Fifer <[email protected]>、alexander smishlajev <[email protected]>、Steven Morlock <[email protected]>、Sebastien Barre <[email protected]>、Teun Burgers <[email protected]>、Gerrit P. Haase <[email protected]>、Reini Urban <[email protected]>、Jan Dubois <[email protected]>、Jerry D. Hedden <[email protected]>。

历史记录

上次更新:2019-11-14