参考:在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.
$ more Makefile
test %test: test.c
gcc -o test test.c
-
$ make -f Makefile addtest
gcc -o test test.c
创建测试二进制文件。
答案 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所说,制作的多个版本可以很容易地并存。