Makefile (не чувствительные к регистру цели) - PullRequest
4 голосов
/ 05 ноября 2011

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

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

, и я должен все делать то же самое в моем 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"  

Я пытался сделать это в верхней части моего make-файла:

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  

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

Ответы [ 2 ]

6 голосов
/ 05 ноября 2011

Сырой, но эффективный:

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

clean:
        delete_stuff
5 голосов
/ 05 ноября 2011

Вы можете создавать свои цели, например, используя оболочку (по крайней мере, в GNU Make):

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

$(clean_insensitive) :
    rm *.o

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...