如何在cygwin上安装pigz(并行gzip)?

3
我想使用pigz来压缩大量的tar档案。
我正在使用cygwin。不幸的是,pigz不是标准的cygwin软件包之一。
有人知道如何在cygwin下安装pigz吗?
以下是我尝试但没有成功的两种方法:
1)此网页上的README(或者如果您从这里下载源代码,则在README文件中)说,您应该能够仅通过构建源代码来构建它

在此目录中键入“make”以构建“pigz”可执行文件。

当我在我的机器上执行此操作时,我会得到大量警告,从以下内容开始:
pigz.c:2950:20: warning: unknown conversion type character 'j' in format [-Wformat=]
                        (intmax_t)g.in_tot, (intmax_t)len, tag);

然后出现了这个最终的错误:
gcc  -o pigz pigz.o yarn.o try.o deflate.o blocksplitter.o tree.o lz77.o cache.o hash.o util.o squeeze.o katajainen.o -lm -lpthread -lz
pigz.o:pigz.c:(.text+0xd4f8): undefined reference to `fsync'
collect2.exe: error: ld returned 1 exit status
make: *** [pigz] Error 1

这大约耗尽了我从源代码构建程序的能力......
2)看起来有一个2015年旧版pigz 2.3.3的Cygwin Ports端口,这是扩展的cygwin软件包仓库。
但是那个版本已经过时了(最新的pigz是2.4)。实际上,Cygwin Ports已经迁移到Github,在那里搜索pigz找不到任何东西。
我甚至不知道如何使用Cygwin Ports!项目主页仅仅说:

按照通常的Cygwin安装说明安装此项目当前维护的任何软件包。

我假设这意味着运行Cygwin的setup-x86.exe,但当它要求您“选择下载站点”时,您需要输入一些Cygwin Ports的URL。
网络搜索发现很少的信息。这个链接说要使用http://sourceware.org/cygwinports/,但是setup-x86.exe很快就因为该URL生成了一个错误。这个链接中的说明对我也没有用。

从源代码构建对我来说很顺利。你使用的Cygwin和GCC版本是多少? - undefined
一样的情况。它完全没有任何警告就构建成功了。 - undefined
@varro和matzeri:我最初的帖子是在我的工作电脑上完成的。现在我回到家了。在我的家用机器上,我最终也成功编译了pigz。尽管如此,我首先需要运行cygwin的setup-x86_64.exe三次来安装:make、3个gcc C/C++相关的软件包和3个zlib相关的软件包。对于每个安装,我还安装了setup-x86_64.exe建议的所有依赖项。 - undefined
@varro和matzeri:我的工作电脑与家里的电脑有很多不同之处。现在我想起来,最糟糕的一点是它安装了RTools。RTools在很多方面都很糟糕。几乎可以肯定与此相关的是,它需要一些旧的但特定的32位版本的cygwin命令。因此,RTools必须首先出现在我的Windows Path环境变量中,并且我的cygwin安装也必须是32位的;请参考此链接 - undefined
@varro和matzeri:我敢打赌,RTools目录中的旧cygwin命令搞乱了我的系统。等我回到工作岗位,我会尝试暂时将RTools从我的路径中移除,看看是否能够成功编译。 - undefined
3个回答

1
C99标准为printf()指定了j说明符。(注意,99指的是1999年。现在是2018年。)您可以通过将__STDC_VERSION__-0 >= 199901L || __GNUC__-0 >= 3更改为0来强制pigz编译不假定C99。然后它就不会尝试使用j。
请告诉我您的编译器的__STDC_VERSION__、__GNUC__和__GNUC_MINOR__的值。
此外,pigz需要符合POSIX标准,这将提供fsync()调用。您只需删除对fsync()的引用,这将导致--synchronous和-Y选项没有任何效果。

考虑到其他人可以在不需要对源代码进行调整的情况下成功构建此程序,最好是找出OP的环境存在什么问题,而不是修改源代码。 - undefined
@Mark:感谢您的回复!能够得到pigz的创作者的回应我感到非常荣幸!有没有可能将pigz添加到cygwin软件包列表中呢? - undefined
我不知道谁会做这个或者如何做。 - undefined
@Mark: 我刚刚对tar进行了基准测试,分别使用标准gzip、pigz(利用所有核心)和xz(利用所有核心)进行压缩。我将文件归档到本地和NAS驱动器上进行测试。这是在一台旧的Dell Precision 7500工作站上进行的(大约7年前的机器,但配备了2个Xeon 5680处理器,总共12个核心)。主要结果是:pigz比gzip快大约10倍。太棒了!你必须让pigz成为所有发行版的标准!对于cygwin来说,我相信开始询问的地方是他们的主要cygwin邮件列表,可以在这里找到相关信息。 - undefined
太好了,pigz的作者回答了!就为这个+1。 - undefined

0

关于我与@varro和matzeri的评论,我现在可以回答自己的问题了:我的怀疑是正确的:RTools是罪魁祸首。我发现,如果我暂时从Windows的Path环境变量中移除所有的RTools元素(对我来说是c:\Rtools\binc:\Rtools\mingw_32\bin),那么我就能够成功运行pigzmake命令。

在进行了这个Path编辑之后,我卸载了已有的cygwin,重新安装了cygwin,安装了我通常使用的额外软件包(chere, openssh, subversion, zip, unzip)及其依赖项,安装了make及其依赖项,安装了gcc-core(C编译器)及其依赖项。在那时,我能够完美地使用make命令来编译pigz


0

有一个比自己编译更简单的方法。我曾经遇到过同样的问题,通过一点研究,我找到了多个现成的.exe文件(pigz.exe),可以直接在Windows上使用。我正在使用这个:

https://sourceforge.net/projects/pigz-for-windows/files/

OP最关注的问题是:“我想使用pigz来压缩大型tar存档文件。”我希望这个答案能对您的问题有所帮助,尽管它并没有解释如何解决编译问题。

一些额外的注意事项:

有趣的是,一些人可能不知道的是,我们可以在Cygwin中使用普通的Windows二进制文件,反之亦然。也就是说,即使OP拥有复杂的Cygwin / bash(或其他)脚本来驱动pigz和整个压缩过程,他也可以使用上面链接的现成的pigz原生Windows版本。

无论是否使用Cygwin,您都无需自己编译pigz,除非您需要最新的功能或错误修复。

就个人而言,我一直以来都在使用Cygwin下的本地Windows版本的pigz。据我所知,pigz没有进度条,这对我来说有点不方便(因为我不时需要压缩一个巨大的文件(约60GB))。一个方便的解决方法是使用pv工具。由于我没有找到适用于Windows的原生版本,而且我懒得自己在Windows上编译它,所以我使用Cygwin的pv来显示进度,当我让本地Windows的pigz压缩那些巨大的文件时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接