makefile - 使用 gcc -MM 标志在单个文件中生成所有项目依赖项

标签 makefile dependencies

我想通过 Makefile 使用 gcc -M 标志生成一个包含源文件的所有依赖项的单个依赖项文件。我用谷歌搜索了这个解决方案,但是,提到的所有解决方案都是为多个对象生成多个 deps 文件。

DEPS = make.dep

$(OBJS): $(SOURCES)
    @$(CC) -MM $(SOURCEs) > $(DEPS)
    @mv -f $(DEPS) $(DEPS).tmp
    @sed -e 's|.$@:|$@:|' < $(DEPS).tmp > $(DEPS)
    @sed -e 's/.*://' -e 's/\\$$//' < $(DEPS).tmp | fmt -1 | \
      sed -e 's/^ *//' -e 's/$$/:/' >> $(DEPS)
    @rm -f $(DEPS).tmp

但它不能正常工作。请告诉我我在哪里犯了错误。

最佳答案

沿着这些路线的东西是我用来在单个文件中获取所有依赖项的东西:

program_H_SRCS := $(wildcard *.h)
program_C_SRCS := $(wildcard *.c)
DEPS = make.deps

make.deps: $(program_C_SRCS) $(program_H_SRCS)
    $(CC) $(CPPFLAGS) -MM $(program_C_SRCS) > make.deps

include $(DEPS)

这基本上会导致在修改项目中的任何 C 或 H 文件时将所有用户(而不是系统)依赖项重新构建到单个文件中。

+++++++++ 编辑+++++++++++

从那以后,我找到了更好的做事方式。我为每个源文件生成一个单独的 dep 文件。这是基本的makefile:
program_NAME := myprogram
program_SRCS := $(wildcard *.c)
program_OBJS := ${program_SRCS:.c=.o}
clean_list += $(program_OBJS) $(program_NAME)

# C Preprocessor Flags
CPPFLAGS += 
# compiler flags
CFLAGS += -ansi -Wall -Wextra -pedantic-errors

.PHONY: all clean distclean

all: $(program_NAME)

clean:
    @- $(RM) $(clean_list)

distclean: clean

# Generate dependencies for all files in project
%.d: $(program_SRCS)
    @ $(CC) $(CPPFLAGS) -MM $*.c | sed -e 's@^\(.*\)\.o:@\1.d \1.o:@' > $@

clean_list += ${program_SRCS:.c=.d}

$(program_NAME): $(program_OBJS)
    indent -linux -brf $(program_SRCS)
    splint $(program_SRCS)
    $(LINK.c) $(program_OBJS) -o $(program_NAME)

ifneq "$(MAKECMDGOALS)" "clean"
# Include the list of dependancies generated for each object file
-include ${program_SRCS:.c=.d}
endif

这有两件事:
  • 如果 foo.c 依赖的任何文件发生更改,则 foo.o 将被重建,而无需重建项目中的其他文件。
  • dep 文件本身与目标文件具有相同的依赖关系,因此如果任何 dep 被修改,则在检查目标文件 deps 之前,dep 文件本身也会重新生成。
  • 关于makefile - 使用 gcc -MM 标志在单个文件中生成所有项目依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1981563/

    相关文章:

    c - 在 Mac 上的终端中使用 make 编译 c 中的代码

    gcc - 如何让 Makefile 自动重建包含修改后的头文件的源文件? (在 C/C++ 中)

    c# - 构建女妖:缺少依赖项

    algorithm - 依赖项的排序依赖项

    c++ - 如何强制 GNU make 重新编译在具有不同 FLAGS 的两个目标中使用的相同目标文件

    linux - $(shell pwd) 给出什么值?

    javascript - 如果对象的成员之间存在依赖关系,是否可以使用文字符号初始化对象?

    rust - 如何在 Cargo.toml 中包含未发布的依赖项/库?

    algorithm - "make -jX"算法是什么

    build-process - 您对非递归 make 有什么经验?