如何在makefile中设置长选项

问题描述:

我正在写一个makefile以供学生分发。为了缓解他们的黑客体验,我想对未初始化的变量进行警告。如何在makefile中设置长选项

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

的Makefile描述它与--warn-不确定变量工作:

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设置正确。有什么建议么?

+0

你将会淹没像'TARGET_ARCH'和'LOADLIBES'这样的未设置变量的虚假警告。 – Wintermute

+0

这取决于他是否使用内置规则来处理任何事情,我认为。 –

我有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' 

要么我borking的东西...或者是一个错误的化妆。我倾向于认为后者。