在gmake 4.1 ver中混合显式和隐式规则的宽松约束

时间:2015-02-13 18:35:31

标签: makefile gnu

参考:在4.1 ver

中混合显式和隐式规则的宽松约束

即使使用gmake 4.1,我也无法使用具有普通和隐式规则的make文件。但它适用于

给出以下代码段:

test.c的:

$ more Makefile

test %test: test.c
    gcc -o test test.c

$ more test.c

#include <stdio.h>
int main()
{
    printf("hellow world\n");
    return 0;
}

当我使用带有目标名称addtest的Makefile上面的build时,会抛出一个错误:

$ ../make_41_src/make-4.1/make -f Makefile addtest
Makefile:1: *** mixed implicit and normal rules: deprecated syntax
make: *** No rule to make target 'addtest'.  Stop.

$ ../make_41_src/make-4.1/make -version
GNU Make 4.1
Built for x86_64-unknown-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

稍后当我在Makefile中拆分目标时,它可以工作: $ more Makefile

test: test.c
    gcc -o test test.c
%test: test.c
    gcc -o test test.c

$ ../make_41_src/make-4.1/make -f Makefile addtest
gcc -o test test.c

创建了测试箱。


版本3.81,包含隐式和普通规则的Makefile

$ make -version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

此程序是为x86_64-redhat-linux-gnu

而构建的

$ more Makefile

test %test: test.c
    gcc -o test test.c

-

$ make -f Makefile addtest
gcc -o test test.c

创建测试二进制文件。

1 个答案:

答案 0 :(得分:1)

看来GNU make 4.0和4.1之间的行为变化只是因为它是一个简单的单行补丁,允许旧的Linux内核makefile与4.1一起使用。通过对引发此更改的bug report的讨论,看起来假设此更改将恢复3.81功能。然而,这并不是改变的实际目标,只是为了提供与旧Linux makefile的向后兼容性。

这就是改变的角色和GNU当前的开发者Paul D Smith在bug report中对此所说的:

  

如果事实证明只是将fatal()更改为error()是   足以解决这个问题,我愿意做出改变(我不会   为它添加一个标志;该消息只会说语法是   不支持,应该更新)。

     

但是,我不愿意保证这种语法会继续下去   得到支持。 [...]如果人们需要这样的水平   向后兼容性我建议他们只保留多个   GNU版本支持旧代码; make的安装是   琐碎的,只有一个没有额外支持文件的程序,甚至   重命名后,它完美无瑕。

     

在这种特殊情况下,我希望即使语法仍然可以   当我们支持定义明确规则的能力时,立即开始工作   具有从单个配方调用生成的多个目标,这个   语法可能无法生存。事实是这种用法是非法的   根据文件(可能没有明确禁止   但写下所有不合法的东西都是   不可能 - 它很容易,IMO,可以推断语法不是   意图有效)。

     

在这一点上,我不愿意接受&#34;修复&#34;就这样   这种语法完全有效,并使其合法。在我看来它会是   简直太混乱,难以管理周围的所有边缘情况   试图将两个(或更多,将来)不同的规则模型结合起来   成一个声明。 [...]

因此,改变的目的并不是修复他认为无意识和破坏的功能,而是解决报告问题的最小变化。

你应该修复你的makefile,这样他们就不再依赖于GNU make从未打算拥有的功能或转而使用GNU make 3.81。正如Paul D Smith所说,制作的多个版本可以很容易地并存。