Makefile: как мне получить то же поведение, что и $ @ при непосредственном использовании переменной? - PullRequest
0 голосов
/ 24 октября 2018

Я использую код, аналогичный https://stackoverflow.com/a/17845120/1375972, который включает в себя:

TOPTARGETS := zip test clean

SUBDIRS := $(wildcard */.)

$(TOPTARGETS): $(SUBDIRS)
$(SUBDIRS):
    $(MAKE) -C $@ $(MAKECMDGOALS)

Он запускается в зависимости от того, какая команда make передается (из TOPTARGETS) в каждом подкаталоге, что мне и нужно.

Однако я хочу иметь цель deploy, которая ведет себя так же, только если установлена ​​переменная окружения.Вот что я попробовал:

deploy:
ifdef GITLAB_CI
    @echo "GITLAB_CI variable is defined, running deploy on all subdirectories"
    $(MAKE) -C $(SUBDIRS) $(MAKECMDGOALS)

else
    @echo "snip"
endif

Обратите внимание, что строка $(MAKE) такая же, как $(SUBDIRS), только с $@, замененным на $(SUBDIRS) напрямую.

Таким образом, логика заключается в том, что когда он запускается в моем CI, он рекурсивно запускает развертывание во всех подкаталогах, но когда он запускается локально, это не так.Проблема в том, что $(SUBDIRS) при развертывании не работает должным образом.Когда я запускаю make deploy в каталоге с 2 подкаталогами:

> make deploy
GITLAB_CI variable is defined, running deploy on all subdirectories
/Library/Developer/CommandLineTools/usr/bin/make -C subdir1/. subdir2/. deploy
make[1]: *** No rule to make target `subdir2/.'.  Stop.
make: *** [deploy] Error 2

По сравнению с make clean (один из моих TOPTARGETS):

> make clean
/Library/Developer/CommandLineTools/usr/bin/make -C subdir1/. clean
/Library/Developer/CommandLineTools/usr/bin/make -C subdir2/. clean

Так что когда TOPTARGETS используются, $@, кажется, развертывает $(SUBDIRS) иначе, чем когда я сам пишу ту же строку с $@, замененным на $(SUBDIRS).Есть ли какой-нибудь способ самому получить такое поведение в строке deploy?Или мне нужно написать собственный цикл for $(SUBDIRS) внутри этой цели?

1 Ответ

0 голосов
/ 24 октября 2018

Вы можете оставить то, что работает, и добавить минимальное правило deploy:

TOPTARGETS := zip test clean

SUBDIRS := $(wildcard */.)

$(TOPTARGETS): $(SUBDIRS)
$(SUBDIRS):
    $(MAKE) -C $@ $(MAKECMDGOALS)

ifdef GITLAB_CI
deploy: $(SUBDIRS)
else
deploy:
    @echo "snip"
endif

Или, может быть, даже проще:

TOPTARGETS := zip test clean
ifdef GITLAB_CI
TOPTARGETS += deploy
else
deploy:
    @echo "snip"
endif

SUBDIRS := $(wildcard */.)

$(TOPTARGETS): $(SUBDIRS)
$(SUBDIRS):
    $(MAKE) -C $@ $(MAKECMDGOALS)
...