【问题标题】:Makefile recompiles everythingMakefile 重新编译一切
【发布时间】:2018-04-09 09:13:15
【问题描述】:

我知道这个问题已经多次提出,但我似乎还是找不到我的问题。

对象和依赖文件在它们自己的文件夹中创建。但似乎重新编译时没有使用它们。我做错了什么?

我已经关注http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#combine生成依赖文件了。

APP = test

OBJDIR = obj

DEPDIR = dep

HDRS =  -Ibuild/src_generated -Isrc -Isrc/client -Isrc/server -Ideps -Iinclude -Iplugins
SRCS =  $(wildcard build/src_generated/*.c) \
        $(wildcard src/*.c) \
        $(wildcard src/client/*.c) \
        $(wildcard src/server/*.c) \
        $(wildcard deps/*.c) \
        plugins/ua_accesscontrol_default.c \
        plugins/ua_clock.c \
        plugins/ua_config_default.c \
        plugins/ua_debug_dump_pkgs.c \
        plugins/ua_log_stdout.c \
        plugins/ua_network_tcp.c \
        plugins/ua_nodestore_default.c \
        plugins/ua_pki_certificate.c \
        plugins/ua_securitypolicy_none.c \
        tutorial_server_datasource.c
SRCDIRS = ./build/src_generated ./src ./src/client ./src/server ./deps ./plugins
OBJS = $(patsubst %.c,$(OBJDIR)/%.o,$(SRCS))

POSTCOMPILE = @mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d && touch $@

CFLAGS = -Os -std=c99 -DUA_NO_AMALGAMATION 
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Td

$(APP): buildrepo $(OBJS)
    $(CC) $(OBJS) -o $@ $(CFLAGS) $(HDRS) -s

$(OBJDIR)/%.o: %.c $(DEPDIR)/%.d
    $(CC) $(DEPFLAGS) $(CFLAGS) $(HDRS) -o $@ -c $<
    $(POSTCOMPILE)

$(DEPDIR)/%.d: ;
.PRECIOUS: $(DEPDIR)/%.d


include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))

.PHONY: clean
clean:
    rm -rf $(OBJDIR)/*
    rm -rf $(DEPDIR)/*
    rm -rf $(APP)

buildrepo:
    @$(call make-repo)

define make-repo
   for dir in $(SRCDIRS); \
   do \
    mkdir -p $(OBJDIR)/$$dir; \
    mkdir -p $(DEPDIR)/$$dir; \
   done
endef

【问题讨论】:

  • 您是否尝试在obj/ 中重新创建源代码树的结构?

标签: gcc makefile gnu-make


【解决方案1】:

这一行:

include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))

期望所有依赖文件都在一个文件夹中。你可能想要:

-include ${SRCS:%.c=$(OBJDIR)/%.d} # Note the leading -

【讨论】:

  • 实际上这会创建 $(DEPDIR)/plugins/ua_clock.d 而不是 $(DEPDIR)/ua_clock.d。不是应该可以分开吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多