程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Makefile 默认规则模式大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Makefile 默认规则模式?

开发过程中遇到Makefile 默认规则模式的问题如何解决?下面主要结合日常开发的经验,给出你关于Makefile 默认规则模式的解决方法建议,希望对你解决Makefile 默认规则模式有所启发或帮助;

只是尝试使用这个框架编写一个有条件的 Makefile:

TARGET = test

ifeq ($(FOO),y)

$(TARGET):
    @echo This is test
$(TARGET)-a:
    @echo This is test-a
$(TARGET)-b:
    @echo This is test-b

else
$(info FOO is Disabled)
endif

当 FOO 条件为真时,基于 TARGET 变量的一组规则(由一个 $(TARGET) 和一组 $(TARGET)-子字符串组成)按预期工作:

$ make test
This is test

$ make test-a
This is test-a

当 FOO 条件为假时,我想为我的所有目标定义一个默认规则,只是为了在屏幕上报告 FOO 变量被禁用。我不知道这样做的正确方法。尝试了一些选项:

Option1,使用骨架示例,始终打印字符串“FOO is Disabled”,但会产生错误:

$ make test-a
FOO is Disabled
make: *** No rule to make target 'test-a'.  Stop.

$ make test  
FOO is Disabled
make: *** No rule to make target 'test'.  Stop.

选项2,如果尝试以这种方式修改错误规则:

else
$(TARGET)-%:
    $(info FOO is Disabled)
endif

然后所有 $(TARGET)-subString 目标都按预期工作:

$ make test-a
FOO is Disabled
make: 'test-a' is up to date.

$ make test-b
FOO is Disabled
make: 'test-b' is up to date.

但是这个规则在制作 $(TARGET) 时失败了:

$ make test
make: *** No rule to make target 'test'.  Stop.

选项 3,如果尝试删除选项 2 中定义的错误规则上的连字符:

else
$(TARGET)%:
    $(info FOO is Disabled)
endif

然后使 $(TARGET) 执行编译 test.o 目标文件的默认规则:

$ make test
FOO is Disabled
cc   test.o   -o test
cc: error: test.o: No such file or directory
cc: Fatal error: no input files
compilation terminated.
make: *** [<builTin>: test] Error 1

我变得有点疯狂尝试满足这个默认规则。请对此提供一些帮助将非常有用。克斯!

解决方法

有几种方法可以解决这个问题,但最简单的可能只是添加另一个规则:

else

$(TARGET):
    @echo FOO is disabled

$(TARGET)%:
    @echo FOO is disabled

endif

(我将 $(info ... 改为 @echo ... 因为后者只会在 Make 执行规则时运行,而前者会在条件定义这些规则时运行,即使目标是其他东西。)

编辑:是的,可以只用一个规则来解决这个问题,方法不止一种,但没有完美的方法。

这是一种方法:

TARGET = tes

...

else

$(TARGET)%:
    @echo FOO is disabled

endif

请注意,test 的最后一个字符已被删除。好消息是此规则将适用于 testtest-atest-b;坏消息是它也适用于 tesw

,

正如@madScientist 所说,当您只有一个 Makefile 时,.DEFAULT 规则可以解决这个问题。所以这将是最终的 Makefile:

TARGET = test

ifeq ($(FOO),y)

$(TARGET):
    @echo This is test
$(TARGET)-a:
    @echo This is test-a
$(TARGET)-b:
    @echo This is test-b

endif

.DEFAULT:
    @echo This is the default rule

非常感谢您的帮助!

大佬总结

以上是大佬教程为你收集整理的Makefile 默认规则模式全部内容,希望文章能够帮你解决Makefile 默认规则模式所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: