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

发布于 2024-12-13 19:35:05 字数 1090 浏览 2 评论 0原文

使用 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  

我知道这是一个值得大惊小怪的愚蠢细节,但肯定有办法吧?

when using a makefile, I want the following to be possible:

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

and have all to do the same thing in my makefile.
(ie. I don't want make goals to be case sensitive)

Sure, I could just write every possibly like this:

.PHONY clean Clean CLean CLEan CLEAn ... 
clean Clean CLean CLEan CLEAn ...:  
    $(DELETE_STUFF)

but I think you can see why this is not desired..
I know that 'make' has a built in macro called: MAKECMDGOALS which will be equal to whatever you type after typing make.

for example, running 'make clean all backup'   
$(MAKECMDGOALS) = "clean all backup"  

I tried to do this at the top of my makefile:

MAKECMDGOALS:= $(shell echo $(MAKECMDGOALS) | tr "[:upper:]" "[:lower:]")

it does change the variable to all lowercase, but will still only call the rule for the target goal typed.

I've even tried to override it like this:

override MAKECMDGOALS:= $(shell echo $(MAKECMDGOALS) | tr "[:upper:]" "[:lower:]")

in hopes that will be done sooner, yet no success.

I was going to make a target like this:

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

I know it's a silly detail to fuss over, but surely there has got to be a way right?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

想挽留 2024-12-20 19:35:05

粗略但有效:

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

clean:
        delete_stuff

Crude but effective:

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

clean:
        delete_stuff
策马西风 2024-12-20 19:35:05

您可以生成目标,例如通过使用 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,仅接受小写目标。

You can generate your targets, for example by using the shell (at least in GNU Make):

SHELL := /bin/bash
clean_insensitive := $(shell echo {C,c}{L,l}{E,e}{A,a}{N,n})

$(clean_insensitive) :
    rm *.o

Another solution would be to write a wrapper that will lowercase the arguments and call make, accepting only lowercase targets.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文