Целевая переменная Makefile и несколько вызовов базовой цели ничего не нужно делать

Что я хотел бы сделать с GNU Make, так это иметь единую базовую цель, которую можно вызывать с небольшими вариациями в зависимости от фактической вызываемой цели. Для этого я попытался использовать целевые переменные, как показано ниже (минимальный пример):

Makefile:

.PHONY: all _base_target target1 target2

all: target1 target2

target1: MYVAR="first"
target1: _base_target

target2: MYVAR="second"
target2: _base_target

_base_target:
        echo "MYVAR is $(MYVAR)"

Итак, это отлично работает для работы с одной целью:

$ make target1
echo "MYVAR is "first""
MYVAR is first
$ make target2
echo "MYVAR is "second""
MYVAR is second

Однако, когда я хочу, чтобы обе цели запускались (через all или по отдельности):

$ make -n all
echo "MYVAR is "first""

$ make -n target1 target2
echo "MYVAR is "first""
make: Nothing to be done for `target2'.

Как я могу настроить свой Makefile, чтобы он запускал базовую цель для каждого? т.е. Я хотел бы, чтобы make all вел себя так, как если бы я сделал make target1; make target2.

Вариант .PHONY кажется недостаточным, по-видимому. Поскольку мне не хватает опыта работы с GNU Make с точки зрения словарного запаса, мне трудно найти полезные результаты для этого с помощью Google.

Попытка с двойным двоеточием

В ответ на ответ об использовании двойных двоеточий ниже.

[...]
all:: target1
all:: target2
[...]

дает тот же результат.

Замена всех одинарных двоеточий двойными колониями также дает тот же результат.


person gertvdijk    schedule 17.11.2016    source источник


Ответы (2)


Вы не можете сделать это в одном экземпляре GNU make. Make будет пытаться создать одну цель не более одного раза за вызов.

Что вы можете сделать, это использовать рекурсию:

.PHONY: all _base_target target1 target2

all: target1 target2

target1: ; $(MAKE) _base_target 'MYVAR="first"'

target2: ; $(MAKE) _base_target 'MYVAR="second"'

_base_target:
        echo "MYVAR is $(MYVAR)"
person MadScientist    schedule 17.11.2016

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

У вас не может быть одной базовой цели при использовании обычной зависимости. Причина в том, что make выполняет задание для однократного обновления цели, в то время как вы хотели бы обновить ее несколько раз с другим значением MYVAR.

person Maxim Egorushkin    schedule 17.11.2016
comment
Цитата из документации звучит многообещающе, но она не работает, даже если заменить все мои одинарные двоеточия на двойные двоеточия в примере Makefile. Не могли бы вы подробнее рассказать о том, что я должен изменить? В документации отсутствуют примеры. - person gertvdijk; 17.11.2016
comment
@gertvdijk Если базовая цель создает файл, и на его содержимое влияет MYVAR, вам нужны две разные цели. - person Maxim Egorushkin; 17.11.2016
comment
Боюсь, я не понимаю вашего утверждения. У меня уже есть отдельные цели для вариантов, и основная цель моего вопроса — использовать единую базовую цель в качестве «шаблона». - person gertvdijk; 17.11.2016
comment
@gertvdijk Боюсь, если подумать, правила с двойным двоеточием вам не помогут. - person Maxim Egorushkin; 17.11.2016