只需回顾一下术语,这就是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
为目标的规则。我想停止这种行为。
答案 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建议的那样。