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

时间:2011-11-05 02:49:41

标签: makefile case case-sensitive

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

make clean  
make Clean  
make CLean
make CLEan
make CLEAn
make ... 

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

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

.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 个答案:

答案 0 :(得分:6)

原油但有效:

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

clean:
        delete_stuff

答案 1 :(得分: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,只接受小写目标。