从命令行向makefile添加dynmaic调试信息

从命令行向makefile添加dynmaic调试信息,makefile,Makefile,如何从命令行添加动态调试信息 例如,给定一个Makefile: override MAKEFLAGS=r ifeq ($(MAKELEVEL),0) 0:: @$(MAKE) else 1:: @echo $(foo) endif 我想从命令行定义如下: make foo='$@' 因此,它将响应正在执行的命令 但是,我总是得到: 0 其中递归生成中执行的目标为“1”。您可以在包含的生成文件中或在生成文件本身中执行以下操作: ifeq ("$(DEBUG)","1

如何从命令行添加动态调试信息

例如,给定一个Makefile:

override MAKEFLAGS=r

ifeq ($(MAKELEVEL),0)

0::
    @$(MAKE)

else

1::
    @echo $(foo)

endif
我想从命令行定义如下:

make foo='$@'
因此,它将响应正在执行的命令

但是,我总是得到:

0

其中递归生成中执行的目标为“1”。

您可以在包含的生成文件中或在生成文件本身中执行以下操作:

ifeq ("$(DEBUG)","1")
D :=
DBGECHO = @echo
else
D := @
DBGECHO = @true
endif
然后,在makefile中,您可以有如下规则

foo: xxx
     $(DBGECHO) "building $@"
     $(D)$(MAKE) -C $@
如果执行
makefoo
,则不会得到任何输出,但如果执行
makefoodebug=1
,则会得到

building foo
make -C foo

通过变量将
$@
传递到makefile时,make会展开
$(foo)
,但之后不会展开$(foo)的内容(它完成了替换)。您可以使用
eval
执行类似操作。

您可以在包含的生成文件中或在生成文件本身中执行以下操作:

ifeq ("$(DEBUG)","1")
D :=
DBGECHO = @echo
else
D := @
DBGECHO = @true
endif
然后,在makefile中,您可以有如下规则

foo: xxx
     $(DBGECHO) "building $@"
     $(D)$(MAKE) -C $@
如果执行
makefoo
,则不会得到任何输出,但如果执行
makefoodebug=1
,则会得到

building foo
make -C foo

通过变量将
$@
传递到makefile时,make会展开
$(foo)
,但之后不会展开$(foo)的内容(它完成了替换)。您可以使用
eval
来执行类似操作。

在Make 3.81中,如果我删除
override
指令,这项功能将起作用。我不知道为什么会有不同。在Make 3.81中,如果我删除
override
指令,这项功能就会起作用。我不知道为什么会有不同。