Makefile GNU make:如何防止'-包括file.ext';执行目标为';file.ext';?

Makefile GNU make:如何防止'-包括file.ext';执行目标为';file.ext';?,makefile,gnu-make,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 %.

仅回顾一下术语,这是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
当文件夹被清除时,我输入
makeclean
,将显示以下行:

mpicc -MM *.c > depend.mk
rm -f *.o libfmd.so depend.mk
在我看来,
-include depend.mk
除了包含
depend.mk
之外,还执行了
depend.mk
是其目标的规则。我想停止这种行为。

你是对的。请参阅文档中的

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

问题是,你为什么要避免它?也许如果你能从更高的层次解释一下你真正想要的行为,我们会有所帮助。正如您在这里看到的那样,可以在不创建任何depend.mk文件的情况下创建.o文件,然后编译失败,您可以修改头文件以修复它,但由于重新运行时depend.mk文件不存在,因此无法正确重建源文件

如果您想通过GCC准确地处理C/C++依赖关系,您可以看看。

您是对的。请参阅文档中的

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

问题是,你为什么要避免它?也许如果你能从更高的层次解释一下你真正想要的行为,我们会有所帮助。正如您在这里看到的那样,可以在不创建任何depend.mk文件的情况下创建.o文件,然后编译失败,您可以修改头文件以修复它,但由于重新运行时depend.mk文件不存在,因此无法正确重建源文件

如果您想用GCC准确地处理C/C++依赖关系,您可以看看

仅供参考,这是错误的,因为make不支持规则字符串中的shell通配符。尽管是在一个配方行上,当它被外壳本身扩展时可以工作

我想停止这种行为

depend.mk是默认目标的先决条件,因此它无论如何都是一个目标

此外,对于大型项目来说,depend.mk的预处理速度很慢,因此切换到手动编写的依赖项或使用@madscitificate建议的推荐方法生成依赖项是完全有意义的

仅供参考,这是错误的,因为make不支持规则字符串中的shell通配符。尽管是在一个配方行上,当它被外壳本身扩展时可以工作

我想停止这种行为

depend.mk是默认目标的先决条件,因此它无论如何都是一个目标


此外,对于大型项目来说,depend.mk的预处理速度很慢,因此切换到手动编写的依赖项,或者按照@madscitist的建议使用推荐的方法生成依赖项是完全有意义的。

make不支持规则字符串中的shell通配符,这是不正确的:它说目标是文件名,用空格分隔。可以使用通配符,也可以使用由空格分隔的文件名组成的先决条件。(这里也允许使用通配符。)make不支持规则字符串中的shell通配符不是真的:表示目标是文件名,用空格分隔。可以使用通配符,也可以使用由空格分隔的文件名组成的先决条件。(此处也允许使用通配符。)
depend.mk: *.c *.h
    $(CC) -MM *.c > depend.mk