Makefile - 用函数替换冗余

时间:2017-08-31 16:12:55

标签: c makefile gnu-make

我努力编写一个好的通用makefile来编译许多项目中位于不同目录中的许多源,很多目标(make将来需要很多参数)。作为make-tool的初学者,我搜索了很多例子,我看了很多问题来完成我的工作。要构建所有对象,我使用以下目标:

$(OBJDIR)/%.o:
    @mkdir -p $(dir $@)
    @echo Compiling $(subst $(OBJDIR),,$(@:%.o=%.c))
    @echo -e \t '>' $@
    @$(ARCH)gcc $(CFLAGS) -MMD -MP -MF"$(DEPDIR)/$(@F:.o=.d)" -MT"$(@F:%.o=%.o)" -MT"$(@F:%.o=%.d)" $(SRCFLAGS) $(subst $(OBJDIR)/,,$(@:%.o=%.c)) -o $@

如何使用函数替换$(subst $(OBJDIR),,$(@:%.o=%.c))以从.o文件中获取.c文件?然后目标将如下所示:

$(OBJDIR)/%.o:$(call obj_to_src ...)
    @mkdir -p $(dir $@)
    @echo Compiling $<
    @echo -e \t '>' $@
    @$(ARCH)gcc $(CFLAGS) -MMD -MP -MF"$(DEPDIR)/$(@F:.o=.d)" -MT"$(@F:%.o=%.o)" -MT"$(@F:%.o=%.d)" $(SRCFLAGS) $< -o $@

请注意,我的来源具有以下结构:

$(WORKSPACE)/app/*.c
$(WORKSPACE)/efsl/*.c
$(WORKSPACE)/*/*.c

和对象将具有以下结构:

OBJS = $(addprefix $(OBJDIR), $(subst $(WORKSPACE),,$(SRCS:.c=.o)))
.build/$(PROJECT)/$(CONFIG)/obj/app/*.o
.build/$(PROJECT)/$(CONFIG)/obj/*/*.o

对于那些在我的makefile中有兴趣的人,我将其附加到此链接https://www.dropbox.com/s/eu07o41uz3jvb2k/makefile?dl=0

1 个答案:

答案 0 :(得分:0)

使用$(OBJDIR)/%.o:$(WORKSPACE)/%.c解决。所有来源都位于$(WORKSPACE)

下的子文件夹中