Makefile (цели, не учитывающие регистр)

#makefile #case #case-sensitive

#makefile #регистр #чувствительный к регистру

Вопрос:

при использовании makefile я хочу, чтобы было возможно следующее:

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

и все должны делать то же самое в моем makefile.

(т.е. Я не хочу, чтобы цели make учитывали регистр)

Конечно, я мог бы просто написать все, что возможно, вот так:

 .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  
  

Я знаю, что это глупая деталь, из-за которой нужно суетиться, но наверняка должен быть способ, верно?

Ответ №1:

Грубый, но эффективный:

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

clean:
        delete_stuff
  

Ответ №2:

Вы можете сгенерировать свои цели, например, с помощью оболочки (по крайней мере, в GNU Make):

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

$(clean_insensitive) :
    rm *.o
  

Другим решением было бы написать оболочку, которая будет указывать аргументы в нижнем регистре и вызывать make, принимая только цели в нижнем регистре.