Как сделать "сделать <subdir><target>"? - PullRequest
4 голосов
/ 15 июля 2011

Мне нужен make-файл, где я могу позвонить:

'make' / 'make <subdir>' / 'make clean' / 'make <subdir> clean'  

Но я не хочу, чтобы он пытался разрешить clean при вызове на subdir!

Вот пример моего make-файла:

SUBDIRS := a b c
all :  
    @echo building a b and c  
clean :  
    @echo cleaning a b and c
$(SUBDIRS) :  
    make - C $@ $(MAKECMDGOALS)  

Все вызовы работают хорошо, кроме make <subdir> clean, который вызывает make -C <subdir> clean, но затем пытается также решить цель clean отдельноКак мне заставить make остановить обработку более поздних целей?

На оба ответа: спасибо за ваше объяснение.полезно знать, что и что не должно быть сделано.я больше не буду пытаться это делать.

Ответы [ 2 ]

3 голосов
/ 16 июля 2011

Вздох

Да, вы можете сделать это, но это будет уродливый взлом и полностью противоречит тому, как Make предназначен для работы.

Набор целей, которые вы передаете Make, это набор целей , а не структурированная команда с синтаксисом. Ожидается, что Make соберет их всех. Если make-файл включает рецепт для цели foo, то Make должен построить цель foo определенным образом, независимо от того, вызывается ли она как Make foo или Make foo bar или Make bar foo. То, что вы пытаетесь сделать, нарушает общепринятое поведение Make, поэтому вам следует попробовать другой подход.

Если вы все еще хотите это сделать, вы можете сделать это так:

SUBDIRS := a b c

.PHONY: clean
ifneq ($(filter $(SUBDIRS), $(MAKECMDGOALS)),)
$(SUBDIRS) :
        @echo make - C $@ $(MAKECMDGOALS)  

clean:
        @: # do nothing
else
all :
        @echo default

clean :
        @echo cleaning
endif
2 голосов
/ 17 июля 2011

Я полностью согласен с заявлениями Беты о неправильном использовании make. Другим способом достижения того, чего вы хотите, было бы введение явных целей для очистки подкаталогов. Таким образом, например, вы можете позвонить make clean_<subdir>.

SUBDIRS := a b c
all:
    @echo building a b and c

clean:
    @echo cleaning a b and c

$(SUBDIRS):
    make - C $@

$(addprefix clean_, $(SUBDIRS)): clean_%:
    make -C $* clean
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...