我正在研究系统的一个部分,我必须欺骗一些我没有的测量(我没有完整的系统)。
在make文件中我添加了这个部分:
ifneq ("$(wildcard FAKE_FOO.txt)","")
EndMessage += "WARNING : Version with FAKE_FOO"
Info += FAKE_FOO
CC_OPTS_APP += -DFAKE_FOO
endif
ifneq ("$(wildcard FAKE_BAR.txt)","")
EndMessage += "WARNING : Version with FAKE_BAR"
Info += FAKE_BAR
CC_OPTS_APP += -DFAKE_BAR
endif
然后当make命令检测到文件FAKE_FOO.txt时,它定义为FAKE_FOO。当make命令检测到文件FAKE_BAR.txt时,它正在定义FAKE_BAR。 等...
在代码中我有这样的东西:
#ifdef FAKE_FOO
/* do or define my stuff, for my case */
#else
/* do or define the normal stuff for the rest of the team */
#endif
这非常好,所以我可以使用与我的团队相同的代码,我只需要创建文件FAKE * .txt。这些文件在忽略列表中,所以我肯定不会污染官方存储库。
我想避免每次使用另一个FAKE _ * .txt文件时编辑makefile。
如何将其置于通用模式,以便为每个FAKE _ * .txt文件定义FAKE_ *?
答案 0 :(得分:1)
使用foreach
功能和Canned Recipes:
define do_fake
# Need another $(eval) call here to set the bare variable immediately
# so the expansions on the next lines work correctly.
$(eval bare=$(1:.txt=))
EndMessage += "WARNING : Version with $(bare)"
Info += $(bare)
CC_OPTS_APP += -D$(bare)
endef
# Loop over ever FAKE_*.txt file calling the do_fake canned
# recipe/macro/define for each file.
# Use $(eval) on the result so the macro can return make statements
# and so the make parser is happy.
$(foreach f,$(wildcard FAKE_*.txt), $(eval $(call do_fake,$f)))