c - Makefile - 用函数替换冗余

标签 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

最佳答案

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

下的子文件夹中

关于c - Makefile - 用函数替换冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45985928/

相关文章:

c - 矩阵:内存分配问题

c++ - 这是一个有效的 makefile 吗?

java - 如何通过makefile从命令行向java程序传递参数

linux - gcc '-c'和gcc '-o'是什么意思?

android - make snod 没有工作, 'out/target/product/generic/root/file_contexts' 需要这样的警告 :No rule to make target 'snod' ,

c - 如何告诉 Make 忽略尚未更新的文件?

linux - 在 Ubuntu Mate 上安装 STk Scheme 解释器

c - 我怎样才能导致指令缓存未命中?

c - 如何在 autotools 中为 C 项目定义宏?

c - 在内核 4.14 中使用 'MSG_ZEROCOPY' 标志和 'SO_ZEROCOPY' 选项发送 buf 的行为比 non_zerocpy 更糟糕