#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, принимая только цели в нижнем регистре.