Cygwin 设置中 GNU Make 版本之间有什么区别

Cygwin 设置中 GNU Make 版本之间有什么区别

我需要将 GNU Make 添加到我的 Cygwin 安装中,但是安装程序为我提供了两个版本:

  • 3.82.90-1(1,254千)
  • 3.82-3(473千)

我不知道两者有什么区别,我通过 Google 查找的所有尝试都无济于事。两者都没有显示包含源代码(这可以解释大小的巨大差异)。

有人可以告诉我这两个版本之间的区别和/或建议哪个可能是更好的选择吗?

(编辑)为了清楚起见,我在这里真正想问的是: Make x.yy.zz 版本和 x.yy-n 版本有什么区别?为什么编号模式不同?

答案1

cygwin 32位

如果你查看存储库本身,即其中一个镜像(http://mirror.switch.ch/ftp/mirror/cygwin/x86/release/make/),您会找到四个相关文件:

make-3.81-2-src.tar.bz2     09-Feb-2008 20:50   1.1M     
make-3.81-2.tar.bz2         09-Feb-2008 20:50   350K     
make-3.82.90-1-src.tar.bz2  02-Dec-2011 18:05   1.3M     
make-3.82.90-1.tar.bz2      02-Dec-2011 18:05   442K     

有两个版本,3.82.90-1 和旧版本 3.81-2,分别是大小相同(数量级)。相应的较大包(1MB)是源。

这正是cygwin 安装工具提供给我。

cygwin 64位

这里提供的文件是(http://mirror.switch.ch/ftp/mirror/cygwin/x86_64/release/make/):

make-3.82-3-src.tar.bz2     14-Mar-2013 11:26   1.6M     
make-3.82-3.tar.bz2         14-Mar-2013 11:26   473K     
make-3.82.90-1-src.tar.bz2  30-Mar-2013 12:12   1.9M     
make-3.82.90-1.tar.bz2      30-Mar-2013 12:12   1.2M    

这适合您描述的场景。


通常,要了解这两个版本之间的差异,请查看Changelog最新的源 tarball。

进一步阐述:通常(Debian 使用类似的方案)、版本号连字符之前是原始软件包的版本号,由软件作者发布(即GNU 制作团队)。连字符后给出由软件包维护者应用的某种补丁级别(即赛格威团队)。

为了证明这一点,请查看make.cygport源包(例如make-3.82-3-src.tar.bz2

NAME="make"
VERSION="3.82"
RELEASE=3

已应用的补丁(由 cygwin 提供)归档在 中make-3.82-3.src.patch

因此,我们决定在 64 位 cygwin 发行版中包含一个 cygwin 端口make 3.82make 3.82.90(我真的不知道为什么 GNU make 团队决定版本 3.82.90 应该遵循 3.82 版本...)

这些(上游)版本之间有什么区别?NEWScygwin 源码包中的原始源码包告诉我们:

版本 3.82.90

此版本中修复的错误的完整列表可在此处找到: http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=101&set=custom

  • 警告:向后不兼容!此版本的 make 遵循 POSIX 反斜杠/换行符处理,因此存在以下差异:

    • 变量值中的每个反斜杠/换行符都替换为空格;
      多个连续的反斜杠/换行符不会压缩为一个空格。
    • 在食谱中,反斜杠换行符后面的食谱前缀被删除。
  • 新功能:Windows 现已支持“作业服务器”功能。
    实现由 Troy Runkel 贡献

  • 新功能:“!=” shell 赋值运算符可替代 $(shell ...) 函数。实现与 BSD makefile 的兼容性。
    警告:向后不兼容!
    以“!”结尾的变量以前定义为“variable!= value”,现在将被
    解释为 shell 赋值。更改您的赋值以
    在“!”和“=”之间添加空格:“variable! = value”

  • 新的命令行选项:--trace 启用目标跟踪。启用后
    ,即使要调用的配方被
    .SILENT 或“@”前缀字符抑制,也会打印该配方。此外,在运行每个配方之前,
    会显示定义它的 makefile 名称和行号,以及
    导致目标被视为过期的先决条件。

  • 失败时,将显示失败的配方的 makefile 名称和行号

  • 每个配方都会记住一个 .RECIPEPREFIX 设置,并且
    该配方中扩展的变量也会使用该配方前缀设置。

  • 在 -p 输出中,显示 .RECIPEPREFIX 设置,并且所有目标特定的
    变量都像在 makefile 中一样输出,而不是作为注释。

因此,这种向后不兼容性可能是 cygwin 提供两个版本的原因。

相关内容