自动重建依赖项(makefile)

时间:2017-10-24 11:17:09

标签: c makefile build dependencies

我有一个用GCC编译的庞大项目。 我知道通常预先构建应该重建所有最新的依赖项,但我们更改的一些 .h 文件不会导致重建使用它们的文件。 make文件的层次结构,主make文件根据需要包含所需的make文件。 有没有办法确保重建文件" #include"最近修改过.h文件?

1 个答案:

答案 0 :(得分:1)

您必须确保在先决条件中正确列出了头文件。对于大型项目,手动执行此操作是不可行的,但gcc(或clang)和GNU Make的组合为您提供了一种强大的自动化方法。

假设您使用模式规则有一些非常标准的Makefile:

CC := gcc
CFLAGS := -std=c11 -Wall -Wextra -pedantic
OBJS := main.o module.o

all: program

program: $(OBJS)
    $(CC) -o$@ $^

%.o: %.c
    $(CC) -c $(CFLAGS) -o$@ $<

clean:
    rm -f *.o

.PHONY: all clean

然后,您可以使用自动重新生成GNU Make的Makefile功能来包含添加gcc生成的其他先决条件的文件:

CC := gcc
CFLAGS := -std=c11 -Wall -Wextra -pedantic
OBJS := main.o module.o

all: program

program: $(OBJS)
    $(CC) -o$@ $^

# rule to create "dependency files", make the dependency file itself
# depend on the same prerequisites
%.d: %.c
    $(CC) -MM -MT"$@ $(@:.d=.o)" -MF$@ $(CFLAGS) $<

# include dependency files except for targets not building anything
ifneq ($(filter-out clean,$(MAKECMDGOALS)),)
-include $(OBJS:.o=.d)
endif

# add Makefiles themselves to prerequisites here (with a changed Makefile,
# the only safe thing is to rebuild all):
%.o: %.c Makefile
    $(CC) -c $(CFLAGS) -o$@ $<

# remove dependency files on clean
clean:
    rm -f *.o *.d

.PHONY: all clean

这只是一个例子,如何使用这些功能有很多可能性。