Учитывая Makefile с target-specific
Defintion:Как переопределить целевую переменную из командной строки?
# A target-specific definition for both: 'all' and 'x'.
all : foo += target
x : foo += target
all : x ;
x ::
@echo '$(foo)'
Бег, я получаю:
# override Makefile-level variables, with a command-line definition.
$ make foo=cmd
cmd
Теперь же Makefile, как указано выше, но с pattern-specific
Defintion:
# A pattern-specific definition that matches both targets: 'all' and 'x'.
% : foo += target
all : x ;
x ::
@echo '$(foo)'
Бег, я получаю:
# override Makefile-level variables, with a command-line definition.
$ make foo=cmd
cmd cmd cmd
Теперь оба Makefiles почти идентичные, за исключением:
- Для версии 1 Makefile: (С мишенью -специфического определением), мы имели:
all : foo += target
x : foo += target
- Для версии 2 Makefile (С рисунка -специфическое определение), у нас было:
% : foo += target
В обоих случаях, мы имели в основном конфигурацию же:
- Шаблон/целевое определение, которое присоединяет к предыдущему значению.
- Используется определение рисунка/цели как, так и
all
иx
целей. - У нас было определение командной строки, которое должно быть переопределить определение уровня файла makefile.
Теперь, интерпретации или реализации, что переопределение, Make использует совершенно иную методику, для версии (целевое определение), чем версия (определение модели).
Давайте посмотрим:
- Для определения целевого, сделать полностью игнорирует любые значение, определенное в Makefile. Следовательно, окончательное значение:
cmd
. - Для определения шаблона, однако, сделать придумывает «примирительный» подход, пытаясь удовлетворить как, определение Makefile уровня и командной строки дефиниция, так что:
- признает, что окончательное значение
cmd
, в командной строке, которая переопределяет определение make-файла. - Но, поскольку make-файл подразумевает, что «шаблоны» должны «добавлять» дополнительные значения - неважно, что те же самые значения были переопределены - Make будет по-прежнему «подчиняться» этим добавлениям, но это будет сделано с разными значения (т. е. значение командной строки «выигрыш»), тем самым достигая «компрометации», где и make-файл, или командная строка, имеют единственный контроль над конечным значением переменной.
- признает, что окончательное значение
Ну, эти различные подходы, которые делают необходимые для реализации командной строки переопределения, (за шаблон против целевого конкретных переменных), является еще более очевидным, когда мы ожидаем, что очень разные конечные результатов, которые мы получаем для них, соответственно:
cmd
(для конкретных целей).cmd cmd cmd
(для образца).
Это оправдано? И как это?