Makefile(非大小写敏感的目标)

Tre*_*key 4 makefile case case-sensitive

使用makefile时,我想要以下内容:

make clean  
make Clean  
make CLean
make CLEan
make CLEAn
make ... 
Run Code Online (Sandbox Code Playgroud)

并且在我的makefile中都要做同样的事情.
(即我不希望制作目标区分大小写)

当然,我可以像这样写每一个:

.PHONY clean Clean CLean CLEan CLEAn ... 
clean Clean CLean CLEan CLEAn ...:  
    $(DELETE_STUFF)
Run Code Online (Sandbox Code Playgroud)

但是我认为你可以看出为什么这不是我们想要的.
我知道'make'有一个内置的宏叫做:MAKECMDGOALS,它等于输入make后输入的内容.

for example, running 'make clean all backup'   
$(MAKECMDGOALS) = "clean all backup"  
Run Code Online (Sandbox Code Playgroud)

我尝试在makefile的顶部执行此操作:

MAKECMDGOALS:= $(shell echo $(MAKECMDGOALS) | tr "[:upper:]" "[:lower:]")
Run Code Online (Sandbox Code Playgroud)

它确实将变量更改为全部小写,但仍然只调用键入目标目标的规则.

我甚至试图像这样覆盖它:

override MAKECMDGOALS:= $(shell echo $(MAKECMDGOALS) | tr "[:upper:]" "[:lower:]")
Run Code Online (Sandbox Code Playgroud)

希望能早点完成,但没有成功.

我打算做一个像这样的目标:

$(MAKECMDGOALS):
MAKECMDGOALS:= $(shell echo $(MAKECMDGOALS) | tr "[:upper:]" "[:lower:]")
#BUT I CAN'T CALL OTHER TARGETS FROM THE SHELL  
Run Code Online (Sandbox Code Playgroud)

我知道这是一个愚蠢的细节,但肯定有一个正确的方法吗?

Bet*_*eta 6

原油但有效:

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

clean:
        delete_stuff
Run Code Online (Sandbox Code Playgroud)


cho*_*oba 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
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是编写一个包装器,它将小写参数并调用make,只接受小写目标.