使用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
我知道这是一个愚蠢的细节,但肯定有一个正确的方法吗?
答案 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,只接受小写目标。