Я использую код, аналогичный 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)
внутри этой цели?