Специфична за целта променлива на 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