如何在 makefile 中设置长选项

How can I set long options within a makefile

我正在编写一个 makefile 用于分发给学生。为了减轻他们的黑客攻击体验,我想警告未初始化的变量。

我知道有选项 --warn-undefined-variables 可以做到这一点,当然,我可以在我的 .bashrc 中添加别名 á la alias make="make --warn-undefined-variables"。但我想在 makefile 中设置这个选项,这样当学生开始扩展 makefile 时,他们也会自动从这些警告中获益。 这样做的合乎逻辑的方法是 MAKEFLAGS 变量。然而,虽然它适用于短选项,但我无法让它与 Can make warn me, when I use unset variables?

中描述的 --warn-undefined-variables 一起使用

生成文件:

MAKEFLAGS=--warn-undefined-variables
$(info MAKEFLAGS: $(MAKEFLAGS))
$(info ${BAR})

致电:

$ make
MAKEFLAGS: --warn-undefined-variables
make: *** No targets.  Stop.

$  make --warn-undefined-variables
MAKEFLAGS: --warn-undefined-variables
Makefile:3: warning: undefined variable 'BAR'
make: *** No targets.  Stop.

当我将 MAKEFLAGS 更改为 -d 时,控制台充满了调试信息,因此我知道 MAKEFLAGS 设置正确。有什么建议吗?

我这里有 GNU make 4.0,我一辈子都无法用简单的 Makefile 来实现 MAKEFLAGS= --warn-undefined-variables。但是,如果我让 Makefile 调用自身,那么 MAKEFLAGS= --warn-undefined-variables 在子调用中起作用!

MAKEFLAGS= --warn-undefined-variables
$(info MAKEFLAGS: $(MAKEFLAGS))
$(info $(BAR))

# This prevents a warning if we invoke make without a target...
MAKECMDGOALS?=

all:
ifndef RECURSED
    $(MAKE) RECURSED=1 $(MAKECMDGOALS)
else
    echo $(FOO)
endif

如果我 运行 make,我得到:

MAKEFLAGS: --warn-undefined-variables

make RECURSED=1 
make[1]: Entering directory '/tmp/t1'
MAKEFLAGS: --warn-undefined-variables
Makefile:3: warning: undefined variable 'BAR'

Makefile:12: warning: undefined variable 'FOO'
echo 

make[1]: Leaving directory '/tmp/t1'

要么我正在做某事...要么 make 中有错误。我倾向于后者。