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)
我知道这是一个愚蠢的细节,但肯定有一个正确的方法吗?
原油但有效:
%:
$(MAKE) $(shell echo $@ | tr "[:upper:]" "[:lower:]")
clean:
delete_stuff
Run Code Online (Sandbox Code Playgroud)
您可以生成目标,例如使用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,只接受小写目标.
| 归档时间: |
|
| 查看次数: |
2422 次 |
| 最近记录: |