Makefile(不区分大小写的目标)

5
使用Makefile时,我希望能够实现以下功能:
make clean  
make Clean  
make CLean
make CLEan
make CLEAn
make ... 

“在我的Makefile中,所有人都必须做同样的事情。(即我不希望make目标区分大小写)
当然,我可以将所有可能的情况都写成这样:”
.PHONY clean Clean CLean CLEan CLEAn ... 
clean Clean CLean CLEan CLEAn ...:  
    $(DELETE_STUFF)

但我认为你可以看出这不是我们想要的。。
我知道'make'有一个内置宏叫做:MAKECMDGOALS,它将等于你在输入make后键入的任何内容。
for example, running 'make clean all backup'   
$(MAKECMDGOALS) = "clean all backup"  

我试着在我的makefile顶部做这个:
MAKECMDGOALS:= $(shell echo $(MAKECMDGOALS) | tr "[:upper:]" "[:lower:]")

它确实将变量改为全小写,但仍然只会调用输入的目标规则。我甚至尝试过像这样覆盖它:
override MAKECMDGOALS:= $(shell echo $(MAKECMDGOALS) | tr "[:upper:]" "[:lower:]")

希望这件事能尽快完成,但是没有成功。
我本打算制定一个像这样的目标:
$(MAKECMDGOALS):
MAKECMDGOALS:= $(shell echo $(MAKECMDGOALS) | tr "[:upper:]" "[:lower:]")
#BUT I CAN'T CALL OTHER TARGETS FROM THE SHELL  

我知道这是一个不值一提的细节,但肯定有解决方法,对吧?
2个回答

8

简单却有效:

%:
        $(MAKE) $(shell echo $@ | tr "[:upper:]" "[:lower:]")

clean:
        delete_stuff

5
您可以生成您的目标,例如通过使用 shell(至少在 GNU Make 中):
SHELL := /bin/bash
clean_insensitive := $(shell echo {C,c}{L,l}{E,e}{A,a}{N,n})

$(clean_insensitive) :
    rm *.o

另一种解决方案是编写一个包装器,将参数转换为小写并调用make,仅接受小写目标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接