我努力编写了一个好的通用 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
最佳答案
通过使用 $(OBJDIR)/%.o:$(WORKSPACE)/%.c
解决。所有源都位于 $(WORKSPACE)
关于c - Makefile - 用函数替换冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45985928/