我想通过 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 文件本身也会重新生成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)