【发布时间】:2016-07-07 21:33:49
【问题描述】:
当您执行make all --print-data-base 时,您会在给定的makefile 执行完成后得到这种输出:
...
# default
LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)
# default
OUTPUT_OPTION = -o $@
# environment
QT_INSTALL_PLUGINS = C:/Users/mureadr/Desktop/A/HMI_FORGF/qt5binaries/plugins
# default
COMPILE.cpp = $(COMPILE.cc)
# environment
PATHEXT = .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW
# makefile (from 'Makefile', line 1)
MAKEFILE_LIST := C:/Users/mureadr/Desktop/A/ImpTarget.mk Makefile
# environment
TMP = C:/Temp
...
当前目录简单地等于CURDIR - 未显示 - 但makefile的名称不是那么简单。
查看6.14 Other Special Variables: MAKEFILE_LIST,答案似乎是:查看MAKEFILE_LIST 的第一个条目,这就是makefile 的名称。但是,如果您通过make all --print-data-base MAKEFILES=MyMake.mk 将makefile 传递给make,那么第一个条目将是MyMake.mk。
因此,规则似乎是:查看变量-*-command-variables-*- 并确定是否传入了makefile。如果是,则将其从变量MAKEFILE_LIST 中扣除,其余条目中的第一个字符串是名称的makefile。
问题
是否有任何其他“陷阱”可以在真正的 makefile 前面的 var MAKEFILE_LIST 中插入一些东西?
【问题讨论】:
-
简短的回答是
MAKEFILE_LIST包含一个以空格分隔的文件名列表,这些文件名是makefile 解析的,按照make 解析它们的顺序。因此,任何导致 make 解析 makefile 的功能都会修改此列表。这包括MAKEFILES变量、提供给命令行上-f选项的名称、提供给出现在MAKEFLAGS或GNUMAKEFLAGS变量中的任何-f选项的名称,以及任何include指令.这就是我能想到的全部。 -
@MadScientist 从
make的输出中是否可以推断出是否使用MAKEFILES=传入了任何makefile?这就是我真正需要的。 -
您的意思是,来自
make -p的输出?为什么不直接检查打印出的MAKEFILES变量的内容? -
@MadScientist 问题出在
MAKEFILE=,因为如果它用于传入makefile,传入的makefile 会放在MAKEFILE_LIST的开头,所以我需要一种方法来检测它。用于调用给定 makefile 的命令行是否存储在其-p部分中? -
@MadScientist 在下面查看我的答案。