编写生成文件模板以处理多个 C++ 扩展

writing a makefile template to handle multiple c++ extensions

本文关键字:处理 C++ 扩展 文件      更新时间:2023-10-16

我正在尝试研究如何为给定的源文件列表编写处理多个 c++ 扩展的 makefile 模板 - 但不想为每个可能的扩展制定单独的规则。 这可能吗?

例如

TMP_CPPEXTS := cpp c++
TMP_OBJDIR := ~/objfiles
TMP_SOURCEFILES := foo.cpp bar.c++
TMP_BASENAMES := $(basename $(TMP_SOURCEFILES))
TMP_OBJFILES := $(addprefix $(TMP_OBJDIR)/,$(addsuffix .o,$(notdir $(TMP_BASENAMES))))
TMP_DEPFILES :=$(addprefix $(TMP_OBJDIR)/,$(addsuffix .d,$(notdir $(TMP_BASENAMES))))
BD_EXTFROMBASE = $(strip $(foreach TMP_EXT,$(2),$(foreach TMP_NAME,$(1),$(if $(filter $(addsuffix .$(TMP_EXT),$(TMP_NAME)),$(TMP_SOURCEFILES)),$(EXT)))))
$(TMP_OBJFILES) : $(TMP_OBJDIR)/%.o : %.$(call BD_EXTFROMBASE,$*,$(TMP_CPPEXTS))
    g++ -c $< -o $@
$(TMP_DEPFILES) : $(TMP_OBJDIR)/%.d : %.$(call BD_EXTFROMBASE,$*,$(TMP_CPPEXTS))
    g++ -m $< -o $@

我已经验证TMP_OBJFILES包含预期的对象文件,但似乎无法使规则本身起作用?除了使用单独的规则/宏之外,还有其他建议吗?

这个怎么样:

define templ
$(TMP_OBJDIR)/%.o: %.$(1)
    g++ -c $$< -o $$@
endef
$(foreach ext,$(TMP_CPPEXTS),$(eval $(call templ,$(ext))))