GNU make:如何防止'-include file.ext'执行目标为'file.ext'的规则?

时间:2019-06-01 14:35:38

标签: makefile gnu-make

只需回顾一下术语,这就是makefile“规则”的结构:

target:   dependencies ...
          commands
          ...

这是我编写的makefile:

CC = mpicc
SHAREDLIB = libfmd.so
CFLAGS = -fPIC -Wall -Wno-unused-result -O3 -fopenmp
LFLAGS = -lm -fopenmp -lgsl -lgslcblas

OBJS = $(patsubst %.c,%.o,$(wildcard *.c))

.PHONY: all shared clean
all: shared
shared: $(SHAREDLIB)
$(SHAREDLIB): depend.mk $(OBJS)
    $(CC) $(OBJS) -shared -o $@ $(LFLAGS)
depend.mk: *.c *.h
    $(CC) -MM *.c > depend.mk
-include depend.mk
clean:
    rm -f *.o libfmd.so depend.mk

当文件夹干净时,我输入make clean,将显示以下行:

mpicc -MM *.c > depend.mk
rm -f *.o libfmd.so depend.mk

在我看来,-include depend.mk除了包含depend.mk之外,还执行以depend.mk为目标的规则。我想停止这种行为。

2 个答案:

答案 0 :(得分:1)

您是正确的。请参阅文档中的How Makefiles are Remade

没有办法防止这种行为:如果有创建包含的makefile的规则,make将始终重建它(如果它已过期),然后重新调用自身以读取最新版本。

问题是,为什么要避免这种情况?也许如果您从更高层次上解释了您实际上正在寻找的行为,我们可以为您提供帮助。如此处所示,有可能在创建.o文件时未创建任何depend.mk文件,然后编译失败,您修改了头文件以对其进行修复,但是由于在重新启动时depend.mk文件不存在-run使源文件未正确重建。

如果您想使用GCC准确处理C / C ++依赖关系,可以看看Auto-Dependency Generation

答案 1 :(得分:1)

depend.mk: *.c *.h
    $(CC) -MM *.c > depend.mk

仅供参考,这是错误的,因为make在规则字符串中不支持shell通配符。尽管在配方行上可以通过外壳自身扩展而起作用。

  

我想停止这种行为

depend.mk是默认目标的先决条件,因此无论如何它都是目标。我看来,您的问题是您的depend.mk先决条件错误,而不是使用“ include”指令。

此外,对于大型项目而言,对depend.mk的预处理很慢,因此完全有道理,要么切换到手动编写的依赖项,要么使用推荐的方式生成依赖项,如@MadScientist建议的那样。